Rotating/panning the view, using mouse left/right + CTRL modifier, while any gizmo is active
This commit is contained in:
parent
0f8f412e90
commit
68a7e5ce41
@ -56,4 +56,12 @@
|
|||||||
#define ENABLE_GCODE_VIEWER_STATISTICS (0 && ENABLE_GCODE_VIEWER)
|
#define ENABLE_GCODE_VIEWER_STATISTICS (0 && ENABLE_GCODE_VIEWER)
|
||||||
#define ENABLE_GCODE_VIEWER_DATA_CHECKING (0 && ENABLE_GCODE_VIEWER)
|
#define ENABLE_GCODE_VIEWER_DATA_CHECKING (0 && ENABLE_GCODE_VIEWER)
|
||||||
|
|
||||||
|
|
||||||
|
//===================
|
||||||
|
// 2.3.0.alpha2 techs
|
||||||
|
//===================
|
||||||
|
#define ENABLE_2_3_0_ALPHA2 1
|
||||||
|
|
||||||
|
#define ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS (1 && ENABLE_2_3_0_ALPHA2)
|
||||||
|
|
||||||
#endif // _prusaslicer_technologies_h_
|
#endif // _prusaslicer_technologies_h_
|
||||||
|
@ -3505,40 +3505,35 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
|||||||
#endif /* SLIC3R_DEBUG_MOUSE_EVENTS */
|
#endif /* SLIC3R_DEBUG_MOUSE_EVENTS */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_main_toolbar.on_mouse(evt, *this))
|
if (m_main_toolbar.on_mouse(evt, *this)) {
|
||||||
{
|
|
||||||
if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp())
|
if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp())
|
||||||
mouse_up_cleanup();
|
mouse_up_cleanup();
|
||||||
m_mouse.set_start_position_3D_as_invalid();
|
m_mouse.set_start_position_3D_as_invalid();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_undoredo_toolbar.on_mouse(evt, *this))
|
if (m_undoredo_toolbar.on_mouse(evt, *this)) {
|
||||||
{
|
|
||||||
if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp())
|
if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp())
|
||||||
mouse_up_cleanup();
|
mouse_up_cleanup();
|
||||||
m_mouse.set_start_position_3D_as_invalid();
|
m_mouse.set_start_position_3D_as_invalid();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wxGetApp().plater()->get_collapse_toolbar().on_mouse(evt, *this))
|
if (wxGetApp().plater()->get_collapse_toolbar().on_mouse(evt, *this)) {
|
||||||
{
|
|
||||||
if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp())
|
if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp())
|
||||||
mouse_up_cleanup();
|
mouse_up_cleanup();
|
||||||
m_mouse.set_start_position_3D_as_invalid();
|
m_mouse.set_start_position_3D_as_invalid();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wxGetApp().plater()->get_view_toolbar().on_mouse(evt, *this))
|
if (wxGetApp().plater()->get_view_toolbar().on_mouse(evt, *this)) {
|
||||||
{
|
|
||||||
if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp())
|
if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp())
|
||||||
mouse_up_cleanup();
|
mouse_up_cleanup();
|
||||||
m_mouse.set_start_position_3D_as_invalid();
|
m_mouse.set_start_position_3D_as_invalid();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_gizmos.on_mouse(evt))
|
if (m_gizmos.on_mouse(evt)) {
|
||||||
{
|
|
||||||
if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp())
|
if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp())
|
||||||
mouse_up_cleanup();
|
mouse_up_cleanup();
|
||||||
|
|
||||||
@ -3547,12 +3542,15 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS
|
||||||
|
bool any_gizmo_active = m_gizmos.get_current() != nullptr;
|
||||||
|
#endif // ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS
|
||||||
|
|
||||||
int selected_object_idx = m_selection.get_object_idx();
|
int selected_object_idx = m_selection.get_object_idx();
|
||||||
int layer_editing_object_idx = is_layers_editing_enabled() ? selected_object_idx : -1;
|
int layer_editing_object_idx = is_layers_editing_enabled() ? selected_object_idx : -1;
|
||||||
m_layers_editing.select_object(*m_model, layer_editing_object_idx);
|
m_layers_editing.select_object(*m_model, layer_editing_object_idx);
|
||||||
|
|
||||||
if (m_mouse.drag.move_requires_threshold && m_mouse.is_move_start_threshold_position_2D_defined() && m_mouse.is_move_threshold_met(pos))
|
if (m_mouse.drag.move_requires_threshold && m_mouse.is_move_start_threshold_position_2D_defined() && m_mouse.is_move_threshold_met(pos)) {
|
||||||
{
|
|
||||||
m_mouse.drag.move_requires_threshold = false;
|
m_mouse.drag.move_requires_threshold = false;
|
||||||
m_mouse.set_move_start_threshold_position_2D_as_invalid();
|
m_mouse.set_move_start_threshold_position_2D_as_invalid();
|
||||||
}
|
}
|
||||||
@ -3561,8 +3559,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
|||||||
// Grab keyboard focus on any mouse click event.
|
// Grab keyboard focus on any mouse click event.
|
||||||
m_canvas->SetFocus();
|
m_canvas->SetFocus();
|
||||||
|
|
||||||
if (evt.Entering())
|
if (evt.Entering()) {
|
||||||
{
|
|
||||||
//#if defined(__WXMSW__) || defined(__linux__)
|
//#if defined(__WXMSW__) || defined(__linux__)
|
||||||
// // On Windows and Linux needs focus in order to catch key events
|
// // On Windows and Linux needs focus in order to catch key events
|
||||||
// Set focus in order to remove it from sidebar fields
|
// Set focus in order to remove it from sidebar fields
|
||||||
@ -3587,49 +3584,49 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
|||||||
m_mouse.set_start_position_2D_as_invalid();
|
m_mouse.set_start_position_2D_as_invalid();
|
||||||
//#endif
|
//#endif
|
||||||
}
|
}
|
||||||
else if (evt.Leaving())
|
else if (evt.Leaving()) {
|
||||||
{
|
|
||||||
_deactivate_undo_redo_toolbar_items();
|
_deactivate_undo_redo_toolbar_items();
|
||||||
|
|
||||||
// to remove hover on objects when the mouse goes out of this canvas
|
// to remove hover on objects when the mouse goes out of this canvas
|
||||||
m_mouse.position = Vec2d(-1.0, -1.0);
|
m_mouse.position = Vec2d(-1.0, -1.0);
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
}
|
}
|
||||||
else if (evt.LeftDown() || evt.RightDown() || evt.MiddleDown())
|
else if (evt.LeftDown() || evt.RightDown() || evt.MiddleDown()) {
|
||||||
{
|
|
||||||
if (_deactivate_undo_redo_toolbar_items() || _deactivate_search_toolbar_item())
|
if (_deactivate_undo_redo_toolbar_items() || _deactivate_search_toolbar_item())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// If user pressed left or right button we first check whether this happened
|
// If user pressed left or right button we first check whether this happened
|
||||||
// on a volume or not.
|
// on a volume or not.
|
||||||
m_layers_editing.state = LayersEditing::Unknown;
|
m_layers_editing.state = LayersEditing::Unknown;
|
||||||
if ((layer_editing_object_idx != -1) && m_layers_editing.bar_rect_contains(*this, pos(0), pos(1)))
|
if (layer_editing_object_idx != -1 && m_layers_editing.bar_rect_contains(*this, pos(0), pos(1))) {
|
||||||
{
|
|
||||||
// A volume is selected and the mouse is inside the layer thickness bar.
|
// A volume is selected and the mouse is inside the layer thickness bar.
|
||||||
// Start editing the layer height.
|
// Start editing the layer height.
|
||||||
m_layers_editing.state = LayersEditing::Editing;
|
m_layers_editing.state = LayersEditing::Editing;
|
||||||
_perform_layer_editing_action(&evt);
|
_perform_layer_editing_action(&evt);
|
||||||
}
|
}
|
||||||
else if (evt.LeftDown() && (evt.ShiftDown() || evt.AltDown()) && m_picking_enabled)
|
else if (evt.LeftDown() && (evt.ShiftDown() || evt.AltDown()) && m_picking_enabled) {
|
||||||
{
|
|
||||||
if (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports
|
if (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports
|
||||||
&& m_gizmos.get_current_type() != GLGizmosManager::FdmSupports
|
&& m_gizmos.get_current_type() != GLGizmosManager::FdmSupports
|
||||||
&& m_gizmos.get_current_type() != GLGizmosManager::Seam)
|
&& m_gizmos.get_current_type() != GLGizmosManager::Seam) {
|
||||||
{
|
|
||||||
m_rectangle_selection.start_dragging(m_mouse.position, evt.ShiftDown() ? GLSelectionRectangle::Select : GLSelectionRectangle::Deselect);
|
m_rectangle_selection.start_dragging(m_mouse.position, evt.ShiftDown() ? GLSelectionRectangle::Select : GLSelectionRectangle::Deselect);
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{
|
#if ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS
|
||||||
|
// Select volume in this 3D canvas.
|
||||||
|
// Don't deselect a volume if layer editing is enabled or any gizmo is active. We want the object to stay selected
|
||||||
|
// during the scene manipulation.
|
||||||
|
|
||||||
|
if (m_picking_enabled && !any_gizmo_active && (!m_hover_volume_idxs.empty() || !is_layers_editing_enabled())) {
|
||||||
|
#else
|
||||||
// Select volume in this 3D canvas.
|
// Select volume in this 3D canvas.
|
||||||
// Don't deselect a volume if layer editing is enabled. We want the object to stay selected
|
// Don't deselect a volume if layer editing is enabled. We want the object to stay selected
|
||||||
// during the scene manipulation.
|
// during the scene manipulation.
|
||||||
|
|
||||||
if (m_picking_enabled && (!m_hover_volume_idxs.empty() || !is_layers_editing_enabled()))
|
if (m_picking_enabled && (!m_hover_volume_idxs.empty() || !is_layers_editing_enabled())) {
|
||||||
{
|
#endif // ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS
|
||||||
if (evt.LeftDown() && !m_hover_volume_idxs.empty())
|
if (evt.LeftDown() && !m_hover_volume_idxs.empty()) {
|
||||||
{
|
|
||||||
int volume_idx = get_first_hover_volume_idx();
|
int volume_idx = get_first_hover_volume_idx();
|
||||||
bool already_selected = m_selection.contains_volume(volume_idx);
|
bool already_selected = m_selection.contains_volume(volume_idx);
|
||||||
bool ctrl_down = evt.CmdDown();
|
bool ctrl_down = evt.CmdDown();
|
||||||
@ -3638,8 +3635,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
|||||||
|
|
||||||
if (already_selected && ctrl_down)
|
if (already_selected && ctrl_down)
|
||||||
m_selection.remove(volume_idx);
|
m_selection.remove(volume_idx);
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
m_selection.add(volume_idx, !ctrl_down, true);
|
m_selection.add(volume_idx, !ctrl_down, true);
|
||||||
m_mouse.drag.move_requires_threshold = !already_selected;
|
m_mouse.drag.move_requires_threshold = !already_selected;
|
||||||
if (already_selected)
|
if (already_selected)
|
||||||
@ -3649,8 +3645,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// propagate event through callback
|
// propagate event through callback
|
||||||
if (curr_idxs != m_selection.get_volume_idxs())
|
if (curr_idxs != m_selection.get_volume_idxs()) {
|
||||||
{
|
|
||||||
if (m_selection.is_empty())
|
if (m_selection.is_empty())
|
||||||
m_gizmos.reset_all_states();
|
m_gizmos.reset_all_states();
|
||||||
else
|
else
|
||||||
@ -3663,16 +3658,17 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_hover_volume_idxs.empty())
|
if (!m_hover_volume_idxs.empty()) {
|
||||||
{
|
if (evt.LeftDown() && m_moving_enabled && m_mouse.drag.move_volume_idx == -1) {
|
||||||
if (evt.LeftDown() && m_moving_enabled && (m_mouse.drag.move_volume_idx == -1))
|
|
||||||
{
|
|
||||||
// Only accept the initial position, if it is inside the volume bounding box.
|
// Only accept the initial position, if it is inside the volume bounding box.
|
||||||
int volume_idx = get_first_hover_volume_idx();
|
int volume_idx = get_first_hover_volume_idx();
|
||||||
BoundingBoxf3 volume_bbox = m_volumes.volumes[volume_idx]->transformed_bounding_box();
|
BoundingBoxf3 volume_bbox = m_volumes.volumes[volume_idx]->transformed_bounding_box();
|
||||||
volume_bbox.offset(1.0);
|
volume_bbox.offset(1.0);
|
||||||
if (volume_bbox.contains(m_mouse.scene_position))
|
#if ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS
|
||||||
{
|
if (!any_gizmo_active && volume_bbox.contains(m_mouse.scene_position)) {
|
||||||
|
#else
|
||||||
|
if (volume_bbox.contains(m_mouse.scene_position)) {
|
||||||
|
#endif // ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS
|
||||||
m_volumes.volumes[volume_idx]->hover = GLVolume::HS_None;
|
m_volumes.volumes[volume_idx]->hover = GLVolume::HS_None;
|
||||||
// The dragging operation is initiated.
|
// The dragging operation is initiated.
|
||||||
m_mouse.drag.move_volume_idx = volume_idx;
|
m_mouse.drag.move_volume_idx = volume_idx;
|
||||||
@ -3684,18 +3680,14 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (evt.Dragging() && evt.LeftIsDown() && (m_layers_editing.state == LayersEditing::Unknown) && (m_mouse.drag.move_volume_idx != -1))
|
else if (evt.Dragging() && evt.LeftIsDown() && m_layers_editing.state == LayersEditing::Unknown && m_mouse.drag.move_volume_idx != -1) {
|
||||||
{
|
if (!m_mouse.drag.move_requires_threshold) {
|
||||||
if (!m_mouse.drag.move_requires_threshold)
|
|
||||||
{
|
|
||||||
m_mouse.dragging = true;
|
m_mouse.dragging = true;
|
||||||
Vec3d cur_pos = m_mouse.drag.start_position_3D;
|
Vec3d cur_pos = m_mouse.drag.start_position_3D;
|
||||||
// we do not want to translate objects if the user just clicked on an object while pressing shift to remove it from the selection and then drag
|
// we do not want to translate objects if the user just clicked on an object while pressing shift to remove it from the selection and then drag
|
||||||
if (m_selection.contains_volume(get_first_hover_volume_idx()))
|
if (m_selection.contains_volume(get_first_hover_volume_idx())) {
|
||||||
{
|
|
||||||
const Camera& camera = wxGetApp().plater()->get_camera();
|
const Camera& camera = wxGetApp().plater()->get_camera();
|
||||||
if (std::abs(camera.get_dir_forward()(2)) < EPSILON)
|
if (std::abs(camera.get_dir_forward()(2)) < EPSILON) {
|
||||||
{
|
|
||||||
// side view -> move selected volumes orthogonally to camera view direction
|
// side view -> move selected volumes orthogonally to camera view direction
|
||||||
Linef3 ray = mouse_ray(pos);
|
Linef3 ray = mouse_ray(pos);
|
||||||
Vec3d dir = ray.unit_vector();
|
Vec3d dir = ray.unit_vector();
|
||||||
@ -3717,8 +3709,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
|||||||
// apply offset
|
// apply offset
|
||||||
cur_pos = m_mouse.drag.start_position_3D + projection_x * camera_right + projection_z * camera_up;
|
cur_pos = m_mouse.drag.start_position_3D + projection_x * camera_right + projection_z * camera_up;
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
// Generic view
|
// Generic view
|
||||||
// Get new position at the same Z of the initial click point.
|
// Get new position at the same Z of the initial click point.
|
||||||
float z0 = 0.0f;
|
float z0 = 0.0f;
|
||||||
@ -3732,35 +3723,32 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
|||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (evt.Dragging() && evt.LeftIsDown() && m_picking_enabled && m_rectangle_selection.is_dragging())
|
else if (evt.Dragging() && evt.LeftIsDown() && m_picking_enabled && m_rectangle_selection.is_dragging()) {
|
||||||
{
|
|
||||||
m_rectangle_selection.dragging(pos.cast<double>());
|
m_rectangle_selection.dragging(pos.cast<double>());
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
}
|
}
|
||||||
else if (evt.Dragging())
|
else if (evt.Dragging()) {
|
||||||
{
|
|
||||||
m_mouse.dragging = true;
|
m_mouse.dragging = true;
|
||||||
|
|
||||||
if ((m_layers_editing.state != LayersEditing::Unknown) && (layer_editing_object_idx != -1))
|
if (m_layers_editing.state != LayersEditing::Unknown && layer_editing_object_idx != -1) {
|
||||||
{
|
if (m_layers_editing.state == LayersEditing::Editing) {
|
||||||
if (m_layers_editing.state == LayersEditing::Editing)
|
|
||||||
{
|
|
||||||
_perform_layer_editing_action(&evt);
|
_perform_layer_editing_action(&evt);
|
||||||
m_mouse.position = pos.cast<double>();
|
m_mouse.position = pos.cast<double>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// do not process the dragging if the left mouse was set down in another canvas
|
// do not process the dragging if the left mouse was set down in another canvas
|
||||||
else if (evt.LeftIsDown())
|
else if (evt.LeftIsDown()) {
|
||||||
{
|
|
||||||
// if dragging over blank area with left button, rotate
|
// if dragging over blank area with left button, rotate
|
||||||
if (m_hover_volume_idxs.empty() && m_mouse.is_start_position_3D_defined())
|
#if ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS
|
||||||
{
|
if ((any_gizmo_active || m_hover_volume_idxs.empty()) && m_mouse.is_start_position_3D_defined()) {
|
||||||
|
#else
|
||||||
|
if (m_hover_volume_idxs.empty() && m_mouse.is_start_position_3D_defined()) {
|
||||||
|
#endif // ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS
|
||||||
const Vec3d rot = (Vec3d(pos.x(), pos.y(), 0.) - m_mouse.drag.start_position_3D) * (PI * TRACKBALLSIZE / 180.);
|
const Vec3d rot = (Vec3d(pos.x(), pos.y(), 0.) - m_mouse.drag.start_position_3D) * (PI * TRACKBALLSIZE / 180.);
|
||||||
if (wxGetApp().app_config->get("use_free_camera") == "1")
|
if (wxGetApp().app_config->get("use_free_camera") == "1")
|
||||||
// Virtual track ball (similar to the 3DConnexion mouse).
|
// Virtual track ball (similar to the 3DConnexion mouse).
|
||||||
wxGetApp().plater()->get_camera().rotate_local_around_target(Vec3d(rot.y(), rot.x(), 0.));
|
wxGetApp().plater()->get_camera().rotate_local_around_target(Vec3d(rot.y(), rot.x(), 0.));
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
// Forces camera right vector to be parallel to XY plane in case it has been misaligned using the 3D mouse free rotation.
|
// Forces camera right vector to be parallel to XY plane in case it has been misaligned using the 3D mouse free rotation.
|
||||||
// It is cheaper to call this function right away instead of testing wxGetApp().plater()->get_mouse3d_controller().connected(),
|
// It is cheaper to call this function right away instead of testing wxGetApp().plater()->get_mouse3d_controller().connected(),
|
||||||
// which checks an atomics (flushes CPU caches).
|
// which checks an atomics (flushes CPU caches).
|
||||||
@ -3774,11 +3762,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
|||||||
}
|
}
|
||||||
m_mouse.drag.start_position_3D = Vec3d((double)pos(0), (double)pos(1), 0.0);
|
m_mouse.drag.start_position_3D = Vec3d((double)pos(0), (double)pos(1), 0.0);
|
||||||
}
|
}
|
||||||
else if (evt.MiddleIsDown() || evt.RightIsDown())
|
else if (evt.MiddleIsDown() || evt.RightIsDown()) {
|
||||||
{
|
|
||||||
// If dragging over blank area with right button, pan.
|
// If dragging over blank area with right button, pan.
|
||||||
if (m_mouse.is_start_position_2D_defined())
|
if (m_mouse.is_start_position_2D_defined()) {
|
||||||
{
|
|
||||||
// get point in model space at Z = 0
|
// get point in model space at Z = 0
|
||||||
float z = 0.0f;
|
float z = 0.0f;
|
||||||
const Vec3d& cur_pos = _mouse_to_3d(pos, &z);
|
const Vec3d& cur_pos = _mouse_to_3d(pos, &z);
|
||||||
@ -3798,43 +3784,36 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
|||||||
m_mouse.drag.start_position_2D = pos;
|
m_mouse.drag.start_position_2D = pos;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp())
|
else if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) {
|
||||||
{
|
if (m_layers_editing.state != LayersEditing::Unknown) {
|
||||||
if (m_layers_editing.state != LayersEditing::Unknown)
|
|
||||||
{
|
|
||||||
m_layers_editing.state = LayersEditing::Unknown;
|
m_layers_editing.state = LayersEditing::Unknown;
|
||||||
_stop_timer();
|
_stop_timer();
|
||||||
m_layers_editing.accept_changes(*this);
|
m_layers_editing.accept_changes(*this);
|
||||||
}
|
}
|
||||||
else if ((m_mouse.drag.move_volume_idx != -1) && m_mouse.dragging)
|
else if (m_mouse.drag.move_volume_idx != -1 && m_mouse.dragging) {
|
||||||
{
|
|
||||||
do_move(L("Move Object"));
|
do_move(L("Move Object"));
|
||||||
wxGetApp().obj_manipul()->set_dirty();
|
wxGetApp().obj_manipul()->set_dirty();
|
||||||
// Let the plater know that the dragging finished, so a delayed refresh
|
// Let the plater know that the dragging finished, so a delayed refresh
|
||||||
// of the scene with the background processing data should be performed.
|
// of the scene with the background processing data should be performed.
|
||||||
post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED));
|
post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED));
|
||||||
}
|
}
|
||||||
else if (evt.LeftUp() && m_picking_enabled && m_rectangle_selection.is_dragging())
|
else if (evt.LeftUp() && m_picking_enabled && m_rectangle_selection.is_dragging()) {
|
||||||
{
|
|
||||||
if (evt.ShiftDown() || evt.AltDown())
|
if (evt.ShiftDown() || evt.AltDown())
|
||||||
_update_selection_from_hover();
|
_update_selection_from_hover();
|
||||||
|
|
||||||
m_rectangle_selection.stop_dragging();
|
m_rectangle_selection.stop_dragging();
|
||||||
}
|
}
|
||||||
else if (evt.LeftUp() && !m_mouse.ignore_left_up && !m_mouse.dragging && m_hover_volume_idxs.empty() && !is_layers_editing_enabled())
|
else if (evt.LeftUp() && !m_mouse.ignore_left_up && !m_mouse.dragging && m_hover_volume_idxs.empty() && !is_layers_editing_enabled()) {
|
||||||
{
|
|
||||||
// deselect and propagate event through callback
|
// deselect and propagate event through callback
|
||||||
if (!evt.ShiftDown() && m_picking_enabled)
|
if (!evt.ShiftDown() && m_picking_enabled)
|
||||||
deselect_all();
|
deselect_all();
|
||||||
}
|
}
|
||||||
else if (evt.RightUp())
|
else if (evt.RightUp()) {
|
||||||
{
|
|
||||||
m_mouse.position = pos.cast<double>();
|
m_mouse.position = pos.cast<double>();
|
||||||
// forces a frame render to ensure that m_hover_volume_idxs is updated even when the user right clicks while
|
// forces a frame render to ensure that m_hover_volume_idxs is updated even when the user right clicks while
|
||||||
// the context menu is already shown
|
// the context menu is already shown
|
||||||
render();
|
render();
|
||||||
if (!m_hover_volume_idxs.empty())
|
if (!m_hover_volume_idxs.empty()) {
|
||||||
{
|
|
||||||
// if right clicking on volume, propagate event through callback (shows context menu)
|
// if right clicking on volume, propagate event through callback (shows context menu)
|
||||||
int volume_idx = get_first_hover_volume_idx();
|
int volume_idx = get_first_hover_volume_idx();
|
||||||
if (!m_volumes.volumes[volume_idx]->is_wipe_tower // no context menu for the wipe tower
|
if (!m_volumes.volumes[volume_idx]->is_wipe_tower // no context menu for the wipe tower
|
||||||
@ -3866,8 +3845,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
|||||||
|
|
||||||
mouse_up_cleanup();
|
mouse_up_cleanup();
|
||||||
}
|
}
|
||||||
else if (evt.Moving())
|
else if (evt.Moving()) {
|
||||||
{
|
|
||||||
m_mouse.position = pos.cast<double>();
|
m_mouse.position = pos.cast<double>();
|
||||||
|
|
||||||
// updates gizmos overlay
|
// updates gizmos overlay
|
||||||
|
@ -504,18 +504,20 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt)
|
|||||||
int selected_object_idx = selection.get_object_idx();
|
int selected_object_idx = selection.get_object_idx();
|
||||||
bool processed = false;
|
bool processed = false;
|
||||||
|
|
||||||
|
#if ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS
|
||||||
|
// when control is down we allow scene pan and rotation even when clicking over some object
|
||||||
|
bool control_down = evt.CmdDown();
|
||||||
|
#endif // ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS
|
||||||
|
|
||||||
// mouse anywhere
|
// mouse anywhere
|
||||||
if (evt.Moving())
|
if (evt.Moving())
|
||||||
m_tooltip = update_hover_state(mouse_pos);
|
m_tooltip = update_hover_state(mouse_pos);
|
||||||
else if (evt.LeftUp())
|
else if (evt.LeftUp()) {
|
||||||
{
|
if (m_mouse_capture.left) {
|
||||||
if (m_mouse_capture.left)
|
|
||||||
{
|
|
||||||
processed = true;
|
processed = true;
|
||||||
m_mouse_capture.left = false;
|
m_mouse_capture.left = false;
|
||||||
}
|
}
|
||||||
else if (is_dragging())
|
else if (is_dragging()) {
|
||||||
{
|
|
||||||
switch (m_current) {
|
switch (m_current) {
|
||||||
case Move: m_parent.do_move(L("Gizmo-Move")); break;
|
case Move: m_parent.do_move(L("Gizmo-Move")); break;
|
||||||
case Scale: m_parent.do_scale(L("Gizmo-Scale")); break;
|
case Scale: m_parent.do_scale(L("Gizmo-Scale")); break;
|
||||||
@ -538,41 +540,34 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt)
|
|||||||
// else
|
// else
|
||||||
// return false;
|
// return false;
|
||||||
}
|
}
|
||||||
else if (evt.MiddleUp())
|
else if (evt.MiddleUp()) {
|
||||||
{
|
if (m_mouse_capture.middle) {
|
||||||
if (m_mouse_capture.middle)
|
|
||||||
{
|
|
||||||
processed = true;
|
processed = true;
|
||||||
m_mouse_capture.middle = false;
|
m_mouse_capture.middle = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if (evt.RightUp())
|
else if (evt.RightUp()) {
|
||||||
{
|
if (pending_right_up) {
|
||||||
if (pending_right_up)
|
|
||||||
{
|
|
||||||
pending_right_up = false;
|
pending_right_up = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (m_mouse_capture.right)
|
if (m_mouse_capture.right) {
|
||||||
{
|
|
||||||
processed = true;
|
processed = true;
|
||||||
m_mouse_capture.right = false;
|
m_mouse_capture.right = false;
|
||||||
}
|
}
|
||||||
// else
|
// else
|
||||||
// return false;
|
// return false;
|
||||||
}
|
}
|
||||||
else if (evt.Dragging() && !is_dragging())
|
else if (evt.Dragging() && !is_dragging()) {
|
||||||
{
|
|
||||||
if (m_mouse_capture.any())
|
if (m_mouse_capture.any())
|
||||||
// if the button down was done on this toolbar, prevent from dragging into the scene
|
// if the button down was done on this toolbar, prevent from dragging into the scene
|
||||||
processed = true;
|
processed = true;
|
||||||
// else
|
// else
|
||||||
// return false;
|
// return false;
|
||||||
}
|
}
|
||||||
else if (evt.Dragging() && is_dragging())
|
else if (evt.Dragging() && is_dragging()) {
|
||||||
{
|
|
||||||
if (!m_parent.get_wxglcanvas()->HasCapture())
|
if (!m_parent.get_wxglcanvas()->HasCapture())
|
||||||
m_parent.get_wxglcanvas()->CaptureMouse();
|
m_parent.get_wxglcanvas()->CaptureMouse();
|
||||||
|
|
||||||
@ -595,7 +590,11 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt)
|
|||||||
if (evt.AltDown())
|
if (evt.AltDown())
|
||||||
transformation_type.set_independent();
|
transformation_type.set_independent();
|
||||||
selection.scale(get_scale(), transformation_type);
|
selection.scale(get_scale(), transformation_type);
|
||||||
|
#if ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS
|
||||||
|
if (control_down)
|
||||||
|
#else
|
||||||
if (evt.ControlDown())
|
if (evt.ControlDown())
|
||||||
|
#endif // ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS
|
||||||
selection.translate(get_scale_offset(), true);
|
selection.translate(get_scale_offset(), true);
|
||||||
wxGetApp().obj_manipul()->set_dirty();
|
wxGetApp().obj_manipul()->set_dirty();
|
||||||
break;
|
break;
|
||||||
@ -618,15 +617,21 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt)
|
|||||||
processed = true;
|
processed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (get_gizmo_idx_from_mouse(mouse_pos) == Undefined)
|
if (get_gizmo_idx_from_mouse(mouse_pos) == Undefined) {
|
||||||
{
|
|
||||||
// mouse is outside the toolbar
|
// mouse is outside the toolbar
|
||||||
m_tooltip = "";
|
m_tooltip = "";
|
||||||
|
|
||||||
if (evt.LeftDown())
|
#if ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS
|
||||||
{
|
if (evt.LeftDown() && (!control_down || grabber_contains_mouse())) {
|
||||||
if ((m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports ||m_current == Seam)
|
#else
|
||||||
&& gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown()))
|
if (evt.LeftDown()) {
|
||||||
|
#endif // ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS
|
||||||
|
if ((m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports || m_current == Seam)
|
||||||
|
#if ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS
|
||||||
|
&& gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, evt.ShiftDown(), evt.AltDown()))
|
||||||
|
#else
|
||||||
|
&& gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown()))
|
||||||
|
#endif // ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS
|
||||||
// the gizmo got the event and took some action, there is no need to do anything more
|
// the gizmo got the event and took some action, there is no need to do anything more
|
||||||
processed = true;
|
processed = true;
|
||||||
else if (!selection.is_empty() && grabber_contains_mouse()) {
|
else if (!selection.is_empty() && grabber_contains_mouse()) {
|
||||||
@ -644,17 +649,19 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt)
|
|||||||
processed = true;
|
processed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (evt.RightDown() && (selected_object_idx != -1) && (m_current == SlaSupports || m_current == Hollow)
|
else if (evt.RightDown() && selected_object_idx != -1 && (m_current == SlaSupports || m_current == Hollow)
|
||||||
&& gizmo_event(SLAGizmoEventType::RightDown, mouse_pos))
|
&& gizmo_event(SLAGizmoEventType::RightDown, mouse_pos)) {
|
||||||
{
|
|
||||||
// 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
|
// 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;
|
pending_right_up = true;
|
||||||
// event was taken care of by the SlaSupports gizmo
|
// event was taken care of by the SlaSupports gizmo
|
||||||
processed = true;
|
processed = true;
|
||||||
}
|
}
|
||||||
|
#if ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS
|
||||||
|
else if (evt.RightDown() && !control_down && selected_object_idx != -1 && (m_current == FdmSupports || m_current == Seam)
|
||||||
|
#else
|
||||||
else if (evt.RightDown() && (selected_object_idx != -1) && (m_current == FdmSupports || m_current == Seam)
|
else if (evt.RightDown() && (selected_object_idx != -1) && (m_current == FdmSupports || m_current == Seam)
|
||||||
&& gizmo_event(SLAGizmoEventType::RightDown, mouse_pos))
|
#endif // ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS
|
||||||
{
|
&& gizmo_event(SLAGizmoEventType::RightDown, mouse_pos)) {
|
||||||
// event was taken care of by the FdmSupports / Seam gizmo
|
// event was taken care of by the FdmSupports / Seam gizmo
|
||||||
processed = true;
|
processed = true;
|
||||||
}
|
}
|
||||||
@ -662,53 +669,57 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt)
|
|||||||
&& (m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports || m_current == Seam))
|
&& (m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports || m_current == Seam))
|
||||||
// don't allow dragging objects with the Sla gizmo on
|
// don't allow dragging objects with the Sla gizmo on
|
||||||
processed = true;
|
processed = true;
|
||||||
else if (evt.Dragging() && (m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports || m_current == Seam )
|
#if ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS
|
||||||
&& gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown()))
|
else if (evt.Dragging() && !control_down && (m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports || m_current == Seam)
|
||||||
{
|
&& gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, evt.ShiftDown(), evt.AltDown())) {
|
||||||
|
#else
|
||||||
|
else if (evt.Dragging() && (m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports || m_current == Seam)
|
||||||
|
&& gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown())) {
|
||||||
|
#endif // ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS
|
||||||
// the gizmo got the event and took some action, no need to do anything more here
|
// the gizmo got the event and took some action, no need to do anything more here
|
||||||
m_parent.set_as_dirty();
|
m_parent.set_as_dirty();
|
||||||
processed = true;
|
processed = true;
|
||||||
}
|
}
|
||||||
else if (evt.LeftUp() && (m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports || m_current == Seam) && !m_parent.is_mouse_dragging())
|
else if (evt.LeftUp() && (m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports || m_current == Seam) && !m_parent.is_mouse_dragging()) {
|
||||||
{
|
|
||||||
// in case SLA/FDM gizmo is selected, we just pass the LeftUp event and stop processing - neither
|
// 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
|
// object moving or selecting is suppressed in that case
|
||||||
|
#if ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS
|
||||||
|
gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, evt.ShiftDown(), evt.AltDown(), control_down);
|
||||||
|
#else
|
||||||
gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown());
|
gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown());
|
||||||
|
#endif // ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS
|
||||||
processed = true;
|
processed = true;
|
||||||
}
|
}
|
||||||
else if (evt.LeftUp() && (m_current == Flatten) && (m_gizmos[m_current]->get_hover_id() != -1))
|
else if (evt.LeftUp() && m_current == Flatten && m_gizmos[m_current]->get_hover_id() != -1) {
|
||||||
{
|
|
||||||
// to avoid to loose the selection when user clicks an the white faces of a different object while the Flatten gizmo is active
|
// to avoid to loose the selection when user clicks an the white faces of a different object while the Flatten gizmo is active
|
||||||
processed = true;
|
processed = true;
|
||||||
}
|
}
|
||||||
else if (evt.RightUp() && (m_current == FdmSupports || m_current == Seam) && !m_parent.is_mouse_dragging())
|
else if (evt.RightUp() && (m_current == FdmSupports || m_current == Seam) && !m_parent.is_mouse_dragging()) {
|
||||||
{
|
#if ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS
|
||||||
|
gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, evt.ShiftDown(), evt.AltDown(), control_down);
|
||||||
|
#else
|
||||||
gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown());
|
gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown());
|
||||||
|
#endif // ENABLE_PAN_ROTATE_SCENE_IN_GIZMOS
|
||||||
processed = true;
|
processed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
// mouse inside toolbar
|
// mouse inside toolbar
|
||||||
if (evt.LeftDown() || evt.LeftDClick())
|
if (evt.LeftDown() || evt.LeftDClick()) {
|
||||||
{
|
|
||||||
m_mouse_capture.left = true;
|
m_mouse_capture.left = true;
|
||||||
m_mouse_capture.parent = &m_parent;
|
m_mouse_capture.parent = &m_parent;
|
||||||
processed = true;
|
processed = true;
|
||||||
if (!selection.is_empty())
|
if (!selection.is_empty()) {
|
||||||
{
|
|
||||||
update_on_off_state(mouse_pos);
|
update_on_off_state(mouse_pos);
|
||||||
update_data();
|
update_data();
|
||||||
m_parent.set_as_dirty();
|
m_parent.set_as_dirty();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (evt.MiddleDown())
|
else if (evt.MiddleDown()) {
|
||||||
{
|
|
||||||
m_mouse_capture.middle = true;
|
m_mouse_capture.middle = true;
|
||||||
m_mouse_capture.parent = &m_parent;
|
m_mouse_capture.parent = &m_parent;
|
||||||
}
|
}
|
||||||
else if (evt.RightDown())
|
else if (evt.RightDown()) {
|
||||||
{
|
|
||||||
m_mouse_capture.right = true;
|
m_mouse_capture.right = true;
|
||||||
m_mouse_capture.parent = &m_parent;
|
m_mouse_capture.parent = &m_parent;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user