Extract layer menu action planning

This commit is contained in:
2026-06-03 12:05:13 +02:00
parent 6dac909869
commit fb844f79fd
7 changed files with 440 additions and 40 deletions

View File

@@ -32,6 +32,21 @@ enum class DocumentLayerOperation {
set_highlight,
};
enum class DocumentLayerMenuCommand {
clear,
rename,
merge_down,
};
enum class DocumentLayerMenuAction {
clear_current_layer,
show_rename_dialog,
merge_with_lower_layer,
show_merge_animated_not_supported,
no_op_select_layer,
no_op_select_upper_layer,
};
struct DocumentLayerRenamePlan {
std::string old_name;
std::string new_name;
@@ -55,6 +70,14 @@ struct DocumentLayerOperationPlan {
bool updates_title = false;
};
struct DocumentLayerMenuPlan {
DocumentLayerMenuCommand command = DocumentLayerMenuCommand::clear;
DocumentLayerMenuAction action = DocumentLayerMenuAction::clear_current_layer;
std::string label;
int from_index = 0;
int to_index = 0;
};
[[nodiscard]] inline pp::foundation::Status validate_layer_index(
int layer_count,
int index) noexcept
@@ -328,4 +351,63 @@ struct DocumentLayerOperationPlan {
return pp::foundation::Result<DocumentLayerOperationPlan>::success(plan);
}
[[nodiscard]] inline pp::foundation::Result<DocumentLayerMenuPlan> plan_document_layer_menu(
DocumentLayerMenuCommand command,
bool has_current_layer,
int current_index,
int animation_duration,
std::string_view current_layer_name,
std::string_view lower_layer_name)
{
if (current_index < 0) {
return pp::foundation::Result<DocumentLayerMenuPlan>::failure(
pp::foundation::Status::out_of_range("current layer index must not be negative"));
}
if (animation_duration < 0) {
return pp::foundation::Result<DocumentLayerMenuPlan>::failure(
pp::foundation::Status::out_of_range("animation duration must not be negative"));
}
DocumentLayerMenuPlan plan;
plan.command = command;
plan.from_index = current_index;
plan.to_index = current_index > 0 ? current_index - 1 : 0;
switch (command) {
case DocumentLayerMenuCommand::clear:
plan.action = has_current_layer
? DocumentLayerMenuAction::clear_current_layer
: DocumentLayerMenuAction::no_op_select_layer;
plan.label = has_current_layer
? "Clear Layer " + std::string(current_layer_name)
: "Clear Layer (Select a layer)";
break;
case DocumentLayerMenuCommand::rename:
plan.action = has_current_layer
? DocumentLayerMenuAction::show_rename_dialog
: DocumentLayerMenuAction::no_op_select_layer;
plan.label = has_current_layer
? "Rename Layer " + std::string(current_layer_name)
: "Rename Layer (Select a layer)";
break;
case DocumentLayerMenuCommand::merge_down:
if (!has_current_layer) {
plan.action = DocumentLayerMenuAction::no_op_select_layer;
plan.label = "Merge Layer (Select a layer)";
} else if (animation_duration > 1) {
plan.action = DocumentLayerMenuAction::show_merge_animated_not_supported;
plan.label = "Merge Layer (Animation not supported)";
} else if (current_index <= 0) {
plan.action = DocumentLayerMenuAction::no_op_select_upper_layer;
plan.label = "Merge Layer (Select upper layers)";
} else {
plan.action = DocumentLayerMenuAction::merge_with_lower_layer;
plan.label = "Merge with " + std::string(lower_layer_name);
}
break;
}
return pp::foundation::Result<DocumentLayerMenuPlan>::success(std::move(plan));
}
}