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
openswmmvis::ui Namespace Reference

Namespaces

namespace  extcol
 
namespace  theme
 

Classes

struct  ActionCatalogEntry
 
class  ActionRegistry
 
class  AquiferEditorDialog
 
class  AquiferListModel
 
class  AssignRainGagesDialog
 
class  AttributePickerMenu
 
class  BuildupTableModel
 
class  CalibrationDataDialog
 
struct  CalibrationEntry
 
struct  CategoryInfo
 User-visible label + Qt resource alias for a category. Returned by categoryInfo(); the strings are static (resource aliases under :/swmmvis/ are compile-time constants). More...
 
class  ChartAxisFormatController
 
class  ChartPropertiesDialog
 
class  ClassificationEditor
 
class  ClassificationSchemeCellEditor
 
class  ColorButton
 
class  ColorCellDelegate
 
class  ColorRampEditorDialog
 
class  CommandPalette
 
class  CommandPaletteModel
 
class  CompactToolbarController
 
class  ComparisonPairsDialog
 
class  ComparisonPlotDialog
 
class  ContourBandSymbolStyleEditor
 
class  CursorWindowSlider
 
class  CurveEditChartView
 
class  CurveEditorDialog
 
class  CurvePointTableModel
 
class  CustomReportDialog
 
class  DashStyleCombo
 
class  DatesPage
 
class  DateTimeDelegate
 QDateTimeEdit-in-a-cell, formatted MM/dd/yyyy HH:mm. More...
 
class  DialogLayoutWatcher
 
class  DialogRegistry
 
struct  EngineCapabilities
 What this engine build accepts, probed once. More...
 
class  EnumComboDelegate
 
struct  ExternalSeriesPoint
 One parsed sample: SWMM DateTime (days since 1899-12-30) + value. More...
 
class  FeatureLayerPanel
 
class  FeatureStyleEditorBase
 
class  FigureCapture
 Drives a manifest of figures to PNG, then quits the application. More...
 
struct  FigureResult
 Result of attempting one row; serialised into run.json. More...
 
struct  FigureSpec
 One row of the manifest: a figure and how to reach it. More...
 
class  FilesPage
 
class  GisVectorSymbolEditor
 
class  GraduatedRendererBinding
 Bridges the editor's ClassificationScheme onto a 1D per-kind GraduatedRenderer without changing the renderer's JSON. More...
 
class  GwfExpressionEdit
 
class  GwfSyntaxHighlighter
 Palette-driven highlighter for one [GWF] expression line. More...
 
class  HillshadeSymbolStyleEditor
 
class  HydraulicsPage
 
class  IClassificationBinding
 What ClassificationEditor talks to instead of a concrete model. More...
 
class  IconFactory
 
class  ILayerStyleSubject
 One styleable thing the dialog can edit. More...
 
class  InfilAssignToSelectionDialog
 
class  InletDrawingView
 
class  InletEditorDialog
 
class  InletJunctionSetupDialog
 
class  InletListModel
 
class  InletPropertyBag
 
class  InletSceneBuilder
 Pure scene factory for one inlet design. More...
 
struct  InletTheme
 Colours for the drawing. Taken from the widget palette — the same source StreetSectionPreview uses — so the drawing follows the app theme without a second palette to keep in sync. More...
 
class  InteractiveChartView
 
class  IRendererPanel
 
class  IsolineSymbolStyleEditor
 
class  IStyleEditorWidget
 Custom editor widget for one style subject. More...
 
class  KindRendererPanel
 
class  KindTreeSymbologyPanel
 
class  LabelConfigEditor
 
class  LabelExpressionDialog
 
class  LabelsTab
 
class  LandUseEditorDialog
 
class  LandUseListModel
 
class  LayerStyleDialog
 
class  LayerStyleSubject
 
class  LayerStylingDock
 
class  LegendColorDelegate
 
class  LegendDock
 
class  LegendLayerTreeModel
 
class  LegendOverlay
 
class  LegendPropertiesDialog
 
class  LidControlEditorDialog
 
class  LidControlListModel
 
class  LineFeatureStyleEditor
 
class  LineSymbolStyleEditor
 
class  MarkerShapeCombo
 
class  MarkerShapeEditor
 
class  Mesh2DAquiferModel
 The [2D_AQUIFER] rows: scope, the five positional columns, and the law/closure selections. More...
 
class  Mesh2DAquiferNodeModel
 The [2D_AQUIFER_NODE] beds: which 1D node exchanges with which cell, through what conductance. More...
 
struct  Mesh2DExportDialogInputs
 What the dialog needs to know about the run it is exporting. More...
 
class  Mesh2DGroundwaterDialog
 
class  Mesh2DResultsExportDialog
 
class  MeshAttributeAssignDialog
 
class  MeshEdgeSymbolStyleEditor
 
class  MeshNodeSymbolStyleEditor
 
class  MeshPage
 
class  ModelsPage
 
class  NewFeatureLayerDialog
 
class  OverviewMapPanel
 
class  OverviewMapWidget
 
class  PatternEditChartView
 
class  PatternEditorDialog
 
class  PatternFactorTableModel
 
class  PerAttributeThemingWidget
 
class  PerformancePage
 
class  PlotVariablePickerDialog
 
class  PointFeatureStyleEditor
 
class  PointSymbolStyleEditor
 
class  PollutantEditorDialog
 
class  PollutantListModel
 
class  PolygonFeatureStyleEditor
 
class  PolygonSymbolStyleEditor
 
class  QualityFunctionTableModel
 Shared base: pollutant rows + one bound (engine, land use) target. More...
 
class  QualityPage
 
class  RainfallVisualizationDialog
 
class  RangeSliderWidget
 
class  RasterColorRampSymbolStyleEditor
 
class  RasterSchemeBinding
 Drives the GraduatedRasterRenderer live on a GISRasterLayer. More...
 
class  RasterSymbologyPanel
 
class  ReactionExpressionDelegate
 
class  ReactionExpressionEdit
 
class  ReactionSyntaxHighlighter
 
class  RelativePathPicker
 A QLineEdit + browse-button widget that normalises display paths against a project anchor. More...
 
struct  RendererPanelContext
 Context passed to renderer-panel factories at construction time. More...
 
class  RendererPanelRegistrar
 
class  RendererPanelRegistry
 
struct  ReportSource
 
class  RibbonCompactor
 
class  RibbonGroup
 
struct  RibbonGroupWidths
 
class  RibbonSplitButton
 
class  RuleCodeEditor
 
class  RuleListModel
 
class  RulesEditorDialog
 
class  RuleStyleSubject
 Wraps a Rule as one ILayerStyleSubject for the legacy dialog. More...
 
class  RuleSymbologyTab
 
class  ScatterPlotDialog
 
class  SectionViewPanel
 Right-dock vector section / profile view for the selected object. More...
 
class  SeriesStyleEditor
 
class  ShortcutEditorWidget
 
class  SimOptionsContext
 
class  SimOptionsPage
 
class  SnowpackEditorDialog
 
class  SnowpackListModel
 
class  SpatialPage
 
class  StatisticsDashboardDialog
 
class  StatsSummaryPanel
 
class  StatusReportDialog
 
class  StreetEditorDialog
 
class  StreetListModel
 
class  StreetSectionPreview
 Lightweight schematic preview of a street cross-section. Draws the road crown, curb, depressed gutter and (optionally) backing from a StreetProvider's parameters. No Q_OBJECT — plain paintEvent widget. More...
 
class  StyleEditorRegistrar
 
class  StyleEditorRegistry
 Maps a property-object class name to an editor-widget factory. More...
 
class  StyleManagerDialog
 
class  StylePreviewSwatch
 
class  SublayerSchemeBinding
 Drives a ClassificationScheme stored by value on a style bag. More...
 
class  SunPositionThumb
 
class  Swmm2DMeshStylePanel
 
class  Swmm2DResultsStylePanel
 
class  SwmmElementSymbolEditor
 
class  SymbologyTab
 
class  TabularResultsDialog
 
struct  ThemeColors
 
class  ThemeManager
 
class  TimeseriesEditChartView
 
class  TimeseriesEditorDialog
 
class  TimeseriesListModel
 
class  TimeseriesTableModel
 
class  TitleNotesPage
 
class  TransectChartView
 
class  TransectEditorDialog
 
class  TransectListModel
 
class  TransectPropertyBag
 
class  TransectStationTableModel
 
class  TreatmentExpressionDelegate
 
class  TreatmentExpressionEdit
 
class  TreatmentSyntaxHighlighter
 Palette-driven highlighter for one treatment expression line. More...
 
class  TypeConversionFlow
 
class  UserFlagsModel
 
class  VelocityVectorSymbolStyleEditor
 
class  WashoffTableModel
 

Typedefs

using ReportViewerDialog = StatusReportDialog
 
using Style = OpenSWMM::Render::LegendOverlayStyle
 

Enumerations

enum  ActionTag : unsigned {
  NoTags = 0u ,
  RequiresProject = 1u << 0 ,
  RequiresEditSession = 1u << 1 ,
  Contextual2D = 1u << 2
}
 
enum class  LayerCapability : unsigned int {
  Information = 1u << 0 ,
  Source = 1u << 1 ,
  Symbology = 1u << 2 ,
  Labels = 1u << 3 ,
  Rendering = 1u << 4 ,
  Metadata = 1u << 5
}
 Which tabs apply to a given layer type. More...
 
enum  CategoryId {
  CatSwmm = 0 ,
  CatMeshes ,
  CatSwmm1DOutputs ,
  CatSwmm2DOutputs ,
  CatFeatureLayers ,
  CatRasterLayers ,
  CatBasemaps ,
  CatTables ,
  CatCount
}
 Top-level layer-tree groups. More...
 
enum class  LayerTypeOrdinal : int {
  SWMMDefaultLayer = 0 ,
  SWMMModelLayer = 1 ,
  SWMMResultsLayer = 2 ,
  SWMMGISLayer = 3 ,
  SWMMVectorLayer = 4 ,
  SWMMRasterLayer = 5 ,
  SWMMImageryLayer = 6 ,
  SWMMTabularDataLayer = 7 ,
  SWMMTabularyTimeSeriesLayer = 8 ,
  SWMMSubProjectLayer = 9 ,
  SWMMWMSLayer = 10 ,
  SWMMWMTSLayer = 11 ,
  SWMM2DMeshLayer = 12 ,
  SWMM2DResultsLayer = 13 ,
  SWMMAnnotationLayer = 14
}
 Mirror of OpenSWMMVisLayer::OpenSWMMVisLayerType — same ordinals, no Qt include cost. Used by tests so they can call categoryForLayerType() without pulling openswmmvislayer.h. More...
 
enum class  RibbonMode {
  Collapsed = 0 ,
  Compact = 1 ,
  Full = 2
}
 
enum class  FigureLane {
  Offscreen ,
  Live ,
  Human
}
 Which platform a figure can be captured on. More...
 

Functions

void saveDialogLayout (QWidget *root)
 Persist the dialog's geometry + every named QSplitter under it.
 
bool restoreDialogLayout (QWidget *root)
 Inverse of saveDialogLayout — restore geometry + splitter states.
 
QRect clampToVisibleScreen (const QRect &saved, int titleBarStrip=-1)
 Clamp a saved top-level geometry into currently-available screen space, so a window can never be restored somewhere unreachable.
 
void ensureWindowOnScreen (QWidget *widget, const QScreen *preferred=nullptr)
 Move/resize widget's window so it is reachable on a connected screen, using the live frame geometry to size the title-bar allowance.
 
void applyAlwaysOnTopPolicy (QDialog *d)
 Step H — pin the dialog above the main window so a map click doesn't hide it. Idempotent. Harmless on modal dialogs and on dialogs that already have the flag set. On macOS this is a no-op (the always-on-top hint would also float above other applications; Qt::Tool already keeps the dialog above the main window).
 
Qt::WindowFlags floatingPanelFlags ()
 Window flags for a modeless "floating panel" dialog that must stay above the application's OWN windows but never above other applications. macOS: a plain Qt::Dialog window (no Qt::Tool — that would hide the dialog when the app is deactivated; no WindowStaysOnTopHint — that floats above every app system-wide). The "stay above the main window" behaviour is instead provided by attaching the dialog as an NSWindow child window (see openswmmvis::platform::attachAsChildWindow, driven from the app-wide show event filter). Windows/X11: Qt::Tool + WindowStaysOnTopHint keeps the dialog above the main window (it does not leak across applications there).
 
Qt::WindowFlags stayAboveAppFlags ()
 Just the "keep above the app's other windows" hint, for full top-level (Qt::Window) dialogs that should NOT be turned into Tool panels. Empty on macOS — those dialogs are kept above the main window by the NSWindow child-window attachment instead; WindowStaysOnTopHint elsewhere.
 
LayerCapabilities layerCapabilities (OpenSWMMVisLayer *layer)
 
QList< SWMMResultsLayer * > profileResultSources (AnimationController *anim, SWMMVisProjectWindow *projectWindow, MapCanvas *canvas=nullptr)
 
std::vector< std::unique_ptr< ILayerStyleSubject > > subjectsFromRuleList (OpenSWMM::Render::RuleList *list)
 Build one RuleStyleSubject per Rule in list. Empty / null list yields an empty vector. RoutingIds are auto-assigned as "rule.0", "rule.1", ... — stable for the duration of the dialog session.
 
EngineCapabilities probeEngineCapabilities (SWMM_Engine e, const QString &version)
 Probe e once for everything the dialog gates on.
 
const char * transport2DKey (int speciesClass)
 The [2D_OPTIONS] key carrying one SWMM_TRANSPORT_CLASS_*, or "" for an unknown class.
 
QDoubleSpinBox * makeDSpin (QWidget *parent, double lo, double hi, double step, int decimals, double value, const QString &suffix=QString())
 
QSpinBox * makeSpin (QWidget *parent, int lo, int hi, int value)
 
QWidget * makeSublayerHeader (QWidget *parent, OpenSWMM::Render::ISublayer *sub, const QString &showLabel)
 
void installMdiWorkspaceChrome (QMdiArea *area, QWidget *welcome=nullptr)
 Make area's backdrop track the theme and give welcome an opaque background of its own.
 
CategoryId categoryForLayerType (int layerTypeOrdinal)
 Maps a layer-type ordinal to its tree category.
 
CategoryId categoryForLayerType (LayerTypeOrdinal t)
 Convenience overload taking the typed ordinal directly.
 
CategoryInfo categoryInfo (CategoryId id)
 Returns the display label + icon alias for a category.
 
const ThemeColorslightColors ()
 
const ThemeColorsdarkColors ()
 
int ribbonRowWidth (const QVector< RibbonGroupWidths > &groups, const QVector< RibbonMode > &modes, int spacing)
 
QVector< RibbonModesolveRibbonModes (int availableWidth, const QVector< RibbonGroupWidths > &groups, int spacing)
 
QVector< RibbonModeapplyRibbonHysteresis (const QVector< RibbonMode > &previous, int availableWidth, const QVector< RibbonGroupWidths > &groups, int spacing, int deadBand=32)
 
QStringList readHeaders (const QString &path, QString *errorOut=nullptr, bool *fabricatedOut=nullptr)
 Enumerate the value-column names of path (time column excluded).
 
int readColumn (const QString &path, const QString &columnSelector, QVector< ExternalSeriesPoint > &pointsOut, QStringList *headersOut=nullptr, QString *errorOut=nullptr, bool *fabricatedOut=nullptr)
 Read one column of path into pointsOut.
 
QString reconcileColumnSelector (const QString &path, const QString &current)
 The column selector path should carry, given current.
 
int fuzzyScore (const QString &pattern, const QString &candidate)
 
QPropertyItemDelegate * makeStyleDelegate (QObject *parent)
 
 REGISTER_STYLE_EDITOR (PointFeatureSublayerStyle, [](QObject *obj, QWidget *parent) -> IStyleEditorWidget *{ if(auto *s=qobject_cast< PointFeatureSublayerStyle * >(obj)) return new PointFeatureStyleEditor(s, parent);return nullptr;}) REGISTER_STYLE_EDITOR(LineFeatureSublayerStyle
 
 REGISTER_STYLE_EDITOR (PointSymbolStyleAdapter, [](QObject *obj, QWidget *parent) -> IStyleEditorWidget *{ if(auto *a=qobject_cast< PointSymbolStyleAdapter * >(obj)) return new PointSymbolStyleEditor(a, parent);return nullptr;}) REGISTER_STYLE_EDITOR(LineSymbolStyleAdapter
 

Variables

constexpr ActionCatalogEntry kActionCatalog []
 
constexpr std::size_t kActionCatalogSize = std::size(kActionCatalog)
 
constexpr const char * kActionCatalogTabs []
 Known compact-toolbar tab ids ("" = menu-only entry).
 
constexpr char kNoLayoutPersistenceProp [] = "noLayoutPersistence"
 Dynamic property opting a QDialog out of automatic persistence.
 
constexpr char kLayoutRestoredOnceProp [] = "layoutRestoredOnce"
 Instance property marking that the first-show restore already ran.
 
constexpr int kSpinMinWidthPx = 110
 
constexpr int kComboMinWidthPx = 140
 
constexpr int kDefaultCategoryDisplayOrder [CatCount]
 Default top-to-bottom order of the category groups in the layer tree AND in the canvas paint stack (index 0 = top of tree = drawn last). Results groups sit on top because they overlay the model / mesh for analysis; tables sit at the bottom.
 
constexpr int kRibbonRowHeight = 100
 
constexpr int kRibbonIconFull = 32
 Icon edge in Full mode.
 
constexpr int kRibbonIconCompact = 24
 Icon edge in Compact mode.
 
QObject * obj
 
QObject QWidget *parent IStyleEditorWidget *return nullptr
 

Typedef Documentation

◆ ReportViewerDialog

◆ Style

Enumeration Type Documentation

◆ ActionTag

enum openswmmvis::ui::ActionTag : unsigned
Enumerator
NoTags 
RequiresProject 

Enabled only while a project is open (applyProjectOpenToActions set).

RequiresEditSession 

Enabled only during an explicit edit session (applyEditSessionToActions set).

Contextual2D 

Belongs to the contextual Mesh 2D surface.

◆ CategoryId

Top-level layer-tree groups.

   Order is the default display order. Categories with no layers
   are hidden by rebuildCategories() in layertreepanel.cpp. The
   user can permute the order via the right-click "Move Category
   Up/Down" menu or by dragging the header — that permutation is
   per project (MapCanvas::layerGroupOrder()), not here.
Enumerator
CatSwmm 
CatMeshes 
CatSwmm1DOutputs 
CatSwmm2DOutputs 
CatFeatureLayers 
CatRasterLayers 
CatBasemaps 
CatTables 
CatCount 

◆ FigureLane

enum class openswmmvis::ui::FigureLane
strong

Which platform a figure can be captured on.

Enumerator
Offscreen 

widget-only; no display needed (the default)

Live 

needs real scene-graph pixels — cocoa on a real display

Human 

native menus / file pickers / Finder — engine skips it

◆ LayerCapability

enum class openswmmvis::ui::LayerCapability : unsigned int
strong

Which tabs apply to a given layer type.

   Information / Rendering / Metadata are universal (every layer
   type has them).  Source applies when the layer has an editable
   CRS or filter expression.  Symbology and Labels are gated per
   the §X.3.1 table.  The dialog skips any tab whose capability
   flag is false — no empty placeholders.
Enumerator
Information 
Source 
Symbology 
Labels 
Rendering 
Metadata 

◆ LayerTypeOrdinal

enum class openswmmvis::ui::LayerTypeOrdinal : int
strong

Mirror of OpenSWMMVisLayer::OpenSWMMVisLayerType — same ordinals, no Qt include cost. Used by tests so they can call categoryForLayerType() without pulling openswmmvislayer.h.

The .cpp static_asserts this stays in lockstep with the source enum, so adding a new layer type without updating both will fail the build instead of silently mis-bucketing.

Enumerator
SWMMDefaultLayer 
SWMMModelLayer 
SWMMResultsLayer 
SWMMGISLayer 
SWMMVectorLayer 
SWMMRasterLayer 
SWMMImageryLayer 
SWMMTabularDataLayer 
SWMMTabularyTimeSeriesLayer 
SWMMSubProjectLayer 
SWMMWMSLayer 
SWMMWMTSLayer 
SWMM2DMeshLayer 
SWMM2DResultsLayer 
SWMMAnnotationLayer 

◆ RibbonMode

enum class openswmmvis::ui::RibbonMode
strong
Enumerator
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

Function Documentation

◆ applyAlwaysOnTopPolicy()

void openswmmvis::ui::applyAlwaysOnTopPolicy ( QDialog *  d)

Step H — pin the dialog above the main window so a map click doesn't hide it. Idempotent. Harmless on modal dialogs and on dialogs that already have the flag set. On macOS this is a no-op (the always-on-top hint would also float above other applications; Qt::Tool already keeps the dialog above the main window).

Here is the caller graph for this function:

◆ applyRibbonHysteresis()

QVector< RibbonMode > openswmmvis::ui::applyRibbonHysteresis ( const QVector< RibbonMode > &  previous,
int  availableWidth,
const QVector< RibbonGroupWidths > &  groups,
int  spacing,
int  deadBand = 32 
)
inline

solveRibbonModes with a promotion dead band.

Demotions (vs previous) apply immediately — shrinking must always fit. A promotion is accepted only if it would also hold with deadBand fewer pixels, so a window dragged across a boundary doesn't flap between modes. A previous of a different size (group added/removed) falls back to the plain solve.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ categoryForLayerType() [1/2]

CategoryId openswmmvis::ui::categoryForLayerType ( int  layerTypeOrdinal)

Maps a layer-type ordinal to its tree category.

   Unrecognised ordinals return CatFeatureLayers (matches the
   runtime fall-back behaviour, but without the qWarning() that the
   full layertreepanel.cpp version emits — a headless helper has
   nowhere sensible to log).
Here is the caller graph for this function:

◆ categoryForLayerType() [2/2]

CategoryId openswmmvis::ui::categoryForLayerType ( LayerTypeOrdinal  t)
inline

Convenience overload taking the typed ordinal directly.

Here is the call graph for this function:

◆ categoryInfo()

CategoryInfo openswmmvis::ui::categoryInfo ( CategoryId  id)

Returns the display label + icon alias for a category.

◆ clampToVisibleScreen()

QRect openswmmvis::ui::clampToVisibleScreen ( const QRect &  saved,
int  titleBarStrip = -1 
)

Clamp a saved top-level geometry into currently-available screen space, so a window can never be restored somewhere unreachable.

saved is a CLIENT rect (what QWidget::geometry() / setGeometry() use). titleBarStrip is the height of the frame decoration above that rect — the window's only drag handle, which must stay inside the available area or the window cannot be moved at all. Pass -1 for a platform default.

Rules, in order:

  • target screen = the one the window's FRAME overlaps most (a rect straddling two monitors keeps the monitor it mostly sits on, instead of being yanked to primary because its center fell in the gap);
  • the rect is shrunk to fit that screen (a window saved on a large display must not stay oversized when restored on a small one);
  • if less than a grabbable slice would be visible, or the title bar would land above the available area, the rect is translated minimally back inside — position is preserved wherever it is already usable.

Pure function of its inputs plus the current screen layout: safe to unit test and reusable by any window-recovery path.

Here is the caller graph for this function:

◆ darkColors()

const ThemeColors & openswmmvis::ui::darkColors ( )
inline
Here is the caller graph for this function:

◆ ensureWindowOnScreen()

void openswmmvis::ui::ensureWindowOnScreen ( QWidget *  widget,
const QScreen *  preferred = nullptr 
)

Move/resize widget's window so it is reachable on a connected screen, using the live frame geometry to size the title-bar allowance.

With preferred non-null the window is additionally CENTERED on that screen unconditionally — the "Reset Window Positions" recovery path, which gathers every open window onto the main window's display. No-op when preferred is null and the window is already well placed.

Note
Only the title-bar strip above the client rect is modelled; left, right and bottom frame borders (Windows/Linux) are not, so a restored window can still sit a few border pixels past those edges.
Here is the call graph for this function:

◆ floatingPanelFlags()

Qt::WindowFlags openswmmvis::ui::floatingPanelFlags ( )
inline

Window flags for a modeless "floating panel" dialog that must stay above the application's OWN windows but never above other applications. macOS: a plain Qt::Dialog window (no Qt::Tool — that would hide the dialog when the app is deactivated; no WindowStaysOnTopHint — that floats above every app system-wide). The "stay above the main window" behaviour is instead provided by attaching the dialog as an NSWindow child window (see openswmmvis::platform::attachAsChildWindow, driven from the app-wide show event filter). Windows/X11: Qt::Tool + WindowStaysOnTopHint keeps the dialog above the main window (it does not leak across applications there).

Here is the caller graph for this function:

◆ fuzzyScore()

int openswmmvis::ui::fuzzyScore ( const QString &  pattern,
const QString &  candidate 
)

Fuzzy relevance of pattern against candidate (case-insensitive). -1 = no subsequence match; higher is better. Prefix matches beat word-boundary subsequences beat scattered subsequences; shorter candidates win ties.

◆ installMdiWorkspaceChrome()

void openswmmvis::ui::installMdiWorkspaceChrome ( QMdiArea *  area,
QWidget *  welcome = nullptr 
)

Make area's backdrop track the theme and give welcome an opaque background of its own.

Backdrop: QMdiArea snapshots palette(QPalette::Dark) once in its constructor and has no PaletteChange handling, so a theme installed after construction — as ThemeManager is, SWMMVis being built first — leaves the workspace painted in the pre-theme brush.

Welcome: uic emits welcomeWidget as a bare QWidget, so it has no autoFillBackground and paints nothing behind its own children. That is why the backdrop showed through the whole welcome tab — and the backdrop is not the only thing below it. In TabbedView QMdiArea never hides the outgoing sub-window; _q_deactivateAllWindows merely showNormal()s it (qmdiarea.cpp:685) and relies on the incoming maximized window to cover the viewport. So after welcome → model → welcome the model sub-window is still sitting in the viewport as a 200x150 framed child, and a transparent welcome on top of it is not a cover: the user sees a detached, undocked model window painted over the welcome screen.

setAutoFillBackground() fills with QPalette::Window, which ThemeManager sets to surfaceWindow (thememanager.cpp:87) — the same token the backdrop uses, so the welcome looks unchanged — and it is re-read at every paint, so the Appearance switch needs no extra hook here.

Safe to call once per area; a null area or welcome is a no-op.

Here is the call graph for this function:

◆ layerCapabilities()

LayerCapabilities openswmmvis::ui::layerCapabilities ( OpenSWMMVisLayer layer)

Return the capability mask for a layer based on its layerType + class.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ lightColors()

const ThemeColors & openswmmvis::ui::lightColors ( )
inline
Here is the caller graph for this function:

◆ makeDSpin()

QDoubleSpinBox * openswmmvis::ui::makeDSpin ( QWidget *  parent,
double  lo,
double  hi,
double  step,
int  decimals,
double  value,
const QString &  suffix = QString() 
)
inline
Here is the caller graph for this function:

◆ makeSpin()

QSpinBox * openswmmvis::ui::makeSpin ( QWidget *  parent,
int  lo,
int  hi,
int  value 
)
inline

◆ makeStyleDelegate()

QPropertyItemDelegate * openswmmvis::ui::makeStyleDelegate ( QObject *  parent)

New a QPropertyItemDelegate, register the ClassificationScheme cell editor on it, and return it. Caller installs it via QTreeView::setItemDelegate.

◆ makeSublayerHeader()

QWidget * openswmmvis::ui::makeSublayerHeader ( QWidget *  parent,
OpenSWMM::Render::ISublayer sub,
const QString &  showLabel 
)
inline

"Show <name>" checkbox + opacity spin bound to the sublayer's visibility / opacity — the shared header row of every tab.

Here is the call graph for this function:

◆ probeEngineCapabilities()

EngineCapabilities openswmmvis::ui::probeEngineCapabilities ( SWMM_Engine  e,
const QString &  version 
)

Probe e once for everything the dialog gates on.

Parameters
eEngine handle; may be null (every capability reads false).
versionEngine version string as passed to the dialog.
Here is the caller graph for this function:

◆ profileResultSources()

QList< SWMMResultsLayer * > openswmmvis::ui::profileResultSources ( AnimationController anim,
SWMMVisProjectWindow projectWindow,
MapCanvas canvas = nullptr 
)
inline
Here is the call graph for this function:

◆ readColumn()

int openswmmvis::ui::readColumn ( const QString &  path,
const QString &  columnSelector,
QVector< ExternalSeriesPoint > &  pointsOut,
QStringList *  headersOut = nullptr,
QString *  errorOut = nullptr,
bool *  fabricatedOut = nullptr 
)

Read one column of path into pointsOut.

Parameters
columnSelectorColumn name; matched case-insensitively against readHeaders() names (engine parity). Empty selects the first data column; a non-empty name that matches nothing FAILS (the engine errors on it — review B-3 — so no silent first-column fallback). A headerless file resolves no name at all: only an empty selector reads it.
pointsOutCleared, then filled sorted ascending in time. Cells that are missing or non-numeric are skipped (mirrors the engine's copy-out of NaN cells). For a headerless file the first content line is consumed as the header row, exactly as the engine does, so both agree on which rows are data.
headersOutOptional; receives the same list readHeaders() returns, from the same single pass — populated even when the column selector fails to resolve.
errorOutOptional; human-readable reason on failure.
fabricatedOutOptional; see readHeaders().
Returns
the number of points loaded, or -1 when the file cannot be opened / has no usable header / the selector matched no column.

◆ readHeaders()

QStringList openswmmvis::ui::readHeaders ( const QString &  path,
QString *  errorOut = nullptr,
bool *  fabricatedOut = nullptr 
)

Enumerate the value-column names of path (time column excluded).

TSF → the IDs row's tokens; CSV/TSV → header cells, or fabricated "col_N" names when the first content line is itself a data row. Returns an empty list for unreadable files and for headerless whitespace formats (SWMM .dat / standard rain files) — those have no columns to pick.

Parameters
errorOutOptional; receives a human-readable reason on failure.
fabricatedOutOptional; true when the names are fabricated (headerless file). Such a name cannot be resolved by the engine, so callers must not persist it in a "path:col" token — only the first data column of a headerless file is addressable, via an EMPTY selector (review B-4 / risk R1).
Here is the caller graph for this function:

◆ reconcileColumnSelector()

QString openswmmvis::ui::reconcileColumnSelector ( const QString &  path,
const QString &  current 
)

The column selector path should carry, given current.

Answers the "the file just changed — now what?" question for every editor that binds a column to a path, so the timeseries dialog, the rain-gage property row and the rain-gage attribute cell all reconcile identically:

  • current still names a column of the new file → current, unchanged (case preserved as the file spells it, so the stored token matches the file);
  • the file has real headers but current names none of them (including the empty selector) → its FIRST value column, which is what an editor would otherwise leave the user to pick by hand;
  • the file has no usable headers — headerless, whitespace-delimited or unreadable → EMPTY, because a fabricated "col_N" is not resolvable by the engine and a stale name from the previous file would fail the run (review B-4 / risk R1).

Callers compare the result with current and write only on a change, so a path edit that leaves the binding valid costs nothing.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ REGISTER_STYLE_EDITOR() [1/2]

openswmmvis::ui::REGISTER_STYLE_EDITOR ( PointFeatureSublayerStyle  ,
[] (QObject *obj, QWidget *parent) -> IStyleEditorWidget *{ if(auto *s=qobject_cast< PointFeatureSublayerStyle * >(obj)) return new PointFeatureStyleEditor(s, parent);return nullptr;}   
)

◆ REGISTER_STYLE_EDITOR() [2/2]

openswmmvis::ui::REGISTER_STYLE_EDITOR ( PointSymbolStyleAdapter  ,
[] (QObject *obj, QWidget *parent) -> IStyleEditorWidget *{ if(auto *a=qobject_cast< PointSymbolStyleAdapter * >(obj)) return new PointSymbolStyleEditor(a, parent);return nullptr;}   
)

◆ restoreDialogLayout()

bool openswmmvis::ui::restoreDialogLayout ( QWidget *  root)

Inverse of saveDialogLayout — restore geometry + splitter states.

Restored geometry is clamped to currently-available screen real estate so a saved position on a now-disconnected monitor doesn't render off-screen.

Returns
true if any state was restored (caller can skip its defaults); false on first-open (caller applies its hard-coded defaults).
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ribbonRowWidth()

int openswmmvis::ui::ribbonRowWidth ( const QVector< RibbonGroupWidths > &  groups,
const QVector< RibbonMode > &  modes,
int  spacing 
)
inline

Total row width of groups under modes, with spacing between adjacent groups.

Here is the caller graph for this function:

◆ saveDialogLayout()

void openswmmvis::ui::saveDialogLayout ( QWidget *  root)

Persist the dialog's geometry + every named QSplitter under it.

Walks root->findChildren<QSplitter*>() and stores each splitter's saveState() under Dialogs/<root-objectName>/splitter/<splitter-objectName>. Splitters without an objectName are skipped (forces deliberate opt-in).

No-op when root has no objectName (we'd have nowhere to file it). Safe to call on any QWidget — passes through to its window.

Here is the caller graph for this function:

◆ solveRibbonModes()

QVector< RibbonMode > openswmmvis::ui::solveRibbonModes ( int  availableWidth,
const QVector< RibbonGroupWidths > &  groups,
int  spacing 
)
inline

Demote trailing groups until the row fits availableWidth.

Pass 1 walks from the trailing end demoting Full → Compact; if the row still overflows, pass 2 walks again demoting Compact → Collapsed (collapsible groups only). A row that cannot fit even fully demoted returns the maximally-demoted assignment — the toolbar's extension chevron is the final backstop.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ stayAboveAppFlags()

Qt::WindowFlags openswmmvis::ui::stayAboveAppFlags ( )
inline

Just the "keep above the app's other windows" hint, for full top-level (Qt::Window) dialogs that should NOT be turned into Tool panels. Empty on macOS — those dialogs are kept above the main window by the NSWindow child-window attachment instead; WindowStaysOnTopHint elsewhere.

Here is the caller graph for this function:

◆ subjectsFromRuleList()

std::vector< std::unique_ptr< ILayerStyleSubject > > openswmmvis::ui::subjectsFromRuleList ( OpenSWMM::Render::RuleList list)

Build one RuleStyleSubject per Rule in list. Empty / null list yields an empty vector. RoutingIds are auto-assigned as "rule.0", "rule.1", ... — stable for the duration of the dialog session.

Here is the call graph for this function:

◆ transport2DKey()

const char * openswmmvis::ui::transport2DKey ( int  speciesClass)

The [2D_OPTIONS] key carrying one SWMM_TRANSPORT_CLASS_*, or "" for an unknown class.

Shared vocabulary rather than a page member: the 2D page owns the TRANSPORT_* checkboxes, while the Models page's Domain × Species matrix names the same keys in its cell tooltips (CLAUDE.md §5.1 — one model, two views).

Here is the caller graph for this function:

Variable Documentation

◆ kActionCatalog

constexpr ActionCatalogEntry openswmmvis::ui::kActionCatalog[]
inlineconstexpr

◆ kActionCatalogSize

constexpr std::size_t openswmmvis::ui::kActionCatalogSize = std::size(kActionCatalog)
inlineconstexpr

◆ kActionCatalogTabs

constexpr const char* openswmmvis::ui::kActionCatalogTabs[]
inlineconstexpr
Initial value:
= {
"home", "model", "mesh2d", "analysis", "results", "view", "features",
}

Known compact-toolbar tab ids ("" = menu-only entry).

◆ kComboMinWidthPx

constexpr int openswmmvis::ui::kComboMinWidthPx = 140
inlineconstexpr

◆ kDefaultCategoryDisplayOrder

constexpr int openswmmvis::ui::kDefaultCategoryDisplayOrder[CatCount]
constexpr
Initial value:
= {
}
@ CatBasemaps
Definition layertreecategories.h:41
@ CatSwmm
Definition layertreecategories.h:35
@ CatRasterLayers
Definition layertreecategories.h:40
@ CatSwmm1DOutputs
Definition layertreecategories.h:37
@ CatMeshes
Definition layertreecategories.h:36
@ CatSwmm2DOutputs
Definition layertreecategories.h:38
@ CatTables
Definition layertreecategories.h:42
@ CatFeatureLayers
Definition layertreecategories.h:39

Default top-to-bottom order of the category groups in the layer tree AND in the canvas paint stack (index 0 = top of tree = drawn last). Results groups sit on top because they overlay the model / mesh for analysis; tables sit at the bottom.

Slice LTR-2026-09-19: the effective order is per project — it is held by MapCanvas::layerGroupOrder() and persisted in the .oswp canvas block. This array is only the seed for a canvas that has no saved order.

◆ kLayoutRestoredOnceProp

constexpr char openswmmvis::ui::kLayoutRestoredOnceProp[] = "layoutRestoredOnce"
inlineconstexpr

Instance property marking that the first-show restore already ran.

◆ kNoLayoutPersistenceProp

constexpr char openswmmvis::ui::kNoLayoutPersistenceProp[] = "noLayoutPersistence"
inlineconstexpr

Dynamic property opting a QDialog out of automatic persistence.

◆ kRibbonIconCompact

constexpr int openswmmvis::ui::kRibbonIconCompact = 24
inlineconstexpr

Icon edge in Compact mode.

◆ kRibbonIconFull

constexpr int openswmmvis::ui::kRibbonIconFull = 32
inlineconstexpr

Icon edge in Full mode.

◆ kRibbonRowHeight

constexpr int openswmmvis::ui::kRibbonRowHeight = 100
inlineconstexpr

Fixed height of the ribbon content + caption row (ArcGIS scale; sized for a 32 px icon over TWO wrapped label lines plus the group caption — see the kShortLabels '
' wrapping in swmmvisactions.cpp).

◆ kSpinMinWidthPx

constexpr int openswmmvis::ui::kSpinMinWidthPx = 110
inlineconstexpr

◆ nullptr

QObject QWidget *parent IStyleEditorWidget *return openswmmvis::ui::nullptr
Initial value:
{
if (auto *s = qobject_cast<LineFeatureSublayerStyle *>(obj))
return new LineFeatureStyleEditor(s, parent)
double s
Scene px per model length unit.
Definition inletdrawingview.cpp:82
QVector< int > parent
union-find
Definition pslgminsize.cpp:176

◆ obj

QObject * openswmmvis::ui::obj