From 1fa3a236a59be1326a19f61a4de1200d92443a3d Mon Sep 17 00:00:00 2001 From: Filip Sykala Date: Thu, 10 Feb 2022 14:58:41 +0100 Subject: [PATCH] Fix hollowing mouse click --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 65 ++++++++-- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp | 124 +++++++------------ 2 files changed, 97 insertions(+), 92 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 3c720d5df..c40e131bc 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -429,19 +429,60 @@ bool GLGizmoHollow::on_mouse(const wxMouseEvent &mouse_event) Selection & selection = m_parent.get_selection(); static bool pending_right_up = false; - if (mouse_event.RightDown() && selection.get_object_idx() != -1 && - gizmo_event(SLAGizmoEventType::RightDown, mouse_pos, false, false, false)) { - // we need to set the following right up as processed to avoid showing - // the context menu if the user release the mouse over the object - pending_right_up = true; - // event was taken care of by the SlaSupports gizmo - return true; + // when control is down we allow scene pan and rotation even when clicking + // over some object + bool control_down = mouse_event.CmdDown(); + bool grabber_contains_mouse = (get_hover_id() != -1); + int selected_object_idx = selection.get_object_idx(); + if (mouse_event.LeftDown()) { + if ((!control_down || grabber_contains_mouse) && + gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false)) + // the gizmo got the event and took some action, there is no need + // to do anything more + return true; + } else if (mouse_event.Dragging()) { + if (m_parent.get_move_volume_id() != -1) + // don't allow dragging objects with the Sla gizmo on + return true; + if (control_down) { + if ((mouse_event.LeftIsDown() || mouse_event.RightIsDown())) { + // CTRL has been pressed while already dragging -> stop current action + if (mouse_event.LeftIsDown()) + gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true); + else if (mouse_event.RightIsDown()) + gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true); + } + } else if(gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false)) { + // the gizmo got the event and took some action, no need to do + // anything more here + m_parent.set_as_dirty(); + return true; + } + } else if (mouse_event.LeftUp()) { + if (!m_parent.is_mouse_dragging()) { + // in case gizmo is selected, we just pass the LeftUp event + // and stop processing - neither object moving or selecting is + // suppressed in that case + gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, + mouse_event.ShiftDown(), mouse_event.AltDown(), + control_down); + return true; + } + } else if (mouse_event.RightDown()) { + if (selection.get_object_idx() != -1 && + gizmo_event(SLAGizmoEventType::RightDown, mouse_pos, false, false, false)) { + // we need to set the following right up as processed to avoid showing + // the context menu if the user release the mouse over the object + pending_right_up = true; + // event was taken care of by the SlaSupports gizmo + return true; + } + } else if (mouse_event.RightUp()) { + if (pending_right_up) { + pending_right_up = false; + return true; + } } - if (pending_right_up && mouse_event.RightUp()) { - pending_right_up = false; - return true; - } - return false; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index a5009b210..4f806b711 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -643,21 +643,13 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous bool GLGizmoPainterBase::on_mouse(const wxMouseEvent &mouse_event) { - // TODO: distribute implementation into gizmos itself - - GLGizmosManager & mng = m_parent.get_gizmos_manager(); - GLGizmosManager::EType current_type = mng.get_current_type(); - // wxCoord == int --> wx/types.h Vec2i mouse_coord(mouse_event.GetX(), mouse_event.GetY()); Vec2d mouse_pos = mouse_coord.cast(); if (mouse_event.Moving()) { - if (current_type == GLGizmosManager::MmuSegmentation || - current_type == GLGizmosManager::FdmSupports) - gizmo_event(SLAGizmoEventType::Moving, mouse_pos, - mouse_event.ShiftDown(), mouse_event.AltDown(), - false); + gizmo_event(SLAGizmoEventType::Moving, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false); + return false; } // when control is down we allow scene pan and rotation even when clicking @@ -667,79 +659,51 @@ bool GLGizmoPainterBase::on_mouse(const wxMouseEvent &mouse_event) const Selection &selection = m_parent.get_selection(); int selected_object_idx = selection.get_object_idx(); - if (mouse_event.LeftDown() && (!control_down || grabber_contains_mouse)) { - if ((current_type == GLGizmosManager::SlaSupports || - current_type == GLGizmosManager::Hollow || - current_type == GLGizmosManager::FdmSupports || - current_type == GLGizmosManager::Seam || - current_type == GLGizmosManager::MmuSegmentation) && - gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, - mouse_event.ShiftDown(), mouse_event.AltDown(), false)) + if (mouse_event.LeftDown()) { + if ((!control_down || grabber_contains_mouse) && + gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false)) // the gizmo got the event and took some action, there is no need // to do anything more return true; - } else if (mouse_event.RightDown() && !control_down && selected_object_idx != -1 && - (current_type == GLGizmosManager::FdmSupports || - current_type == GLGizmosManager::Seam || - current_type == GLGizmosManager::MmuSegmentation) && - gizmo_event(SLAGizmoEventType::RightDown, mouse_pos, false, false, false)) { - // event was taken care of by the FdmSupports / Seam / MMUPainting gizmo - return true; - } else if (mouse_event.Dragging() && - m_parent.get_move_volume_id() != -1 && - (current_type == GLGizmosManager::SlaSupports || - current_type == GLGizmosManager::Hollow || - current_type == GLGizmosManager::FdmSupports || - current_type == GLGizmosManager::Seam || - current_type == GLGizmosManager::MmuSegmentation)) - // don't allow dragging objects with the Sla gizmo on - return true; - else if (mouse_event.Dragging() && !control_down && - (current_type == GLGizmosManager::SlaSupports || - current_type == GLGizmosManager::Hollow || - current_type == GLGizmosManager::FdmSupports || - current_type == GLGizmosManager::Seam || - current_type == GLGizmosManager::MmuSegmentation) && - gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, - mouse_event.ShiftDown(), mouse_event.AltDown(), false)) { - // the gizmo got the event and took some action, no need to do - // anything more here - m_parent.set_as_dirty(); - return true; - } else if (mouse_event.Dragging() && control_down && - (mouse_event.LeftIsDown() || mouse_event.RightIsDown())) { - // CTRL has been pressed while already dragging -> stop current action - if (mouse_event.LeftIsDown()) - gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, - mouse_event.ShiftDown(), mouse_event.AltDown(), true); - else if (mouse_event.RightIsDown()) - gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, - mouse_event.ShiftDown(), mouse_event.AltDown(), true); - - } else if (mouse_event.LeftUp() && - (current_type == GLGizmosManager::SlaSupports || - current_type == GLGizmosManager::Hollow || - current_type == GLGizmosManager::FdmSupports || - current_type == GLGizmosManager::Seam || - current_type == GLGizmosManager::MmuSegmentation) && - !m_parent.is_mouse_dragging()) { - // in case SLA/FDM gizmo is selected, we just pass the LeftUp event - // and stop processing - neither object moving or selecting is - // suppressed in that case - gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, - mouse_event.ShiftDown(), mouse_event.AltDown(), - control_down); - return true; - } else if (mouse_event.RightUp() && - (current_type == GLGizmosManager::FdmSupports || - current_type == GLGizmosManager::Seam || - current_type == GLGizmosManager::MmuSegmentation) && - !m_parent.is_mouse_dragging()) { - gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, - mouse_event.ShiftDown(), mouse_event.AltDown(), - control_down); - - return true; + } else if (mouse_event.RightDown()){ + if (!control_down && selected_object_idx != -1 && + gizmo_event(SLAGizmoEventType::RightDown, mouse_pos, false, false, false)) + // event was taken care of + return true; + } else if (mouse_event.Dragging()) { + if (m_parent.get_move_volume_id() != -1) + // don't allow dragging objects with the Sla gizmo on + return true; + if (!control_down && gizmo_event(SLAGizmoEventType::Dragging, + mouse_pos, mouse_event.ShiftDown(), + mouse_event.AltDown(), false)) { + // the gizmo got the event and took some action, no need to do + // anything more here + m_parent.set_as_dirty(); + return true; + } + if(control_down && (mouse_event.LeftIsDown() || mouse_event.RightIsDown())) + { + // CTRL has been pressed while already dragging -> stop current action + if (mouse_event.LeftIsDown()) + gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true); + else if (mouse_event.RightIsDown()) + gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true); + return false; + } + } else if (mouse_event.LeftUp()) { + if (!m_parent.is_mouse_dragging()) { + // in case SLA/FDM gizmo is selected, we just pass the LeftUp + // event and stop processing - neither object moving or selecting + // is suppressed in that case + gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), control_down); + return true; + } + } else if (mouse_event.RightUp()) { + if (!m_parent.is_mouse_dragging()) { + gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), control_down); + return true; + } } return false; }