Fix hollowing mouse click

This commit is contained in:
Filip Sykala 2022-02-10 14:58:41 +01:00
parent 46044a210f
commit 1fa3a236a5
2 changed files with 97 additions and 92 deletions

View File

@ -429,7 +429,47 @@ bool GLGizmoHollow::on_mouse(const wxMouseEvent &mouse_event)
Selection & selection = m_parent.get_selection(); Selection & selection = m_parent.get_selection();
static bool pending_right_up = false; static bool pending_right_up = false;
if (mouse_event.RightDown() && selection.get_object_idx() != -1 && // 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)) { gizmo_event(SLAGizmoEventType::RightDown, mouse_pos, false, false, false)) {
// we need to set the following right up as processed to avoid showing // 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 // the context menu if the user release the mouse over the object
@ -437,11 +477,12 @@ bool GLGizmoHollow::on_mouse(const wxMouseEvent &mouse_event)
// event was taken care of by the SlaSupports gizmo // event was taken care of by the SlaSupports gizmo
return true; return true;
} }
if (pending_right_up && mouse_event.RightUp()) { } else if (mouse_event.RightUp()) {
if (pending_right_up) {
pending_right_up = false; pending_right_up = false;
return true; return true;
} }
}
return false; return false;
} }

View File

@ -643,21 +643,13 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous
bool GLGizmoPainterBase::on_mouse(const wxMouseEvent &mouse_event) 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 // wxCoord == int --> wx/types.h
Vec2i mouse_coord(mouse_event.GetX(), mouse_event.GetY()); Vec2i mouse_coord(mouse_event.GetX(), mouse_event.GetY());
Vec2d mouse_pos = mouse_coord.cast<double>(); Vec2d mouse_pos = mouse_coord.cast<double>();
if (mouse_event.Moving()) { if (mouse_event.Moving()) {
if (current_type == GLGizmosManager::MmuSegmentation || gizmo_event(SLAGizmoEventType::Moving, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false);
current_type == GLGizmosManager::FdmSupports) return false;
gizmo_event(SLAGizmoEventType::Moving, mouse_pos,
mouse_event.ShiftDown(), mouse_event.AltDown(),
false);
} }
// when control is down we allow scene pan and rotation even when clicking // when control is down we allow scene pan and rotation even when clicking
@ -667,80 +659,52 @@ bool GLGizmoPainterBase::on_mouse(const wxMouseEvent &mouse_event)
const Selection &selection = m_parent.get_selection(); const Selection &selection = m_parent.get_selection();
int selected_object_idx = selection.get_object_idx(); int selected_object_idx = selection.get_object_idx();
if (mouse_event.LeftDown() && (!control_down || grabber_contains_mouse)) { if (mouse_event.LeftDown()) {
if ((current_type == GLGizmosManager::SlaSupports || if ((!control_down || grabber_contains_mouse) &&
current_type == GLGizmosManager::Hollow || gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false))
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))
// the gizmo got the event and took some action, there is no need // the gizmo got the event and took some action, there is no need
// to do anything more // to do anything more
return true; return true;
} else if (mouse_event.RightDown() && !control_down && selected_object_idx != -1 && } else if (mouse_event.RightDown()){
(current_type == GLGizmosManager::FdmSupports || if (!control_down && selected_object_idx != -1 &&
current_type == GLGizmosManager::Seam || gizmo_event(SLAGizmoEventType::RightDown, mouse_pos, false, false, false))
current_type == GLGizmosManager::MmuSegmentation) && // event was taken care of
gizmo_event(SLAGizmoEventType::RightDown, mouse_pos, false, false, false)) {
// event was taken care of by the FdmSupports / Seam / MMUPainting gizmo
return true; return true;
} else if (mouse_event.Dragging() && } else if (mouse_event.Dragging()) {
m_parent.get_move_volume_id() != -1 && if (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 // don't allow dragging objects with the Sla gizmo on
return true; return true;
else if (mouse_event.Dragging() && !control_down && if (!control_down && gizmo_event(SLAGizmoEventType::Dragging,
(current_type == GLGizmosManager::SlaSupports || mouse_pos, mouse_event.ShiftDown(),
current_type == GLGizmosManager::Hollow || mouse_event.AltDown(), false)) {
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 // the gizmo got the event and took some action, no need to do
// anything more here // anything more here
m_parent.set_as_dirty(); m_parent.set_as_dirty();
return true; return true;
} else if (mouse_event.Dragging() && control_down && }
(mouse_event.LeftIsDown() || mouse_event.RightIsDown())) { if(control_down && (mouse_event.LeftIsDown() || mouse_event.RightIsDown()))
{
// CTRL has been pressed while already dragging -> stop current action // CTRL has been pressed while already dragging -> stop current action
if (mouse_event.LeftIsDown()) if (mouse_event.LeftIsDown())
gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true);
mouse_event.ShiftDown(), mouse_event.AltDown(), true);
else if (mouse_event.RightIsDown()) else if (mouse_event.RightIsDown())
gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true);
mouse_event.ShiftDown(), mouse_event.AltDown(), true); return false;
}
} else if (mouse_event.LeftUp() && } else if (mouse_event.LeftUp()) {
(current_type == GLGizmosManager::SlaSupports || if (!m_parent.is_mouse_dragging()) {
current_type == GLGizmosManager::Hollow || // in case SLA/FDM gizmo is selected, we just pass the LeftUp
current_type == GLGizmosManager::FdmSupports || // event and stop processing - neither object moving or selecting
current_type == GLGizmosManager::Seam || // is suppressed in that case
current_type == GLGizmosManager::MmuSegmentation) && gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), control_down);
!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; return true;
} else if (mouse_event.RightUp() && }
(current_type == GLGizmosManager::FdmSupports || } else if (mouse_event.RightUp()) {
current_type == GLGizmosManager::Seam || if (!m_parent.is_mouse_dragging()) {
current_type == GLGizmosManager::MmuSegmentation) && gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), control_down);
!m_parent.is_mouse_dragging()) {
gizmo_event(SLAGizmoEventType::RightUp, mouse_pos,
mouse_event.ShiftDown(), mouse_event.AltDown(),
control_down);
return true; return true;
} }
}
return false; return false;
} }