Centralize legacy document file saves

This commit is contained in:
2026-06-04 13:47:43 +02:00
parent 8a0810acb3
commit ab6223c256
8 changed files with 257 additions and 37 deletions

View File

@@ -587,8 +587,9 @@ Known local toolchain state:
close-request executor dispatch/no-op preservation, document-save executor
dispatch/no-op preservation, save-before-workflow executor dispatch,
new-document target/resolution/overwrite planning and executor dispatch,
document file target, combined save-file overwrite planning, and save-version
target decisions without requiring a window, canvas, or message box.
document file target, combined save-file overwrite planning and executor
dispatch, plus save-version target decisions and executor validation without
requiring a window, canvas, or message box.
- `src/legacy_document_open_services.*` is the current app-shell bridge between
`pp_app_core` document-open plans and live ABR/PPBR import prompts,
unsaved-project discard prompts, project opening, layer UI refresh, title
@@ -599,8 +600,11 @@ Known local toolchain state:
save dialogs, save-version routing, existing-project saves, and
save-before-workflow prompts. It also bridges accepted new-document plans to
legacy canvas resize/layer setup, overwrite prompts, title updates, and
keyboard/dialog cleanup. Retained legacy UI/canvas execution remains tracked
by `DEBT-0040` and `DEBT-0041`.
keyboard/dialog cleanup. Accepted Save As and Save Version plans now also
route through this bridge before reaching legacy project-save execution,
overwrite prompts, document field updates, title updates, and keyboard/dialog
cleanup. Retained legacy UI/canvas execution remains tracked by `DEBT-0040`,
`DEBT-0041`, and `DEBT-0042`.
- `src/legacy_history_services.*` is the current app-shell bridge between
`pp_app_core` history plans and legacy `ActionManager`; toolbar and
`NodeCanvas` hotkeys share it while document-history extraction remains

View File

@@ -59,6 +59,7 @@ agent or engineer to remove them without reconstructing context from chat.
| DEBT-0039 | Open | Modernization | Document-open planning and execution dispatch now consume pure `pp_app_core` through `App::open_document`, `pano_cli plan-open-route`, `DocumentOpenServices`, and `src/legacy_document_open_services.*`, but the bridge still opens ABR/PPBR import prompts, launches legacy brush preset import threads, applies unsaved-project discard prompts, calls legacy project-open execution, refreshes layer UI, updates the app title, and clears legacy history directly | Preserve current file-open/import behavior while document loading and brush import move toward app/document/asset/UI services | `pp_app_core_document_route_tests`; `pp_app_core_document_session_tests`; `pano_cli plan-open-route --path D:/Paint/Scenes/demo.ppi --unsaved`; `pano_cli plan-open-route --path D:/Paint/Brushes/clouds.ABR --unsaved`; `ctest --preset desktop-fast --build-config Debug` | Brush import prompting/execution, project-open execution, unsaved-project discard prompting, layer refresh, title updates, and history clearing are owned by injected app/document/asset/UI services with `App::open_document` acting only as an adapter |
| DEBT-0040 | Open | Modernization | Close request, document save, and save-before-workflow planning/execution dispatch now consume pure `pp_app_core` through `App::request_close`, `App::save_document`, `App::continue_document_workflow_after_optional_save`, `pano_cli simulate-app-session`, `DocumentSaveServices`, `CloseRequestServices`, `DocumentWorkflowServices`, and `src/legacy_document_session_services.*`, but the bridge still opens legacy message boxes/save dialogs, calls `Canvas::I->project_save`, mutates the unsaved flag on close confirmation, invokes native app close, and routes save-version through the retained legacy dialog | Preserve current close/save/dirty-workflow behavior while document session execution moves toward app/document/UI/platform services | `pp_app_core_document_session_tests`; `pano_cli simulate-app-session --unsaved --save-intent save-dirty-version`; `pano_cli simulate-app-session --no-canvas`; `pano_cli plan-document-file --work-dir D:/Paint --name demo --target-exists`; `pano_cli plan-document-version --directory D:/Paint --doc-name demo.01 --existing-path D:/Paint/demo.02.ppi`; `ctest --preset desktop-fast --build-config Debug` | Close prompt execution, native close requests, dirty-workflow save prompts, existing-project saves, save dialogs, save-version execution, and unsaved-flag mutation are owned by injected app/document/UI/platform services with `App` methods acting only as adapters |
| DEBT-0041 | Open | Modernization | Accepted new-document planning/execution dispatch now consumes pure `pp_app_core` through `App::dialog_newdoc`, `pano_cli plan-new-document`, `NewDocumentServices`, and `src/legacy_document_session_services.*`, but the bridge still mutates legacy app document fields, clears legacy layer UI, resizes legacy `Canvas`, clears legacy history, creates the default layer through legacy UI, mutates unsaved/new-document flags, updates the title, and handles keyboard/dialog cleanup directly | Preserve current New Document dialog behavior while document creation moves toward app/document/UI services | `pp_app_core_document_session_tests`; `pano_cli plan-new-document --work-dir D:/Paint --name demo --resolution-index 3`; `pano_cli plan-new-document --work-dir D:/Paint --name demo --resolution-index 3 --target-exists`; `pano_cli simulate-app-session --save-intent save`; `ctest --preset desktop-fast --build-config Debug` | New document creation, overwrite confirmation, canvas/document allocation, default layer creation, history clearing, title updates, dirty/new-document state, and keyboard/dialog cleanup are owned by injected app/document/UI services with `App::dialog_newdoc` acting only as a UI adapter |
| DEBT-0042 | Open | Modernization | Accepted Save As and Save Version planning/execution dispatch now consumes pure `pp_app_core` through `App::dialog_save`, `App::dialog_save_ver`, `pano_cli plan-document-file`, `pano_cli plan-document-version`, `DocumentFileSaveServices`, `DocumentVersionSaveServices`, and `src/legacy_document_session_services.*`, but the bridge still opens legacy overwrite prompts, calls legacy `Canvas::project_save`, mutates app document name/path/directory fields, marks version saves dirty before saving, updates the title, and handles keyboard/dialog cleanup directly | Preserve current Save As and Save Version behavior while document persistence moves toward app/document/storage/UI services | `pp_app_core_document_session_tests`; `pano_cli plan-document-file --work-dir D:/Paint --name demo --target-exists`; `pano_cli plan-document-version --directory D:/Paint --doc-name demo.01 --existing-path D:/Paint/demo.02.ppi`; `pano_cli simulate-app-session --save-intent save-as`; `pano_cli simulate-app-session --save-intent save-version`; `ctest --preset desktop-fast --build-config Debug` | Save As overwrite prompting, project-save execution, app document metadata updates, title updates, version-save dirty-state handling, and keyboard/dialog cleanup are owned by injected app/document/storage/UI services with `App::dialog_save` and `App::dialog_save_ver` acting only as UI adapters |
## Closed Debt

View File

@@ -744,6 +744,12 @@ app-core new-document executor and `src/legacy_document_session_services.*`,
preserving target overwrite prompts, legacy canvas resize/layer setup, history
clearing, title updates, dirty/new-document flag mutation, and keyboard/dialog
cleanup while retained execution remains tracked under `DEBT-0041`.
`App::dialog_save` and `App::dialog_save_ver` now route accepted Save As and
Save Version plans through app-core document file/version save executors and
`src/legacy_document_session_services.*`, preserving overwrite prompts,
legacy `Canvas::project_save`, app document field updates, title updates, and
keyboard/dialog cleanup while retained execution remains tracked under
`DEBT-0042`.
Implementation tasks:
@@ -1299,6 +1305,15 @@ Results:
- Focused new-document/session CTest coverage passed for
`pp_app_core_document_session_tests`, `pano_cli_plan_new_document_*`, and
`pano_cli_simulate_app_session_*` smoke tests after the live bridge split.
- `PanoPainter`, `pp_app_core_document_session_tests`, and `pano_cli` built
after accepted Save As and Save Version execution moved behind document
file/version save services. A clean rebuild was required once because MSVC
reported the known Debug PDB `LNK1103` corruption, after which the build
passed.
- Focused Save As/Version/session CTest coverage passed for
`pp_app_core_document_session_tests`, `pano_cli_plan_document_file_*`,
`pano_cli_plan_document_version_*`, and `pano_cli_simulate_app_session_*`
smoke tests after the live bridge split.
- `pp_app_core_document_recording_tests` passed, covering recording start/stop,
clear, platform recorded-file cleanup, frame-count reset, export progress
totals, and oversized progress-total clamping.