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
swmmattributetablemodel.h
Go to the documentation of this file.
1
21#ifndef SWMMATTRIBUTETABLEMODEL_H
22#define SWMMATTRIBUTETABLEMODEL_H
23
24#include <QAbstractTableModel>
25#include <QPointer>
26#include <QStringList>
27#include <QVariantMap>
28
29class QUndoStack;
30
32// Not forward-declarable: m_resultsSource is a QPointer, which static_casts
33// through QObject* and so needs the complete type at instantiation.
35
36namespace openswmmvis {
37
39enum class EditorKind {
40 ReadOnly,
41 Numeric,
42 Integer,
43 Enum,
44 Text,
45 Compound,
50 Interval,
62};
63
67inline constexpr int kFileColumnOptionsRole = Qt::UserRole + 21;
68
74enum class UnitKind {
75 None,
76 Length,
77 Area,
79 Volume,
80 Velocity,
81 FlowRate,
83 Percent,
84 Rate,
85};
86
93struct ColumnSpec {
94 QString key;
95 QString label;
97 QString setter;
98 QVariantList enumValues;
99 double minValue = -std::numeric_limits<double>::infinity();
100 double maxValue = std::numeric_limits<double>::infinity();
101 int decimals = 4;
103 QString tooltip;
105 QString fileFilter;
106};
107
108} // namespace openswmmvis
109
110class SWMMAttributeTableModel : public QAbstractTableModel
111{
112 Q_OBJECT
113public:
114 explicit SWMMAttributeTableModel(QObject *parent = nullptr);
115
120
134 [[nodiscard]] SWMMResultsLayer *resultsSource() const { return m_resultsSource; }
135
136 [[nodiscard]] SWMMModelLayer *layer() const noexcept { return m_layer; }
137 [[nodiscard]] SWMMModelLayer::Category category() const noexcept
138 { return m_category; }
139
141 [[nodiscard]] QString objectNameAt(int row) const;
142
145 [[nodiscard]] int rowForName(const QString &name) const;
146
151 QStringList columnKeys() const { return m_columnKeys; }
152
156 QList<openswmmvis::ColumnSpec> columnSpecs() const { return m_columnSpecs; }
157
161 void refreshHeaders();
162
167 void setUndoStack(QUndoStack *stack) { m_undoStack = stack; }
168 [[nodiscard]] QUndoStack *undoStack() const { return m_undoStack; }
169
173 bool commitValueDirect(const QModelIndex &index, const QVariant &value);
174
175 // QAbstractTableModel ----------------------------------------------------
176 int rowCount(const QModelIndex &parent = {}) const override;
177 int columnCount(const QModelIndex &parent = {}) const override;
178 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
179 bool setData(const QModelIndex &index, const QVariant &value,
180 int role = Qt::EditRole) override;
181 Qt::ItemFlags flags(const QModelIndex &index) const override;
182 QVariant headerData(int section, Qt::Orientation orientation,
183 int role = Qt::DisplayRole) const override;
184
185public slots:
187 void reload();
188
194 void refreshObject(const QString &name);
195
196signals:
203 void objectEdited(const QString &name);
204
205private:
206 void rebuildColumnSchema();
209 QString offsetModeLabel(const openswmmvis::ColumnSpec &spec) const;
217 void appendInitialQualityColumns();
221 void appendUserFlagColumns();
222
228 void appendDynamicsColumns();
229 QVariantMap rowData(int row) const;
230
233 [[nodiscard]] int columnForSetter(const QString &tag) const;
234
237 [[nodiscard]] QString rainFileFor(int row) const;
238
251 bool commitRainFilePath(const QModelIndex &pathIndex,
252 const QVariant &oldPath, const QVariant &newPath);
253
254 QPointer<SWMMModelLayer> m_layer;
255 QPointer<SWMMResultsLayer> m_resultsSource;
257 QStringList m_columnKeys;
258 QStringList m_columnLabels;
259 QList<openswmmvis::ColumnSpec> m_columnSpecs;
260 QUndoStack *m_undoStack = nullptr;
261
262 // Per-row cache: name → row-data map. Invalidated by reload().
263 // The cache is mutable so const data() can populate it on first
264 // access without hammering identifyByName() on every paint.
265 mutable QVector<QVariantMap> m_rowCache;
266 mutable QVector<bool> m_rowCacheValid;
267
268 // Per-node summary caches used by compound cells (Inflows / DWF /
269 // RDII / Treatment columns). Without these, each cell paint runs
270 // an O(N) engine-wide scan over all external inflows / DWF entries /
271 // RDII entries, multiplied by the number of visible rows × paint
272 // events — millions of calls per second on a junction table.
273 // Filled lazily on first compound-cell access and cleared whenever
274 // the per-row cache is invalidated.
275 mutable QHash<int, int> m_inflowCountByNode;
276 mutable QHash<int, int> m_dwfCountByNode;
277 mutable QHash<int, int> m_rdiiCountByNode;
278 mutable QHash<int, int> m_treatmentActiveByNode;
279 mutable int m_compoundPollutantCount = 0;
280 mutable bool m_compoundCacheBuilt = false;
281 void ensureCompoundCacheBuilt() const;
282 void invalidateCompoundCache();
283
284 // Initial-quality UI round — element engine index → (constituent →
285 // value) for the bound category's scope (NODE or LINK), filled by one
286 // engine-wide scan so per-cell paints don't rescan the row store.
287 // Invalidated together with the compound caches.
288 mutable QHash<int, QHash<QString, double>> m_initQualityByElem;
289 mutable bool m_initQualityCacheBuilt = false;
290 void ensureInitQualityCacheBuilt() const;
291};
292
293#endif // SWMMATTRIBUTETABLEMODEL_H
Definition swmmattributetablemodel.h:111
void refreshHeaders()
Definition swmmattributetablemodel.cpp:2149
SWMMResultsLayer * resultsSource() const
Definition swmmattributetablemodel.h:134
void setSource(SWMMModelLayer *layer, SWMMModelLayer::Category category)
Definition swmmattributetablemodel.cpp:2100
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override
Definition swmmattributetablemodel.cpp:3572
QList< openswmmvis::ColumnSpec > columnSpecs() const
Definition swmmattributetablemodel.h:156
void setResultsSource(SWMMResultsLayer *layer)
Definition swmmattributetablemodel.cpp:2114
int columnCount(const QModelIndex &parent={}) const override
Definition swmmattributetablemodel.cpp:2392
Qt::ItemFlags flags(const QModelIndex &index) const override
Definition swmmattributetablemodel.cpp:3003
void reload()
Definition swmmattributetablemodel.cpp:2176
bool commitValueDirect(const QModelIndex &index, const QVariant &value)
Definition swmmattributetablemodel.cpp:3096
void setUndoStack(QUndoStack *stack)
Definition swmmattributetablemodel.h:167
SWMMModelLayer * layer() const noexcept
Definition swmmattributetablemodel.h:136
QString objectNameAt(int row) const
Definition swmmattributetablemodel.cpp:2426
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
Definition swmmattributetablemodel.cpp:2462
QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override
Definition swmmattributetablemodel.cpp:2398
void objectEdited(const QString &name)
QUndoStack * undoStack() const
Definition swmmattributetablemodel.h:168
QStringList columnKeys() const
Definition swmmattributetablemodel.h:151
int rowForName(const QString &name) const
Definition swmmattributetablemodel.cpp:2433
void refreshObject(const QString &name)
Definition swmmattributetablemodel.cpp:3475
SWMMModelLayer::Category category() const noexcept
Definition swmmattributetablemodel.h:137
int rowCount(const QModelIndex &parent={}) const override
Definition swmmattributetablemodel.cpp:2385
Renders the SWMM network elements (nodes, links, subcatchments, rain gages) for one OpenSWMMEngine mo...
Definition swmmmodellayer.h:133
static constexpr Category CatJunctions
Definition swmmmodellayer.h:156
Overlays time-stepped simulation results on the SWMM network geometry.
Definition swmmresultslayer.h:96
SWMM_FilePathRole role
Definition ioportabilitynormalizer.cpp:22
int index
Position in m_quadRegions / m_quadReports.
Definition meshgenerator.cpp:153
QString tag
r.tag or inherited from a dropped RegionMarker.
Definition meshgenerator.cpp:167
SwmmCategory
Stable ordinal categorising every SWMM-element kind that has per-kind styling, per-kind tree rows,...
Definition swmm_category.h:28
Definition aquiferprovider.h:21
EditorKind
Definition swmmattributetablemodel.h:39
@ ReadOnly
Default; flags() omits ItemIsEditable.
@ Numeric
NumericDelegate (QDoubleSpinBox).
@ Text
Plain QLineEdit (default delegate); used for Name column.
@ Integer
IntegerDelegate (QSpinBox).
@ Enum
EnumDelegate (QComboBox) with pre-baked pairs.
UnitKind
Definition swmmattributetablemodel.h:74
@ FlowRate
CFS / CMS — uses UnitSystem::flowUnitLabel.
@ None
No physical unit (counts, ids, names, etc.)
@ Depression
in / mm (depression storage, rainfall)
@ SubcatchArea
ac / ha (subcatchment area; SWMM convention)
@ Percent
% — always
@ Length
ft / m (invert, max depth, offsets, crest height)
@ Rate
in/hr / mm/hr (infiltration, seepage)
@ Area
ft² / m² (ponded area, cross-section)
constexpr int kFileColumnOptionsRole
Definition swmmattributetablemodel.h:67
QVector< int > parent
union-find
Definition pslgminsize.cpp:176
QString name
Definition sectionmodelbuilders.cpp:474
Definition swmmattributetablemodel.h:93
int decimals
Definition swmmattributetablemodel.h:101
QVariantList enumValues
For Enum: list of {label, data} pairs.
Definition swmmattributetablemodel.h:98
UnitKind unit
Semantic unit (resolved at render)
Definition swmmattributetablemodel.h:102
double minValue
Definition swmmattributetablemodel.h:99
QString label
Header label (without unit suffix)
Definition swmmattributetablemodel.h:95
QString tooltip
Definition swmmattributetablemodel.h:103
double maxValue
Definition swmmattributetablemodel.h:100
EditorKind editor
Definition swmmattributetablemodel.h:96
QString key
identifyByName-map key (display)
Definition swmmattributetablemodel.h:94
QString fileFilter
For FileBrowse: QFileDialog name filter.
Definition swmmattributetablemodel.h:105
QString setter
Setter tag (empty == read-only)
Definition swmmattributetablemodel.h:97
Map layer that renders an OpenSWMMEngine network (nodes, links, subcatchments, rain gages) and provid...
Layer that colour-maps SWMM simulation output over the network geometry for interactive time-stepped ...