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
actioncatalog.h
Go to the documentation of this file.
1#ifndef ACTIONCATALOG_H
2#define ACTIONCATALOG_H
3
36#include <iterator>
37
38namespace openswmmvis::ui {
39
40enum ActionTag : unsigned {
41 NoTags = 0u,
43 RequiresProject = 1u << 0,
47 Contextual2D = 1u << 2,
48};
49
51 const char *id;
52 const char *objectName;
53 const char *category;
54 const char *defaultShortcut;
55 const char *icon;
56 const char *tab;
57 const char *menuPath;
58 unsigned tags;
59};
60
61inline constexpr ActionCatalogEntry kActionCatalog[] = {
62 // ── File ────────────────────────────────────────────────────────────
63 {"file.new", "actionNew", "File", "std:New", "New", "home", "File", NoTags},
64 {"file.open", "actionOpen", "File", "std:Open", "Open", "home", "File", NoTags},
65 {"file.save", "actionSave", "File", "std:Save", "Save", "home", "File", NoTags},
66 {"file.saveAs", "actionSaveAs", "File", "std:SaveAs", "SaveAs", "", "File", NoTags},
67 {"file.exportMap", "actionExportMap", "File", "", "ExportMap", "", "File", NoTags},
68 {"file.print", "actionPrint", "File", "std:Print", "Print", "", "File", NoTags},
69 {"file.clearRecent", "actionClearRecentFiles", "File", "", "ClearRecent", "", "File/Open Recent", NoTags},
70 // Literal Ctrl+, (not std:Preferences): the offscreen QPA's platform
71 // theme resolves that StandardKey to nothing, and Ctrl+, is the
72 // convention on every platform anyway (Cmd+, on macOS via Qt::CTRL).
73 {"app.preferences", "actionSettings", "Application", "Ctrl+,", "Settings", "", "Tools", NoTags},
74 // Literal Ctrl+Q for the same offscreen-theme reason as app.preferences.
75 {"app.quit", "actionExit", "Application", "Ctrl+Q", "Exit", "", "File", NoTags},
76
77 // ── Edit / selection ────────────────────────────────────────────────
78 {"edit.undo", "actionUndo", "Edit", "std:Undo", "Undo", "home", "Edit", NoTags},
79 {"edit.redo", "actionRedo", "Edit", "std:Redo", "Redo", "home", "Edit", NoTags},
80 {"edit.copy", "actionCopy", "Edit", "std:Copy", "Copy", "home", "Edit", NoTags},
81 {"find.search", "actionSearch", "Edit", "std:Find", "Search", "home", "Edit", NoTags},
82 {"edit.editExisting", "actionEditExisting", "Edit", "Ctrl+E", "SelectEdit", "model", "Edit", NoTags},
83 {"select.invert", "actionInvertSelection", "Edit", "", "InvertSelection", "home", "Edit", NoTags},
84 {"select.upstream", "actionSelectUpstream", "Edit", "", "SelectUpstream", "home", "Edit", NoTags},
85 {"select.downstream", "actionSelectDownstream", "Edit", "", "SelectDownstream", "home", "Edit", NoTags},
86
87 // ── Map navigation / tools ──────────────────────────────────────────
88 {"map.pan", "actionPan", "Map", "", "Move", "home", "View", NoTags},
89 {"map.zoomIn", "actionZoomIn", "Map", "std:ZoomIn", "ZoomIn", "home", "View", NoTags},
90 {"map.zoomOut", "actionZoomOut", "Map", "std:ZoomOut", "ZoomOut", "home", "View", NoTags},
91 {"map.zoomExtent", "actionZoomExtent", "Map", "Ctrl+Shift+F", "Extent", "home", "View", NoTags},
92 {"map.zoomToSelection", "actionZoomToSelection", "Map", "Ctrl+Shift+J", "ZoomToSelection", "home", "View", NoTags},
93 {"map.select", "actionSelect", "Map", "", "Select", "home", "Edit", NoTags},
94 {"map.selectByPolygon", "actionSelectByPolygon", "Map", "", "SelectByPolygon", "home", "Edit", NoTags},
95 {"map.measure", "actionMeasure", "Map", "Ctrl+Shift+M", "Ruler", "home", "View", NoTags},
96
97 // ── Model authoring (enabled while a project is open) ───────────────
98 {"model.addJunction", "actionAddJunction", "Model", "", "Junction", "model", "Model/Add Node", RequiresProject},
99 {"model.addVirtualJunction", "actionAddVirtualJunction", "Model", "", "VirtualJunction", "model", "Model/Add Node", RequiresProject},
100 {"model.addJunctionSplit", "actionAddJunctionSplit", "Model", "", "JunctionSplit", "model", "Model/Add Node", RequiresProject},
101 {"model.addInletJunction", "actionAddInletJunction", "Model", "", "InletJunction", "model", "Model/Add Node", RequiresProject},
102 {"model.addOutfall", "actionAddOutfall", "Model", "", "Outfall", "model", "Model/Add Node", RequiresProject},
103 {"model.addFlowDivider", "actionAddFlowDivider", "Model", "", "Divider", "model", "Model/Add Node", RequiresProject},
104 {"model.addStorage", "actionAddStorage", "Model", "", "Storage", "model", "Model/Add Node", RequiresProject},
105 {"model.addPipe", "actionAddPipe", "Model", "", "Polyline", "model", "Model/Add Link", RequiresProject},
106 {"model.addPump", "actionAddPump", "Model", "", "Pump", "model", "Model/Add Link", RequiresProject},
107 {"model.addOrifice", "actionAddOrifice", "Model", "", "Orifice", "model", "Model/Add Link", RequiresProject},
108 {"model.addWeir", "actionAddWeir", "Model", "", "Weir", "model", "Model/Add Link", RequiresProject},
109 {"model.addOutlet", "actionAddOutlet", "Model", "", "Outlet", "model", "Model/Add Link", RequiresProject},
110 {"model.addSubcatchment", "actionAddSubcatchment", "Model", "", "Subcatchment", "model", "Model", RequiresProject},
111 {"model.addRainGage", "actionRainGauge", "Model", "", "Rainfall", "model", "Model", RequiresProject},
112 {"model.addText", "actionAddText", "Model", "", "Text", "model", "Model", RequiresProject},
113 {"model.importFeatureLayer", "actionImportFeatureLayer", "Model", "", "ImportGIS", "model", "Model", NoTags},
114 {"model.assignRainGages", "actionAssignRainGages", "Model", "", "AssignRainGages", "model", "Model", RequiresProject},
115 {"model.simulationOptions", "actionOptions", "Model", "", "Options", "model", "Model", NoTags},
116 {"model.userFlags", "actionUserFlags", "Model", "", "UserFlags", "model", "Model", NoTags},
117 {"model.editReactionSystem", "actionEditReactionSystem", "Model", "", "ReactionSystem", "model", "Model", NoTags},
118 {"model.editHeatConfig", "actionEditHeatConfig", "Model", "", "HeatConfig", "model", "Model", NoTags},
119 {"model.generateMesh", "actionGenerateMesh", "Model", "", "CreateMesh", "mesh2d", "Model", NoTags},
120
121 // ── Feature layers (user-drawn GeoPackage-backed vector layers;
122 // MESH_DIALOG_TABS_AND_FEATURE_LAYERS_PLAN §5.1) ─────────────────
123 // RequiresProject: every one of these writes into the project's own
124 // .features.gpkg, which is derived from the model path, so none of them
125 // means anything before a project is open.
126 {"features.newLayer", "actionNewFeatureLayer", "Features", "", "AddVector", "features", "Model/Feature Layers", RequiresProject},
127 // Edit mode gates the seven tools and the attribute grid, the way a GIS
128 // package does: nothing on a feature layer is mutable until it is on.
129 {"features.editMode", "actionFeatureEditMode", "Features", "", "Edit", "features", "Model/Feature Layers", RequiresProject},
130 {"features.delete", "actionFeatureDelete", "Features", "Del", "Delete", "features", "Model/Feature Layers", RequiresProject},
131 {"features.drawPoint", "actionFeatureDrawPoint", "Features", "", "Node", "features", "Model/Feature Layers", RequiresProject},
132 {"features.drawLine", "actionFeatureDrawLine", "Features", "", "Polyline", "features", "Model/Feature Layers", RequiresProject},
133 {"features.drawPolygon", "actionFeatureDrawPolygon", "Features", "", "Polygon", "features", "Model/Feature Layers", RequiresProject},
134 {"features.addPart", "actionFeatureAddPart", "Features", "", "Add", "features", "Model/Feature Layers", RequiresProject},
135 {"features.addHole", "actionFeatureAddHole", "Features", "", "Clear", "features", "Model/Feature Layers", RequiresProject},
136 {"features.editVertex", "actionFeatureEditVertex", "Features", "", "InsertVertex", "features", "Model/Feature Layers", RequiresProject},
137 {"features.moveFeature", "actionFeatureMove", "Features", "", "Move", "features", "Model/Feature Layers", RequiresProject},
138
139 // ── Climatology ─────────────────────────────────────────────────────
140 {"climate.temperature", "actionTemperature", "Climate", "", "Thermometer", "model", "Model/Climate", NoTags},
141 {"climate.evaporation", "actionEvaporation", "Climate", "", "Evaporation", "model", "Model/Climate", NoTags},
142 {"climate.wind", "actionWind", "Climate", "", "Wind", "model", "Model/Climate", NoTags},
143 {"climate.snow", "actionSnow", "Climate", "", "Snow", "model", "Model/Climate", NoTags},
144 {"climate.solarRadiation","actionSolarRadiation", "Climate", "", "Sun", "model", "Model/Climate", NoTags},
145
146 // ── Data objects (programmatic Data menu; objectNames assigned at
147 // creation in initializeMenus) ─────────────────────────────────────
148 {"data.newTimeSeries", "actionNewTimeSeries", "Data", "", "AddTimeSeries", "model", "Model/Data Objects", NoTags},
149 {"data.newCurve", "actionNewCurve", "Data", "", "AddCurve", "model", "Model/Data Objects", NoTags},
150 {"data.newPattern", "actionNewPattern", "Data", "", "AddPattern", "model", "Model/Data Objects", NoTags},
151 {"data.newLidControl", "actionNewLidControl", "Data", "", "LidControl", "model", "Model/Data Objects", NoTags},
152 {"data.newPollutant", "actionNewPollutant", "Data", "", "Pollutant", "model", "Model/Data Objects", NoTags},
153 {"data.newLandUse", "actionNewLandUse", "Data", "", "LandUse", "", "Model/Data Objects", NoTags},
154 {"data.newAquifer", "actionNewAquifer", "Data", "", "Aquifer", "model", "Model/Data Objects", NoTags},
155 {"data.newSnowpack", "actionNewSnowpack", "Data", "", "Snowpack", "", "Model/Data Objects", NoTags},
156 {"data.newControlRule", "actionNewControlRule", "Data", "", "AddControlRule", "model", "Model/Data Objects", NoTags},
157 {"data.newTransect", "actionNewTransect", "Data", "", "AddTransect", "model", "Model/Data Objects", NoTags},
158 {"data.newUnitHydrograph","actionNewUnitHydrograph","Data", "", "UnitHydrograph", "", "Model/Data Objects", NoTags},
159 {"data.newStreet", "actionNewStreet", "Data", "", "Street", "model", "Model/Data Objects", NoTags},
160 {"data.newInlet", "actionNewInlet", "Data", "", "Inlet", "model", "Model/Data Objects", NoTags},
161
162 // ── Layer / data import ─────────────────────────────────────────────
163 {"import.swmmOutput", "actionAddSWMMOutput", "Import", "", "AddSWMMOutput", "home", "File/Import", NoTags},
164 {"import.vector", "actionAddVectorData", "Import", "", "AddVector", "home", "File/Import", NoTags},
165 {"import.raster", "actionAddRasterData", "Import", "", "AddRaster", "home", "File/Import", NoTags},
166 {"import.wms", "actionAddWMSData", "Import", "", "AddWMS", "home", "File/Import", NoTags},
167 {"import.delimited", "actionAddDelimeteredData","Import", "", "AddDelimetered", "home", "File/Import", NoTags},
168 {"import.basemap", "actionAddBasemap", "Import", "", "AddBasemap", "", "File/Import", NoTags},
169 {"import.mesh2d", "actionAddMesh2D", "Import", "", "AddMesh", "home", "File/Import", NoTags},
170
171 // ── Simulation ──────────────────────────────────────────────────────
172 {"sim.run", "actionExecute", "Simulation", "Ctrl+R", "Execute", "home", "Analysis", NoTags},
173 {"sim.pause", "actionPauseExecution", "Simulation", "", "Pause", "home", "Analysis", NoTags},
174 {"sim.stop", "actionCancelExecution", "Simulation", "Ctrl+.", "CancelExecution", "home", "Analysis", NoTags},
175
176 // ── Results playback ────────────────────────────────────────────────
177 {"results.play", "actionPlay", "Playback", "", "Play", "results", "Results", NoTags},
178 {"results.pause", "actionPause", "Playback", "", "Pause", "results", "Results", NoTags},
179 {"results.stop", "actionStop", "Playback", "", "Stop", "results", "Results", NoTags},
180 {"results.skipBack", "actionSkipBack", "Playback", "", "SkipBack", "results", "Results", NoTags},
181 {"results.skipForward", "actionSkipForward", "Playback", "", "SkipForward", "results", "Results", NoTags},
182 {"results.setStyle", "actionSetStyle", "Playback", "", "Style", "results", "Results", NoTags},
183 {"view.showLegend", "actionShowLegend", "View", "", "Legend", "results", "View", NoTags},
184
185 // ── Analysis / reporting ────────────────────────────────────────────
186 {"analysis.summarize", "actionSummarizeResults", "Analysis", "", "Summarize", "analysis", "Analysis", NoTags},
187 {"analysis.report", "actionReport", "Analysis", "", "Report", "analysis", "Analysis", NoTags},
188 {"analysis.tabularView", "actionTabularView", "Analysis", "Ctrl+Shift+A", "TableView", "analysis", "Analysis", NoTags},
189 {"analysis.plotTimeSeries", "actionPlotTimeSeries", "Analysis", "Ctrl+T", "Chart", "analysis", "Analysis", NoTags},
190 {"analysis.plotProfile", "actionPlotProfile", "Analysis", "Ctrl+Shift+T", "Profile", "analysis", "Analysis", NoTags},
191 {"analysis.plotProfile2D", "actionPlotProfile2D", "Analysis", "", "Profile2D", "analysis", "Analysis", NoTags},
192 {"analysis.flowBalanceDown", "actionFlowBalanceDownstream","Analysis", "", "FlowBalanceDownstream", "analysis", "Analysis", NoTags},
193 {"analysis.flowBalanceUp", "actionFlowBalanceUpstream", "Analysis", "", "FlowBalanceUpstream", "analysis", "Analysis", NoTags},
194 {"analysis.travelTimeDown", "actionTravelTimeDownstream", "Analysis", "", "TravelTimeDownstream", "analysis", "Analysis", NoTags},
195 {"analysis.travelTimeUp", "actionTravelTimeUpstream", "Analysis", "", "TravelTimeUpstream", "analysis", "Analysis", NoTags},
196 {"analysis.massBalance", "actionShowMassBalance", "Analysis", "", "Chartpie", "analysis", "Analysis", NoTags},
197 {"analysis.export2DResults", "actionExport2DResults", "Analysis", "", "Export2DResults", "analysis", "Analysis", NoTags},
198
199 // ── Mesh 2D / terrain ───────────────────────────────────────────────
200 {"mesh.selectVertices", "actionMeshSelectVertex", "Mesh 2D", "", "SelectTriNode", "mesh2d", "Model/Mesh", Contextual2D},
201 {"mesh.selectEdges", "actionMeshSelectEdge", "Mesh 2D", "", "SelectTriEdge", "mesh2d", "Model/Mesh", Contextual2D},
202 // Cell Data — assign per-cell parameters from a raster or a vector field.
203 {"mesh.assignFromRaster", "actionMeshAssignFromRaster", "Mesh 2D", "", "MeshAssignRaster", "mesh2d", "Model/Mesh", Contextual2D},
204 {"mesh.assignFromVector", "actionMeshAssignFromVector", "Mesh 2D", "", "MeshAssignVector", "mesh2d", "Model/Mesh", Contextual2D},
205 // Groundwater (2D) — preview of the pending [2D_AQUIFER] editor.
206 {"mesh.gw2dParams", "actionMesh2DGWParams", "Mesh 2D", "", "GW2DParams", "mesh2d", "Model/Mesh", Contextual2D},
207 {"mesh.gw2dInitCond", "actionMesh2DGWInitCond", "Mesh 2D", "", "GW2DInit", "mesh2d", "Model/Mesh", Contextual2D},
208 {"terrain.profile", "actionTerrainProfile", "Model", "", "Profile", "model", "Model", NoTags},
209
210 // ── View / panels (dock toggle actions; objectNames assigned where
211 // the View → Panels menu is built) ────────────────────────────────
212 {"view.styleManager", "actionStyleManager", "View", "", "StyleManager", "view", "Tools", NoTags},
213 {"view.layerStylingDock", "actionLayerStylingDock", "Panels", "Ctrl+Alt+8", "LayerStyling", "view", "View", NoTags},
214 {"view.dock.layers", "actionToggleDockLayers", "Panels", "Ctrl+Alt+1", "DockLayers", "view", "View/Panels", NoTags},
215 {"view.dock.objectBrowser", "actionToggleDockObjectBrowser", "Panels", "Ctrl+Alt+2", "DockObjectBrowser", "view", "View/Panels", NoTags},
216 {"view.dock.properties", "actionToggleDockProperties", "Panels", "Ctrl+Alt+3", "DockProperties", "view", "View/Panels", NoTags},
217 {"view.dock.sectionView", "actionToggleDockSectionView", "Panels", "Ctrl+Alt+9", "DockSectionView", "view", "View/Panels", NoTags},
218 {"view.dock.attributeTable","actionToggleDockAttributeTable", "Panels", "Ctrl+Alt+4", "DockAttributeTable", "view", "View/Panels", NoTags},
219 {"view.dock.legend", "actionToggleDockLegend", "Panels", "Ctrl+Alt+5", "DockLegend", "view", "View/Panels", NoTags},
220 {"view.dock.simulationStatus","actionToggleDockSimulationStatus","Panels","Ctrl+Alt+6","DockSimulationStatus", "view", "View/Panels", NoTags},
221 {"view.dock.messageLogs", "actionToggleDockMessageLogs", "Panels", "Ctrl+Alt+7", "DockMessageLogs", "view", "View/Panels", NoTags},
222 {"view.dock.features", "actionToggleDockFeatures", "Panels", "Ctrl+Alt+0", "Layers", "view", "View/Panels", NoTags},
223 {"view.showWelcome", "actionShowWelcome", "View", "", "Help", "view", "Help", NoTags},
224
225 // ── Tools / window / help ───────────────────────────────────────────
226 {"tools.plugins", "actionPlugins", "Tools", "", "Plugins", "", "Tools", NoTags},
227 {"window.minimize", "actionWindowMinimize", "Window", "Ctrl+M", "WindowMinimize", "", "Window", NoTags},
228 {"window.zoom", "actionWindowZoom", "Window", "", "WindowZoom", "", "Window", NoTags},
229 {"app.commandPalette", "actionCommandPalette", "Application", "Ctrl+Shift+P", "CommandPalette", "", "View", NoTags},
230 {"help.keyboardShortcuts","actionKeyboardShortcuts","Help", "", "KeyboardShortcuts", "", "Help", NoTags},
231 {"app.help", "actionHelp", "Help", "std:HelpContents", "Help", "", "Help", NoTags},
232 {"app.about", "actionAbout", "Help", "", "About", "", "Help", NoTags},
233};
234
235inline constexpr std::size_t kActionCatalogSize = std::size(kActionCatalog);
236
238inline constexpr const char *kActionCatalogTabs[] = {
239 "home", "model", "mesh2d", "analysis", "results", "view", "features",
240};
241
242} // namespace openswmmvis::ui
243
244#endif // ACTIONCATALOG_H
Definition openswmmvislayer.h:43
constexpr const char * kActionCatalogTabs[]
Known compact-toolbar tab ids ("" = menu-only entry).
Definition actioncatalog.h:238
constexpr std::size_t kActionCatalogSize
Definition actioncatalog.h:235
constexpr ActionCatalogEntry kActionCatalog[]
Definition actioncatalog.h:61
ActionTag
Definition actioncatalog.h:40
@ RequiresProject
Enabled only while a project is open (applyProjectOpenToActions set).
Definition actioncatalog.h:43
@ RequiresEditSession
Enabled only during an explicit edit session (applyEditSessionToActions set).
Definition actioncatalog.h:45
@ Contextual2D
Belongs to the contextual Mesh 2D surface.
Definition actioncatalog.h:47
@ NoTags
Definition actioncatalog.h:41
Definition actioncatalog.h:50
const char * objectName
Definition actioncatalog.h:52
unsigned tags
Definition actioncatalog.h:58
const char * menuPath
Definition actioncatalog.h:57
const char * tab
Definition actioncatalog.h:56
const char * id
Definition actioncatalog.h:51
const char * icon
Definition actioncatalog.h:55
const char * category
Definition actioncatalog.h:53
const char * defaultShortcut
Definition actioncatalog.h:54