Extract app status planning into app core

This commit is contained in:
2026-06-03 09:45:12 +02:00
parent a64a63def7
commit 4d06608cc9
9 changed files with 385 additions and 21 deletions

View File

@@ -1,4 +1,5 @@
#include "app_core/app_preferences.h"
#include "app_core/app_status.h"
#include "app_core/document_export.h"
#include "app_core/document_cloud.h"
#include "app_core/document_platform_io.h"
@@ -200,6 +201,18 @@ struct PlanAppPreferencesArgs {
int cursor_mode = 0;
};
struct PlanAppStatusArgs {
std::string document_name = "no-name";
bool unsaved = false;
int resolution = 512;
int resolution_index = 0;
float zoom = 1.0F;
std::uint32_t history_bytes = 0;
bool recording_running = false;
bool encoder_available = false;
std::uint32_t encoded_frames = 0;
};
struct SimulateAppSessionArgs {
bool has_canvas = true;
bool new_document = false;
@@ -668,6 +681,7 @@ void print_help()
<< " plan-cloud-upload-all [--file-count N] [--no-progress-ui]\n"
<< " plan-recording-session [--running] [--frame-count N] [--platform-deletes-recorded-files]\n"
<< " plan-app-preferences [--ui-scale N] [--display-density N] [--current-scale N] [--scale-option N] [--viewport-scale N] [--rtl] [--timelapse-disabled] [--recording-running] [--vr-controllers-disabled] [--cursor-mode N]\n"
<< " 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-share-file [--path FILE]\n"
<< " plan-picked-path [--path FILE]\n"
<< " plan-display-file [--path FILE]\n"
@@ -2107,6 +2121,104 @@ int plan_app_preferences(int argc, char** argv)
return 0;
}
pp::foundation::Status parse_plan_app_status_args(
int argc,
char** argv,
PlanAppStatusArgs& args)
{
for (int i = 2; i < argc; ++i) {
const std::string_view key(argv[i]);
if (key == "--doc-name") {
if (i + 1 >= argc) {
return pp::foundation::Status::invalid_argument("missing value for option");
}
args.document_name = argv[++i];
} else if (key == "--unsaved") {
args.unsaved = true;
} else if (key == "--resolution" || key == "--resolution-index" || key == "--history-bytes"
|| key == "--encoded-frames") {
if (i + 1 >= argc) {
return pp::foundation::Status::invalid_argument("missing value for option");
}
const auto value = pp::foundation::parse_u32(argv[++i]);
if (!value) {
return value.status();
}
if (key == "--resolution") {
args.resolution = static_cast<int>(value.value());
} else if (key == "--resolution-index") {
args.resolution_index = static_cast<int>(value.value());
} else if (key == "--history-bytes") {
args.history_bytes = value.value();
} else {
args.encoded_frames = value.value();
}
} else if (key == "--zoom") {
if (i + 1 >= argc) {
return pp::foundation::Status::invalid_argument("missing value for option");
}
const auto value = parse_float_arg(argv[++i]);
if (!value) {
return value.status();
}
args.zoom = value.value();
} else if (key == "--recording-running") {
args.recording_running = true;
} else if (key == "--encoder-available") {
args.encoder_available = true;
} else {
return pp::foundation::Status::invalid_argument("unknown option");
}
}
return pp::foundation::Status::success();
}
int plan_app_status(int argc, char** argv)
{
PlanAppStatusArgs args;
const auto status = parse_plan_app_status_args(argc, argv, args);
if (!status.ok()) {
print_error("plan-app-status", status.message);
return 2;
}
const auto resolution_from_index = pp::app::display_resolution_from_index(args.resolution_index);
const auto resolution_index = pp::app::document_resolution_to_index(args.resolution);
const auto resolution_label = pp::app::document_resolution_label(args.resolution);
const auto recording_label = pp::app::make_recording_frame_label(
args.recording_running,
args.encoder_available,
static_cast<int>(args.encoded_frames));
std::cout << "{\"ok\":true,\"command\":\"plan-app-status\""
<< ",\"state\":{\"documentName\":\"" << json_escape(args.document_name)
<< "\",\"unsaved\":" << json_bool(args.unsaved)
<< ",\"resolution\":" << args.resolution
<< ",\"resolutionIndex\":" << args.resolution_index
<< ",\"zoom\":" << args.zoom
<< ",\"historyBytes\":" << args.history_bytes
<< ",\"recordingRunning\":" << json_bool(args.recording_running)
<< ",\"encoderAvailable\":" << json_bool(args.encoder_available)
<< ",\"encodedFrames\":" << args.encoded_frames
<< "},\"title\":\"" << json_escape(pp::app::make_document_title(
args.document_name,
args.unsaved,
args.resolution))
<< "\",\"dpi\":\"" << json_escape(pp::app::make_dpi_label(args.zoom))
<< "\",\"memory\":\"" << json_escape(pp::app::make_history_memory_label(args.history_bytes))
<< "\",\"recording\":{\"visible\":" << json_bool(recording_label.visible)
<< ",\"text\":\"" << json_escape(recording_label.text)
<< "\"},\"resolutionMap\":{\"fromIndexValid\":" << json_bool(static_cast<bool>(resolution_from_index))
<< ",\"fromIndex\":" << (resolution_from_index ? resolution_from_index.value() : 0)
<< ",\"toIndexValid\":" << json_bool(static_cast<bool>(resolution_index))
<< ",\"toIndex\":" << (resolution_index ? resolution_index.value() : 0)
<< ",\"labelValid\":" << json_bool(static_cast<bool>(resolution_label))
<< ",\"label\":\"" << json_escape(resolution_label ? std::string(resolution_label.value()) : std::string())
<< "\"}}\n";
return 0;
}
pp::foundation::Status parse_plan_share_file_args(
int argc,
char** argv,
@@ -4503,6 +4615,10 @@ int main(int argc, char** argv)
return plan_app_preferences(argc, argv);
}
if (command == "plan-app-status") {
return plan_app_status(argc, argv);
}
if (command == "plan-share-file") {
return plan_share_file(argc, argv);
}