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
swmmvis.h
Go to the documentation of this file.
1
20#ifndef SWMMVIS_H
21#define SWMMVIS_H
22
23#include <QDateTime> // 2026-07-19 — mPendingSeekTime (scrub coalescing)
24#include <QHash>
25#include <QMainWindow>
26#include <QPointer>
27#include <QSettings>
28#include <functional>
29#include <optional>
30#include <utility>
31
33#include "layers/swmmmodellayer.h" // NewProjectSpec (nested type)
34#include "selection/selectionmanager.h" // SWMMObjectRef
35#include "plot/plotattribute.h"
36#include "plot/resultdescriptor.h" // PlotAttribute (AT.2)
37#include "plot/profilerouter.h" // ProfileRouter::Path
38
39QT_BEGIN_NAMESPACE
40namespace Ui { class SWMMVis; }
41QT_END_NAMESPACE
42
43namespace openswmmvis::ui { class CompactToolbarController; }
44namespace openswmmvis::ui { class ComparisonPlotDialog; }
45namespace openswmmvis::ui { class RainfallVisualizationDialog; }
46namespace openswmmvis::ui { class RibbonGroup; }
47namespace openswmmvis::project::examples { struct ExampleInfo; }
48
49class QCheckBox;
50class QLabel;
51class QToolButton;
52class QComboBox;
53class QLineEdit;
54class QSlider;
55class QDoubleSpinBox;
56class QDateTimeEdit;
57class QProgressBar;
58class QTimer; // 2026-07-19 — mScrubCoalesceTimer (scrub coalescing)
59class QStandardItemModel;
60class QDragEnterEvent;
61class QDragMoveEvent;
62class QDropEvent;
63class QMimeData;
64class OpenSWMMVisLayer; // Slice BI-MK.LT — onLayerKindStyleRequested signature
65class QMdiSubWindow;
66class QAction;
67class QMenu;
68class GISRasterLayer;
71class MapCanvas;
73class LayerTreePanel;
75class PropertiesPanel;
76namespace openswmmvis::ui { class SectionViewPanel; }
80
81namespace openswmmvis::ui { class CursorWindowSlider; }
82namespace openswmmvis::ui { class LegendDock; }
83namespace openswmmvis::ui { class LayerStylingDock; }
84namespace openswmmvis::ui { class FeatureLayerPanel; }
85class FeatureLayer;
87
98
99class SWMMVis : public QMainWindow
100{
101 Q_OBJECT
102
103public:
109 explicit SWMMVis(QWidget *parent = nullptr);
110
114 virtual ~SWMMVis();
115
122
137 const QString &targetPath,
138 bool isGpkg);
139
140public slots:
146 void onLogMessage(const QString &message,
149
150private:
151 void initializeWelcomeScreen();
152
156 void openExampleCopy(const openswmmvis::project::examples::ExampleInfo &info);
157
158 void initializeToolBars();
159 void initializeAnimationToolBar();
160 void initializeTerrainToolBar();
161 void initializeMeshEditingToolBar(); // Slice §V.VB
162
165 void initializeAnalysisLayerCombos();
166
171 void refreshActiveResultsCombos();
172 void initializeMapTools();
173 void initializeStatusBar();
174
177 void updateCoordinateReadout();
178 void initializeDockWidgets();
179 void initializeLayersDockWidget();
180 void initializeObjectBrowserDockWidget();
181 void initializePropertiesPanelDockWidget();
182 void initializeSimulationStatusDockWidget();
183 void initializeMessageLogDockWidget();
184 void initializeLegendDockWidget(); // Slice BB Phase 8.6.11 / 8.6.16
185
186 // ── Editable feature layers (MESH_DIALOG_TABS_AND_FEATURE_LAYERS_PLAN
187 // §5.1, §6.2) ────────────────────────────────────────────────────
189 void initializeFeatureLayerDockWidget();
191 void initializeFeatureLayerActions();
195 [[nodiscard]] QString featureGpkgPathFor(SWMMVisProjectWindow *pw) const;
197 void onNewFeatureLayer();
199 void retargetFeatureTools(SWMMVisProjectWindow *pw, FeatureLayer *layer);
201 void onDeleteSelectedFeatures();
204 void syncFeatureEditState();
205
206 void initializeMenus();
207 void initializeSettings();
208
214 void registerActions();
215
219 void rebindUndoRedoActions(SWMMVisProjectWindow *pw);
220 QMetaObject::Connection mUndoEnableConn;
221 QMetaObject::Connection mRedoEnableConn;
222
227 void initializeCompactToolbar();
228
232 void updateContextualTabs();
233
234 void saveSettings();
235 void clearPreviousWelcomeScreenElements();
236 void initializeDefaultWorkspaceSession();
237 void applyEditSessionToActions(bool active);
238 void applyProjectOpenToActions(bool open);
239
242 void updateOffsetModeLabels(bool elevation);
243
244private slots:
249 void onLayerKindStyleRequested(OpenSWMMVisLayer *layer,
250 int kindOrdinal,
251 const QString &rendererId);
252
258 void onPlotTimeSeriesFromOutputLayer(class SWMMResultsLayer *layer);
259
262 void onNewProject();
263
268 void openUntitledProject(const SWMMModelLayer::NewProjectSpec &spec);
269
273 SWMMVisProjectWindow *createProjectWindow(const QString &filePath);
274
275
278 void onOpenProject(const QString &path = QString());
279
283 void openSingleINP(const QString &filePath);
284
289 void finalizeSingleINPOpen(SWMMVisProjectWindow *window,
290 const QString &filePath,
291 bool ok,
292 const QList<QString> &warnings,
293 const QList<QString> &errors,
294 qint64 elapsedMs,
295 class OpenProgressModel *progress = nullptr);
296
305 void attachMesh2DLayersAsync(SWMMVisProjectWindow *window,
306 const QString &filePath,
307 class OpenProgressModel *progress = nullptr);
308
324 void maybeLoad2DResults(SWMMVisProjectWindow *window,
325 const QString &filePath,
326 const QString &h5Override = QString());
327
335 void showMeshCellProperties(SWMMVisProjectWindow *window,
336 const SWMMObjectRef &ref);
337
340 void beginFileOpen(const QString &path);
341
346 void endFileOpen(const QString &path, bool ok,
347 const QString &summary, qint64 elapsedMs,
348 const QString &errorDetail = QString());
349
351 void openProjectFile(const QString &oswpPath);
352
354 void onOpenRecentFile(QAction *action);
355
357 void onSaveProject();
358
360 void onSaveAs();
361
363 void onExportMap();
364
366 void onClearRecentFiles();
367
369 void onRecentFilesSizeChanged();
370
372 void onShowWelcomeScreen();
373
375 void onClose();
376
378 void onSetProgressBarBusy(bool busy);
379
381 void onAbout();
382
384 void onModelLoaded();
385
387 void onModelLoadError(const QString &msg);
388
390 void onFlowUnitsChanged(int comboIndex);
391
393 void onCursorPositionChanged(double mapX, double mapY);
394
398 void onMeshHoverElevation(double z, bool finite);
399
401 void onCanvasSRSChanged(SpatialReferenceSystem *srs);
402
404 void onCRSButtonClicked();
405
408 void onMapScaleEntered(const QString &text);
409
412 void onCanvasScaleChanged(double denominator);
413
415 void onAddBasemapLayer();
416
418 void onAddWMSLayer();
419
428 void onAddWFSLayer();
429
431 void onAddVectorLayer();
432
434 void onAddRasterLayer();
435
437 void onAddSWMMResultsLayer();
438
442 void onAddMesh2DLayer();
443
448 void onAdd2DResultsLayer();
449
451 void onSimulationOptions();
452
454 void onClimatology(int tab);
455
457 void onEditWaterAgeSources();
458
460 void onEditInitialQuality();
461
463 void onEditReactionSystem();
464
467 void onEditHeatConfig(int tab = -1);
468
469 // ── Toolbar quick-wins (Phase 2) ────────────────────────────────────────
471 void onSearch();
473 void onTabularView();
475 void onAddDelimitedData();
477 void onSummarizeResults();
478
481 void onExport2DResults();
487 void onCopyActiveView();
489 void onPrintActiveView();
491 void onInvertSelection();
492
493 // ── Network analysis (Phase 3) ──────────────────────────────────────────
495 void onSelectUpstream();
497 void onSelectDownstream();
500 void onStreamSelect(bool upstream);
502 void onFlowBalance(bool upstream);
504 void onTravelTime(bool upstream);
505
508 void onUserFlags();
509
511 void onRunSimulation();
512
516 void onPlotTimeSeries();
517
520 void onShowReport();
521
530 void openTimeSeriesPlotFor(const SWMMObjectRef &ref);
531
538 void openTimeSeriesPlotForOnLayer(const SWMMObjectRef &ref,
539 SWMMResultsLayer *layer);
540
545 openswmmvis::ui::ComparisonPlotDialog *ensureComparisonPlotDialog();
546
550 openswmmvis::ui::RainfallVisualizationDialog *ensureRainfallVisualizationDialog();
551
557 void openRainfallVisualization();
558
562 void openRainfallVisualizationFor(const SWMMObjectRef &ref);
563
568 void openComparisonPlotFor(const SWMMObjectRef &ref);
569
572 void openComparisonPlotForOnLayer(const SWMMObjectRef &ref,
573 SWMMResultsLayer *layer);
574
580 void openComparisonPlotForAttribute(const SWMMObjectRef &ref,
582
585 void openComparisonPlotForAttributeOnLayer(const SWMMObjectRef &ref,
587 SWMMResultsLayer *layer);
588
594 void openComparisonPlotForDescriptor(
595 const SWMMObjectRef &ref,
596 const openswmmvis::plot::ResultDescriptor &descriptor);
597 void openComparisonPlotForDescriptorOnLayer(
598 const SWMMObjectRef &ref,
599 const openswmmvis::plot::ResultDescriptor &descriptor,
600 SWMMResultsLayer *layer);
601
607 void openComparisonPlotOverlayForProfile(
608 ProfilePlotDialog *profileDlg,
609 const SWMMObjectRef &ref,
610 const openswmmvis::plot::ResultDescriptor &descriptor);
611
615 void openComparisonPlotForSystemAttribute(openswmmvis::plot::PlotAttribute attribute);
616
620 void openComparisonPlotForCells(class SWMM2DResultsLayer *layer,
621 const QVector<int> &triIdxList,
622 const QVector<openswmmvis::plot::PlotAttribute> &attrs);
623
627 void onAddFromMapToggled(bool active);
628
632 void openProfilePlotFor(const ProfileRouter::Path &path);
633
641 void openMeshProfilePlotFor(const QVector<QPointF> &scenePolyline);
642 void openMeshBedProfilePlotFor(const QVector<QPointF> &scenePolyline);
643
648 void openTerrainProfilePlotFor(const QVector<QPointF> &scenePolyline);
649
653 void onPlotProfileTriggered();
654
656 void openMeshProfileDialog(const QVector<QPointF> &scenePolyline,
657 class SWMM2DResultsLayer *results,
658 const QString &title);
659
663 void openMeshEdgeFluxPlotFor(class SWMM2DMeshLayer *mesh, int triIdx, int edgeLocal,
665
669 void openMeshVertexSeriesFor(class SWMM2DMeshLayer *mesh, const QVector<int> &vertexIdxList,
670 const QVector<openswmmvis::plot::PlotAttribute> &attrs);
671
672 void onActiveSubWindowChanged(QMdiSubWindow *window);
673
682 void rebuildWindowMenu();
683
695 void resetWindowPositions();
696
697protected:
698 void closeEvent(QCloseEvent *event) override;
699 bool eventFilter(QObject *watched, QEvent *event) override;
700
704 QMenu *createPopupMenu() override;
705
706 // Feature A — drag-and-drop of .inp / .oswp files onto the main window.
707 // Accepted local paths are routed through onOpenProject().
708 void dragEnterEvent(QDragEnterEvent *event) override;
709 void dragMoveEvent(QDragMoveEvent *event) override;
710 void dropEvent(QDropEvent *event) override;
711
715 [[nodiscard]] QStringList acceptableDropPaths(const QMimeData *mime) const;
716
719 QMdiSubWindow *welcomeSubWindow() const;
720
725
726private:
727 Ui::SWMMVis *ui;
728 QStringList mRecentFiles;
729 bool mShowSplashScreenOnStartUp = true;
730 bool mShowWelcomeScreenOnStartUp = true;
731
732 // Status bar widgets
733 QCheckBox *mCheckBoxLevelOffsetMode = nullptr;
734 QLabel *mLabelOffsetElevation = nullptr;
735 QLabel *mLabelOffsetDepth = nullptr;
736 QCheckBox *mCheckBoxAutoLength = nullptr;
737 QToolButton *mToolButtonCoordinateReferenceSystem = nullptr;
738 QLineEdit *mLineEditCoordinates = nullptr;
739 // Coordinate-readout state: last cursor position (canvas CRS) + the
740 // mesh hover-Z mirrored from the Mesh Editing toolbar's probe, so
741 // either input can rebuild the readout.
742 double mLastCursorMapX = 0.0;
743 double mLastCursorMapY = 0.0;
744 bool mHasCursorPos = false;
745 std::optional<double> mMeshHoverZ;
746 QComboBox *mComboBoxMapScale = nullptr;
747 QComboBox *mComboBoxFlowUnits = nullptr;
748 QComboBox *mComboBoxEngineVersion = nullptr;
749 QProgressBar *mProgressBar = nullptr;
752 QLabel *mProgressLabel = nullptr;
753 QDateTimeEdit *mDateTimeEditAnimationTime = nullptr;
754 QLabel *mLabelAnimationSpeed = nullptr;
755 QComboBox *mComboAnimationSpeed = nullptr;
756 QCheckBox *mCheckBoxAnimationCycle = nullptr; // loop playback at end-of-range (default on)
757 // Causal "as-of within timespan" sync controls (look-back window).
758 QLabel *mLabelAnimationWindow = nullptr;
759 QDoubleSpinBox *mSpinAnimationWindow = nullptr;
760 // Issue 1 — single-thumb scrubber (cursor) + painted look-back window band.
761 // Replaces the laggy two-thumb RangeSliderWidget; the window is driven by
762 // mSpinAnimationWindow, not by a second thumb.
763 openswmmvis::ui::CursorWindowSlider *mAnimationSlider = nullptr;
764 // 2026-07-19 — scrub-seek coalescing (slider lag fix). cursorChanged
765 // fires per drag pixel; each seek used to run the full synchronous
766 // layer fetch + 2D frame load. Drag now stores the pending time and
767 // restarts this ~40 ms single-shot timer (trailing edge, same idiom as
768 // MapCanvas::m_refreshTimer); cursorReleased seeks immediately so the
769 // final frame matches the thumb exactly.
770 QTimer *mScrubCoalesceTimer = nullptr;
771 QDateTime mPendingSeekTime;
772 // Active analysis-layer selectors on the Analysis toolbar. The user picks
773 // which 1D / 2D results layer every analysis tool targets; "— none —"
774 // returns to model editing. Populated from the active project window's
775 // OutputStatsRegistry (1D) / canvas 2D results layers, kept in sync via
776 // SWMMVisProjectWindow::activeResultsLayerChanged / active2DResultsLayerChanged.
777 QLabel *mLabelActiveResults1D = nullptr;
778 QComboBox *mComboActiveResults1D = nullptr;
779 QLabel *mLabelActiveResults2D = nullptr;
780 QComboBox *mComboActiveResults2D = nullptr;
781 QCheckBox *mCheckBoxLive2D = nullptr; // live 2D render on/off (Issue 2)
782 QCheckBox *mCheckBoxLive1D = nullptr; // live 1D results pref (LIVE_1D_RESULTS_PLAN_V2)
783 class AnimationController *mAnimationController = nullptr;
784 class TerrainToolbar *mTerrainToolbar = nullptr;
785 class MeshEditingToolbar *mMeshEditingToolbar = nullptr; // Slice §V.VB
786
787 // UI redesign P6 — tabbed compact toolbar (strip + per-tab rows).
788 openswmmvis::ui::CompactToolbarController *mCompactToolbar = nullptr;
789 class QToolBar *mToolBarHome = nullptr;
790 class QToolBar *mToolBarModel = nullptr;
791 class QToolBar *mToolBarMesh2D = nullptr;
792 class QToolBar *mToolBarView = nullptr;
793 class QToolBar *mToolBarFeatures = nullptr;
794 // Iteration 2 (R3) — the two formerly .ui-authored bars, rebuilt in
795 // code with the SAME objectNames so saved window state keeps working.
796 class QToolBar *mToolBarAnimation = nullptr;
797 class QToolBar *mToolBarAnalysis = nullptr;
798 // Ribbon groups later phases re-anchor into: the analysis layer
799 // combos, the animation timeline widgets, and the Plots group whose
800 // Plot-Profile button carries the override dropdown.
801 openswmmvis::ui::RibbonGroup *mGroupResultsLayers = nullptr;
802 openswmmvis::ui::RibbonGroup *mGroupTimeline = nullptr;
803 openswmmvis::ui::RibbonGroup *mGroupPlots = nullptr;
804 QMetaObject::Connection mMeshTabConnAdd;
805 QMetaObject::Connection mMeshTabConnRemove;
806
807 QSettings mSettings;
808 QStandardItemModel *mLogMessagesModel = nullptr;
811 bool mLogScrollPending = false;
812 LayerTreePanel *mLayerTreePanel = nullptr;
813 ObjectBrowserPanel *mObjectBrowserPanel = nullptr;
814 PropertiesPanel *mPropertiesPanel = nullptr;
815 // Slice SP.4 — dockable vector section / profile view of the selection.
816 openswmmvis::ui::SectionViewPanel *mSectionViewPanel = nullptr;
817 AttributeTablePanel *mAttributeTablePanel = nullptr;
818 // Editable feature layers — the Features dock and its host dock widget
819 // (MESH_DIALOG_TABS_AND_FEATURE_LAYERS_PLAN §5.1). Tabified behind the
820 // property browser; the panel picks which FeatureLayer the drawing tools
821 // target.
822 openswmmvis::ui::FeatureLayerPanel *mFeatureLayerPanel = nullptr;
823 class QDockWidget *mFeatureDock = nullptr;
824 SimulationStatusModel *mSimStatusModel = nullptr;
825 // Slice BB Phase 8.6.11 / 8.6.16 — dockable per-class legend / style editor.
826 openswmmvis::ui::LegendDock *mLegendDock = nullptr;
827 // Slice Z.18 — always-open layer-styling editor dock.
828 openswmmvis::ui::LayerStylingDock *mLayerStylingDock = nullptr;
829
830 // Live simulation-progress tracker for the status-bar bottom bar.
831 // Keyed by SimulationRunner jobId, value is the latest 0.0–1.0
832 // fraction reported by the engine progress callback. The bar shows
833 // min-across-running-jobs as a real percent (never busy).
834 QHash<int, double> mRunningSimProgress;
835
836 // Keyed map of active simulation runners by jobId so the Pause /
837 // Cancel toolbar actions can reach any running runner. Entries are
838 // removed on SimulationRunner::finished.
839 QHash<int, class SimulationRunner *> mActiveRunners;
840
841 // Slice CF.MVP — keyed map of in-flight 2D results layers so per-tick
842 // twoDDepthsAvailable signals can find the layer to push into. Uses
843 // QPointer so the entry is auto-cleared if the layer is destroyed (e.g.
844 // the user closes the project window mid-run).
845 QHash<int, QPointer<class SWMM2DResultsLayer>> mActive2DResultsLayers;
846
852 void adoptFinished2DResults(int jobId, bool success, int errCode);
853
857 bool mExport2DInFlight = false;
858 QHash<int, std::pair<bool, int>> mDeferred2DFinish;
859
864 QHash<int, QPointer<class SWMMResultsLayer>> mLive1DLayers;
865
869 class SWMMResultsLayer *findOrCreateResultsLayer(SWMMVisProjectWindow *pw,
870 const QString &outPath,
871 const QString &rptPath);
872
875 void tickLive1DResults(int jobId, SWMMVisProjectWindow *pw,
876 const QString &outPath, const QString &rptPath);
877
878 // Per-job simulation start time captured from simulationDatesKnown so the
879 // post-run HDF5Mesh2DSource can map its /time (days-since-start) to
880 // calendar QDateTime for the global animation slider.
881 QHash<int, QDateTime> mSimulationStarts;
882
883 // Slice AT.2 — Add-from-Map mode state. When active, mPlotPickTool is
884 // the canvas's active tool and mPrevMapTool holds whichever tool was
885 // active when the user toggled "Add from Map…" on. Both cleared when
886 // the user toggles back off / presses Esc.
887 QPointer<class OpenSWMMVisMapToolPlotPick> mPlotPickTool;
888 QPointer<class OpenSWMMVisMapTool> mPrevMapTool;
889
890 // ── Status-bar progress arbitration (LOAD_PERF Phase 1c) ──────────────
891 // One QProgressBar serves three producers: simulation runs (real
892 // percent), project opens (real percent), and a handful of genuinely
893 // unmeasurable operations (raster/table open) that still want a spinner.
894 // They are mutually exclusive, so ownership is explicit and every writer
895 // goes through applyProgressBarState().
896
900 enum class ProgressOwner { None, Busy, Open, Simulation };
901
905 QHash<int, class OpenProgressModel *> mRunningOpens;
906 int mNextOpenId = 1;
907 int mBusyRefCount = 0;
908
911 void applyProgressBarState();
912
915 OpenProgressModel *beginOpenProgress();
916
918 void endOpenProgress(int openId);
919
921 void updateSimulationProgressBar();
922
926 void logInheritedThreadEnvironment();
927
933 void refreshSimulationDatesForProject(class SWMMVisProjectWindow *pw);
934
937 void refreshOffsetModeViews();
938
947 void clearSimulationStatusForProject(class SWMMVisProjectWindow *pw);
948
949 // Phase 2 editing actions — declared for future programmatic wiring
950 QAction *mActionAddJunction = nullptr;
951 QAction *mActionAddOutfall = nullptr;
952 QAction *mActionAddStorage = nullptr;
953 QAction *mActionAddConduit = nullptr;
954 QAction *mActionDeleteObject = nullptr;
955
956 // macOS-style Window menu (programmatically built — the .ui has no
957 // menuWindow). Entries rebuild on every MDI subWindowActivated and on
958 // each project window's windowTitleChanged so the list stays in sync.
959 QMenu *mMenuWindow = nullptr;
960 QAction *mActionWindowMinimize = nullptr;
961 QAction *mActionWindowZoom = nullptr;
962 QAction *mActionWindowBringAllToFront = nullptr;
963 QAction *mActionWindowResetPositions = nullptr;
964
965 OpenSWMMVisWorkspace *mProject = nullptr;
966 SWMMVisProjectWindow *mActiveProjectWindow = nullptr; // last-bound project; survives transient focus loss
967
968 SWMMVisProjectWindow *activeProjectWindow() const;
969 MapCanvas *activeCanvas() const;
970
974 bool zoomCanvasToSelection(MapCanvas *c) const;
975};
976
977#endif // SWMMVIS_H
Central coordinator for result-layer time-stepping and playback.
Definition animationcontroller.h:43
Definition attributetablepanel.h:51
An editable, GeoPackage-backed vector layer.
Definition featurelayer.h:127
A map layer backed by a GDAL raster dataset.
Definition gisrasterlayer.h:61
Embeddable widget containing the layer tree.
Definition layertreepanel.h:274
The central map display widget — QGIS-style hybrid rendering.
Definition mapcanvas.h:63
Definition mesheditingtoolbar.h:55
Embeddable object-navigation widget. Mirrors the legacy Delphi browser's per-type collapsible groups ...
Definition objectbrowserpanel.h:46
Weighted, monotonic progress aggregator for one project open.
Definition loadprogress.h:114
Abstract base class for all layers displayed in the MapCanvas.
Definition openswmmvislayer.h:116
LogMessageType
Severity classification for a log record.
Definition openswmmvislogmessage.h:44
@ Information
Definition openswmmvislogmessage.h:45
Top-level project container managing sessions, the SWMM model layer, and persistence paths for one SW...
Definition openswmmvisworkspace.h:42
Definition profileplotdialog.h:62
A dock widget that displays and edits object attributes using QPropertyModel.
Definition propertiespanel.h:57
Definition swmm2dmeshlayer.h:64
Definition swmm2dresultslayer.h:550
Overlays time-stepped simulation results on the SWMM network geometry.
Definition swmmresultslayer.h:96
Main application window for SWMMVis.
Definition swmmvis.h:100
void onLogMessage(const QString &message, OpenSWMMVisLogMessage::LogMessageType messageType=OpenSWMMVisLogMessage::LogMessageType::Information)
Appends a log entry to the Message Log dock panel.
Definition swmmvis.cpp:450
QStringList acceptableDropPaths(const QMimeData *mime) const
Definition swmmvis.cpp:397
bool eventFilter(QObject *watched, QEvent *event) override
Definition swmmvis.cpp:4910
QMdiSubWindow * welcomeSubWindow() const
Definition swmmvis.cpp:4959
bool saveProjectWindowAs(SWMMVisProjectWindow *pw)
The Save As flow (path dialog, filter memory, normalization, write) for pw. Returns false when the us...
Definition swmmvis.cpp:5123
QMenu * createPopupMenu() override
Definition swmmvisactions.cpp:524
virtual ~SWMMVis()
Destructor. Saves window geometry and dock layout to QSettings.
Definition swmmvis.cpp:390
void dragEnterEvent(QDragEnterEvent *event) override
Definition swmmvis.cpp:417
void dragMoveEvent(QDragMoveEvent *event) override
Definition swmmvis.cpp:425
void logPortabilityPreflight(SWMMVisProjectWindow *pw, const QString &targetPath, bool isGpkg)
Run the pre-save portability check for pw against targetPath and log any warnings.
Definition swmmvis.cpp:5063
void closeEvent(QCloseEvent *event) override
Definition swmmvis.cpp:4831
void dropEvent(QDropEvent *event) override
Definition swmmvis.cpp:433
void removeWelcomeSubWindow()
Definition swmmvis.cpp:4968
MDI sub-window owning a MapCanvas, SWMMModelLayer, and map tools.
Definition swmmvisprojectwindow.h:58
Two-level QAbstractItemModel for the Simulation Status dock.
Definition simulationstatusmodel.h:98
Represents a coordinate reference system backed by a GDAL OGRSpatialReference.
Definition spatialreferencesystem.h:28
Toolbar for selecting an active DTM raster and setting node/link invert offsets used during interacti...
Definition terraintoolbar.h:35
Definition compacttoolbarcontroller.h:30
Definition comparisonplotdialog.h:65
Definition cursorwindowslider.h:30
Definition featurelayerpanel.h:45
Definition layerstylingdock.h:38
Definition legenddock.h:38
Definition rainfallvisualizationdialog.h:57
Definition ribbongroup.h:51
Right-dock vector section / profile view for the selected object.
Definition sectionviewpanel.h:42
bool ok
Definition inpmeshwriter.cpp:575
Definition swmmvis.h:40
Definition meshcommands.h:302
PlotAttribute
What a series plots. One row per attribute in the Nx2 grid.
Definition plotattribute.h:38
Definition examplesseeder.h:26
Definition openswmmvislayer.h:43
Immutable plain-data log message stamped with a severity level and wall-clock time.
Slice BL — canonical enumeration of plottable result attributes.
Path-routing primitives over an abstract weighted graph, used by Slice BC's profile-path picker.
EdgeRef ref
Definition pslgminsize.cpp:377
int path
Definition pslgminsize.cpp:234
QVector< int > parent
union-find
Definition pslgminsize.cpp:176
QString text
Definition queryparser.cpp:35
QString message
Definition queryparser.cpp:150
Y2b-1 (amendment D-Y4) — one plottable result, fixed or species.
const char * title
Definition snowpackeditordialog.cpp:71
A single candidate path: ordered node sequence (length N+1) of engine node indices,...
Definition profilerouter.h:80
Everything a blank untitled project needs — the in-memory replacement for the synthetic temp ....
Definition swmmmodellayer.h:296
Identifies a single SWMM object.
Definition selectionmanager.h:32
One plottable result: a fixed attribute OR a species by name.
Definition resultdescriptor.h:39
Definition examplesseeder.h:30
Map layer that renders an OpenSWMMEngine network (nodes, links, subcatchments, rain gages) and provid...