SWMMVis  6.0.0-alpha.4
Qt6/C++ GIS-based graphical user interface for the SWMMVis engine (6.0.0-alpha.4)
Loading...
Searching...
No Matches
ribbonlayoutsolver.h
Go to the documentation of this file.
1#ifndef RIBBONLAYOUTSOLVER_H
2#define RIBBONLAYOUTSOLVER_H
3
18#include <QVector>
19#include <QtGlobal>
20
21namespace openswmmvis::ui {
22
23enum class RibbonMode {
24 Collapsed = 0,
25 Compact = 1,
26 Full = 2,
27};
28
30 int full = 0;
31 int compact = 0;
32 int collapsed = 0;
33 bool collapsible = true;
34
36 {
37 switch (m) {
38 case RibbonMode::Full: return full;
39 case RibbonMode::Compact: return compact;
41 }
42 return full;
43 }
44};
45
48inline int ribbonRowWidth(const QVector<RibbonGroupWidths> &groups,
49 const QVector<RibbonMode> &modes, int spacing)
50{
51 int width = 0;
52 for (int i = 0; i < groups.size(); ++i) {
53 width += groups.at(i).widthFor(modes.at(i));
54 if (i > 0)
55 width += spacing;
56 }
57 return width;
58}
59
67inline QVector<RibbonMode> solveRibbonModes(int availableWidth,
68 const QVector<RibbonGroupWidths> &groups,
69 int spacing)
70{
71 QVector<RibbonMode> modes(groups.size(), RibbonMode::Full);
72 if (groups.isEmpty())
73 return modes;
74 if (ribbonRowWidth(groups, modes, spacing) <= availableWidth)
75 return modes;
76 for (int i = groups.size() - 1; i >= 0; --i) {
77 modes[i] = RibbonMode::Compact;
78 if (ribbonRowWidth(groups, modes, spacing) <= availableWidth)
79 return modes;
80 }
81 for (int i = groups.size() - 1; i >= 0; --i) {
82 if (!groups.at(i).collapsible)
83 continue;
84 modes[i] = RibbonMode::Collapsed;
85 if (ribbonRowWidth(groups, modes, spacing) <= availableWidth)
86 return modes;
87 }
88 return modes;
89}
90
98inline QVector<RibbonMode> applyRibbonHysteresis(const QVector<RibbonMode> &previous,
99 int availableWidth,
100 const QVector<RibbonGroupWidths> &groups,
101 int spacing, int deadBand = 32)
102{
103 const QVector<RibbonMode> candidate =
104 solveRibbonModes(availableWidth, groups, spacing);
105 if (previous.size() != groups.size())
106 return candidate;
107 const QVector<RibbonMode> held =
108 solveRibbonModes(availableWidth - deadBand, groups, spacing);
109 QVector<RibbonMode> result = candidate;
110 for (int i = 0; i < groups.size(); ++i) {
111 if (candidate.at(i) > previous.at(i)) // promotion requested
112 result[i] = qMax(previous.at(i), held.at(i));
113 }
114 return result;
115}
116
117} // namespace openswmmvis::ui
118
119#endif // RIBBONLAYOUTSOLVER_H
size_t i
Definition contourjob.cpp:27
MaskMode m
Definition maskspec.cpp:18
Definition openswmmvislayer.h:43
int ribbonRowWidth(const QVector< RibbonGroupWidths > &groups, const QVector< RibbonMode > &modes, int spacing)
Definition ribbonlayoutsolver.h:48
RibbonMode
Definition ribbonlayoutsolver.h:23
@ Collapsed
one popup button titled by the group caption
@ Compact
icon-only buttons, small icons, caption kept
@ Full
text-under-icon buttons, large icons, caption
QVector< RibbonMode > applyRibbonHysteresis(const QVector< RibbonMode > &previous, int availableWidth, const QVector< RibbonGroupWidths > &groups, int spacing, int deadBand=32)
Definition ribbonlayoutsolver.h:98
QVector< RibbonMode > solveRibbonModes(int availableWidth, const QVector< RibbonGroupWidths > &groups, int spacing)
Definition ribbonlayoutsolver.h:67
Definition ribbonlayoutsolver.h:29
int widthFor(RibbonMode m) const
Definition ribbonlayoutsolver.h:35
int full
Definition ribbonlayoutsolver.h:30
bool collapsible
false = widget-hosting group; never collapses
Definition ribbonlayoutsolver.h:33
int collapsed
Definition ribbonlayoutsolver.h:32
int compact
Definition ribbonlayoutsolver.h:31