Extract file menu action planning

This commit is contained in:
2026-06-03 11:56:14 +02:00
parent 65b262207c
commit 6dac909869
8 changed files with 474 additions and 34 deletions

View File

@@ -14,6 +14,7 @@
#include "app_core/document_route.h"
#include "app_core/document_sharing.h"
#include "app_core/document_session.h"
#include "app_core/file_menu.h"
#include "app_core/grid_ui.h"
#include "app_core/history_ui.h"
#include "app_core/quick_ui.h"
@@ -158,6 +159,10 @@ struct PlanExportMenuArgs {
bool has_canvas = true;
};
struct PlanFileMenuArgs {
std::string command = "new";
};
struct PlanCloudUploadArgs {
bool has_canvas = true;
bool new_document = false;
@@ -572,6 +577,70 @@ const char* document_workflow_decision_name(pp::app::DocumentWorkflowDecision de
return "unavailable";
}
const char* file_menu_command_name(pp::app::FileMenuCommand command) noexcept
{
switch (command) {
case pp::app::FileMenuCommand::new_document:
return "new-document";
case pp::app::FileMenuCommand::import_image:
return "import-image";
case pp::app::FileMenuCommand::open_project:
return "open-project";
case pp::app::FileMenuCommand::browse_cloud:
return "browse";
case pp::app::FileMenuCommand::save:
return "save";
case pp::app::FileMenuCommand::save_as:
return "save-as";
case pp::app::FileMenuCommand::save_version:
return "save-version";
case pp::app::FileMenuCommand::export_jpeg:
return "export-jpeg";
case pp::app::FileMenuCommand::export_submenu:
return "export-submenu";
case pp::app::FileMenuCommand::share:
return "share";
case pp::app::FileMenuCommand::resize:
return "resize";
case pp::app::FileMenuCommand::cloud_upload:
return "cloud-upload";
case pp::app::FileMenuCommand::cloud_browse:
return "cloud-browse";
}
return "new-document";
}
const char* file_menu_action_name(pp::app::FileMenuAction action) noexcept
{
switch (action) {
case pp::app::FileMenuAction::show_new_document_dialog:
return "show-new-document-dialog";
case pp::app::FileMenuAction::pick_image_for_import:
return "pick-image-for-import";
case pp::app::FileMenuAction::pick_project_file:
return "pick-project-file";
case pp::app::FileMenuAction::show_cloud_browser_dialog:
return "show-cloud-browser-dialog";
case pp::app::FileMenuAction::save_document:
return "save-document";
case pp::app::FileMenuAction::show_export_jpeg_dialog:
return "show-export-jpeg-dialog";
case pp::app::FileMenuAction::show_export_submenu:
return "show-export-submenu";
case pp::app::FileMenuAction::share_document:
return "share-document";
case pp::app::FileMenuAction::show_resize_dialog:
return "show-resize-dialog";
case pp::app::FileMenuAction::upload_to_cloud:
return "upload-to-cloud";
case pp::app::FileMenuAction::browse_cloud_documents:
return "browse-cloud-documents";
}
return "show-new-document-dialog";
}
const char* document_layer_rename_action_name(pp::app::DocumentLayerRenameAction action) noexcept
{
switch (action) {
@@ -1119,6 +1188,7 @@ void print_help()
<< " inspect-project --path FILE\n"
<< " classify-open --path FILE\n"
<< " plan-open-route --path FILE [--unsaved]\n"
<< " plan-file-menu --command new|import|open|browse|save|save-as|save-version|export|export-submenu|share|resize|cloud-upload|cloud-browse\n"
<< " plan-new-document --work-dir DIR --name NAME [--resolution-index N] [--target-exists]\n"
<< " plan-document-file --work-dir DIR --name NAME [--target-exists]\n"
<< " plan-document-version --directory DIR --doc-name NAME [--existing-path FILE]\n"
@@ -2045,6 +2115,52 @@ int plan_open_route(int argc, char** argv)
return 0;
}
pp::foundation::Status parse_plan_file_menu_args(
int argc,
char** argv,
PlanFileMenuArgs& args)
{
for (int i = 2; i < argc; ++i) {
const std::string_view key(argv[i]);
if (key == "--command") {
if (i + 1 >= argc) {
return pp::foundation::Status::invalid_argument("missing value for option");
}
args.command = argv[++i];
} else {
return pp::foundation::Status::invalid_argument("unknown option");
}
}
return pp::foundation::Status::success();
}
int plan_file_menu(int argc, char** argv)
{
PlanFileMenuArgs args;
const auto status = parse_plan_file_menu_args(argc, argv, args);
if (!status.ok()) {
print_error("plan-file-menu", status.message);
return 2;
}
const auto command = pp::app::parse_file_menu_command(args.command);
if (!command) {
print_error("plan-file-menu", command.status().message);
return 2;
}
const auto plan = pp::app::plan_file_menu_command(command.value());
std::cout << "{\"ok\":true,\"command\":\"plan-file-menu\""
<< ",\"state\":{\"command\":\"" << json_escape(args.command)
<< "\"},\"plan\":{\"command\":\"" << file_menu_command_name(plan.command)
<< "\",\"action\":\"" << file_menu_action_name(plan.action)
<< "\",\"saveIntent\":\"" << document_save_intent_name(plan.save_intent)
<< "\",\"exportKind\":\"" << document_export_menu_kind_name(plan.export_kind)
<< "\"}}\n";
return 0;
}
pp::foundation::Status parse_plan_document_file_args(
int argc,
char** argv,
@@ -6262,6 +6378,10 @@ int main(int argc, char** argv)
return plan_open_route(argc, argv);
}
if (command == "plan-file-menu") {
return plan_file_menu(argc, argv);
}
if (command == "plan-document-file") {
return plan_document_file(argc, argv);
}