From a4bc6aca0ef96ce5e4b011cd33477e551269fa1e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 9 Jul 2019 00:06:59 +1000 Subject: Fix T66554: Measure doesn't snap with Ctrl --- .../editors/space_view3d/view3d_gizmo_ruler.c | 41 +++++++++++++++++----- 1 file changed, 32 insertions(+), 9 deletions(-) (limited to 'source/blender/editors/space_view3d/view3d_gizmo_ruler.c') diff --git a/source/blender/editors/space_view3d/view3d_gizmo_ruler.c b/source/blender/editors/space_view3d/view3d_gizmo_ruler.c index ebfd66008f7..e781e129540 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_ruler.c +++ b/source/blender/editors/space_view3d/view3d_gizmo_ruler.c @@ -113,6 +113,13 @@ typedef struct RulerInfo { wmWindow *win; ScrArea *sa; ARegion *ar; /* re-assigned every modal update */ + + /* Track changes in state. */ + struct { + bool do_snap; + bool do_thickness; + } drag_state_prev; + } RulerInfo; /* -------------------------------------------------------------------- */ @@ -280,6 +287,7 @@ static void ruler_state_set(bContext *C, RulerInfo *ruler_info, int state) /* pass */ } else if (state == RULER_STATE_DRAG) { + memset(&ruler_info->drag_state_prev, 0x0, sizeof(ruler_info->drag_state_prev)); ruler_info->snap_context = ED_transform_snap_object_context_create_view3d( bmain, CTX_data_scene(C), CTX_data_depsgraph(C), 0, ruler_info->ar, CTX_wm_view3d(C)); } @@ -857,27 +865,43 @@ static int gizmo_ruler_test_select(bContext *UNUSED(C), wmGizmo *gz, const int m static int gizmo_ruler_modal(bContext *C, wmGizmo *gz, const wmEvent *event, - eWM_GizmoFlagTweak UNUSED(tweak_flag)) + eWM_GizmoFlagTweak tweak_flag) { bool do_draw = false; int exit_code = OPERATOR_RUNNING_MODAL; RulerInfo *ruler_info = gz->parent_gzgroup->customdata; RulerItem *ruler_item = (RulerItem *)gz; ARegion *ar = CTX_wm_region(C); + bool do_cursor_update = false; ruler_info->ar = ar; switch (event->type) { case MOUSEMOVE: { - if (ruler_info->state == RULER_STATE_DRAG) { - if (view3d_ruler_item_mousemove( - ruler_info, ruler_item, event->mval, event->shift != 0, event->ctrl != 0)) { - do_draw = true; - } - } + do_cursor_update = true; break; } } + + const bool do_snap = tweak_flag & WM_GIZMO_TWEAK_SNAP; + const bool do_thickness = tweak_flag & WM_GIZMO_TWEAK_PRECISE; + if ((ruler_info->drag_state_prev.do_snap != do_snap) || + (ruler_info->drag_state_prev.do_thickness != do_thickness)) { + do_cursor_update = true; + } + + if (do_cursor_update) { + if (ruler_info->state == RULER_STATE_DRAG) { + if (view3d_ruler_item_mousemove( + ruler_info, ruler_item, event->mval, do_thickness, do_snap)) { + do_draw = true; + } + } + } + + ruler_info->drag_state_prev.do_snap = do_snap; + ruler_info->drag_state_prev.do_thickness = do_thickness; + if (do_draw) { ED_region_tag_redraw(ar); } @@ -920,8 +944,7 @@ static int gizmo_ruler_invoke(bContext *C, wmGizmo *gz, const wmEvent *event) } /* update the new location */ - view3d_ruler_item_mousemove( - ruler_info, ruler_item_pick, event->mval, event->shift != 0, event->ctrl != 0); + view3d_ruler_item_mousemove(ruler_info, ruler_item_pick, event->mval, false, false); } } else { -- cgit v1.2.3