Move project save write planning to app core

This commit is contained in:
2026-06-06 12:00:57 +02:00
parent ed9709ade8
commit a03db82307
8 changed files with 199 additions and 15 deletions

View File

@@ -103,6 +103,21 @@ struct DocumentCanvasProjectSaveTargetPlan {
std::string timelapse_path;
};
enum class DocumentCanvasProjectSaveWriteAction {
write_direct_to_target,
write_temporary_then_swap,
};
struct DocumentCanvasProjectSaveWritePlan {
DocumentCanvasProjectSaveWriteAction action = DocumentCanvasProjectSaveWriteAction::write_direct_to_target;
std::string write_path;
std::string target_path;
std::string temporary_path;
bool target_exists = false;
bool uses_temporary = false;
bool falls_back_to_direct_on_temporary_open_failure = false;
};
class DocumentCanvasClearServices {
public:
virtual ~DocumentCanvasClearServices() = default;
@@ -350,6 +365,38 @@ plan_document_canvas_project_save_target(
return pp::foundation::Result<DocumentCanvasProjectSaveTargetPlan>::success(std::move(plan));
}
[[nodiscard]] inline pp::foundation::Result<DocumentCanvasProjectSaveWritePlan>
plan_document_canvas_project_save_write(
const DocumentCanvasProjectSaveTargetPlan& target,
bool target_exists)
{
if (target.target_path.empty()) {
return pp::foundation::Result<DocumentCanvasProjectSaveWritePlan>::failure(
pp::foundation::Status::invalid_argument("project save write target path must not be empty"));
}
DocumentCanvasProjectSaveWritePlan plan;
plan.target_exists = target_exists;
plan.target_path = target.target_path;
plan.temporary_path = target.temporary_path;
if (!target_exists) {
plan.write_path = target.target_path;
return pp::foundation::Result<DocumentCanvasProjectSaveWritePlan>::success(std::move(plan));
}
if (target.temporary_path.empty()) {
return pp::foundation::Result<DocumentCanvasProjectSaveWritePlan>::failure(
pp::foundation::Status::invalid_argument("project save temporary path must not be empty"));
}
plan.action = DocumentCanvasProjectSaveWriteAction::write_temporary_then_swap;
plan.write_path = target.temporary_path;
plan.uses_temporary = true;
plan.falls_back_to_direct_on_temporary_open_failure = true;
return pp::foundation::Result<DocumentCanvasProjectSaveWritePlan>::success(std::move(plan));
}
[[nodiscard]] inline pp::foundation::Result<DocumentCanvasClearPlan> plan_document_canvas_clear(
bool has_canvas,
float r = 0.0F,