Add tools menu service boundary
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "foundation/result.h"
|
||||
|
||||
#include <string_view>
|
||||
|
||||
namespace pp::app {
|
||||
@@ -57,6 +59,18 @@ struct ToolsPanelPlan {
|
||||
bool hides_embedded_title = false;
|
||||
};
|
||||
|
||||
class ToolsMenuServices {
|
||||
public:
|
||||
virtual ~ToolsMenuServices() = default;
|
||||
|
||||
virtual void show_panels_submenu() = 0;
|
||||
virtual void show_options_submenu() = 0;
|
||||
virtual void clear_grid_overlays() = 0;
|
||||
virtual void reset_camera() = 0;
|
||||
virtual void show_shortcuts_dialog() = 0;
|
||||
virtual void start_sonarpen() = 0;
|
||||
};
|
||||
|
||||
[[nodiscard]] constexpr ToolsMenuPlan plan_tools_menu_command(
|
||||
ToolsMenuCommand command,
|
||||
bool sonarpen_available = false) noexcept
|
||||
@@ -138,4 +152,34 @@ struct ToolsPanelPlan {
|
||||
return plan;
|
||||
}
|
||||
|
||||
[[nodiscard]] inline pp::foundation::Status execute_tools_menu_plan(
|
||||
const ToolsMenuPlan& plan,
|
||||
ToolsMenuServices& services)
|
||||
{
|
||||
switch (plan.action) {
|
||||
case ToolsMenuAction::show_panels_submenu:
|
||||
services.show_panels_submenu();
|
||||
return pp::foundation::Status::success();
|
||||
case ToolsMenuAction::show_options_submenu:
|
||||
services.show_options_submenu();
|
||||
return pp::foundation::Status::success();
|
||||
case ToolsMenuAction::clear_grid_overlays:
|
||||
services.clear_grid_overlays();
|
||||
return pp::foundation::Status::success();
|
||||
case ToolsMenuAction::reset_camera:
|
||||
services.reset_camera();
|
||||
return pp::foundation::Status::success();
|
||||
case ToolsMenuAction::show_shortcuts_dialog:
|
||||
services.show_shortcuts_dialog();
|
||||
return pp::foundation::Status::success();
|
||||
case ToolsMenuAction::start_sonarpen:
|
||||
services.start_sonarpen();
|
||||
return pp::foundation::Status::success();
|
||||
case ToolsMenuAction::no_op_unavailable:
|
||||
return pp::foundation::Status::success();
|
||||
}
|
||||
|
||||
return pp::foundation::Status::invalid_argument("unknown tools menu action");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -376,6 +376,49 @@ private:
|
||||
App& app_;
|
||||
};
|
||||
|
||||
class LegacyToolsMenuServices final : public pp::app::ToolsMenuServices {
|
||||
public:
|
||||
explicit LegacyToolsMenuServices(App& app) noexcept
|
||||
: app_(app)
|
||||
{
|
||||
}
|
||||
|
||||
void show_panels_submenu() override
|
||||
{
|
||||
}
|
||||
|
||||
void show_options_submenu() override
|
||||
{
|
||||
}
|
||||
|
||||
void clear_grid_overlays() override
|
||||
{
|
||||
auto* mode = static_cast<CanvasModeGrid*>(Canvas::modes[(int)kCanvasMode::Grid][0]);
|
||||
mode->clear();
|
||||
}
|
||||
|
||||
void reset_camera() override
|
||||
{
|
||||
if (app_.canvas)
|
||||
app_.canvas->reset_camera();
|
||||
}
|
||||
|
||||
void show_shortcuts_dialog() override
|
||||
{
|
||||
app_.dialog_shortcuts();
|
||||
}
|
||||
|
||||
void start_sonarpen() override
|
||||
{
|
||||
#if __IOS__
|
||||
[app_.ios_app sonarpen_start];
|
||||
#endif
|
||||
}
|
||||
|
||||
private:
|
||||
App& app_;
|
||||
};
|
||||
|
||||
void execute_main_toolbar_plan(App& app, const pp::app::MainToolbarPlan& plan)
|
||||
{
|
||||
LegacyMainToolbarServices services(app);
|
||||
@@ -392,6 +435,14 @@ void execute_about_menu_plan(App& app, const pp::app::AboutMenuPlan& plan)
|
||||
LOG("About menu action failed: %s", status.message);
|
||||
}
|
||||
|
||||
void execute_tools_menu_plan(App& app, const pp::app::ToolsMenuPlan& plan)
|
||||
{
|
||||
LegacyToolsMenuServices services(app);
|
||||
const auto status = pp::app::execute_tools_menu_plan(plan, services);
|
||||
if (!status.ok())
|
||||
LOG("Tools menu action failed: %s", status.message);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
void App::title_update()
|
||||
@@ -1580,11 +1631,7 @@ void App::init_menu_tools()
|
||||
|
||||
popup_exp->find<NodeButtonCustom>("clear-grids")->on_click = [this, popup_exp](Node*) {
|
||||
const auto plan = pp::app::plan_tools_menu_command(pp::app::ToolsMenuCommand::clear_grids);
|
||||
if (plan.action == pp::app::ToolsMenuAction::clear_grid_overlays)
|
||||
{
|
||||
CanvasModeGrid* mode = (CanvasModeGrid*)Canvas::modes[(int)kCanvasMode::Grid][0];
|
||||
mode->clear();
|
||||
}
|
||||
execute_tools_menu_plan(*this, plan);
|
||||
if (plan.closes_root_popup)
|
||||
{
|
||||
popup_exp->mouse_release();
|
||||
@@ -1594,8 +1641,7 @@ void App::init_menu_tools()
|
||||
|
||||
popup_exp->find<NodeButtonCustom>("camera-reset")->on_click = [this, popup_exp](Node*) {
|
||||
const auto plan = pp::app::plan_tools_menu_command(pp::app::ToolsMenuCommand::reset_camera);
|
||||
if (plan.action == pp::app::ToolsMenuAction::reset_camera)
|
||||
canvas->reset_camera();
|
||||
execute_tools_menu_plan(*this, plan);
|
||||
if (plan.closes_root_popup)
|
||||
{
|
||||
popup_exp->mouse_release();
|
||||
@@ -1605,8 +1651,7 @@ void App::init_menu_tools()
|
||||
|
||||
popup_exp->find<NodeButtonCustom>("shortcuts")->on_click = [this, popup_exp](Node*) {
|
||||
const auto plan = pp::app::plan_tools_menu_command(pp::app::ToolsMenuCommand::shortcuts);
|
||||
if (plan.action == pp::app::ToolsMenuAction::show_shortcuts_dialog)
|
||||
dialog_shortcuts();
|
||||
execute_tools_menu_plan(*this, plan);
|
||||
if (plan.closes_root_popup)
|
||||
{
|
||||
popup_exp->mouse_release();
|
||||
@@ -1625,8 +1670,7 @@ void App::init_menu_tools()
|
||||
#if __IOS__
|
||||
popup_exp->find<NodeButtonCustom>("sonarpen")->on_click = [this, popup_exp](Node*) {
|
||||
const auto plan = pp::app::plan_tools_menu_command(pp::app::ToolsMenuCommand::sonarpen, true);
|
||||
if (plan.action == pp::app::ToolsMenuAction::start_sonarpen)
|
||||
[ios_app sonarpen_start];
|
||||
execute_tools_menu_plan(*this, plan);
|
||||
if (plan.closes_root_popup)
|
||||
{
|
||||
popup_exp->mouse_release();
|
||||
|
||||
Reference in New Issue
Block a user