Centralize legacy document session bridge

This commit is contained in:
2026-06-04 13:30:22 +02:00
parent d980b81bd7
commit 4528edfb2c
10 changed files with 437 additions and 64 deletions

View File

@@ -65,6 +65,31 @@ public:
virtual void prompt_discard_unsaved_project(const DocumentOpenRoute& route) = 0;
};
class CloseRequestServices {
public:
virtual ~CloseRequestServices() = default;
virtual void request_close_now() = 0;
virtual void show_unsaved_close_prompt() = 0;
};
class DocumentSaveServices {
public:
virtual ~DocumentSaveServices() = default;
virtual void show_save_dialog() = 0;
virtual void save_existing_document() = 0;
virtual void save_document_version() = 0;
};
class DocumentWorkflowServices {
public:
virtual ~DocumentWorkflowServices() = default;
virtual void continue_workflow_now() = 0;
virtual void prompt_save_before_continue() = 0;
};
struct DocumentFileTarget {
std::string name;
std::string directory;
@@ -160,6 +185,24 @@ struct NewDocumentPlan {
: CloseRequestDecision::show_unsaved_prompt;
}
[[nodiscard]] inline pp::foundation::Status execute_close_request_decision(
CloseRequestDecision decision,
CloseRequestServices& services)
{
switch (decision) {
case CloseRequestDecision::close_now:
services.request_close_now();
return pp::foundation::Status::success();
case CloseRequestDecision::show_unsaved_prompt:
services.show_unsaved_close_prompt();
return pp::foundation::Status::success();
case CloseRequestDecision::wait_for_existing_prompt:
return pp::foundation::Status::success();
}
return pp::foundation::Status::invalid_argument("unknown close request decision");
}
[[nodiscard]] constexpr DocumentSaveDecision plan_document_save(
bool is_new_document,
bool has_unsaved_changes,
@@ -191,6 +234,27 @@ struct NewDocumentPlan {
return DocumentSaveDecision::no_op;
}
[[nodiscard]] inline pp::foundation::Status execute_document_save_decision(
DocumentSaveDecision decision,
DocumentSaveServices& services)
{
switch (decision) {
case DocumentSaveDecision::no_op:
return pp::foundation::Status::success();
case DocumentSaveDecision::show_save_dialog:
services.show_save_dialog();
return pp::foundation::Status::success();
case DocumentSaveDecision::save_existing:
services.save_existing_document();
return pp::foundation::Status::success();
case DocumentSaveDecision::save_version:
services.save_document_version();
return pp::foundation::Status::success();
}
return pp::foundation::Status::invalid_argument("unknown document save decision");
}
[[nodiscard]] constexpr DocumentWorkflowDecision plan_document_workflow(
bool has_canvas,
bool has_unsaved_changes) noexcept
@@ -204,6 +268,24 @@ struct NewDocumentPlan {
: DocumentWorkflowDecision::continue_now;
}
[[nodiscard]] inline pp::foundation::Status execute_document_workflow_decision(
DocumentWorkflowDecision decision,
DocumentWorkflowServices& services)
{
switch (decision) {
case DocumentWorkflowDecision::unavailable:
return pp::foundation::Status::success();
case DocumentWorkflowDecision::continue_now:
services.continue_workflow_now();
return pp::foundation::Status::success();
case DocumentWorkflowDecision::prompt_save_before_continue:
services.prompt_save_before_continue();
return pp::foundation::Status::success();
}
return pp::foundation::Status::invalid_argument("unknown document workflow decision");
}
[[nodiscard]] inline pp::foundation::Result<DocumentFileTarget> make_document_file_target(
std::string_view work_directory,
std::string_view document_name)