Add file menu service boundary

This commit is contained in:
2026-06-03 13:00:22 +02:00
parent defa9fc212
commit e880f23040
5 changed files with 266 additions and 42 deletions

View File

@@ -45,6 +45,23 @@ struct FileMenuPlan {
DocumentExportMenuKind export_kind = DocumentExportMenuKind::jpeg;
};
class FileMenuServices {
public:
virtual ~FileMenuServices() = default;
virtual void show_new_document_dialog() = 0;
virtual void pick_image_for_import() = 0;
virtual void pick_project_file() = 0;
virtual void show_cloud_browser_dialog() = 0;
virtual void save_document(DocumentSaveIntent intent) = 0;
virtual void show_export_jpeg_dialog(DocumentExportMenuKind kind) = 0;
virtual void show_export_submenu() = 0;
virtual void share_document() = 0;
virtual void show_resize_dialog() = 0;
virtual void upload_to_cloud() = 0;
virtual void browse_cloud_documents() = 0;
};
[[nodiscard]] constexpr FileMenuPlan plan_file_menu_command(FileMenuCommand command) noexcept
{
FileMenuPlan plan;
@@ -146,4 +163,47 @@ struct FileMenuPlan {
pp::foundation::Status::invalid_argument("unknown file menu command"));
}
[[nodiscard]] inline pp::foundation::Status execute_file_menu_plan(
const FileMenuPlan& plan,
FileMenuServices& services)
{
switch (plan.action) {
case FileMenuAction::show_new_document_dialog:
services.show_new_document_dialog();
return pp::foundation::Status::success();
case FileMenuAction::pick_image_for_import:
services.pick_image_for_import();
return pp::foundation::Status::success();
case FileMenuAction::pick_project_file:
services.pick_project_file();
return pp::foundation::Status::success();
case FileMenuAction::show_cloud_browser_dialog:
services.show_cloud_browser_dialog();
return pp::foundation::Status::success();
case FileMenuAction::save_document:
services.save_document(plan.save_intent);
return pp::foundation::Status::success();
case FileMenuAction::show_export_jpeg_dialog:
services.show_export_jpeg_dialog(plan.export_kind);
return pp::foundation::Status::success();
case FileMenuAction::show_export_submenu:
services.show_export_submenu();
return pp::foundation::Status::success();
case FileMenuAction::share_document:
services.share_document();
return pp::foundation::Status::success();
case FileMenuAction::show_resize_dialog:
services.show_resize_dialog();
return pp::foundation::Status::success();
case FileMenuAction::upload_to_cloud:
services.upload_to_cloud();
return pp::foundation::Status::success();
case FileMenuAction::browse_cloud_documents:
services.browse_cloud_documents();
return pp::foundation::Status::success();
}
return pp::foundation::Status::invalid_argument("unknown file menu action");
}
} // namespace pp::app