diff --git a/docs/modernization/roadmap.md b/docs/modernization/roadmap.md index 14f0a4cb..5e2d3e62 100644 --- a/docs/modernization/roadmap.md +++ b/docs/modernization/roadmap.md @@ -84,7 +84,7 @@ Current hotspot files: - `src/canvas_modes.cpp`: 176 lines - `src/node.cpp`: 222 lines - `src/main.cpp`: 130 lines -- `src/node_panel_brush.cpp`: 186 lines +- `src/node_panel_brush.cpp`: 182 lines - `src/node_stroke_preview.cpp`: 192 lines - `src/node_canvas.cpp`: 69 lines - `src/app.cpp`: 105 lines @@ -370,8 +370,10 @@ Current architecture mismatches that must be treated as real blockers: `NodePanelBrushPreset` registration/lifecycle pocket now also routes through the preset-list helper registry instead of a node-local static vector, which removes the remaining live preset-panel ownership glue from - `src/node_panel_brush.cpp`. The broader preset workflow pocket still remains, - while `NodeCanvas::handle_event()` + `src/node_panel_brush.cpp`, and preset-restore notification visibility now + also stays with `src/legacy_brush_preset_services.*` instead of the node + wrapper. The broader preset workflow pocket still remains, while + `NodeCanvas::handle_event()` now also routes through `execute_node_canvas_handle_event(...)`, which trims another coherent input-routing block from `src/node_canvas.cpp` even though the file is still diff --git a/src/app_dialogs.cpp b/src/app_dialogs.cpp index 9ea3bed8..944acd69 100644 --- a/src/app_dialogs.cpp +++ b/src/app_dialogs.cpp @@ -1,11 +1,8 @@ #include "pch.h" #include "app.h" #include "app_core/app_dialog.h" -#include "app_core/document_layer.h" #include "legacy_app_dialog_services.h" #include "legacy_document_layer_services.h" -#include "legacy_ui_overlay_services.h" -#include "node_dialog_layer_rename.h" #ifdef __QUEST__ #include "oculus_vr.h" @@ -25,6 +22,7 @@ void open_changelog_dialog(App& app); void open_about_dialog(App& app); void open_whatsnew_dialog(App& app, bool force_show); void open_shortcuts_dialog(App& app); +void open_legacy_document_layer_rename_dialog(App& app); } std::shared_ptr App::show_progress(const std::string& title, int total /*= 0*/) @@ -95,46 +93,7 @@ void App::dialog_export_cube_faces() void App::dialog_layer_rename() { - auto* overlay_anchor = layout[main_id]; - if (!overlay_anchor) { - LOG("Layer rename dialog open failed: main layout anchor is missing"); - return; - } - - auto dialog = pp::panopainter::make_legacy_overlay_node(*this); - dialog->input->set_text(layers->m_current_layer->m_label_text); - - App::I->showKeyboard(); - - const auto overlay = pp::panopainter::open_legacy_overlay_node_with_handle(*overlay_anchor, dialog); - if (!overlay) { - App::I->hideKeyboard(); - LOG("Layer rename dialog open failed: %s", overlay.status().message); - return; - } - const auto overlay_handle = overlay.value(); - - const auto close_dialog = [this, overlay_anchor, overlay_handle]() { - const auto close_status = - pp::panopainter::close_legacy_overlay_node(*overlay_anchor, overlay_handle); - (void)close_status; - App::I->hideKeyboard(); - }; - - dialog->btn_ok->on_click = [this,dialog](Node*) - { - const auto old_name = layers->m_current_layer->m_label_text; - const auto plan = pp::app::plan_document_layer_rename(old_name, dialog->get_name()); - if (!plan) - return; - const auto status = pp::panopainter::execute_legacy_document_layer_rename_plan(*this, plan.value(), dialog); - if (!status.ok()) - LOG("Layer rename failed: %s", status.message); - }; - dialog->btn_cancel->on_click = [close_dialog](Node*) - { - close_dialog(); - }; + pp::panopainter::open_legacy_document_layer_rename_dialog(*this); } void App::dialog_preset_download() diff --git a/src/legacy_brush_preset_list_services.cpp b/src/legacy_brush_preset_list_services.cpp index 0fe8b2b2..cfda30b5 100644 --- a/src/legacy_brush_preset_list_services.cpp +++ b/src/legacy_brush_preset_list_services.cpp @@ -7,6 +7,27 @@ namespace pp::panopainter { +namespace { +std::vector s_legacy_brush_preset_panels; +} + +void register_legacy_brush_preset_panel(NodePanelBrushPreset& panel) +{ + s_legacy_brush_preset_panels.push_back(&panel); +} + +void unregister_legacy_brush_preset_panel(NodePanelBrushPreset& panel) +{ + s_legacy_brush_preset_panels.erase( + std::remove(s_legacy_brush_preset_panels.begin(), s_legacy_brush_preset_panels.end(), &panel), + s_legacy_brush_preset_panels.end()); +} + +const std::vector& legacy_brush_preset_panels() +{ + return s_legacy_brush_preset_panels; +} + LegacyBrushPresetListServices::LegacyBrushPresetListServices(NodePanelBrushPreset& owner) : owner_(owner) { @@ -21,7 +42,7 @@ pp::foundation::Status LegacyBrushPresetListServices::add_current_brush_preset(i return pp::foundation::Status::invalid_argument("current brush must be available to add a preset"); } - for (auto p : NodePanelBrushPreset::s_panels) { + for (auto p : legacy_brush_preset_panels()) { p->add_brush(std::make_shared(*Canvas::I->m_current_brush)); } return pp::foundation::Status::success(); @@ -33,7 +54,7 @@ void LegacyBrushPresetListServices::remove_brush_preset( bool selects_target, bool clears_selection) { - for (auto p : NodePanelBrushPreset::s_panels) { + for (auto p : legacy_brush_preset_panels()) { if (current_index < 0 || current_index >= static_cast(p->m_container->m_children.size())) { continue; } @@ -51,7 +72,7 @@ void LegacyBrushPresetListServices::remove_brush_preset( void LegacyBrushPresetListServices::move_brush_preset(int from_index, int to_index) { - for (auto p : NodePanelBrushPreset::s_panels) { + for (auto p : legacy_brush_preset_panels()) { if (from_index >= 0 && from_index < static_cast(p->m_container->m_children.size())) { p->m_container->move_child(p->m_container->m_children[from_index].get(), to_index); } @@ -60,7 +81,7 @@ void LegacyBrushPresetListServices::move_brush_preset(int from_index, int to_ind void LegacyBrushPresetListServices::select_brush_preset(int index, bool notify_brush_changed) { - for (auto p : NodePanelBrushPreset::s_panels) { + for (auto p : legacy_brush_preset_panels()) { if (p->m_current) { p->m_current->m_selected = false; } @@ -75,7 +96,7 @@ void LegacyBrushPresetListServices::select_brush_preset(int index, bool notify_b void LegacyBrushPresetListServices::clear_brush_presets(bool clears_selection) { - for (auto p : NodePanelBrushPreset::s_panels) { + for (auto p : legacy_brush_preset_panels()) { p->m_container->remove_all_children(); if (clears_selection) { p->m_current = nullptr; @@ -85,7 +106,7 @@ void LegacyBrushPresetListServices::clear_brush_presets(bool clears_selection) void LegacyBrushPresetListServices::update_preset_empty_notification() { - for (auto p : NodePanelBrushPreset::s_panels) { + for (auto p : legacy_brush_preset_panels()) { p->m_notification->SetVisibility(p->m_container->m_children.size() == 0); } } diff --git a/src/legacy_brush_preset_list_services.h b/src/legacy_brush_preset_list_services.h index 87b821de..89044e92 100644 --- a/src/legacy_brush_preset_list_services.h +++ b/src/legacy_brush_preset_list_services.h @@ -5,6 +5,10 @@ namespace pp::panopainter { +void register_legacy_brush_preset_panel(NodePanelBrushPreset& panel); +void unregister_legacy_brush_preset_panel(NodePanelBrushPreset& panel); +const std::vector& legacy_brush_preset_panels(); + class LegacyBrushPresetListServices final : public pp::app::BrushPresetListServices { public: explicit LegacyBrushPresetListServices(NodePanelBrushPreset& owner); diff --git a/src/legacy_brush_preset_services.cpp b/src/legacy_brush_preset_services.cpp index c72368ab..c14adf0c 100644 --- a/src/legacy_brush_preset_services.cpp +++ b/src/legacy_brush_preset_services.cpp @@ -1,6 +1,7 @@ #include "pch.h" #include "legacy_brush_preset_services.h" +#include "legacy_brush_preset_list_services.h" #include "abr.h" #include "app.h" @@ -84,6 +85,7 @@ bool LegacyBrushPresetServices::restore() owner_.add_brush(b); } } + owner_.m_notification->SetVisibility(owner_.m_container->m_children.size() == 0); return true; } return false; @@ -350,7 +352,7 @@ bool LegacyBrushPresetServices::import_ppbr(const std::string& path) App::I->ui_task([owner, brushes_to_add = std::move(brushes_to_add), pb]() mutable { for (const auto& b : brushes_to_add) { - for (auto p : NodePanelBrushPreset::s_panels) + for (auto p : legacy_brush_preset_panels()) p->add_brush(b); } @@ -439,7 +441,7 @@ bool LegacyBrushPresetServices::import_abr(const std::string& path) if (b->valid()) { LOG("add preset %s", b->m_name.c_str()); - for (auto p : NodePanelBrushPreset::s_panels) + for (auto p : legacy_brush_preset_panels()) p->add_brush(b); } pb->increment(); diff --git a/src/legacy_document_layer_services.cpp b/src/legacy_document_layer_services.cpp index bdc53b55..64521973 100644 --- a/src/legacy_document_layer_services.cpp +++ b/src/legacy_document_layer_services.cpp @@ -6,6 +6,7 @@ #include "app.h" #include "legacy_document_canvas_services.h" #include "legacy_ui_overlay_services.h" +#include "node_dialog_layer_rename.h" namespace pp::panopainter { namespace { @@ -313,6 +314,50 @@ pp::foundation::Status execute_legacy_document_layer_rename_plan( return pp::app::execute_document_layer_rename_plan(plan, services); } +void open_legacy_document_layer_rename_dialog(App& app) +{ + auto* overlay_anchor = app.layout[app.main_id]; + if (!overlay_anchor) { + LOG("Layer rename dialog open failed: main layout anchor is missing"); + return; + } + + auto dialog = pp::panopainter::make_legacy_overlay_node(app); + dialog->input->set_text(app.layers->m_current_layer->m_label_text); + + app.showKeyboard(); + + const auto overlay = pp::panopainter::open_legacy_overlay_node_with_handle(*overlay_anchor, dialog); + if (!overlay) { + app.hideKeyboard(); + LOG("Layer rename dialog open failed: %s", overlay.status().message); + return; + } + const auto overlay_handle = overlay.value(); + + const auto close_dialog = [&app, overlay_anchor, overlay_handle]() { + const auto close_status = + pp::panopainter::close_legacy_overlay_node(*overlay_anchor, overlay_handle); + (void)close_status; + app.hideKeyboard(); + }; + + dialog->btn_ok->on_click = [&app, dialog](Node*) + { + const auto old_name = app.layers->m_current_layer->m_label_text; + const auto plan = pp::app::plan_document_layer_rename(old_name, dialog->get_name()); + if (!plan) + return; + const auto status = pp::panopainter::execute_legacy_document_layer_rename_plan(app, plan.value(), dialog); + if (!status.ok()) + LOG("Layer rename failed: %s", status.message); + }; + dialog->btn_cancel->on_click = [close_dialog](Node*) + { + close_dialog(); + }; +} + pp::foundation::Status execute_legacy_document_layer_menu_plan( App& app, const pp::app::DocumentLayerMenuPlan& plan) diff --git a/src/legacy_document_layer_services.h b/src/legacy_document_layer_services.h index 6be820a6..7ec3c968 100644 --- a/src/legacy_document_layer_services.h +++ b/src/legacy_document_layer_services.h @@ -15,6 +15,7 @@ namespace pp::panopainter { App& app, const pp::app::DocumentLayerRenamePlan& plan, const std::shared_ptr& dialog); +void open_legacy_document_layer_rename_dialog(App& app); [[nodiscard]] pp::foundation::Status execute_legacy_document_layer_menu_plan( App& app, const pp::app::DocumentLayerMenuPlan& plan); diff --git a/src/node_panel_brush.cpp b/src/node_panel_brush.cpp index 15516bde..fdc75eff 100644 --- a/src/node_panel_brush.cpp +++ b/src/node_panel_brush.cpp @@ -116,8 +116,6 @@ void NodePanelBrush::added(Node* parent) // ----------------------------------------------------------------------- -std::vector NodePanelBrushPreset::s_panels; - Node* NodeBrushPresetItem::clone_instantiate() const { return pp::panopainter::clone_legacy_brush_preset_item(*this); @@ -135,12 +133,12 @@ void NodeBrushPresetItem::draw() NodePanelBrushPreset::NodePanelBrushPreset() { - s_panels.push_back(this); + pp::panopainter::register_legacy_brush_preset_panel(*this); } NodePanelBrushPreset::~NodePanelBrushPreset() { - s_panels.erase(std::remove(s_panels.begin(), s_panels.end(), this)); + pp::panopainter::unregister_legacy_brush_preset_panel(*this); } //--- @@ -150,9 +148,6 @@ Node* NodePanelBrushPreset::clone_instantiate() const return new NodePanelBrushPreset(); } -namespace pp::panopainter { -} // namespace pp::panopainter - void NodePanelBrushPreset::execute_preset_list_plan(const pp::app::BrushPresetListPlan& plan) { pp::panopainter::LegacyBrushPresetListServices services(*this); @@ -184,11 +179,7 @@ bool NodePanelBrushPreset::save() bool NodePanelBrushPreset::restore() { - const auto ok = pp::panopainter::LegacyBrushPresetServices(*this).restore(); - if (ok) { - m_notification->SetVisibility(m_container->m_children.size() == 0); - } - return ok; + return pp::panopainter::LegacyBrushPresetServices(*this).restore(); } void NodePanelBrushPreset::add_brush(std::shared_ptr brush) diff --git a/src/node_panel_brush.h b/src/node_panel_brush.h index 41ebe99b..2f07afda 100644 --- a/src/node_panel_brush.h +++ b/src/node_panel_brush.h @@ -96,8 +96,6 @@ class NodePanelBrushPreset : public Node friend class pp::panopainter::LegacyBrushPresetPanelUi; friend class pp::panopainter::LegacyBrushPresetListServices; friend class pp::panopainter::LegacyBrushPresetServices; - - static std::vector s_panels; bool m_interacted = false; NodeBrushPresetItem* m_current = nullptr; NodeButtonCustom* m_btn_add;