diff --git a/src/node_panel_stroke.cpp b/src/node_panel_stroke.cpp index 23501acc..6bc8bf80 100644 --- a/src/node_panel_stroke.cpp +++ b/src/node_panel_stroke.cpp @@ -116,6 +116,43 @@ pp::app::BrushStrokePanelInput make_stroke_panel_input(const Brush& brush) return input; } +template +bool open_stroke_popup_with_handles( + NodePanelStroke& panel, + const std::shared_ptr& popup, + const glm::vec2& tick_pos, + float button_height) noexcept +{ + if (!popup) { + return false; + } + + panel.close_popup_overlay_handles(); + + auto tick = pp::panopainter::make_legacy_overlay_node_for_anchor(panel); + tick->SetPositioning(YGPositionTypeAbsolute); + tick->SetSize(16, 32); + tick->SetPosition(tick_pos.x, tick_pos.y + (button_height - 32) * 0.5f); + tick->set_image("data/ui/popup-tick.png"); + tick->m_scale = { 1, 1 }; + + const auto popup_overlay = pp::panopainter::open_legacy_overlay_node_with_handle(panel, popup); + const auto tick_overlay = pp::panopainter::open_legacy_overlay_node_with_handle(panel, tick); + if (!popup_overlay || !tick_overlay) { + pp::panopainter::close_legacy_overlay_handles_if_open(panel, popup_overlay, tick_overlay); + panel.m_popup_overlay_handle = {}; + panel.m_tick_overlay_handle = {}; + return false; + } + + panel.m_popup_overlay_handle = popup_overlay.value(); + panel.m_tick_overlay_handle = tick_overlay.value(); + popup->on_popup_close = [&panel](Node*) { + panel.close_popup_overlay_handles(); + }; + return true; +} + } // namespace Node* NodePanelStroke::clone_instantiate() const @@ -313,28 +350,21 @@ void NodePanelStroke::init_controls() m_preset_button->on_click = [this](Node*) { auto screen = root()->m_size; glm::vec2 pos = m_preset_button->m_pos + glm::vec2(m_preset_button->m_size.x, 0); - (void)pp::panopainter::attach_legacy_overlay_node_to_root(*this, App::I->presets); - auto tick = pp::panopainter::make_legacy_overlay_node_for_anchor(*this); - tick->SetPositioning(YGPositionTypeAbsolute); - tick->SetSize(16, 32); - tick->SetPosition(pos.x, pos.y + (m_preset_button->m_size.y - 32) * 0.5f); - tick->set_image("data/ui/popup-tick.png"); - (void)pp::panopainter::attach_legacy_overlay_node_to_root(*this, tick); + if (!open_stroke_popup_with_handles(*this, App::I->presets, pos, m_preset_button->m_size.y)) { + return; + } float hh = App::I->presets->m_container->m_children.size() > 10 ? App::I->height / App::I->zoom * .75f : 400.f; App::I->presets->SetHeight(glm::max(hh, 400.f)); App::I->presets->SetWidth(300); root()->update(); if ((pos.y + App::I->presets->m_size.y) > screen.y) pos.y = screen.y - App::I->presets->m_size.y; - if (pos.y < 0) + if (pos.y < 0) pos.y = 0; App::I->presets->SetPosition(pos.x + 16, pos.y); App::I->presets->SetPositioning(YGPositionTypeAbsolute); pp::panopainter::activate_legacy_popup_overlay(*App::I->presets); root()->update(); - - pp::panopainter::bind_legacy_popup_close_destroys_overlay(*App::I->presets, tick); - App::I->presets->on_brush_changed = [this](Node* target, std::shared_ptr& b) { // don't change some params //b->m_tip_size = Canvas::I->m_current_brush->m_tip_size; @@ -360,13 +390,9 @@ void NodePanelStroke::init_controls() m_brush_button->on_click = [this](Node*) { auto screen = root()->m_size; glm::vec2 pos = m_brush_button->m_pos + glm::vec2(m_brush_button->m_size.x, 0); - (void)pp::panopainter::attach_legacy_overlay_node_to_root(*this, m_brush_popup); - auto tick = pp::panopainter::make_legacy_overlay_node_for_anchor(*this); - tick->SetPositioning(YGPositionTypeAbsolute); - tick->SetSize(16, 32); - tick->SetPosition(pos.x, pos.y + (m_brush_button->m_size.y - 32) * 0.5f); - tick->set_image("data/ui/popup-tick.png"); - (void)pp::panopainter::attach_legacy_overlay_node_to_root(*this, tick); + if (!open_stroke_popup_with_handles(*this, m_brush_popup, pos, m_brush_button->m_size.y)) { + return; + } root()->update(); if ((pos.y + m_brush_popup->m_size.y) > screen.y) pos.y = screen.y - m_brush_popup->m_size.y; @@ -376,8 +402,6 @@ void NodePanelStroke::init_controls() pp::panopainter::activate_legacy_popup_overlay(*m_brush_popup); root()->update(); - pp::panopainter::bind_legacy_popup_close_destroys_overlay(*m_brush_popup, tick); - m_brush_popup->on_brush_changed = [this](Node*, int index) { if (on_brush_changed) on_brush_changed(this, m_brush_popup->get_texture_path(index), m_brush_popup->get_thumb_path(index)); @@ -395,13 +419,9 @@ void NodePanelStroke::init_controls() m_dual_brush_button->on_click = [this](Node*) { auto screen = root()->m_size; glm::vec2 pos = m_dual_brush_button->m_pos + glm::vec2(m_dual_brush_button->m_size.x, 0); - (void)pp::panopainter::attach_legacy_overlay_node_to_root(*this, m_brush_popup); - auto tick = pp::panopainter::make_legacy_overlay_node_for_anchor(*this); - tick->SetPositioning(YGPositionTypeAbsolute); - tick->SetSize(16, 32); - tick->SetPosition(pos.x, pos.y + (m_dual_brush_button->m_size.y - 32) * 0.5f); - tick->set_image("data/ui/popup-tick.png"); - (void)pp::panopainter::attach_legacy_overlay_node_to_root(*this, tick); + if (!open_stroke_popup_with_handles(*this, m_brush_popup, pos, m_dual_brush_button->m_size.y)) { + return; + } root()->update(); if ((pos.y + m_brush_popup->m_size.y) > screen.y) pos.y = screen.y - m_brush_popup->m_size.y; @@ -411,8 +431,6 @@ void NodePanelStroke::init_controls() pp::panopainter::activate_legacy_popup_overlay(*m_brush_popup); root()->update(); - pp::panopainter::bind_legacy_popup_close_destroys_overlay(*m_brush_popup, tick); - m_brush_popup->on_brush_changed = [this](Node*, int index) { m_dual_enabled->set_value(true, true); if (on_dual_changed) @@ -430,13 +448,9 @@ void NodePanelStroke::init_controls() m_pattern_button->on_click = [this](Node*) { auto screen = root()->m_size; glm::vec2 pos = m_pattern_button->m_pos + glm::vec2(m_pattern_button->m_size.x, 0); - (void)pp::panopainter::attach_legacy_overlay_node_to_root(*this, m_pattern_popup); - auto tick = pp::panopainter::make_legacy_overlay_node_for_anchor(*this); - tick->SetPositioning(YGPositionTypeAbsolute); - tick->SetSize(16, 32); - tick->SetPosition(pos.x, pos.y + (m_pattern_button->m_size.y - 32) * 0.5f); - tick->set_image("data/ui/popup-tick.png"); - (void)pp::panopainter::attach_legacy_overlay_node_to_root(*this, tick); + if (!open_stroke_popup_with_handles(*this, m_pattern_popup, pos, m_pattern_button->m_size.y)) { + return; + } root()->update(); if ((pos.y + m_pattern_popup->m_size.y) > screen.y) pos.y = screen.y - m_pattern_popup->m_size.y; @@ -446,8 +460,6 @@ void NodePanelStroke::init_controls() pp::panopainter::activate_legacy_popup_overlay(*m_pattern_popup); root()->update(); - pp::panopainter::bind_legacy_popup_close_destroys_overlay(*m_pattern_popup, tick); - m_pattern_popup->on_brush_changed = [this](Node*, int index) { m_pattern_enabled->set_value(true, true); if (on_pattern_changed) @@ -708,6 +720,18 @@ void NodePanelStroke::execute_stroke_control_plan(const pp::app::BrushStrokeCont } } +void NodePanelStroke::close_popup_overlay_handles() noexcept +{ + if (m_popup_overlay_handle.valid()) { + pp::panopainter::close_legacy_overlay_handle_ignoring_status(*this, m_popup_overlay_handle); + m_popup_overlay_handle = {}; + } + if (m_tick_overlay_handle.valid()) { + pp::panopainter::close_legacy_overlay_handle_ignoring_status(*this, m_tick_overlay_handle); + m_tick_overlay_handle = {}; + } +} + kEventResult NodePanelStroke::handle_event(Event* e) { switch (e->m_type) @@ -715,7 +739,7 @@ kEventResult NodePanelStroke::handle_event(Event* e) case kEventType::MouseUpL: if (!m_mouse_inside) { - pp::panopainter::close_legacy_popup_panel(*this, on_popup_close); + close_popup_overlay_handles(); } break; default: