diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-07-08 17:06:59 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-07-08 17:18:24 +0300 |
commit | a4bc6aca0ef96ce5e4b011cd33477e551269fa1e (patch) | |
tree | f4dffb5abc63ec6dcc4788cfd91e6225fab912a3 /source/blender/editors/space_view3d/view3d_gizmo_ruler.c | |
parent | 6546442f4f0a275a15969e1daefcc8e0f5fa8f54 (diff) |
Fix T66554: Measure doesn't snap with Ctrl
Diffstat (limited to 'source/blender/editors/space_view3d/view3d_gizmo_ruler.c')
-rw-r--r-- | source/blender/editors/space_view3d/view3d_gizmo_ruler.c | 41 |
1 files changed, 32 insertions, 9 deletions
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 { |