Add layer menu service boundary
This commit is contained in:
@@ -78,6 +78,16 @@ struct DocumentLayerMenuPlan {
|
||||
int to_index = 0;
|
||||
};
|
||||
|
||||
class DocumentLayerMenuServices {
|
||||
public:
|
||||
virtual ~DocumentLayerMenuServices() = default;
|
||||
|
||||
virtual void clear_current_layer() = 0;
|
||||
virtual void show_rename_dialog() = 0;
|
||||
virtual void merge_with_lower_layer(int from_index, int to_index) = 0;
|
||||
virtual void show_merge_animated_not_supported() = 0;
|
||||
};
|
||||
|
||||
[[nodiscard]] inline pp::foundation::Status validate_layer_index(
|
||||
int layer_count,
|
||||
int index) noexcept
|
||||
@@ -410,4 +420,29 @@ struct DocumentLayerMenuPlan {
|
||||
return pp::foundation::Result<DocumentLayerMenuPlan>::success(std::move(plan));
|
||||
}
|
||||
|
||||
[[nodiscard]] inline pp::foundation::Status execute_document_layer_menu_plan(
|
||||
const DocumentLayerMenuPlan& plan,
|
||||
DocumentLayerMenuServices& services)
|
||||
{
|
||||
switch (plan.action) {
|
||||
case DocumentLayerMenuAction::clear_current_layer:
|
||||
services.clear_current_layer();
|
||||
return pp::foundation::Status::success();
|
||||
case DocumentLayerMenuAction::show_rename_dialog:
|
||||
services.show_rename_dialog();
|
||||
return pp::foundation::Status::success();
|
||||
case DocumentLayerMenuAction::merge_with_lower_layer:
|
||||
services.merge_with_lower_layer(plan.from_index, plan.to_index);
|
||||
return pp::foundation::Status::success();
|
||||
case DocumentLayerMenuAction::show_merge_animated_not_supported:
|
||||
services.show_merge_animated_not_supported();
|
||||
return pp::foundation::Status::success();
|
||||
case DocumentLayerMenuAction::no_op_select_layer:
|
||||
case DocumentLayerMenuAction::no_op_select_upper_layer:
|
||||
return pp::foundation::Status::success();
|
||||
}
|
||||
|
||||
return pp::foundation::Status::invalid_argument("unknown document layer menu action");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -419,6 +419,39 @@ private:
|
||||
App& app_;
|
||||
};
|
||||
|
||||
class LegacyDocumentLayerMenuServices final : public pp::app::DocumentLayerMenuServices {
|
||||
public:
|
||||
explicit LegacyDocumentLayerMenuServices(App& app) noexcept
|
||||
: app_(app)
|
||||
{
|
||||
}
|
||||
|
||||
void clear_current_layer() override
|
||||
{
|
||||
if (app_.canvas && app_.canvas->m_canvas)
|
||||
app_.canvas->m_canvas->clear();
|
||||
}
|
||||
|
||||
void show_rename_dialog() override
|
||||
{
|
||||
app_.dialog_layer_rename();
|
||||
}
|
||||
|
||||
void merge_with_lower_layer(int from_index, int to_index) override
|
||||
{
|
||||
if (app_.layers)
|
||||
app_.layers->merge(from_index, to_index, true);
|
||||
}
|
||||
|
||||
void show_merge_animated_not_supported() override
|
||||
{
|
||||
app_.message_box("Not supported", "Merging animated layers is not supported yet.");
|
||||
}
|
||||
|
||||
private:
|
||||
App& app_;
|
||||
};
|
||||
|
||||
void execute_main_toolbar_plan(App& app, const pp::app::MainToolbarPlan& plan)
|
||||
{
|
||||
LegacyMainToolbarServices services(app);
|
||||
@@ -443,6 +476,14 @@ void execute_tools_menu_plan(App& app, const pp::app::ToolsMenuPlan& plan)
|
||||
LOG("Tools menu action failed: %s", status.message);
|
||||
}
|
||||
|
||||
void execute_document_layer_menu_plan(App& app, const pp::app::DocumentLayerMenuPlan& plan)
|
||||
{
|
||||
LegacyDocumentLayerMenuServices services(app);
|
||||
const auto status = pp::app::execute_document_layer_menu_plan(plan, services);
|
||||
if (!status.ok())
|
||||
LOG("Layer menu action failed: %s", status.message);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
void App::title_update()
|
||||
@@ -1832,8 +1873,7 @@ void App::init_menu_layer()
|
||||
|
||||
popup->find<NodeButtonCustom>("layer-clear")->on_click = [this, popup](Node*) {
|
||||
const auto plan = make_layer_menu_plan(pp::app::DocumentLayerMenuCommand::clear, *this);
|
||||
if (plan.action == pp::app::DocumentLayerMenuAction::clear_current_layer)
|
||||
canvas->m_canvas->clear();
|
||||
execute_document_layer_menu_plan(*this, plan);
|
||||
popup->mouse_release();
|
||||
popup->destroy();
|
||||
};
|
||||
@@ -1846,8 +1886,7 @@ void App::init_menu_layer()
|
||||
|
||||
popup->find<NodeButtonCustom>("layer-rename")->on_click = [this, popup](Node*) {
|
||||
const auto plan = make_layer_menu_plan(pp::app::DocumentLayerMenuCommand::rename, *this);
|
||||
if (plan.action == pp::app::DocumentLayerMenuAction::show_rename_dialog)
|
||||
dialog_layer_rename();
|
||||
execute_document_layer_menu_plan(*this, plan);
|
||||
popup->mouse_release();
|
||||
popup->destroy();
|
||||
};
|
||||
@@ -1860,14 +1899,7 @@ void App::init_menu_layer()
|
||||
|
||||
popup->find<NodeButtonCustom>("layer-merge")->on_click = [this, popup](Node*) {
|
||||
const auto plan = make_layer_menu_plan(pp::app::DocumentLayerMenuCommand::merge_down, *this);
|
||||
if (plan.action == pp::app::DocumentLayerMenuAction::show_merge_animated_not_supported)
|
||||
{
|
||||
message_box("Not supported", "Merging animated layers is not supported yet.");
|
||||
}
|
||||
else if (plan.action == pp::app::DocumentLayerMenuAction::merge_with_lower_layer)
|
||||
{
|
||||
layers->merge(plan.from_index, plan.to_index, true);
|
||||
}
|
||||
execute_document_layer_menu_plan(*this, plan);
|
||||
popup->mouse_release();
|
||||
popup->destroy();
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user