Prepare document snapshots before legacy saves
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user