3D View: add back transform tool

Further changes are planned in T64928,
this is just the initial basic version.
This commit is contained in:
2019-05-24 01:35:48 +10:00
parent faf48c0f64
commit ec664636e7
4 changed files with 112 additions and 0 deletions

View File

@@ -5060,6 +5060,7 @@ def km_popup_toolbar(_params):
{"items": [
op_tool("builtin.select", {"type": 'W', "value": 'PRESS'}),
op_tool("builtin.select_lasso", {"type": 'L', "value": 'PRESS'}),
op_tool("builtin.transform", {"type": 'T', "value": 'PRESS'}),
op_tool("builtin.measure", {"type": 'M', "value": 'PRESS'}),
]},
)
@@ -5298,6 +5299,16 @@ def km_3d_view_tool_select_lasso(params):
)
def km_3d_view_tool_transform(params):
return (
"3D View Tool: Transform",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
("transform.from_gizmo", {"type": params.tool_tweak, "value": 'ANY'}, None),
]},
)
def km_3d_view_tool_move(params):
return (
"3D View Tool: Move",
@@ -6178,6 +6189,7 @@ def generate_keymaps(params=None):
km_3d_view_tool_select_box(params),
km_3d_view_tool_select_circle(params),
km_3d_view_tool_select_lasso(params),
km_3d_view_tool_transform(params),
km_3d_view_tool_move(params),
km_3d_view_tool_rotate(params),
km_3d_view_tool_scale(params),

View File

@@ -292,6 +292,30 @@ class _defs_transform:
draw_settings=draw_settings,
)
@ToolDef.from_fn
def transform():
def draw_settings(context, layout, tool):
if not layout.use_property_split:
layout.label(text="Gizmos:")
tool_settings = context.tool_settings
props = tool.gizmo_group_properties("VIEW3D_GGT_xform_gizmo")
layout.prop(props, "drag_action")
_template_widget.VIEW3D_GGT_xform_gizmo.draw_settings_with_index(context, layout, 1)
return dict(
idname="builtin.transform",
label="Transform",
description=(
"Supports any combination of grab, rotate & scale at once"
),
icon="ops.transform.transform",
widget="VIEW3D_GGT_xform_gizmo",
keymap="3D View Tool: Transform",
draw_settings=draw_settings,
)
class _defs_view3d_select:
@@ -1685,6 +1709,7 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel):
# for reuse
_tools_transform = (
_defs_transform.transform,
_defs_transform.translate,
_defs_transform.rotate,
(

View File

@@ -1661,7 +1661,12 @@ static void WIDGETGROUP_gizmo_setup(const bContext *C, wmGizmoGroup *gzgroup)
else if (tref && STREQ(tref->idname, "builtin.scale")) {
ggd->twtype |= V3D_GIZMO_SHOW_OBJECT_SCALE;
}
else if (tref && STREQ(tref->idname, "builtin.transform")) {
ggd->twtype = V3D_GIZMO_SHOW_OBJECT_TRANSLATE | V3D_GIZMO_SHOW_OBJECT_ROTATE |
V3D_GIZMO_SHOW_OBJECT_SCALE;
}
else {
/* This is also correct logic for 'builtin.transform', no special check needed. */
/* Setup all gizmos, they can be toggled via 'ToolSettings.gizmo_flag' */
ggd->twtype = V3D_GIZMO_SHOW_OBJECT_TRANSLATE | V3D_GIZMO_SHOW_OBJECT_ROTATE |
V3D_GIZMO_SHOW_OBJECT_SCALE;
@@ -1990,6 +1995,20 @@ void VIEW3D_GGT_xform_gizmo(wmGizmoGroupType *gzgt)
gzgt->message_subscribe = WIDGETGROUP_gizmo_message_subscribe;
gzgt->draw_prepare = WIDGETGROUP_gizmo_draw_prepare;
gzgt->invoke_prepare = WIDGETGROUP_gizmo_invoke_prepare;
static const EnumPropertyItem rna_enum_gizmo_items[] = {
{V3D_GIZMO_SHOW_OBJECT_TRANSLATE, "TRANSLATE", 0, "Move", ""},
{V3D_GIZMO_SHOW_OBJECT_ROTATE, "ROTATE", 0, "Rotate", ""},
{V3D_GIZMO_SHOW_OBJECT_SCALE, "SCALE", 0, "Scale", ""},
{0, "NONE", 0, "None", ""},
{0, NULL, 0, NULL, NULL},
};
RNA_def_enum(gzgt->srna,
"drag_action",
rna_enum_gizmo_items,
V3D_GIZMO_SHOW_OBJECT_TRANSLATE,
"Drag Action",
"");
}
/** Only poll, flag & gzmap_params differ. */

View File

@@ -1210,6 +1210,60 @@ static void TRANSFORM_OT_transform(struct wmOperatorType *ot)
P_ALIGN_SNAP | P_GPENCIL_EDIT | P_CENTER);
}
static int transform_from_gizmo_invoke(bContext *C,
wmOperator *UNUSED(op),
const wmEvent *UNUSED(event))
{
bToolRef *tref = WM_toolsystem_ref_from_context(C);
if (tref) {
ARegion *ar = CTX_wm_region(C);
wmGizmoMap *gzmap = ar->gizmo_map;
wmGizmoGroup *gzgroup = gzmap ? WM_gizmomap_group_find(gzmap, "VIEW3D_GGT_xform_gizmo") : NULL;
if (gzgroup != NULL) {
PointerRNA gzg_ptr;
WM_toolsystem_ref_properties_ensure_from_gizmo_group(tref, gzgroup->type, &gzg_ptr);
const int drag_action = RNA_enum_get(&gzg_ptr, "drag_action");
const char *op_id = NULL;
switch (drag_action) {
case V3D_GIZMO_SHOW_OBJECT_TRANSLATE:
op_id = "TRANSFORM_OT_translate";
break;
case V3D_GIZMO_SHOW_OBJECT_ROTATE:
op_id = "TRANSFORM_OT_rotate";
break;
case V3D_GIZMO_SHOW_OBJECT_SCALE:
op_id = "TRANSFORM_OT_resize";
break;
default:
break;
}
if (op_id) {
wmOperatorType *ot = WM_operatortype_find(op_id, true);
PointerRNA op_ptr;
WM_operator_properties_create_ptr(&op_ptr, ot);
RNA_boolean_set(&op_ptr, "release_confirm", true);
WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &op_ptr);
WM_operator_properties_free(&op_ptr);
return OPERATOR_FINISHED;
}
}
}
return OPERATOR_PASS_THROUGH;
}
/* Use with 'TRANSFORM_GGT_gizmo'. */
static void TRANSFORM_OT_from_gizmo(struct wmOperatorType *ot)
{
/* identifiers */
ot->name = "Transform From Gizmo";
ot->description = "Transform selected items by mode type";
ot->idname = "TRANSFORM_OT_from_gizmo";
ot->flag = 0;
/* api callbacks */
ot->invoke = transform_from_gizmo_invoke;
}
void transform_operatortypes(void)
{
TransformModeItem *tmode;
@@ -1223,6 +1277,8 @@ void transform_operatortypes(void)
WM_operatortype_append(TRANSFORM_OT_select_orientation);
WM_operatortype_append(TRANSFORM_OT_create_orientation);
WM_operatortype_append(TRANSFORM_OT_delete_orientation);
WM_operatortype_append(TRANSFORM_OT_from_gizmo);
}
void ED_keymap_transform(wmKeyConfig *keyconf)