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

Dragging outside the view was only meant to be a temporary workaround.
This commit is contained in:
Campbell Barton 2019-02-20 16:38:21 +11:00
parent 7ee9fe4991
commit 4d085c9bae
5 changed files with 68 additions and 7 deletions

View File

@ -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),
]},
)

View File

@ -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",

View File

@ -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;
}
/** \} */

View File

@ -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);

View File

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