[Bf-blender-cvs] [4d085c9baec] master: Measure Tool: use x/del key to remove the active ruler

Campbell Barton noreply at git.blender.org
Wed Feb 20 06:45:17 CET 2019


Commit: 4d085c9baecb3956c924dc1d96483e685bcf5a29
Author: Campbell Barton
Date:   Wed Feb 20 16:38:21 2019 +1100
Branches: master
https://developer.blender.org/rB4d085c9baecb3956c924dc1d96483e685bcf5a29

Measure Tool: use x/del key to remove the active ruler

Dragging outside the view was only meant to be a temporary workaround.

===================================================================

M	release/scripts/presets/keyconfig/keymap_data/blender_default.py
M	release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
M	source/blender/editors/space_view3d/view3d_gizmo_ruler.c
M	source/blender/editors/space_view3d/view3d_intern.h
M	source/blender/editors/space_view3d/view3d_ops.c

===================================================================

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();
 }



More information about the Bf-blender-cvs mailing list