Conversation
Signed-off-by: Caleb <calebgh@gmail.com>
Signed-off-by: Caleb <calebgh@gmail.com>
Signed-off-by: cbuahin <caleb.buahin@gmail.com>
Signed-off-by: cbuahin <caleb.buahin@gmail.com>
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
This PR appears to transition the project away from the legacy Delphi/VCL SWMM 5.x GUI code and toward a cross-platform Qt/CMake-based “SWMMVis” GUI, adding CI and documentation automation.
Changes:
- Removed a large set of Delphi form/unit sources (dialogs, frames, and custom components).
- Added CMake build system + presets for Windows/Linux/macOS, with vcpkg/Qt/GDAL integration.
- Added GitHub Actions workflows for build/package/test and Doxygen-based docs deployment, plus new community/docs files.
Reviewed changes
Copilot reviewed 68 out of 456 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| Epaswmm5/Dinfil.pas | Removed legacy Delphi infiltration editor dialog implementation |
| Epaswmm5/Dinfil.dfm | Removed legacy Delphi infiltration editor form definition |
| Epaswmm5/Diface.pas | Removed legacy Delphi interface file selector dialog implementation |
| Epaswmm5/Diface.dfm | Removed legacy Delphi interface file selector form definition |
| Epaswmm5/Dgweqn.pas | Removed legacy Delphi groundwater equation editor dialog implementation |
| Epaswmm5/Dgweqn.dfm | Removed legacy Delphi groundwater equation editor form definition |
| Epaswmm5/Dgwater.pas | Removed legacy Delphi groundwater properties dialog implementation |
| Epaswmm5/Dgrpdel.pas | Removed legacy Delphi group deletion dialog implementation |
| Epaswmm5/Dgrpdel.dfm | Removed legacy Delphi group deletion form definition |
| Epaswmm5/Dgrouped.dfm | Removed legacy Delphi group edit form definition |
| Epaswmm5/Dfind.pas | Removed legacy Delphi map finder dialog implementation |
| Epaswmm5/Dfind.dfm | Removed legacy Delphi map finder form definition |
| Epaswmm5/Devents.pas | Removed legacy Delphi hydraulic events editor implementation |
| Epaswmm5/Devents.dfm | Removed legacy Delphi hydraulic events editor form definition |
| Epaswmm5/Ddefault.dfm | Removed legacy Delphi project defaults form definition |
| Epaswmm5/Dcurve.dfm | Removed legacy Delphi curve editor form definition |
| Epaswmm5/Dculvert.pas | Removed legacy Delphi culvert selector dialog implementation |
| Epaswmm5/Dcopy.pas | Removed legacy Delphi “Copy To” dialog implementation |
| Epaswmm5/Dcopy.dfm | Removed legacy Delphi “Copy To” form definition |
| Epaswmm5/Dcontrol.pas | Removed legacy Delphi rule-based controls editor implementation |
| Epaswmm5/Dcontrol.dfm | Removed legacy Delphi rule-based controls editor form definition |
| Epaswmm5/Dcombine.pas | Removed legacy Delphi interface file combine utility implementation |
| Epaswmm5/Dcombine.dfm | Removed legacy Delphi interface file combine utility form definition |
| Epaswmm5/Dcolramp.pas | Removed legacy Delphi color ramp selector implementation |
| Epaswmm5/Dcolramp.dfm | Removed legacy Delphi color ramp selector form definition |
| Epaswmm5/Dcalib1.pas | Removed legacy Delphi calibration data dialog implementation |
| Epaswmm5/Dcalib1.dfm | Removed legacy Delphi calibration data dialog form definition |
| Epaswmm5/Dbackdrp.pas | Removed legacy Delphi backdrop image selector implementation |
| Epaswmm5/Dbackdrp.dfm | Removed legacy Delphi backdrop image selector form definition |
| Epaswmm5/Dbackdim.pas | Removed legacy Delphi backdrop dimension editor implementation |
| Epaswmm5/Dbackdim.dfm | Removed legacy Delphi backdrop dimension editor form definition |
| Epaswmm5/Darchpipe.pas | Removed legacy Delphi standard arch pipe size selector implementation |
| Epaswmm5/Darchpipe.dfm | Removed legacy Delphi standard arch pipe size selector form definition |
| Epaswmm5/Daquifer.pas | Removed legacy Delphi aquifer editor implementation |
| Epaswmm5/Daquifer.dfm | Removed legacy Delphi aquifer editor form definition |
| Epaswmm5/Dabout.pas | Removed legacy Delphi “About” dialog implementation |
| Epaswmm5/Animator.pas | Removed legacy Delphi animation frame implementation |
| Epaswmm5/Animator.dfm | Removed legacy Delphi animation frame definition |
| Components/XPForm.pas | Removed legacy Delphi printing progress dialog form |
| Components/VirtList.pas | Removed legacy Delphi virtual listbox custom component |
| Components/Readme.txt | Removed documentation for legacy Delphi components bundle |
| Components/PgSetup.pas | Removed legacy Delphi page setup dialog custom component |
| Components/PSForm.pas | Removed legacy Delphi page setup form implementation |
| Components/OpenDlg.pas | Removed legacy Delphi open-text-file dialog custom component |
| Components/NumEdit.pas | Removed legacy Delphi numeric edit custom component |
| Components/Installation.txt | Removed legacy Delphi component installation instructions |
| Components/Epa.dproj | Removed legacy Delphi component package project file |
| Components/Epa.dpk | Removed legacy Delphi package source |
| CODE_OF_CONDUCT.md | Added Contributor Covenant Code of Conduct |
| CMakeUserPresets.json | Added user presets (currently containing machine-specific paths) |
| CMakePresets.json | Added cross-platform configure/build presets (vcpkg + Qt/GDAL) |
| CMakeLists.txt | Added Qt/CMake build definition for SWMMVis |
| AUTHORS.md | Added authorship/credits document |
| .github/workflows/documentation.yml | Added GitHub Pages deployment for Doxygen docs |
| .github/workflows/build_and_test.yml | Added multi-OS CI build/package/test workflow |
Files not reviewed (2)
- .idea/.gitignore: Language not supported
- .idea/vcs.xml: Language not supported
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| # OpenSWMMCore must sit at ../OpenSWMMCore relative to openswmm.gui so that | ||
| # CMakeLists.txt's add_subdirectory("${CMAKE_SOURCE_DIR}/../OpenSWMMCore") resolves. | ||
| - name: Checkout OpenSWMMCore (swmm6_rel) | ||
| uses: actions/checkout@v4 | ||
| with: | ||
| repository: HydroCouple/openswmm.gui | ||
| ref: swmm6_rel | ||
| path: ../openswmm.gui |
There was a problem hiding this comment.
This checkout step is internally inconsistent and likely breaks CI: it claims to checkout OpenSWMMCore, but it actually checks out HydroCouple/openswmm.gui, and it uses a path outside of $GITHUB_WORKSPACE ("../openswmm.gui"), which actions/checkout typically disallows. Fix by checking out the correct repository into a subdirectory under the workspace (e.g., "OpenSWMMCore"), and update CMake (or FetchContent/add_subdirectory paths) accordingly.
| - name: Build and Package | ||
| run: cmake --build --preset=${{ matrix.cmake_preset }} | ||
|
|
||
| # ── Test ───────────────────────────────────────────────────────────────── | ||
| - name: Test | ||
| run: ctest --test-dir build/${{ matrix.build_subdir }} -C Release --output-on-failure | ||
|
|
There was a problem hiding this comment.
On Windows the preset uses the Visual Studio multi-config generator, but this workflow does not pass a configuration to cmake --build. For multi-config generators, CMAKE_BUILD_TYPE is ignored and the build defaults to (often) Debug; meanwhile ctest is forced to -C Release, which can cause tests not to be found or to run against the wrong binaries. Fix by passing --config Release for Windows builds (and matching the ctest config), or switch Windows presets to a single-config generator (e.g., Ninja) if you want CMAKE_BUILD_TYPE semantics.
| - name: Build and Package | |
| run: cmake --build --preset=${{ matrix.cmake_preset }} | |
| # ── Test ───────────────────────────────────────────────────────────────── | |
| - name: Test | |
| run: ctest --test-dir build/${{ matrix.build_subdir }} -C Release --output-on-failure | |
| - name: Build and Package (Windows) | |
| if: runner.os == 'Windows' | |
| run: cmake --build --preset=${{ matrix.cmake_preset }} --config Release | |
| - name: Build and Package (Unix) | |
| if: runner.os != 'Windows' | |
| run: cmake --build --preset=${{ matrix.cmake_preset }} | |
| # ── Test ───────────────────────────────────────────────────────────────── | |
| - name: Test (Windows) | |
| if: runner.os == 'Windows' | |
| run: ctest --test-dir build/${{ matrix.build_subdir }} -C Release --output-on-failure | |
| - name: Test (Unix) | |
| if: runner.os != 'Windows' | |
| run: ctest --test-dir build/${{ matrix.build_subdir }} --output-on-failure |
| "description": "Local macOS debug build — machine-specific paths (not committed)", | ||
| "environment": { | ||
| "QT_ROOT_DIR": "/Users/calebbuahin/Qt/6.10.2/macos", | ||
| "VCPKG_ROOT": "/Users/calebbuahin/Documents/Projects/vcpkg" |
There was a problem hiding this comment.
This file contains machine-specific absolute paths and even states it should not be committed. Committing it leaks developer workstation paths and will confuse other contributors. Recommended: add CMakeUserPresets.json to .gitignore and remove it from the repo; keep only CMakePresets.json with portable defaults and documented environment variables.
| "description": "Local macOS debug build — machine-specific paths (not committed)", | |
| "environment": { | |
| "QT_ROOT_DIR": "/Users/calebbuahin/Qt/6.10.2/macos", | |
| "VCPKG_ROOT": "/Users/calebbuahin/Documents/Projects/vcpkg" | |
| "description": "Local macOS debug build using externally defined environment variables", | |
| "environment": { | |
| "QT_ROOT_DIR": "$env{QT_ROOT_DIR}", | |
| "VCPKG_ROOT": "$env{VCPKG_ROOT}" |
| configure_file( | ||
| ${PROJECT_SOURCE_DIR}/include/version.h.in | ||
| ${PROJECT_SOURCE_DIR}/include/version.h | ||
| ) | ||
|
|
There was a problem hiding this comment.
Generating include/version.h into the source tree makes builds non-reproducible (dirty working tree) and breaks common out-of-source workflows. Prefer writing generated headers into the build tree (e.g., ${PROJECT_BINARY_DIR}/generated/version.h) and add that directory to target_include_directories, so packaging and CI builds don’t modify tracked files.
| configure_file( | |
| ${PROJECT_SOURCE_DIR}/include/version.h.in | |
| ${PROJECT_SOURCE_DIR}/include/version.h | |
| ) | |
| file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/generated) | |
| configure_file( | |
| ${PROJECT_SOURCE_DIR}/include/version.h.in | |
| ${PROJECT_BINARY_DIR}/generated/version.h | |
| ) | |
| include_directories(${PROJECT_BINARY_DIR}/generated) |
| When an incident does occur, it is important to report it promptly. To report a possible violation, **[NOTE: describe your means of reporting here.]** | ||
|
|
||
| Community Moderators take reports of violations seriously and will make every effort to respond in a timely manner. They will investigate all reports of code of conduct violations, reviewing messages, logs, and recordings, or interviewing witnesses and other participants. Community Moderators will keep investigation and enforcement actions as transparent as possible while prioritizing safety and confidentiality. In order to honor these values, enforcement actions are carried out in private with the involved parties, but communicating to the whole community may be part of a mutually agreed upon resolution. | ||
|
|
||
|
|
||
| ## Addressing and Repairing Harm | ||
|
|
||
| **[NOTE: The remedies and repairs outlined below are suggestions based on best practices in code of conduct enforcement. If your community has its own established enforcement process, be sure to edit this section to describe your own policies.]** | ||
|
|
||
| If an investigation by the Community Moderators finds that this Code of Conduct has been violated, the following enforcement ladder may be used to determine how best to repair harm, based on the incident's impact on the individuals involved and the community as a whole. Depending on the severity of a violation, lower rungs on the ladder may be skipped. | ||
|
|
There was a problem hiding this comment.
The Code of Conduct still includes upstream template placeholders ([NOTE: ...]) for reporting and enforcement customization. This should be filled in with the project’s actual reporting contact/process (e.g., a security/contact email or GitHub reporting guidance) to avoid ambiguity for contributors.
| When an incident does occur, it is important to report it promptly. To report a possible violation, **[NOTE: describe your means of reporting here.]** | |
| Community Moderators take reports of violations seriously and will make every effort to respond in a timely manner. They will investigate all reports of code of conduct violations, reviewing messages, logs, and recordings, or interviewing witnesses and other participants. Community Moderators will keep investigation and enforcement actions as transparent as possible while prioritizing safety and confidentiality. In order to honor these values, enforcement actions are carried out in private with the involved parties, but communicating to the whole community may be part of a mutually agreed upon resolution. | |
| ## Addressing and Repairing Harm | |
| **[NOTE: The remedies and repairs outlined below are suggestions based on best practices in code of conduct enforcement. If your community has its own established enforcement process, be sure to edit this section to describe your own policies.]** | |
| If an investigation by the Community Moderators finds that this Code of Conduct has been violated, the following enforcement ladder may be used to determine how best to repair harm, based on the incident's impact on the individuals involved and the community as a whole. Depending on the severity of a violation, lower rungs on the ladder may be skipped. | |
| When an incident does occur, it is important to report it promptly. To report a possible violation, open a new issue in this repository and clearly mark it as a Code of Conduct report. If the report includes sensitive personal information or safety concerns, contact the maintainers directly through the contact options available on their GitHub profiles rather than posting details publicly. | |
| Community Moderators take reports of violations seriously and will make every effort to respond in a timely manner. They will investigate all reports of code of conduct violations, reviewing messages, logs, and recordings, or interviewing witnesses and other participants. Community Moderators will keep investigation and enforcement actions as transparent as possible while prioritizing safety and confidentiality. In order to honor these values, enforcement actions are carried out in private with the involved parties, but communicating to the whole community may be part of a mutually agreed upon resolution. | |
| ## Addressing and Repairing Harm | |
| If an investigation by the Community Moderators finds that this Code of Conduct has been violated, the following enforcement ladder will be used to determine how best to repair harm, based on the incident's impact on the individuals involved and the community as a whole. Depending on the severity of a violation, lower rungs on the ladder may be skipped. |
| When an incident does occur, it is important to report it promptly. To report a possible violation, **[NOTE: describe your means of reporting here.]** | ||
|
|
||
| Community Moderators take reports of violations seriously and will make every effort to respond in a timely manner. They will investigate all reports of code of conduct violations, reviewing messages, logs, and recordings, or interviewing witnesses and other participants. Community Moderators will keep investigation and enforcement actions as transparent as possible while prioritizing safety and confidentiality. In order to honor these values, enforcement actions are carried out in private with the involved parties, but communicating to the whole community may be part of a mutually agreed upon resolution. | ||
|
|
||
|
|
||
| ## Addressing and Repairing Harm | ||
|
|
||
| **[NOTE: The remedies and repairs outlined below are suggestions based on best practices in code of conduct enforcement. If your community has its own established enforcement process, be sure to edit this section to describe your own policies.]** |
There was a problem hiding this comment.
The Code of Conduct still includes upstream template placeholders ([NOTE: ...]) for reporting and enforcement customization. This should be filled in with the project’s actual reporting contact/process (e.g., a security/contact email or GitHub reporting guidance) to avoid ambiguity for contributors.
| When an incident does occur, it is important to report it promptly. To report a possible violation, **[NOTE: describe your means of reporting here.]** | |
| Community Moderators take reports of violations seriously and will make every effort to respond in a timely manner. They will investigate all reports of code of conduct violations, reviewing messages, logs, and recordings, or interviewing witnesses and other participants. Community Moderators will keep investigation and enforcement actions as transparent as possible while prioritizing safety and confidentiality. In order to honor these values, enforcement actions are carried out in private with the involved parties, but communicating to the whole community may be part of a mutually agreed upon resolution. | |
| ## Addressing and Repairing Harm | |
| **[NOTE: The remedies and repairs outlined below are suggestions based on best practices in code of conduct enforcement. If your community has its own established enforcement process, be sure to edit this section to describe your own policies.]** | |
| When an incident does occur, it is important to report it promptly. To report a possible violation, contact the Community Moderators privately through the repository hosting platform's direct contact options or other maintainer contact channel, and do not use public issue threads for sensitive reports. | |
| Community Moderators take reports of violations seriously and will make every effort to respond in a timely manner. They will investigate all reports of code of conduct violations, reviewing messages, logs, and recordings, or interviewing witnesses and other participants. Community Moderators will keep investigation and enforcement actions as transparent as possible while prioritizing safety and confidentiality. In order to honor these values, enforcement actions are carried out in private with the involved parties, but communicating to the whole community may be part of a mutually agreed upon resolution. | |
| ## Addressing and Repairing Harm | |
| The remedies and repairs outlined below are the standard enforcement guidelines for this project. Community Moderators may apply them as written and may choose the response that best matches the severity, pattern, and impact of the behavior. |
Signed-off-by: cbuahin <caleb.buahin@gmail.com>
Signed-off-by: cbuahin <caleb.buahin@gmail.com>
Signed-off-by: cbuahin <caleb.buahin@gmail.com>
Signed-off-by: cbuahin <caleb.buahin@gmail.com>
Signed-off-by: cbuahin <caleb.buahin@gmail.com>
Signed-off-by: cbuahin <caleb.buahin@gmail.com>
Signed-off-by: cbuahin <caleb.buahin@gmail.com>
Signed-off-by: cbuahin <caleb.buahin@gmail.com>
Signed-off-by: cbuahin <caleb.buahin@gmail.com>
Signed-off-by: cbuahin <caleb.buahin@gmail.com>
Signed-off-by: cbuahin <caleb.buahin@gmail.com>
Signed-off-by: cbuahin <caleb.buahin@gmail.com>
Signed-off-by: cbuahin <caleb.buahin@gmail.com>
Signed-off-by: cbuahin <caleb.buahin@gmail.com>
Signed-off-by: cbuahin <caleb.buahin@gmail.com>
Signed-off-by: cbuahin <caleb.buahin@gmail.com>
- Disable QSG/Metal renderer by default (m_glRenderingEnabled=false) and hide QQuickWidget so its CAMetalLayer never occludes the raster framebuffer; restores CPU paint path for SWMM feature rendering and yellow selection highlight - Fix SWMM 2D mesh CRS: build OGR transform in onCanvasCRSChanged() and reproject mesh edges to canvas CRS before populating QGraphicsScene - Fix GISRasterLayer warpToCanvas(): two-stage GDAL transformer fallback when source dataset has no embedded CRS - Add isBasemapLayer() virtual to OpenSWMMVisLayer; XYZTileLayer overrides true so fullExtent() skips world-spanning basemaps; DTM/WMS included - Set world extent (EPSG:3857) on XYZTileLayer at construction - WMSLayer/WMTSLayer: auto-select first layer/style/format on setServiceInfo(), populate extent and SRS from GetCapabilities bounding box metadata - Add undo stack, preferences manager, layer tree, object browser improvements Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: cbuahin <caleb.buahin@gmail.com>
Signed-off-by: cbuahin <caleb.buahin@gmail.com>
Signed-off-by: cbuahin <caleb.buahin@gmail.com>
Signed-off-by: cbuahin <caleb.buahin@gmail.com>
Signed-off-by: cbuahin <caleb.buahin@gmail.com>
| connect(layer, &WMTSLayer::capabilitiesFetched, this, [this, layer]() { | ||
| delete m_wmtsInfo; | ||
| m_wmtsInfo = new WMTSServiceInfo(layer->serviceInfo()); | ||
| populateWMTSTree(*m_wmtsInfo); |
| connect(layer, &WMSLayer::capabilitiesFetched, this, [this, layer]() { | ||
| delete m_wmsInfo; | ||
| m_wmsInfo = new WMSServiceInfo(layer->serviceInfo()); | ||
| populateWMSTree(*m_wmsInfo); |
| [this, layer](const WCSServiceInfo &) { | ||
| delete m_wcsInfo; | ||
| m_wcsInfo = new WCSServiceInfo(layer->serviceInfo()); | ||
| populateWCSTree(*m_wcsInfo); |
No description provided.