Prepare document snapshots before legacy saves

This commit is contained in:
2026-06-05 18:14:50 +02:00
parent f4f6eb903e
commit 9a75782891
9 changed files with 134 additions and 14 deletions

View File

@@ -66,6 +66,17 @@ struct DocumentCanvasSnapshotResult {
bool requires_renderer_payload_readback = false;
};
struct DocumentCanvasSaveSnapshotReport {
std::uint32_t width = 0;
std::uint32_t height = 0;
std::size_t layer_count = 0;
std::size_t frame_count = 0;
std::size_t captured_face_payloads = 0;
std::size_t pending_face_payloads = 0;
bool payload_complete = false;
bool can_export_ppi = false;
};
class DocumentCanvasClearServices {
public:
virtual ~DocumentCanvasClearServices() = default;
@@ -216,6 +227,21 @@ public:
});
}
[[nodiscard]] inline DocumentCanvasSaveSnapshotReport make_document_canvas_save_snapshot_report(
const DocumentCanvasSnapshotResult& snapshot) noexcept
{
return DocumentCanvasSaveSnapshotReport {
.width = snapshot.document.width(),
.height = snapshot.document.height(),
.layer_count = snapshot.layer_count,
.frame_count = snapshot.frame_count,
.captured_face_payloads = snapshot.captured_face_payloads,
.pending_face_payloads = snapshot.pending_face_payloads,
.payload_complete = !snapshot.requires_renderer_payload_readback,
.can_export_ppi = !snapshot.requires_renderer_payload_readback,
};
}
[[nodiscard]] inline pp::foundation::Result<DocumentCanvasClearPlan> plan_document_canvas_clear(
bool has_canvas,
float r = 0.0F,

View File

@@ -4,6 +4,7 @@
#include "app.h"
#include "legacy_app_dialog_services.h"
#include "legacy_document_canvas_services.h"
#include "legacy_canvas_view_services.h"
#include "legacy_history_services.h"
#include "node_dialog_open.h"
@@ -13,6 +14,59 @@
namespace pp::panopainter {
namespace {
void log_legacy_document_save_snapshot(
const char* context,
const pp::app::DocumentCanvasSaveSnapshotReport& report)
{
LOG(
"%s document snapshot: %ux%u layers=%zu frames=%zu capturedFaces=%zu pendingFaces=%zu ppiReady=%s",
context,
report.width,
report.height,
report.layer_count,
report.frame_count,
report.captured_face_payloads,
report.pending_face_payloads,
report.can_export_ppi ? "true" : "false");
}
pp::foundation::Status prepare_legacy_document_save_snapshot(App& app, const char* context)
{
auto snapshot = capture_legacy_canvas_document_payload_snapshot(app);
if (!snapshot) {
LOG("%s document snapshot failed: %s", context, snapshot.status().message);
return snapshot.status();
}
const auto report = pp::app::make_document_canvas_save_snapshot_report(snapshot.value());
log_legacy_document_save_snapshot(context, report);
return pp::foundation::Status::success();
}
void project_save_after_snapshot(App& app, const std::string& path)
{
const auto status = prepare_legacy_document_save_snapshot(app, "project-save");
if (!status.ok())
LOG("project save snapshot bridge retained legacy save after failure: %s", status.message);
app.canvas->m_canvas->project_save(path);
}
void project_save_after_snapshot(App& app)
{
const auto status = prepare_legacy_document_save_snapshot(app, "project-save");
if (!status.ok())
LOG("project save snapshot bridge retained legacy save after failure: %s", status.message);
app.canvas->m_canvas->project_save();
}
void project_save_after_snapshot(App& app, std::function<void(bool)> on_complete)
{
const auto status = prepare_legacy_document_save_snapshot(app, "project-save-before-workflow");
if (!status.ok())
LOG("project save snapshot bridge retained legacy save after failure: %s", status.message);
app.canvas->m_canvas->project_save(std::move(on_complete));
}
void create_legacy_new_document(
App& app,
const pp::app::NewDocumentPlan& plan,
@@ -78,7 +132,7 @@ void save_legacy_document_file(
const pp::app::DocumentFileSavePlan& plan,
const std::shared_ptr<NodeDialogSave>& dialog)
{
app.canvas->m_canvas->project_save(plan.target.path);
project_save_after_snapshot(app, plan.target.path);
app.doc_name = plan.target.name;
app.doc_path = plan.target.path;
app.doc_dir = plan.target.directory;
@@ -133,7 +187,7 @@ public:
app_.doc_path = target.path;
app_.canvas->m_canvas->m_unsaved = true;
app_.title_update();
app_.canvas->m_canvas->project_save(app_.doc_path);
project_save_after_snapshot(app_, app_.doc_path);
}
private:
@@ -190,7 +244,7 @@ public:
void save_existing_document() override
{
Canvas::I->project_save();
project_save_after_snapshot(app_);
}
void save_document_version() override
@@ -224,7 +278,7 @@ public:
auto* app = &app_;
auto action = action_;
m->btn_ok->on_click = [app, m, action](Node*) {
Canvas::I->project_save([app, m, action](bool success) {
project_save_after_snapshot(*app, [app, m, action](bool success) {
if (success)
action();
else {