diff options
5 files changed, 68 insertions, 7 deletions
diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py index e3fff42cc5b..335076309bc 100644 --- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py +++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py @@ -5276,6 +5276,8 @@ def km_3d_view_tool_measure(params): {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, {"items": [ ("view3d.ruler_add", {"type": params.tool_tweak, "value": 'ANY'}, None), + ("view3d.ruler_remove", {"type": 'X', "value": 'PRESS'}, None), + ("view3d.ruler_remove", {"type": 'DEL', "value": 'PRESS'}, None), ]}, ) diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py index 62530daa420..f99b2ebb009 100644 --- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py +++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py @@ -106,18 +106,21 @@ class _defs_view3d_generic: def ruler(): def description(context, item, km): if km is not None: - kmi = km.keymap_items.find_from_operator("view3d.ruler_add") + kmi_add = km.keymap_items.find_from_operator("view3d.ruler_add") + kmi_remove = km.keymap_items.find_from_operator("view3d.ruler_remove") else: - kmi = None + kmi_add = None + kmi_remove = None return ( "Measure distance and angles.\n" "\u2022 {} anywhere for new measurement.\n" "\u2022 Drag ruler segment to measure an angle.\n" - "\u2022 Drag ruler outside the view to remove.\n" + "\u2022 {} to remove the active ruler.\n" "\u2022 Ctrl while dragging to snap.\n" "\u2022 Shift while dragging to measure surface thickness." ).format( - kmi_to_string_or_none(kmi) + kmi_to_string_or_none(kmi_add), + kmi_to_string_or_none(kmi_remove), ) return dict( text="Measure", diff --git a/source/blender/editors/space_view3d/view3d_gizmo_ruler.c b/source/blender/editors/space_view3d/view3d_gizmo_ruler.c index f04f4bd0e32..2dbc2746fee 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_ruler.c +++ b/source/blender/editors/space_view3d/view3d_gizmo_ruler.c @@ -102,9 +102,10 @@ enum { RULER_SNAP_OK = (1 << 0), }; +struct RulerItem; + typedef struct RulerInfo { - // ListBase items; - int item_active; + struct RulerItem *item_active; int flag; int snap_flag; int state; @@ -152,6 +153,10 @@ static RulerItem *ruler_item_add(wmGizmoGroup *gzgroup) static void ruler_item_remove(bContext *C, wmGizmoGroup *gzgroup, RulerItem *ruler_item) { + RulerInfo *ruler_info = gzgroup->customdata; + if (ruler_info->item_active == ruler_item) { + ruler_info->item_active = NULL; + } WM_gizmo_unlink(&gzgroup->gizmos, gzgroup->parent_gzmap, &ruler_item->gz, C); } @@ -526,7 +531,7 @@ static void gizmo_ruler_draw(const bContext *C, wmGizmo *gz) copy_v3_fl(color_back, 0.0f); } - const bool is_act = (gz->flag & WM_GIZMO_DRAW_HOVER); + const bool is_act = (ruler_info->item_active == ruler_item); float dir_ruler[2]; float co_ss[3][2]; int j; @@ -909,6 +914,8 @@ static int gizmo_ruler_invoke( /* Should always be true. */ inter->inside_region = BLI_rcti_isect_pt_v(&ar->winrct, &event->x); + ruler_info->item_active = ruler_item_pick; + return OPERATOR_RUNNING_MODAL; } @@ -926,6 +933,7 @@ static void gizmo_ruler_exit(bContext *C, wmGizmo *gz, const bool cancel) if ((inter->co_index == 1) && (ruler_item->flag & RULERITEM_USE_ANGLE)) { ruler_item->flag &= ~RULERITEM_USE_ANGLE; } +#if 0 else { /* Not ideal, since the ruler isn't a mode and we don't want to override delete key * use dragging out of the view for removal. */ @@ -934,6 +942,7 @@ static void gizmo_ruler_exit(bContext *C, wmGizmo *gz, const bool cancel) gz = NULL; inter = NULL; } +#endif } if (ruler_info->snap_flag & RULER_SNAP_OK) { ruler_info->snap_flag &= ~RULER_SNAP_OK; @@ -1092,3 +1101,48 @@ void VIEW3D_OT_ruler_add(wmOperatorType *ot) } /** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Remove Ruler Operator + * \{ */ + +static int view3d_ruler_remove_invoke(bContext *C, wmOperator *op, const wmEvent *event) +{ + ARegion *ar = CTX_wm_region(C); + View3D *v3d = CTX_wm_view3d(C); + RegionView3D *rv3d = ar->regiondata; + + if ((v3d->flag2 & V3D_RENDER_OVERRIDE) || + (v3d->gizmo_flag & (V3D_GIZMO_HIDE | V3D_GIZMO_HIDE_TOOL))) + { + BKE_report(op->reports, RPT_WARNING, "Gizmos hidden in this view"); + return OPERATOR_CANCELLED; + } + + wmGizmoMap *gzmap = ar->gizmo_map; + wmGizmoGroup *gzgroup = WM_gizmomap_group_find(gzmap, view3d_gzgt_ruler_id); + if (gzgroup) { + RulerInfo *ruler_info = gzgroup->customdata; + if (ruler_info->item_active) { + ruler_item_remove(C, gzgroup, ruler_info->item_active); + ED_region_tag_redraw(ar); + return OPERATOR_FINISHED; + } + } + return OPERATOR_PASS_THROUGH; +} + +void VIEW3D_OT_ruler_remove(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Ruler Remove"; + ot->idname = "VIEW3D_OT_ruler_remove"; + + ot->invoke = view3d_ruler_remove_invoke; + ot->poll = view3d_ruler_poll; + + /* flags */ + ot->flag = OPTYPE_UNDO | OPTYPE_INTERNAL; +} + +/** \} */ diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h index 1aa494b06d4..1d38b006e14 100644 --- a/source/blender/editors/space_view3d/view3d_intern.h +++ b/source/blender/editors/space_view3d/view3d_intern.h @@ -260,6 +260,7 @@ void VIEW3D_GGT_mesh_preselect_edgering(struct wmGizmoGroupType *gzgt); void VIEW3D_GGT_ruler(struct wmGizmoGroupType *gzgt); void VIEW3D_GT_ruler_item(struct wmGizmoType *gzt); void VIEW3D_OT_ruler_add(struct wmOperatorType *ot); +void VIEW3D_OT_ruler_remove(struct wmOperatorType *ot); void VIEW3D_GT_navigate_rotate(struct wmGizmoType *gzt); diff --git a/source/blender/editors/space_view3d/view3d_ops.c b/source/blender/editors/space_view3d/view3d_ops.c index 60f3fe6a665..d712a9582d5 100644 --- a/source/blender/editors/space_view3d/view3d_ops.c +++ b/source/blender/editors/space_view3d/view3d_ops.c @@ -222,6 +222,7 @@ void view3d_operatortypes(void) WM_operatortype_append(VIEW3D_OT_toggle_matcap_flip); WM_operatortype_append(VIEW3D_OT_ruler_add); + WM_operatortype_append(VIEW3D_OT_ruler_remove); transform_operatortypes(); } |