Centralize canvas mode capture release
This commit is contained in:
@@ -571,6 +571,11 @@ agent or engineer to remove them without reconstructing context from chat.
|
|||||||
title cleanup now use retained detach/close/destroy helpers in
|
title cleanup now use retained detach/close/destroy helpers in
|
||||||
`src/legacy_ui_overlay_services.*`. Dock/drop child ownership and raw panel
|
`src/legacy_ui_overlay_services.*`. Dock/drop child ownership and raw panel
|
||||||
globals remain legacy-owned.
|
globals remain legacy-owned.
|
||||||
|
- 2026-06-12: DEBT-0063 was narrowed again. Retained canvas mode mouse-capture
|
||||||
|
release for camera, paint, line, grid, mask, and fill interactions now routes
|
||||||
|
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-05: DEBT-0011 was narrowed. The Windows app package smoke target now
|
- 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
|
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
|
2026 generator validation does not depend on an older `cmake` on PATH, and
|
||||||
|
|||||||
@@ -529,6 +529,8 @@ cleanup now route through those same retained close/destroy helpers.
|
|||||||
Toolbar popup restoration from docked floating stroke/layer/grid panels and
|
Toolbar popup restoration from docked floating stroke/layer/grid panels and
|
||||||
restored floating color-panel title cleanup now use the retained detach/close/
|
restored floating color-panel title cleanup now use the retained detach/close/
|
||||||
destroy helpers.
|
destroy helpers.
|
||||||
|
Canvas mode mouse-capture release for camera, paint, line, grid, mask, and fill
|
||||||
|
interactions now routes through the retained capture-release helper.
|
||||||
Raw popup callback captures and full close/capture ownership remain part of
|
Raw popup callback captures and full close/capture ownership remain part of
|
||||||
`DEBT-0063`.
|
`DEBT-0063`.
|
||||||
`pano_cli inspect-image` exposes PNG IHDR metadata as JSON,
|
`pano_cli inspect-image` exposes PNG IHDR metadata as JSON,
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
#include "canvas.h"
|
#include "canvas.h"
|
||||||
#include "shader.h"
|
#include "shader.h"
|
||||||
#include "node_canvas.h"
|
#include "node_canvas.h"
|
||||||
|
#include "legacy_ui_overlay_services.h"
|
||||||
#include "legacy_ui_gl_dispatch.h"
|
#include "legacy_ui_gl_dispatch.h"
|
||||||
#include "app.h"
|
#include "app.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
@@ -83,7 +84,7 @@ void CanvasModeBasicCamera::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
|||||||
if (m_draggingL)
|
if (m_draggingL)
|
||||||
{
|
{
|
||||||
m_draggingL = false;
|
m_draggingL = false;
|
||||||
node->mouse_release();
|
pp::panopainter::release_legacy_mouse_capture(*node);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case kEventType::MouseDownR:
|
case kEventType::MouseDownR:
|
||||||
@@ -98,7 +99,7 @@ void CanvasModeBasicCamera::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
|||||||
break;
|
break;
|
||||||
case kEventType::MouseUpR:
|
case kEventType::MouseUpR:
|
||||||
m_draggingR = false;
|
m_draggingR = false;
|
||||||
node->mouse_release();
|
pp::panopainter::release_legacy_mouse_capture(*node);
|
||||||
break;
|
break;
|
||||||
case kEventType::MouseMove:
|
case kEventType::MouseMove:
|
||||||
if (m_draggingR)
|
if (m_draggingR)
|
||||||
@@ -131,7 +132,7 @@ void CanvasModeBasicCamera::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
|||||||
break;
|
break;
|
||||||
case kEventType::MouseCancel:
|
case kEventType::MouseCancel:
|
||||||
m_draggingR = false;
|
m_draggingR = false;
|
||||||
node->mouse_release();
|
pp::panopainter::release_legacy_mouse_capture(*node);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -207,7 +208,7 @@ void CanvasModePen::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
|||||||
case kEventType::MouseUpL:
|
case kEventType::MouseUpL:
|
||||||
if (m_dragging && !m_picking)
|
if (m_dragging && !m_picking)
|
||||||
{
|
{
|
||||||
node->mouse_release();
|
pp::panopainter::release_legacy_mouse_capture(*node);
|
||||||
App::I->render_task_async([]
|
App::I->render_task_async([]
|
||||||
{
|
{
|
||||||
Canvas::I->stroke_end();
|
Canvas::I->stroke_end();
|
||||||
@@ -215,7 +216,7 @@ void CanvasModePen::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
|||||||
}
|
}
|
||||||
if (m_dragging && m_picking)
|
if (m_dragging && m_picking)
|
||||||
{
|
{
|
||||||
node->mouse_release();
|
pp::panopainter::release_legacy_mouse_capture(*node);
|
||||||
glm::vec4 pix = Canvas::I->pick_get(loc);
|
glm::vec4 pix = Canvas::I->pick_get(loc);
|
||||||
Canvas::I->m_current_brush->m_tip_color = pix;
|
Canvas::I->m_current_brush->m_tip_color = pix;
|
||||||
App::I->brush_update(true, false);
|
App::I->brush_update(true, false);
|
||||||
@@ -239,7 +240,7 @@ void CanvasModePen::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
|||||||
case kEventType::MouseUpR:
|
case kEventType::MouseUpR:
|
||||||
if (m_dragging && m_resizing)
|
if (m_dragging && m_resizing)
|
||||||
{
|
{
|
||||||
node->mouse_release();
|
pp::panopainter::release_legacy_mouse_capture(*node);
|
||||||
m_dragging = false;
|
m_dragging = false;
|
||||||
m_resizing = false;
|
m_resizing = false;
|
||||||
}
|
}
|
||||||
@@ -275,7 +276,7 @@ void CanvasModePen::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
|||||||
Canvas::I->stroke_cancel();
|
Canvas::I->stroke_cancel();
|
||||||
});
|
});
|
||||||
m_dragging = false;
|
m_dragging = false;
|
||||||
node->mouse_release();
|
pp::panopainter::release_legacy_mouse_capture(*node);
|
||||||
}
|
}
|
||||||
if (m_picking)
|
if (m_picking)
|
||||||
m_picking = false;
|
m_picking = false;
|
||||||
@@ -377,7 +378,7 @@ void CanvasModeLine::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
|||||||
m_drag_pos = loc;
|
m_drag_pos = loc;
|
||||||
break;
|
break;
|
||||||
case kEventType::MouseUpL:
|
case kEventType::MouseUpL:
|
||||||
node->mouse_release();
|
pp::panopainter::release_legacy_mouse_capture(*node);
|
||||||
if (m_dragging)
|
if (m_dragging)
|
||||||
{
|
{
|
||||||
App::I->render_task_async([=]
|
App::I->render_task_async([=]
|
||||||
@@ -396,7 +397,7 @@ void CanvasModeLine::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
|||||||
m_cur_pos = loc;
|
m_cur_pos = loc;
|
||||||
break;
|
break;
|
||||||
case kEventType::MouseCancel:
|
case kEventType::MouseCancel:
|
||||||
node->mouse_release();
|
pp::panopainter::release_legacy_mouse_capture(*node);
|
||||||
m_dragging = false;
|
m_dragging = false;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -487,7 +488,7 @@ void CanvasModeCamera::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
|||||||
break;
|
break;
|
||||||
case kEventType::MouseUpL:
|
case kEventType::MouseUpL:
|
||||||
m_dragging = false;
|
m_dragging = false;
|
||||||
node->mouse_release();
|
pp::panopainter::release_legacy_mouse_capture(*node);
|
||||||
Canvas::I->m_cam_pos = { 0, 0, 0 };
|
Canvas::I->m_cam_pos = { 0, 0, 0 };
|
||||||
break;
|
break;
|
||||||
case kEventType::MouseMove:
|
case kEventType::MouseMove:
|
||||||
@@ -496,7 +497,7 @@ void CanvasModeCamera::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
|||||||
break;
|
break;
|
||||||
case kEventType::MouseCancel:
|
case kEventType::MouseCancel:
|
||||||
m_dragging = false;
|
m_dragging = false;
|
||||||
node->mouse_release();
|
pp::panopainter::release_legacy_mouse_capture(*node);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -552,7 +553,7 @@ void CanvasModeGrid::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case kEventType::MouseUpL:
|
case kEventType::MouseUpL:
|
||||||
node->mouse_release();
|
pp::panopainter::release_legacy_mouse_capture(*node);
|
||||||
m_dragging = false;
|
m_dragging = false;
|
||||||
ActionManager::add(m_action.release());
|
ActionManager::add(m_action.release());
|
||||||
//commit();
|
//commit();
|
||||||
@@ -574,7 +575,7 @@ void CanvasModeGrid::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
|||||||
if (m_dragging && m_selected_index == m_lines.size() - 1)
|
if (m_dragging && m_selected_index == m_lines.size() - 1)
|
||||||
m_lines.pop_back();
|
m_lines.pop_back();
|
||||||
m_dragging = false;
|
m_dragging = false;
|
||||||
node->mouse_release();
|
pp::panopainter::release_legacy_mouse_capture(*node);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -728,7 +729,7 @@ void CanvasModeMaskFree::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case kEventType::MouseUpL:
|
case kEventType::MouseUpL:
|
||||||
node->mouse_release();
|
pp::panopainter::release_legacy_mouse_capture(*node);
|
||||||
m_dragging = false;
|
m_dragging = false;
|
||||||
if (m_points2d.size() > 3)
|
if (m_points2d.size() > 3)
|
||||||
{
|
{
|
||||||
@@ -802,7 +803,7 @@ void CanvasModeMaskFree::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
|||||||
m_shape.update_vertices(m_points.data(), (int)m_points.size());
|
m_shape.update_vertices(m_points.data(), (int)m_points.size());
|
||||||
}
|
}
|
||||||
m_dragging = false;
|
m_dragging = false;
|
||||||
node->mouse_release();
|
pp::panopainter::release_legacy_mouse_capture(*node);
|
||||||
if (m_points.size() < 4)
|
if (m_points.size() < 4)
|
||||||
{
|
{
|
||||||
m_points.clear();
|
m_points.clear();
|
||||||
@@ -933,7 +934,7 @@ void CanvasModeMaskLine::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case kEventType::MouseUpL:
|
case kEventType::MouseUpL:
|
||||||
node->mouse_release();
|
pp::panopainter::release_legacy_mouse_capture(*node);
|
||||||
m_dragging = false;
|
m_dragging = false;
|
||||||
if (m_points.size() > 1)
|
if (m_points.size() > 1)
|
||||||
{
|
{
|
||||||
@@ -961,7 +962,7 @@ void CanvasModeMaskLine::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
|||||||
m_shape.update_vertices(m_points.data(), (int)m_points.size());
|
m_shape.update_vertices(m_points.data(), (int)m_points.size());
|
||||||
}
|
}
|
||||||
m_dragging = false;
|
m_dragging = false;
|
||||||
node->mouse_release();
|
pp::panopainter::release_legacy_mouse_capture(*node);
|
||||||
if (m_points.size() < 4)
|
if (m_points.size() < 4)
|
||||||
{
|
{
|
||||||
m_points.clear();
|
m_points.clear();
|
||||||
@@ -1058,7 +1059,7 @@ void CanvasModeFill::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case kEventType::MouseUpL:
|
case kEventType::MouseUpL:
|
||||||
node->mouse_release();
|
pp::panopainter::release_legacy_mouse_capture(*node);
|
||||||
m_dragging = false;
|
m_dragging = false;
|
||||||
break;
|
break;
|
||||||
case kEventType::MouseMove:
|
case kEventType::MouseMove:
|
||||||
@@ -1083,7 +1084,7 @@ void CanvasModeFill::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
|||||||
m_shape.update_vertices(m_points.data(), (int)m_points.size());
|
m_shape.update_vertices(m_points.data(), (int)m_points.size());
|
||||||
}
|
}
|
||||||
m_dragging = false;
|
m_dragging = false;
|
||||||
node->mouse_release();
|
pp::panopainter::release_legacy_mouse_capture(*node);
|
||||||
if (m_points.size() < 4)
|
if (m_points.size() < 4)
|
||||||
{
|
{
|
||||||
m_points.clear();
|
m_points.clear();
|
||||||
|
|||||||
Reference in New Issue
Block a user