Extract layer rename dialog and brush preset registry shells

This commit is contained in:
2026-06-16 23:46:08 +02:00
parent 42bae9db16
commit cb9751dcc7
9 changed files with 91 additions and 68 deletions

View File

@@ -84,7 +84,7 @@ Current hotspot files:
- `src/canvas_modes.cpp`: 176 lines - `src/canvas_modes.cpp`: 176 lines
- `src/node.cpp`: 222 lines - `src/node.cpp`: 222 lines
- `src/main.cpp`: 130 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_stroke_preview.cpp`: 192 lines
- `src/node_canvas.cpp`: 69 lines - `src/node_canvas.cpp`: 69 lines
- `src/app.cpp`: 105 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 `NodePanelBrushPreset` registration/lifecycle pocket now also routes through
the preset-list helper registry instead of a node-local static vector, the preset-list helper registry instead of a node-local static vector,
which removes the remaining live preset-panel ownership glue from which removes the remaining live preset-panel ownership glue from
`src/node_panel_brush.cpp`. The broader preset workflow pocket still remains, `src/node_panel_brush.cpp`, and preset-restore notification visibility now
while `NodeCanvas::handle_event()` 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 now also routes
through `execute_node_canvas_handle_event(...)`, which trims another coherent through `execute_node_canvas_handle_event(...)`, which trims another coherent
input-routing block from `src/node_canvas.cpp` even though the file is still input-routing block from `src/node_canvas.cpp` even though the file is still

View File

@@ -1,11 +1,8 @@
#include "pch.h" #include "pch.h"
#include "app.h" #include "app.h"
#include "app_core/app_dialog.h" #include "app_core/app_dialog.h"
#include "app_core/document_layer.h"
#include "legacy_app_dialog_services.h" #include "legacy_app_dialog_services.h"
#include "legacy_document_layer_services.h" #include "legacy_document_layer_services.h"
#include "legacy_ui_overlay_services.h"
#include "node_dialog_layer_rename.h"
#ifdef __QUEST__ #ifdef __QUEST__
#include "oculus_vr.h" #include "oculus_vr.h"
@@ -25,6 +22,7 @@ void open_changelog_dialog(App& app);
void open_about_dialog(App& app); void open_about_dialog(App& app);
void open_whatsnew_dialog(App& app, bool force_show); void open_whatsnew_dialog(App& app, bool force_show);
void open_shortcuts_dialog(App& app); void open_shortcuts_dialog(App& app);
void open_legacy_document_layer_rename_dialog(App& app);
} }
std::shared_ptr<NodeProgressBar> App::show_progress(const std::string& title, int total /*= 0*/) std::shared_ptr<NodeProgressBar> 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() void App::dialog_layer_rename()
{ {
auto* overlay_anchor = layout[main_id]; pp::panopainter::open_legacy_document_layer_rename_dialog(*this);
if (!overlay_anchor) {
LOG("Layer rename dialog open failed: main layout anchor is missing");
return;
}
auto dialog = pp::panopainter::make_legacy_overlay_node<NodeDialogLayerRename>(*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();
};
} }
void App::dialog_preset_download() void App::dialog_preset_download()

View File

@@ -7,6 +7,27 @@
namespace pp::panopainter { namespace pp::panopainter {
namespace {
std::vector<NodePanelBrushPreset*> 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<NodePanelBrushPreset*>& legacy_brush_preset_panels()
{
return s_legacy_brush_preset_panels;
}
LegacyBrushPresetListServices::LegacyBrushPresetListServices(NodePanelBrushPreset& owner) LegacyBrushPresetListServices::LegacyBrushPresetListServices(NodePanelBrushPreset& owner)
: owner_(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"); 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<Brush>(*Canvas::I->m_current_brush)); p->add_brush(std::make_shared<Brush>(*Canvas::I->m_current_brush));
} }
return pp::foundation::Status::success(); return pp::foundation::Status::success();
@@ -33,7 +54,7 @@ void LegacyBrushPresetListServices::remove_brush_preset(
bool selects_target, bool selects_target,
bool clears_selection) bool clears_selection)
{ {
for (auto p : NodePanelBrushPreset::s_panels) { for (auto p : legacy_brush_preset_panels()) {
if (current_index < 0 || current_index >= static_cast<int>(p->m_container->m_children.size())) { if (current_index < 0 || current_index >= static_cast<int>(p->m_container->m_children.size())) {
continue; continue;
} }
@@ -51,7 +72,7 @@ void LegacyBrushPresetListServices::remove_brush_preset(
void LegacyBrushPresetListServices::move_brush_preset(int from_index, int to_index) 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<int>(p->m_container->m_children.size())) { if (from_index >= 0 && from_index < static_cast<int>(p->m_container->m_children.size())) {
p->m_container->move_child(p->m_container->m_children[from_index].get(), to_index); 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) 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) { if (p->m_current) {
p->m_current->m_selected = false; 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) 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(); p->m_container->remove_all_children();
if (clears_selection) { if (clears_selection) {
p->m_current = nullptr; p->m_current = nullptr;
@@ -85,7 +106,7 @@ void LegacyBrushPresetListServices::clear_brush_presets(bool clears_selection)
void LegacyBrushPresetListServices::update_preset_empty_notification() 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); p->m_notification->SetVisibility(p->m_container->m_children.size() == 0);
} }
} }

View File

@@ -5,6 +5,10 @@
namespace pp::panopainter { namespace pp::panopainter {
void register_legacy_brush_preset_panel(NodePanelBrushPreset& panel);
void unregister_legacy_brush_preset_panel(NodePanelBrushPreset& panel);
const std::vector<NodePanelBrushPreset*>& legacy_brush_preset_panels();
class LegacyBrushPresetListServices final : public pp::app::BrushPresetListServices { class LegacyBrushPresetListServices final : public pp::app::BrushPresetListServices {
public: public:
explicit LegacyBrushPresetListServices(NodePanelBrushPreset& owner); explicit LegacyBrushPresetListServices(NodePanelBrushPreset& owner);

View File

@@ -1,6 +1,7 @@
#include "pch.h" #include "pch.h"
#include "legacy_brush_preset_services.h" #include "legacy_brush_preset_services.h"
#include "legacy_brush_preset_list_services.h"
#include "abr.h" #include "abr.h"
#include "app.h" #include "app.h"
@@ -84,6 +85,7 @@ bool LegacyBrushPresetServices::restore()
owner_.add_brush(b); owner_.add_brush(b);
} }
} }
owner_.m_notification->SetVisibility(owner_.m_container->m_children.size() == 0);
return true; return true;
} }
return false; 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 { App::I->ui_task([owner, brushes_to_add = std::move(brushes_to_add), pb]() mutable {
for (const auto& b : brushes_to_add) for (const auto& b : brushes_to_add)
{ {
for (auto p : NodePanelBrushPreset::s_panels) for (auto p : legacy_brush_preset_panels())
p->add_brush(b); p->add_brush(b);
} }
@@ -439,7 +441,7 @@ bool LegacyBrushPresetServices::import_abr(const std::string& path)
if (b->valid()) if (b->valid())
{ {
LOG("add preset %s", b->m_name.c_str()); 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); p->add_brush(b);
} }
pb->increment(); pb->increment();

View File

@@ -6,6 +6,7 @@
#include "app.h" #include "app.h"
#include "legacy_document_canvas_services.h" #include "legacy_document_canvas_services.h"
#include "legacy_ui_overlay_services.h" #include "legacy_ui_overlay_services.h"
#include "node_dialog_layer_rename.h"
namespace pp::panopainter { namespace pp::panopainter {
namespace { namespace {
@@ -313,6 +314,50 @@ pp::foundation::Status execute_legacy_document_layer_rename_plan(
return pp::app::execute_document_layer_rename_plan(plan, services); 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<NodeDialogLayerRename>(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( pp::foundation::Status execute_legacy_document_layer_menu_plan(
App& app, App& app,
const pp::app::DocumentLayerMenuPlan& plan) const pp::app::DocumentLayerMenuPlan& plan)

View File

@@ -15,6 +15,7 @@ namespace pp::panopainter {
App& app, App& app,
const pp::app::DocumentLayerRenamePlan& plan, const pp::app::DocumentLayerRenamePlan& plan,
const std::shared_ptr<NodeDialogLayerRename>& dialog); const std::shared_ptr<NodeDialogLayerRename>& dialog);
void open_legacy_document_layer_rename_dialog(App& app);
[[nodiscard]] pp::foundation::Status execute_legacy_document_layer_menu_plan( [[nodiscard]] pp::foundation::Status execute_legacy_document_layer_menu_plan(
App& app, App& app,
const pp::app::DocumentLayerMenuPlan& plan); const pp::app::DocumentLayerMenuPlan& plan);

View File

@@ -116,8 +116,6 @@ void NodePanelBrush::added(Node* parent)
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
std::vector<NodePanelBrushPreset*> NodePanelBrushPreset::s_panels;
Node* NodeBrushPresetItem::clone_instantiate() const Node* NodeBrushPresetItem::clone_instantiate() const
{ {
return pp::panopainter::clone_legacy_brush_preset_item(*this); return pp::panopainter::clone_legacy_brush_preset_item(*this);
@@ -135,12 +133,12 @@ void NodeBrushPresetItem::draw()
NodePanelBrushPreset::NodePanelBrushPreset() NodePanelBrushPreset::NodePanelBrushPreset()
{ {
s_panels.push_back(this); pp::panopainter::register_legacy_brush_preset_panel(*this);
} }
NodePanelBrushPreset::~NodePanelBrushPreset() 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(); return new NodePanelBrushPreset();
} }
namespace pp::panopainter {
} // namespace pp::panopainter
void NodePanelBrushPreset::execute_preset_list_plan(const pp::app::BrushPresetListPlan& plan) void NodePanelBrushPreset::execute_preset_list_plan(const pp::app::BrushPresetListPlan& plan)
{ {
pp::panopainter::LegacyBrushPresetListServices services(*this); pp::panopainter::LegacyBrushPresetListServices services(*this);
@@ -184,11 +179,7 @@ bool NodePanelBrushPreset::save()
bool NodePanelBrushPreset::restore() bool NodePanelBrushPreset::restore()
{ {
const auto ok = pp::panopainter::LegacyBrushPresetServices(*this).restore(); return pp::panopainter::LegacyBrushPresetServices(*this).restore();
if (ok) {
m_notification->SetVisibility(m_container->m_children.size() == 0);
}
return ok;
} }
void NodePanelBrushPreset::add_brush(std::shared_ptr<Brush> brush) void NodePanelBrushPreset::add_brush(std::shared_ptr<Brush> brush)

View File

@@ -96,8 +96,6 @@ class NodePanelBrushPreset : public Node
friend class pp::panopainter::LegacyBrushPresetPanelUi; friend class pp::panopainter::LegacyBrushPresetPanelUi;
friend class pp::panopainter::LegacyBrushPresetListServices; friend class pp::panopainter::LegacyBrushPresetListServices;
friend class pp::panopainter::LegacyBrushPresetServices; friend class pp::panopainter::LegacyBrushPresetServices;
static std::vector<NodePanelBrushPreset*> s_panels;
bool m_interacted = false; bool m_interacted = false;
NodeBrushPresetItem* m_current = nullptr; NodeBrushPresetItem* m_current = nullptr;
NodeButtonCustom* m_btn_add; NodeButtonCustom* m_btn_add;