Add main toolbar service boundary
This commit is contained in:
@@ -43,6 +43,20 @@ struct MainToolbarPlan {
|
||||
bool no_op = false;
|
||||
};
|
||||
|
||||
class MainToolbarServices {
|
||||
public:
|
||||
virtual ~MainToolbarServices() = default;
|
||||
|
||||
virtual void show_open_dialog() = 0;
|
||||
virtual void show_save_dialog() = 0;
|
||||
virtual void invoke_undo() = 0;
|
||||
virtual void invoke_redo() = 0;
|
||||
virtual void clear_history() = 0;
|
||||
virtual void clear_canvas() = 0;
|
||||
virtual void show_message_box() = 0;
|
||||
virtual void show_settings_dialog() = 0;
|
||||
};
|
||||
|
||||
[[nodiscard]] inline pp::foundation::Result<MainToolbarPlan> plan_main_toolbar_command(
|
||||
MainToolbarCommand command,
|
||||
int undo_count = 0,
|
||||
@@ -143,4 +157,40 @@ struct MainToolbarPlan {
|
||||
pp::foundation::Status::invalid_argument("unknown main toolbar command"));
|
||||
}
|
||||
|
||||
[[nodiscard]] inline pp::foundation::Status execute_main_toolbar_plan(
|
||||
const MainToolbarPlan& plan,
|
||||
MainToolbarServices& services)
|
||||
{
|
||||
switch (plan.action) {
|
||||
case MainToolbarAction::show_open_dialog:
|
||||
services.show_open_dialog();
|
||||
return pp::foundation::Status::success();
|
||||
case MainToolbarAction::show_save_dialog:
|
||||
services.show_save_dialog();
|
||||
return pp::foundation::Status::success();
|
||||
case MainToolbarAction::invoke_undo:
|
||||
services.invoke_undo();
|
||||
return pp::foundation::Status::success();
|
||||
case MainToolbarAction::invoke_redo:
|
||||
services.invoke_redo();
|
||||
return pp::foundation::Status::success();
|
||||
case MainToolbarAction::clear_history:
|
||||
services.clear_history();
|
||||
return pp::foundation::Status::success();
|
||||
case MainToolbarAction::clear_canvas:
|
||||
services.clear_canvas();
|
||||
return pp::foundation::Status::success();
|
||||
case MainToolbarAction::show_message_box:
|
||||
services.show_message_box();
|
||||
return pp::foundation::Status::success();
|
||||
case MainToolbarAction::show_settings_dialog:
|
||||
services.show_settings_dialog();
|
||||
return pp::foundation::Status::success();
|
||||
case MainToolbarAction::no_op_unavailable:
|
||||
return pp::foundation::Status::success();
|
||||
}
|
||||
|
||||
return pp::foundation::Status::invalid_argument("unknown main toolbar action");
|
||||
}
|
||||
|
||||
} // namespace pp::app
|
||||
|
||||
@@ -249,6 +249,74 @@ void apply_tools_panel_chrome(NodePanelFloating& panel, const pp::app::ToolsPane
|
||||
panel.m_droppable = plan.droppable;
|
||||
}
|
||||
|
||||
class LegacyMainToolbarServices final : public pp::app::MainToolbarServices {
|
||||
public:
|
||||
explicit LegacyMainToolbarServices(App& app) noexcept
|
||||
: app_(app)
|
||||
{
|
||||
}
|
||||
|
||||
void show_open_dialog() override
|
||||
{
|
||||
app_.dialog_open();
|
||||
}
|
||||
|
||||
void show_save_dialog() override
|
||||
{
|
||||
app_.dialog_save();
|
||||
}
|
||||
|
||||
void invoke_undo() override
|
||||
{
|
||||
ActionManager::undo();
|
||||
}
|
||||
|
||||
void invoke_redo() override
|
||||
{
|
||||
ActionManager::redo();
|
||||
}
|
||||
|
||||
void clear_history() override
|
||||
{
|
||||
ActionManager::clear();
|
||||
}
|
||||
|
||||
void clear_canvas() override
|
||||
{
|
||||
if (!app_.canvas || !app_.canvas->m_canvas)
|
||||
return;
|
||||
|
||||
app_.canvas->m_canvas->clear({ 0.0F, 0.0F, 0.0F, 0.0F });
|
||||
}
|
||||
|
||||
void show_message_box() override
|
||||
{
|
||||
app_.msgbox = new NodeMessageBox();
|
||||
app_.msgbox->set_manager(&app_.layout);
|
||||
app_.msgbox->init();
|
||||
app_.layout[app_.main_id]->add_child(app_.msgbox);
|
||||
}
|
||||
|
||||
void show_settings_dialog() override
|
||||
{
|
||||
app_.settings = new NodeSettings();
|
||||
app_.settings->set_manager(&app_.layout);
|
||||
app_.settings->init();
|
||||
app_.layout[app_.main_id]->add_child(app_.settings);
|
||||
}
|
||||
|
||||
private:
|
||||
App& app_;
|
||||
};
|
||||
|
||||
void execute_main_toolbar_plan(App& app, const pp::app::MainToolbarPlan& plan)
|
||||
{
|
||||
LegacyMainToolbarServices services(app);
|
||||
const auto status = pp::app::execute_main_toolbar_plan(plan, services);
|
||||
if (!status.ok())
|
||||
LOG("Main toolbar action failed: %s", status.message);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
void App::title_update()
|
||||
@@ -284,8 +352,8 @@ void App::init_toolbar_main()
|
||||
button->on_click = [this, button](Node*) {
|
||||
const auto plan = pp::app::plan_main_toolbar_command(
|
||||
pp::app::MainToolbarCommand::open_document);
|
||||
if (plan && plan.value().action == pp::app::MainToolbarAction::show_open_dialog)
|
||||
dialog_open();
|
||||
if (plan)
|
||||
execute_main_toolbar_plan(*this, plan.value());
|
||||
};
|
||||
}
|
||||
if (auto* button = layout[main_id]->find<NodeButton>("btn-save"))
|
||||
@@ -293,8 +361,8 @@ void App::init_toolbar_main()
|
||||
button->on_click = [this, button](Node*) {
|
||||
const auto plan = pp::app::plan_main_toolbar_command(
|
||||
pp::app::MainToolbarCommand::save_document);
|
||||
if (plan && plan.value().action == pp::app::MainToolbarAction::show_save_dialog)
|
||||
dialog_save();
|
||||
if (plan)
|
||||
execute_main_toolbar_plan(*this, plan.value());
|
||||
};
|
||||
}
|
||||
if (auto* button = layout[main_id]->find<NodeButtonCustom>("btn-undo"))
|
||||
@@ -303,8 +371,8 @@ void App::init_toolbar_main()
|
||||
const auto plan = pp::app::plan_main_toolbar_command(
|
||||
pp::app::MainToolbarCommand::undo,
|
||||
static_cast<int>(ActionManager::I.m_actions.size()));
|
||||
if (plan && plan.value().action == pp::app::MainToolbarAction::invoke_undo)
|
||||
ActionManager::undo();
|
||||
if (plan)
|
||||
execute_main_toolbar_plan(*this, plan.value());
|
||||
};
|
||||
}
|
||||
if (auto* button = layout[main_id]->find<NodeButtonCustom>("btn-redo"))
|
||||
@@ -314,8 +382,8 @@ void App::init_toolbar_main()
|
||||
pp::app::MainToolbarCommand::redo,
|
||||
0,
|
||||
static_cast<int>(ActionManager::I.m_redos.size()));
|
||||
if (plan && plan.value().action == pp::app::MainToolbarAction::invoke_redo)
|
||||
ActionManager::redo();
|
||||
if (plan)
|
||||
execute_main_toolbar_plan(*this, plan.value());
|
||||
};
|
||||
}
|
||||
if (auto* button = layout[main_id]->find<NodeButtonCustom>("btn-clean-memory"))
|
||||
@@ -326,8 +394,8 @@ void App::init_toolbar_main()
|
||||
static_cast<int>(ActionManager::I.m_actions.size()),
|
||||
static_cast<int>(ActionManager::I.m_redos.size()),
|
||||
static_cast<int>(ActionManager::I.m_memory));
|
||||
if (plan && plan.value().action == pp::app::MainToolbarAction::clear_history)
|
||||
ActionManager::clear();
|
||||
if (plan)
|
||||
execute_main_toolbar_plan(*this, plan.value());
|
||||
};
|
||||
}
|
||||
if (auto* button = layout[main_id]->find<NodeButton>("btn-clear"))
|
||||
@@ -340,12 +408,8 @@ void App::init_toolbar_main()
|
||||
0,
|
||||
0,
|
||||
static_cast<bool>(canvas));
|
||||
if (plan && plan.value().action == pp::app::MainToolbarAction::clear_canvas)
|
||||
canvas->m_canvas->clear({
|
||||
0.0F,
|
||||
0.0F,
|
||||
0.0F,
|
||||
0.0F });
|
||||
if (plan)
|
||||
execute_main_toolbar_plan(*this, plan.value());
|
||||
};
|
||||
}
|
||||
if (auto* button = layout[main_id]->find<NodeButton>("btn-popup"))
|
||||
@@ -353,12 +417,8 @@ void App::init_toolbar_main()
|
||||
button->on_click = [this](Node*) {
|
||||
const auto plan = pp::app::plan_main_toolbar_command(
|
||||
pp::app::MainToolbarCommand::show_message_box);
|
||||
if (!plan || plan.value().action != pp::app::MainToolbarAction::show_message_box)
|
||||
return;
|
||||
msgbox = new NodeMessageBox();
|
||||
msgbox->set_manager(&layout);
|
||||
msgbox->init();
|
||||
layout[main_id]->add_child(msgbox);
|
||||
if (plan)
|
||||
execute_main_toolbar_plan(*this, plan.value());
|
||||
};
|
||||
}
|
||||
if (auto* button = layout[main_id]->find<NodeButtonCustom>("btn-settings"))
|
||||
@@ -366,12 +426,8 @@ void App::init_toolbar_main()
|
||||
button->on_click = [this](Node*) {
|
||||
const auto plan = pp::app::plan_main_toolbar_command(
|
||||
pp::app::MainToolbarCommand::show_settings);
|
||||
if (!plan || plan.value().action != pp::app::MainToolbarAction::show_settings_dialog)
|
||||
return;
|
||||
settings = new NodeSettings();
|
||||
settings->set_manager(&layout);
|
||||
settings->init();
|
||||
layout[main_id]->add_child(settings);
|
||||
if (plan)
|
||||
execute_main_toolbar_plan(*this, plan.value());
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user