Extract about menu action planning

This commit is contained in:
2026-06-03 12:27:47 +02:00
parent c640519772
commit b5bd6d42f7
8 changed files with 476 additions and 44 deletions

View File

@@ -1,3 +1,4 @@
#include "app_core/about_menu.h"
#include "app_core/app_preferences.h"
#include "app_core/app_status.h"
#include "app_core/brush_ui.h"
@@ -352,6 +353,15 @@ struct PlanToolsPanelArgs {
bool already_visible = false;
};
struct PlanAboutMenuArgs {
std::string command = "news";
int version_major = 1;
int version_minor = 0;
int version_fix = 0;
bool diagnostics_available = true;
bool has_canvas = true;
};
struct SimulateAppSessionArgs {
bool has_canvas = true;
bool new_document = false;
@@ -737,6 +747,44 @@ const char* tools_panel_action_name(pp::app::ToolsPanelAction action) noexcept
return "no-op-already-visible";
}
const char* about_menu_command_name(pp::app::AboutMenuCommand command) noexcept
{
switch (command) {
case pp::app::AboutMenuCommand::help_guide:
return "help";
case pp::app::AboutMenuCommand::about_app:
return "about";
case pp::app::AboutMenuCommand::whats_new:
return "news";
case pp::app::AboutMenuCommand::induce_crash:
return "crash";
case pp::app::AboutMenuCommand::performance_test:
return "performance";
}
return "help";
}
const char* about_menu_action_name(pp::app::AboutMenuAction action) noexcept
{
switch (action) {
case pp::app::AboutMenuAction::show_user_manual:
return "show-user-manual";
case pp::app::AboutMenuAction::show_about_dialog:
return "show-about-dialog";
case pp::app::AboutMenuAction::show_whats_new_dialog:
return "show-whats-new-dialog";
case pp::app::AboutMenuAction::trigger_crash_test:
return "trigger-crash-test";
case pp::app::AboutMenuAction::run_performance_test:
return "run-performance-test";
case pp::app::AboutMenuAction::no_op_unavailable:
return "no-op-unavailable";
}
return "no-op-unavailable";
}
pp::foundation::Result<pp::app::ToolsMenuCommand> parse_tools_menu_command(std::string_view command)
{
if (command == "panels") {
@@ -790,6 +838,33 @@ pp::foundation::Result<pp::app::ToolsPanel> parse_tools_panel(std::string_view p
pp::foundation::Status::invalid_argument("unknown tools panel"));
}
pp::foundation::Result<pp::app::AboutMenuCommand> parse_about_menu_command(std::string_view command)
{
if (command == "help" || command == "help-guide" || command == "manual") {
return pp::foundation::Result<pp::app::AboutMenuCommand>::success(
pp::app::AboutMenuCommand::help_guide);
}
if (command == "about" || command == "about-app") {
return pp::foundation::Result<pp::app::AboutMenuCommand>::success(
pp::app::AboutMenuCommand::about_app);
}
if (command == "news" || command == "whats-new") {
return pp::foundation::Result<pp::app::AboutMenuCommand>::success(
pp::app::AboutMenuCommand::whats_new);
}
if (command == "crash" || command == "induce-crash") {
return pp::foundation::Result<pp::app::AboutMenuCommand>::success(
pp::app::AboutMenuCommand::induce_crash);
}
if (command == "performance" || command == "perf") {
return pp::foundation::Result<pp::app::AboutMenuCommand>::success(
pp::app::AboutMenuCommand::performance_test);
}
return pp::foundation::Result<pp::app::AboutMenuCommand>::failure(
pp::foundation::Status::invalid_argument("unknown about menu command"));
}
const char* document_layer_rename_action_name(pp::app::DocumentLayerRenameAction action) noexcept
{
switch (action) {
@@ -1406,6 +1481,7 @@ void print_help()
<< " plan-app-status [--doc-name NAME] [--unsaved] [--resolution N] [--resolution-index N] [--zoom N] [--history-bytes N] [--recording-running] [--encoder-available] [--encoded-frames N]\n"
<< " plan-tools-menu --command panels|options|clear-grids|reset-camera|shortcuts|sonarpen [--sonarpen-available]\n"
<< " plan-tools-panel --panel presets|color|color-advanced|layers|brush|grids|animation [--already-visible]\n"
<< " plan-about-menu --command help|about|news|crash|performance [--version-major N] [--version-minor N] [--version-fix N] [--no-diagnostics] [--no-canvas]\n"
<< " plan-canvas-clear [--no-canvas] [--r N] [--g N] [--b N] [--a N]\n"
<< " plan-image-import --width N --height N\n"
<< " plan-document-resize [--current-resolution N] [--selected-resolution-index N]\n"
@@ -3063,6 +3139,86 @@ int plan_tools_panel(int argc, char** argv)
return 0;
}
pp::foundation::Status parse_plan_about_menu_args(
int argc,
char** argv,
PlanAboutMenuArgs& 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 if (key == "--version-major" || key == "--version-minor" || key == "--version-fix") {
if (i + 1 >= argc) {
return pp::foundation::Status::invalid_argument("missing value for option");
}
const auto value = parse_i32_arg(argv[++i]);
if (!value) {
return value.status();
}
if (key == "--version-major") {
args.version_major = value.value();
} else if (key == "--version-minor") {
args.version_minor = value.value();
} else {
args.version_fix = value.value();
}
} else if (key == "--no-diagnostics") {
args.diagnostics_available = false;
} else if (key == "--no-canvas") {
args.has_canvas = false;
} else {
return pp::foundation::Status::invalid_argument("unknown option");
}
}
return pp::foundation::Status::success();
}
int plan_about_menu(int argc, char** argv)
{
PlanAboutMenuArgs args;
const auto status = parse_plan_about_menu_args(argc, argv, args);
if (!status.ok()) {
print_error("plan-about-menu", status.message);
return 2;
}
const auto command = parse_about_menu_command(args.command);
if (!command) {
print_error("plan-about-menu", command.status().message);
return 2;
}
const auto plan = pp::app::plan_about_menu_command(
command.value(),
args.version_major,
args.version_minor,
args.version_fix,
args.diagnostics_available,
args.has_canvas);
std::cout << "{\"ok\":true,\"command\":\"plan-about-menu\""
<< ",\"state\":{\"command\":\"" << json_escape(args.command)
<< "\",\"versionMajor\":" << args.version_major
<< ",\"versionMinor\":" << args.version_minor
<< ",\"versionFix\":" << args.version_fix
<< ",\"diagnosticsAvailable\":" << json_bool(args.diagnostics_available)
<< ",\"hasCanvas\":" << json_bool(args.has_canvas)
<< "},\"plan\":{\"command\":\"" << about_menu_command_name(plan.command)
<< "\",\"action\":\"" << about_menu_action_name(plan.action)
<< "\",\"label\":\"" << json_escape(plan.label)
<< "\",\"closesRootPopup\":" << json_bool(plan.closes_root_popup)
<< ",\"requiresCanvas\":" << json_bool(plan.requires_canvas)
<< ",\"performanceIterations\":" << plan.performance_iterations
<< ",\"performanceUpdatesPerIteration\":" << plan.performance_updates_per_iteration
<< "}}\n";
return 0;
}
pp::foundation::Status parse_plan_app_status_args(
int argc,
char** argv,
@@ -6834,6 +6990,10 @@ int main(int argc, char** argv)
return plan_tools_panel(argc, argv);
}
if (command == "plan-about-menu") {
return plan_about_menu(argc, argv);
}
if (command == "plan-document-resize") {
return plan_document_resize(argc, argv);
}