mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-13 12:07:41 +00:00
Fix gizmo being closed after releasing mouse outside the gizmo floating window (#15095)
* Fix gizmo being closed after releasing mouse outside the gizmo floating window The left up event of a drag started on the gizmo floating window (e.g. selecting text in an input field) and released over the bed was treated as a click on the plate, which deselected the objects and closed the active gizmo. Add the ignore_left_up guard to the plate select branch, matching the deselect branch above. Co-Authored-By: Claude <noreply@anthropic.com> * Fix Emboss gizmo being closed after releasing mouse outside its floating window The Emboss gizmo has its own close-on-click-away handler (on_mouse_change_selection) that was not protected against left up events originating from ImGui windows, so the gizmo was still closed when a drag started on its floating window (e.g. selecting text in the input field) ended over the 3D scene. Expose the canvas's ignore_left_up state to gizmos and skip the close check for such releases. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -4756,7 +4756,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
|||||||
deselect_all();
|
deselect_all();
|
||||||
}
|
}
|
||||||
//BBS Select plate in this 3D canvas.
|
//BBS Select plate in this 3D canvas.
|
||||||
else if (evt.LeftUp() && !m_mouse.dragging && m_picking_enabled && !m_hover_plate_idxs.empty() && (m_canvas_type == CanvasView3D) && !is_layers_editing_enabled())
|
// The left up may come from an ImGui window (e.g. a drag started on the gizmo floating window and released over the bed),
|
||||||
|
// in which case it must not be treated as a click on the plate, otherwise the gizmo would be closed (see deselect_all below).
|
||||||
|
else if (evt.LeftUp() && !m_mouse.ignore_left_up && !m_mouse.dragging && m_picking_enabled && !m_hover_plate_idxs.empty() && (m_canvas_type == CanvasView3D) && !is_layers_editing_enabled())
|
||||||
{
|
{
|
||||||
int hover_idx = m_hover_plate_idxs.front();
|
int hover_idx = m_hover_plate_idxs.front();
|
||||||
wxGetApp().plater()->select_plate_by_hover_id(hover_idx);
|
wxGetApp().plater()->select_plate_by_hover_id(hover_idx);
|
||||||
|
|||||||
@@ -1119,6 +1119,10 @@ public:
|
|||||||
|
|
||||||
void set_mouse_as_dragging() { m_mouse.dragging = true; }
|
void set_mouse_as_dragging() { m_mouse.dragging = true; }
|
||||||
bool is_mouse_dragging() const { return m_mouse.dragging; }
|
bool is_mouse_dragging() const { return m_mouse.dragging; }
|
||||||
|
// True when the current left up event comes from an ImGui window and was not processed by it
|
||||||
|
// (e.g. a drag that started on a gizmo floating window and was released over the 3D scene).
|
||||||
|
// Such a release is the end of an ImGui interaction, not a click on the scene.
|
||||||
|
bool is_mouse_left_up_ignored() const { return m_mouse.ignore_left_up; }
|
||||||
|
|
||||||
double get_size_proportional_to_max_bed_size(double factor) const;
|
double get_size_proportional_to_max_bed_size(double factor) const;
|
||||||
|
|
||||||
|
|||||||
@@ -567,7 +567,10 @@ bool GLGizmoEmboss::on_mouse_for_translate(const wxMouseEvent &mouse_event)
|
|||||||
void GLGizmoEmboss::on_mouse_change_selection(const wxMouseEvent &mouse_event)
|
void GLGizmoEmboss::on_mouse_change_selection(const wxMouseEvent &mouse_event)
|
||||||
{
|
{
|
||||||
static bool was_dragging = true;
|
static bool was_dragging = true;
|
||||||
if ((mouse_event.LeftUp() || mouse_event.RightUp()) && !was_dragging) {
|
// The left up may be the end of a drag that started on the gizmo floating window (e.g. selecting
|
||||||
|
// text in the input field). Such a release is not a click on the scene and must not close the gizmo.
|
||||||
|
// (The flag is only set for left up events, so right up behavior is unchanged.)
|
||||||
|
if ((mouse_event.LeftUp() || mouse_event.RightUp()) && !was_dragging && !m_parent.is_mouse_left_up_ignored()) {
|
||||||
// is hovered volume closest hovered?
|
// is hovered volume closest hovered?
|
||||||
int hovered_idx = m_parent.get_first_hover_volume_idx();
|
int hovered_idx = m_parent.get_first_hover_volume_idx();
|
||||||
if (hovered_idx < 0)
|
if (hovered_idx < 0)
|
||||||
|
|||||||
Reference in New Issue
Block a user