Move project save target planning to app core

This commit is contained in:
2026-06-06 11:52:49 +02:00
parent 9d9b93abb1
commit ed9709ade8
8 changed files with 217 additions and 7 deletions

View File

@@ -96,6 +96,13 @@ struct DocumentCanvasPpiExportResult {
std::vector<std::byte> bytes;
};
struct DocumentCanvasProjectSaveTargetPlan {
std::string target_path;
std::string file_name;
std::string temporary_path;
std::string timelapse_path;
};
class DocumentCanvasClearServices {
public:
virtual ~DocumentCanvasClearServices() = default;
@@ -299,6 +306,50 @@ export_document_canvas_save_snapshot_to_ppi(const DocumentCanvasSnapshotResult&
});
}
[[nodiscard]] inline pp::foundation::Result<DocumentCanvasProjectSaveTargetPlan>
plan_document_canvas_project_save_target(
std::string_view data_directory,
std::string_view target_path)
{
if (data_directory.empty()) {
return pp::foundation::Result<DocumentCanvasProjectSaveTargetPlan>::failure(
pp::foundation::Status::invalid_argument("project save data directory must not be empty"));
}
if (target_path.empty()) {
return pp::foundation::Result<DocumentCanvasProjectSaveTargetPlan>::failure(
pp::foundation::Status::invalid_argument("project save target path must not be empty"));
}
const auto basename_start = target_path.find_last_of("/\\");
const auto file_name_start = basename_start == std::string_view::npos ? 0U : basename_start + 1U;
auto file_name = target_path.substr(file_name_start);
if (file_name.empty()) {
return pp::foundation::Result<DocumentCanvasProjectSaveTargetPlan>::failure(
pp::foundation::Status::invalid_argument("project save target file name must not be empty"));
}
constexpr std::string_view ppi_extension = ".ppi";
if (file_name.size() > ppi_extension.size()
&& file_name.substr(file_name.size() - ppi_extension.size()) == ppi_extension) {
file_name.remove_suffix(ppi_extension.size());
}
DocumentCanvasProjectSaveTargetPlan plan;
plan.target_path = std::string(target_path);
plan.file_name = std::string(file_name);
plan.temporary_path.reserve(data_directory.size() + plan.file_name.size() + 10U);
plan.temporary_path += data_directory;
plan.temporary_path += "/";
plan.temporary_path += plan.file_name;
plan.temporary_path += ".tmp.ppi";
plan.timelapse_path.reserve(data_directory.size() + plan.file_name.size() + 6U);
plan.timelapse_path += data_directory;
plan.timelapse_path += "/";
plan.timelapse_path += plan.file_name;
plan.timelapse_path += ".pptl";
return pp::foundation::Result<DocumentCanvasProjectSaveTargetPlan>::success(std::move(plan));
}
[[nodiscard]] inline pp::foundation::Result<DocumentCanvasClearPlan> plan_document_canvas_clear(
bool has_canvas,
float r = 0.0F,