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
irendererpanel.h
Go to the documentation of this file.
1
24#ifndef OPENSWMMVIS_UI_DIALOGS_IRENDERERPANEL_H
25#define OPENSWMMVIS_UI_DIALOGS_IRENDERERPANEL_H
26
28// Gap A4.1 — resolved capability snapshot (attribute fields + archetype).
31
32#include <QString>
33#include <QVector>
34#include <QWidget>
35
36#include <functional>
37#include <memory>
38#include <optional>
39#include <vector>
40
42
43namespace OpenSWMM::Render {
44class IFeatureRenderer;
45class Rule;
46}
47
48namespace openswmmvis::ui {
49
74{
76 std::optional<OpenSWMMVis::SwmmCategory> category; // empty => layer-level
77 OpenSWMM::Render::Rule *rule = nullptr; // Slice Z.3b
78
79 // ----- Gap A4.1 — resolved capability snapshot -----------------------
80 // Filled by resolve(); declarative inputs for contextual gating so the
81 // panels and the renderer-class dropdown share one source of truth
82 // instead of re-deriving (and drifting on) provider lookups and
83 // rule→layer parent walks.
84
87 QVector<OpenSWMM::Render::AttributeField> fields;
88
92
95 bool animated = false;
96
97 [[nodiscard]] bool hasNumeric() const
98 {
99 for (const auto &f : fields)
100 if (f.type != QMetaType::QString) return true;
101 return false;
102 }
103 [[nodiscard]] bool hasString() const
104 {
105 for (const auto &f : fields)
106 if (f.type == QMetaType::QString) return true;
107 return false;
108 }
109
113 [[nodiscard]] static RendererPanelContext resolve(
114 OpenSWMMVisLayer *layer,
115 std::optional<OpenSWMMVis::SwmmCategory> category,
116 OpenSWMM::Render::Rule *rule = nullptr);
117};
118
122class IRendererPanel : public QWidget
123{
124 Q_OBJECT
125public:
126 using QWidget::QWidget;
127 ~IRendererPanel() override = default;
128
132 virtual void refreshFromModel() = 0;
133
135 virtual QString displayName() const = 0;
136};
137
140{
141public:
145 using Factory = std::function<IRendererPanel *(const RendererPanelContext &ctx,
146 QWidget *parent)>;
147
152 using Applicable = std::function<bool(const RendererPanelContext &ctx)>;
153
154 struct Entry {
155 QString rendererId; // "single" / "graduated" / "categorized" / "rulebased" / ...
156 QString displayName; // shown in the dropdown
158 Applicable applicable; // Gap A4.2 — null => always applicable
159 QString disabledReason; // tooltip shown on the greyed-out row
160 };
161
163
164 void registerRenderer(QString rendererId, QString displayName, Factory factory,
165 Applicable applicable = {},
166 QString disabledReason = QString());
167
170 [[nodiscard]] const std::vector<Entry> &entries() const { return m_entries; }
171
175 [[nodiscard]] const Entry *find(const QString &rendererId) const;
176
177private:
178 RendererPanelRegistry() = default;
179 std::vector<Entry> m_entries;
180};
181
184{
185public:
186 RendererPanelRegistrar(QString rendererId, QString displayName,
188 RendererPanelRegistry::Applicable applicable = {},
189 QString disabledReason = QString())
190 {
192 std::move(rendererId), std::move(displayName), std::move(factory),
193 std::move(applicable), std::move(disabledReason));
194 }
195};
196
197#define REGISTER_RENDERER_PANEL(ID_STRING, DISPLAY_STRING, FACTORY) \
198 static const openswmmvis::ui::RendererPanelRegistrar \
199 s_register_renderer_##__LINE__( \
200 QStringLiteral(ID_STRING), QStringLiteral(DISPLAY_STRING), FACTORY);
201
204#define REGISTER_RENDERER_PANEL_GATED(ID_STRING, DISPLAY_STRING, FACTORY, \
205 APPLICABLE, REASON_STRING) \
206 static const openswmmvis::ui::RendererPanelRegistrar \
207 s_register_renderer_##__LINE__( \
208 QStringLiteral(ID_STRING), QStringLiteral(DISPLAY_STRING), FACTORY, \
209 APPLICABLE, QStringLiteral(REASON_STRING));
210
211} // namespace openswmmvis::ui
212
213#endif // OPENSWMMVIS_UI_DIALOGS_IRENDERERPANEL_H
QString displayName
Definition categoricalpalette.cpp:148
Archetype
Definition featuresublayer.h:45
One layer-scope styled aspect — name + renderer + filter + scale.
Definition rule.h:51
Abstract base class for all layers displayed in the MapCanvas.
Definition openswmmvislayer.h:116
Definition irendererpanel.h:123
virtual void refreshFromModel()=0
virtual QString displayName() const =0
~IRendererPanel() override=default
Definition irendererpanel.h:184
RendererPanelRegistrar(QString rendererId, QString displayName, RendererPanelRegistry::Factory factory, RendererPanelRegistry::Applicable applicable={}, QString disabledReason=QString())
Definition irendererpanel.h:186
Definition irendererpanel.h:140
std::function< IRendererPanel *(const RendererPanelContext &ctx, QWidget *parent)> Factory
Definition irendererpanel.h:146
void registerRenderer(QString rendererId, QString displayName, Factory factory, Applicable applicable={}, QString disabledReason=QString())
Definition irendererpanel.cpp:65
std::function< bool(const RendererPanelContext &ctx)> Applicable
Definition irendererpanel.h:152
static RendererPanelRegistry & instance()
Definition irendererpanel.cpp:59
const Entry * find(const QString &rendererId) const
Definition irendererpanel.cpp:77
const std::vector< Entry > & entries() const
Definition irendererpanel.h:170
Granular per-Category sublayer that replaces the legacy NodeMarker / ConduitLine / ConduitArrow / Sub...
Layer-side seam for "what attributes can I theme by?" — Slice DM.1.
Definition gisrasterlayer.h:40
Definition openswmmvislayer.h:43
QVector< int > parent
union-find
Definition pslgminsize.cpp:176
Context passed to renderer-panel factories at construction time.
Definition irendererpanel.h:74
bool hasNumeric() const
Definition irendererpanel.h:97
bool hasString() const
Definition irendererpanel.h:103
std::optional< OpenSWMMVis::SwmmCategory > category
Definition irendererpanel.h:76
QVector< OpenSWMM::Render::AttributeField > fields
Definition irendererpanel.h:87
OpenSWMM::Render::FeatureSublayer::Archetype archetype
Definition irendererpanel.h:90
bool animated
Definition irendererpanel.h:95
static RendererPanelContext resolve(OpenSWMMVisLayer *layer, std::optional< OpenSWMMVis::SwmmCategory > category, OpenSWMM::Render::Rule *rule=nullptr)
Definition irendererpanel.cpp:18
OpenSWMMVisLayer * hostLayer
Definition irendererpanel.h:75
OpenSWMM::Render::Rule * rule
Definition irendererpanel.h:77
Definition irendererpanel.h:154
QString rendererId
Definition irendererpanel.h:155
QString displayName
Definition irendererpanel.h:156
Applicable applicable
Definition irendererpanel.h:158
QString disabledReason
Definition irendererpanel.h:159
Factory factory
Definition irendererpanel.h:157
Standalone definition of the SWMM-element Category enum used by per-Category APIs across layers,...