Route layer merge through app core

This commit is contained in:
2026-06-03 20:20:07 +02:00
parent b184b3e075
commit 16a1d1e15b
7 changed files with 287 additions and 5 deletions

View File

@@ -78,6 +78,12 @@ struct DocumentLayerMenuPlan {
int to_index = 0;
};
struct DocumentLayerMergePlan {
int from_index = 0;
int to_index = 0;
bool create_history = true;
};
class DocumentLayerMenuServices {
public:
virtual ~DocumentLayerMenuServices() = default;
@@ -115,6 +121,13 @@ public:
virtual void update_title() = 0;
};
class DocumentLayerMergeServices {
public:
virtual ~DocumentLayerMergeServices() = default;
virtual void merge_layers(int from_index, int to_index, bool create_history) = 0;
};
[[nodiscard]] inline pp::foundation::Status validate_layer_index(
int layer_count,
int index) noexcept
@@ -447,6 +460,45 @@ public:
return pp::foundation::Result<DocumentLayerMenuPlan>::success(std::move(plan));
}
[[nodiscard]] inline pp::foundation::Result<DocumentLayerMergePlan> plan_document_layer_merge(
int layer_count,
int from_index,
int to_index,
int animation_duration,
bool create_history = true)
{
auto index_status = validate_layer_index(layer_count, from_index);
if (!index_status.ok()) {
return pp::foundation::Result<DocumentLayerMergePlan>::failure(index_status);
}
index_status = validate_layer_index(layer_count, to_index);
if (!index_status.ok()) {
return pp::foundation::Result<DocumentLayerMergePlan>::failure(index_status);
}
if (animation_duration < 0) {
return pp::foundation::Result<DocumentLayerMergePlan>::failure(
pp::foundation::Status::out_of_range("animation duration must not be negative"));
}
if (animation_duration > 1) {
return pp::foundation::Result<DocumentLayerMergePlan>::failure(
pp::foundation::Status::invalid_argument("animated layer merge is not supported"));
}
if (from_index <= to_index) {
return pp::foundation::Result<DocumentLayerMergePlan>::failure(
pp::foundation::Status::invalid_argument("layer merge source must be above the destination"));
}
DocumentLayerMergePlan plan;
plan.from_index = from_index;
plan.to_index = to_index;
plan.create_history = create_history;
return pp::foundation::Result<DocumentLayerMergePlan>::success(plan);
}
[[nodiscard]] inline pp::foundation::Status execute_document_layer_rename_plan(
const DocumentLayerRenamePlan& plan,
DocumentLayerRenameServices& services)
@@ -545,6 +597,19 @@ inline void execute_document_layer_operation_side_effects(
return pp::foundation::Status::success();
}
[[nodiscard]] inline pp::foundation::Status execute_document_layer_merge_plan(
const DocumentLayerMergePlan& plan,
DocumentLayerMergeServices& services)
{
if (plan.from_index <= plan.to_index) {
return pp::foundation::Status::invalid_argument(
"layer merge source must be above the destination");
}
services.merge_layers(plan.from_index, plan.to_index, plan.create_history);
return pp::foundation::Status::success();
}
[[nodiscard]] inline pp::foundation::Status execute_document_layer_menu_plan(
const DocumentLayerMenuPlan& plan,
DocumentLayerMenuServices& services)