Extract app menu binding services

This commit is contained in:
2026-06-17 19:12:46 +02:00
parent d632efb10f
commit 0c609b9d15
16 changed files with 996 additions and 616 deletions

View File

@@ -0,0 +1,166 @@
#include "pch.h"
#include "legacy_about_menu_binding_services.h"
#include "app.h"
#include "legacy_app_shell_services.h"
#include "legacy_ui_overlay_services.h"
#include "node_button_custom.h"
#include "node_popup_menu.h"
#include "node_text.h"
namespace pp::panopainter {
namespace {
std::shared_ptr<NodePopupMenu> add_menu_popup(
App& app,
const char* template_id,
glm::vec2 position,
float rtl_anchor_width)
{
const auto popup = pp::panopainter::add_legacy_popup_menu(
app,
template_id,
position.x,
position.y,
rtl_anchor_width);
if (!popup) {
LOG("Popup menu '%s' failed: %s", template_id ? template_id : "<null>", popup.status().message);
return nullptr;
}
return popup.value();
}
void close_legacy_overlay_handle_ignoring_status(
Node& anchor,
pp::ui::NodeHandle overlay) noexcept
{
(void)pp::panopainter::close_legacy_overlay_node(anchor, overlay);
}
void bind_about_menu_action(
App& app,
Node& popup_root,
pp::ui::NodeHandle popup_handle,
NodeButtonCustom& button,
pp::app::AboutMenuCommand command,
int version_major,
int version_minor,
int version_fix,
bool has_canvas) noexcept
{
button.on_click = [&app, &popup_root, popup_handle, command, version_major, version_minor, version_fix, has_canvas](Node*) {
const auto plan = pp::app::plan_about_menu_command(
command,
version_major,
version_minor,
version_fix,
true,
has_canvas);
execute_legacy_about_menu_plan(app, plan);
if (plan.closes_root_popup) {
close_legacy_overlay_handle_ignoring_status(popup_root, popup_handle);
}
};
}
} // namespace
void bind_legacy_about_menu_popup(
App& app,
Node& popup_root,
NodeButtonCustom& trigger_button,
int version_major,
int version_minor,
int version_fix,
bool has_canvas) noexcept
{
trigger_button.on_click = [&app, &popup_root, &trigger_button, version_major, version_minor, version_fix, has_canvas](Node*) {
const glm::vec2 pos = trigger_button.m_pos + glm::vec2(0, trigger_button.m_size.y);
auto popup = add_menu_popup(app, "about-menu", pos, trigger_button.m_size.x);
if (!popup) {
return;
}
detach_legacy_node_from_parent(*popup);
auto popup_overlay = pp::panopainter::open_legacy_overlay_node_with_handle(popup_root, popup);
if (!popup_overlay) {
pp::panopainter::destroy_legacy_node(*popup);
return;
}
const auto popup_handle = popup_overlay.value();
bind_about_menu_action(
app,
popup_root,
popup_handle,
*popup->find<NodeButtonCustom>("about-app"),
pp::app::AboutMenuCommand::about_app,
version_major,
version_minor,
version_fix,
has_canvas);
bind_about_menu_action(
app,
popup_root,
popup_handle,
*popup->find<NodeButtonCustom>("about-doc"),
pp::app::AboutMenuCommand::help_guide,
version_major,
version_minor,
version_fix,
has_canvas);
if (auto item = popup->find<NodeButtonCustom>("about-news")) {
if (auto text = item->find<NodeText>("menu-label")) {
const auto plan = pp::app::plan_about_menu_command(
pp::app::AboutMenuCommand::whats_new,
version_major,
version_minor,
version_fix);
text->set_text(plan.label.c_str());
}
bind_about_menu_action(
app,
popup_root,
popup_handle,
*item,
pp::app::AboutMenuCommand::whats_new,
version_major,
version_minor,
version_fix,
has_canvas);
}
if (auto b = popup->find<NodeButtonCustom>("about-crash")) {
bind_about_menu_action(
app,
popup_root,
popup_handle,
*b,
pp::app::AboutMenuCommand::induce_crash,
version_major,
version_minor,
version_fix,
has_canvas);
}
if (auto b = popup->find<NodeButtonCustom>("about-perf")) {
bind_about_menu_action(
app,
popup_root,
popup_handle,
*b,
pp::app::AboutMenuCommand::performance_test,
version_major,
version_minor,
version_fix,
has_canvas);
}
};
}
} // namespace pp::panopainter