Route app save decisions through app core

This commit is contained in:
2026-06-02 22:26:58 +02:00
parent 76808d60e3
commit d28aa25358
12 changed files with 243 additions and 52 deletions

View File

@@ -97,8 +97,10 @@ struct ClassifyOpenArgs {
};
struct SimulateAppSessionArgs {
bool new_document = false;
bool unsaved = false;
bool close_prompt_open = false;
pp::app::DocumentSaveIntent save_intent = pp::app::DocumentSaveIntent::save;
};
struct SimulateStrokeArgs {
@@ -264,6 +266,38 @@ const char* close_request_decision_name(pp::app::CloseRequestDecision decision)
return "close-now";
}
const char* document_save_intent_name(pp::app::DocumentSaveIntent intent) noexcept
{
switch (intent) {
case pp::app::DocumentSaveIntent::save:
return "save";
case pp::app::DocumentSaveIntent::save_as:
return "save-as";
case pp::app::DocumentSaveIntent::save_version:
return "save-version";
case pp::app::DocumentSaveIntent::save_dirty_version:
return "save-dirty-version";
}
return "save";
}
const char* document_save_decision_name(pp::app::DocumentSaveDecision decision) noexcept
{
switch (decision) {
case pp::app::DocumentSaveDecision::no_op:
return "no-op";
case pp::app::DocumentSaveDecision::show_save_dialog:
return "show-save-dialog";
case pp::app::DocumentSaveDecision::save_existing:
return "save-existing";
case pp::app::DocumentSaveDecision::save_version:
return "save-version";
}
return "no-op";
}
pp::foundation::Result<float> parse_float_arg(std::string_view text)
{
float value = 0.0F;
@@ -302,7 +336,7 @@ void print_help()
<< " simulate-document-edits [--width N] [--height N]\n"
<< " simulate-document-export [--width N] [--height N]\n"
<< " simulate-document-history [--width N] [--height N] [--history N]\n"
<< " simulate-app-session [--unsaved] [--close-prompt-open]\n"
<< " simulate-app-session [--new-document] [--unsaved] [--close-prompt-open] [--save-intent save|save-as|save-version|save-dirty-version]\n"
<< " simulate-blend\n"
<< " simulate-image-import [--width N] [--height N]\n"
<< " simulate-stroke --x1 N --y1 N --x2 N --y2 N [--spacing N]\n"
@@ -1142,10 +1176,28 @@ pp::foundation::Status parse_simulate_app_session_args(
{
for (int i = 2; i < argc; ++i) {
const std::string_view key(argv[i]);
if (key == "--unsaved") {
if (key == "--new-document") {
args.new_document = true;
} else if (key == "--unsaved") {
args.unsaved = true;
} else if (key == "--close-prompt-open") {
args.close_prompt_open = true;
} else if (key == "--save-intent") {
if (i + 1 >= argc) {
return pp::foundation::Status::invalid_argument("missing value for option");
}
const std::string_view value(argv[++i]);
if (value == "save") {
args.save_intent = pp::app::DocumentSaveIntent::save;
} else if (value == "save-as") {
args.save_intent = pp::app::DocumentSaveIntent::save_as;
} else if (value == "save-version") {
args.save_intent = pp::app::DocumentSaveIntent::save_version;
} else if (value == "save-dirty-version") {
args.save_intent = pp::app::DocumentSaveIntent::save_dirty_version;
} else {
return pp::foundation::Status::invalid_argument("unknown save intent");
}
} else {
return pp::foundation::Status::invalid_argument("unknown option");
}
@@ -1165,13 +1217,22 @@ int simulate_app_session(int argc, char** argv)
const auto open_decision = pp::app::plan_project_open(args.unsaved);
const auto close_decision = pp::app::plan_close_request(args.unsaved, args.close_prompt_open);
const auto save_decision = pp::app::plan_document_save(
args.new_document,
args.unsaved,
args.save_intent);
std::cout << "{\"ok\":true,\"command\":\"simulate-app-session\""
<< ",\"state\":{\"unsaved\":" << json_bool(args.unsaved)
<< ",\"state\":{\"newDocument\":" << json_bool(args.new_document)
<< ",\"unsaved\":" << json_bool(args.unsaved)
<< ",\"closePromptOpen\":" << json_bool(args.close_prompt_open)
<< "},\"decisions\":{\"projectOpen\":\""
<< project_open_decision_name(open_decision)
<< "\",\"closeRequest\":\""
<< close_request_decision_name(close_decision)
<< "\",\"saveIntent\":\""
<< document_save_intent_name(args.save_intent)
<< "\",\"saveRequest\":\""
<< document_save_decision_name(save_decision)
<< "\"}}\n";
return 0;
}