From 84373f26e7ed858e87cd7210447dbf2cf420d21e Mon Sep 17 00:00:00 2001 From: omigamedev Date: Fri, 12 Jun 2026 16:34:48 +0200 Subject: [PATCH] Centralize retained control capture release --- docs/modernization/debt.md | 4 ++++ docs/modernization/roadmap.md | 2 ++ src/node_button_custom.cpp | 5 +++-- src/node_canvas.cpp | 3 ++- src/node_color_quad.cpp | 5 +++-- src/node_colorwheel.cpp | 5 +++-- src/node_scroll.cpp | 7 ++++--- src/node_slider.cpp | 5 +++-- 8 files changed, 24 insertions(+), 12 deletions(-) diff --git a/docs/modernization/debt.md b/docs/modernization/debt.md index 20425b9..eeb3169 100644 --- a/docs/modernization/debt.md +++ b/docs/modernization/debt.md @@ -576,6 +576,10 @@ agent or engineer to remove them without reconstructing context from chat. through `src/legacy_ui_overlay_services.*` instead of direct `NodeCanvas` release calls. Capture ownership is still raw until retained `Node` adopts checked handles and scoped event/capture lifetime. +- 2026-06-12: DEBT-0063 was narrowed again. Retained button, slider, scroll, + color-wheel, color-quad, and canvas gesture-end capture release now route + through `src/legacy_ui_overlay_services.*`. The controls still own raw event + callback targets and public `Node` capture state. - 2026-06-05: DEBT-0011 was narrowed. The Windows app package smoke target now passes the configure-time CMake executable into `package-smoke.ps1`, so VS 2026 generator validation does not depend on an older `cmake` on PATH, and diff --git a/docs/modernization/roadmap.md b/docs/modernization/roadmap.md index 3984935..3f47e3d 100644 --- a/docs/modernization/roadmap.md +++ b/docs/modernization/roadmap.md @@ -531,6 +531,8 @@ restored floating color-panel title cleanup now use the retained detach/close/ destroy helpers. Canvas mode mouse-capture release for camera, paint, line, grid, mask, and fill interactions now routes through the retained capture-release helper. +Button, slider, scroll, color-wheel, color-quad, and canvas gesture-end capture +release now route through that same helper. Raw popup callback captures and full close/capture ownership remain part of `DEBT-0063`. `pano_cli inspect-image` exposes PNG IHDR metadata as JSON, diff --git a/src/node_button_custom.cpp b/src/node_button_custom.cpp index 1e0442c..155dc03 100644 --- a/src/node_button_custom.cpp +++ b/src/node_button_custom.cpp @@ -1,5 +1,6 @@ #include "pch.h" #include "log.h" +#include "legacy_ui_overlay_services.h" #include "node_button_custom.h" Node* NodeButtonCustom::clone_instantiate() const @@ -69,13 +70,13 @@ kEventResult NodeButtonCustom::handle_event(Event* e) m_color = m_active ? color_active : (m_mouse_inside ? color_hover : color_normal); else m_color = m_active ? color_active : color_normal; - mouse_release(); + pp::panopainter::release_legacy_mouse_capture(*this); if (m_mouse_inside && on_click != nullptr) on_click(this); break; case kEventType::MouseCancel: m_color = m_active ? color_active : color_normal; - mouse_release(); + pp::panopainter::release_legacy_mouse_capture(*this); break; default: return kEventResult::Available; diff --git a/src/node_canvas.cpp b/src/node_canvas.cpp index fec8bb8..96d6b6d 100644 --- a/src/node_canvas.cpp +++ b/src/node_canvas.cpp @@ -13,6 +13,7 @@ #include "app.h" #include "node_panel_grid.h" #include "legacy_ui_gl_dispatch.h" +#include "legacy_ui_overlay_services.h" #include "legacy_canvas_tool_services.h" #include "legacy_history_services.h" #include "log.h" @@ -836,7 +837,7 @@ kEventResult NodeCanvas::handle_event(Event* e) mode->on_GestureEvent(ge); break; case kEventType::GestureEnd: - mouse_release(); + pp::panopainter::release_legacy_mouse_capture(*this); for (auto& mode : *m_canvas->m_mode) mode->on_GestureEvent(ge); break; diff --git a/src/node_color_quad.cpp b/src/node_color_quad.cpp index 2f65563..362cde5 100644 --- a/src/node_color_quad.cpp +++ b/src/node_color_quad.cpp @@ -1,5 +1,6 @@ #include "pch.h" #include "log.h" +#include "legacy_ui_overlay_services.h" #include "node_color_quad.h" #include "shader.h" @@ -54,7 +55,7 @@ kEventResult NodeColorQuad::handle_event(Event* e) } break; case kEventType::MouseUpL: - mouse_release(); + pp::panopainter::release_legacy_mouse_capture(*this); dragging = false; break; case kEventType::MouseMove: @@ -69,7 +70,7 @@ kEventResult NodeColorQuad::handle_event(Event* e) } break; case kEventType::MouseCancel: - mouse_release(); + pp::panopainter::release_legacy_mouse_capture(*this); dragging = false; m_value = m_old_value; set_value(m_value.x, m_value.y); diff --git a/src/node_colorwheel.cpp b/src/node_colorwheel.cpp index be7e4ee..c96b3ef 100644 --- a/src/node_colorwheel.cpp +++ b/src/node_colorwheel.cpp @@ -1,6 +1,7 @@ #include "pch.h" #include "legacy_gl_mesh_dispatch.h" #include "legacy_ui_gl_dispatch.h" +#include "legacy_ui_overlay_services.h" #include "node_colorwheel.h" #include "renderer_gl/opengl_capabilities.h" #include "shader.h" @@ -180,7 +181,7 @@ kEventResult NodeColorWheel::handle_event(Event* e) } break; case kEventType::MouseUpL: - mouse_release(); + pp::panopainter::release_legacy_mouse_capture(*this); dragging = false; break; case kEventType::MouseMove: @@ -203,7 +204,7 @@ kEventResult NodeColorWheel::handle_event(Event* e) } break; case kEventType::MouseCancel: - mouse_release(); + pp::panopainter::release_legacy_mouse_capture(*this); dragging = false; m_hsv = m_old_value; handle_color_change(); diff --git a/src/node_scroll.cpp b/src/node_scroll.cpp index 4b178f3..4e4e075 100644 --- a/src/node_scroll.cpp +++ b/src/node_scroll.cpp @@ -1,6 +1,7 @@ #include "pch.h" #include "log.h" #include "legacy_ui_gl_dispatch.h" +#include "legacy_ui_overlay_services.h" #include "node_scroll.h" #include "event.h" #include "shader.h" @@ -184,7 +185,7 @@ kEventResult NodeScroll::handle_event(Event* e) } break; case kEventType::MouseUpL: - mouse_release(); + pp::panopainter::release_legacy_mouse_capture(*this); m_dragging = false; break; case kEventType::MouseScroll: @@ -200,10 +201,10 @@ kEventResult NodeScroll::handle_event(Event* e) fix_scroll(); break; case kEventType::GestureEnd: - mouse_release(); + pp::panopainter::release_legacy_mouse_capture(*this); break; case kEventType::MouseCancel: - mouse_release(); + pp::panopainter::release_legacy_mouse_capture(*this); m_dragging = false; break; default: diff --git a/src/node_slider.cpp b/src/node_slider.cpp index 88fb82c..dcdabff 100644 --- a/src/node_slider.cpp +++ b/src/node_slider.cpp @@ -1,5 +1,6 @@ #include "pch.h" #include "log.h" +#include "legacy_ui_overlay_services.h" #include "node_slider.h" #include "shader.h" @@ -91,7 +92,7 @@ kEventResult NodeSliderH::handle_event(Event* e) } break; case kEventType::MouseUpL: - mouse_release(); + pp::panopainter::release_legacy_mouse_capture(*this); if (dragging && on_value_final) on_value_final(this, m_value); dragging = false; @@ -109,7 +110,7 @@ kEventResult NodeSliderH::handle_event(Event* e) } break; case kEventType::MouseCancel: - mouse_release(); + pp::panopainter::release_legacy_mouse_capture(*this); if (dragging) { m_value = m_old_value;