Make Shift+LMB on transform manipulator configurable
It's now possible to change the shortcut that enables planar transformation with the transform manipulators (shift+LMB on axis). This actually fixes the workaround added in rB20681f49801fd. Thing is that we needed to allow using the manipulators, even if a modifier key is held so things like snapping work right away. That's why normal LMB behavior uses KM_ANY. However, event handling would always execute the KM_ANY keymap handler because it's iterated over first. Simply solved this by registering the KM_SHIFT keymap item first, so it has priority over the KM_ANY one.
This commit is contained in:
@@ -137,8 +137,14 @@ static void keymap_particle(wmKeyConfig *keyconf)
|
||||
kmi = WM_keymap_add_item(keymap, "PARTICLE_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0);
|
||||
RNA_boolean_set(kmi->ptr, "unselected", true);
|
||||
|
||||
kmi = WM_keymap_verify_item(keymap, "VIEW3D_OT_manipulator", LEFTMOUSE, KM_PRESS, KM_ANY, 0);
|
||||
/* Shift+LMB behavior first, so it has priority over KM_ANY item below. */
|
||||
kmi = WM_keymap_verify_item(keymap, "VIEW3D_OT_manipulator", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0);
|
||||
RNA_boolean_set(kmi->ptr, "release_confirm", true);
|
||||
RNA_boolean_set(kmi->ptr, "use_planar_constraint", true);
|
||||
/* Using KM_ANY here to allow holding modifiers before starting to transform. */
|
||||
kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_manipulator", LEFTMOUSE, KM_PRESS, KM_ANY, 0);
|
||||
RNA_boolean_set(kmi->ptr, "release_confirm", true);
|
||||
RNA_boolean_set(kmi->ptr, "use_planar_constraint", false);
|
||||
|
||||
WM_keymap_add_item(keymap, "PARTICLE_OT_brush_edit", LEFTMOUSE, KM_PRESS, 0, 0);
|
||||
WM_keymap_add_item(keymap, "PARTICLE_OT_brush_edit", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0);
|
||||
|
@@ -4782,13 +4782,10 @@ static int manipulator_invoke(bContext *C, wmOperator *op, const wmEvent *event)
|
||||
if (!(v3d->twflag & V3D_USE_MANIPULATOR)) return OPERATOR_PASS_THROUGH;
|
||||
if (!(v3d->twflag & V3D_DRAW_MANIPULATOR)) return OPERATOR_PASS_THROUGH;
|
||||
|
||||
/* only no modifier or shift */
|
||||
if (event->keymodifier != 0 && event->keymodifier != KM_SHIFT) return OPERATOR_PASS_THROUGH;
|
||||
|
||||
/* note; otherwise opengl won't work */
|
||||
view3d_operator_needs_opengl(C);
|
||||
|
||||
if (0 == BIF_do_manipulator(C, event, op))
|
||||
if (BIF_do_manipulator(C, event, op) == 0)
|
||||
return OPERATOR_PASS_THROUGH;
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
@@ -4809,6 +4806,9 @@ void VIEW3D_OT_manipulator(wmOperatorType *ot)
|
||||
|
||||
/* properties to pass to transform */
|
||||
Transform_Properties(ot, P_CONSTRAINT);
|
||||
|
||||
RNA_def_boolean(ot->srna, "use_planar_constraint", false, "Planar Constraint", "Limit the transformation to the "
|
||||
"two axes that have not been clicked (translate/scale only)");
|
||||
}
|
||||
|
||||
static int enable_manipulator_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
|
||||
|
@@ -240,13 +240,15 @@ void view3d_keymap(wmKeyConfig *keyconf)
|
||||
/* only for region 3D window */
|
||||
keymap = WM_keymap_find(keyconf, "3D View", SPACE_VIEW3D, 0);
|
||||
|
||||
kmi = WM_keymap_verify_item(keymap, "VIEW3D_OT_manipulator", LEFTMOUSE, KM_PRESS, KM_ANY, 0);
|
||||
/* Shift+LMB behavior first, so it has priority over KM_ANY item below. */
|
||||
kmi = WM_keymap_verify_item(keymap, "VIEW3D_OT_manipulator", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0);
|
||||
RNA_boolean_set(kmi->ptr, "release_confirm", true);
|
||||
/*
|
||||
* Doesn't work with KM_SHIFT, have to use KM_ANY and filter in invoke
|
||||
* */
|
||||
// WM_keymap_verify_item(keymap, "VIEW3D_OT_manipulator", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0);
|
||||
|
||||
RNA_boolean_set(kmi->ptr, "use_planar_constraint", true);
|
||||
/* Using KM_ANY here to allow holding modifiers before starting to transform. */
|
||||
kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_manipulator", LEFTMOUSE, KM_PRESS, KM_ANY, 0);
|
||||
RNA_boolean_set(kmi->ptr, "release_confirm", true);
|
||||
RNA_boolean_set(kmi->ptr, "use_planar_constraint", false);
|
||||
|
||||
WM_keymap_verify_item(keymap, "VIEW3D_OT_cursor3d", ACTIONMOUSE, KM_PRESS, 0, 0);
|
||||
|
||||
WM_keymap_verify_item(keymap, "VIEW3D_OT_rotate", MIDDLEMOUSE, KM_PRESS, 0, 0);
|
||||
|
@@ -1835,7 +1835,7 @@ int BIF_do_manipulator(bContext *C, const struct wmEvent *event, wmOperator *op)
|
||||
ARegion *ar = CTX_wm_region(C);
|
||||
int constraint_axis[3] = {0, 0, 0};
|
||||
int val;
|
||||
int shift = event->shift;
|
||||
const bool use_planar = RNA_boolean_get(op->ptr, "use_planar_constraint");
|
||||
|
||||
if (!(v3d->twflag & V3D_USE_MANIPULATOR)) return 0;
|
||||
if (!(v3d->twflag & V3D_DRAW_MANIPULATOR)) return 0;
|
||||
@@ -1856,7 +1856,7 @@ int BIF_do_manipulator(bContext *C, const struct wmEvent *event, wmOperator *op)
|
||||
case MAN_TRANS_C:
|
||||
break;
|
||||
case MAN_TRANS_X:
|
||||
if (shift) {
|
||||
if (use_planar) {
|
||||
constraint_axis[1] = 1;
|
||||
constraint_axis[2] = 1;
|
||||
}
|
||||
@@ -1864,7 +1864,7 @@ int BIF_do_manipulator(bContext *C, const struct wmEvent *event, wmOperator *op)
|
||||
constraint_axis[0] = 1;
|
||||
break;
|
||||
case MAN_TRANS_Y:
|
||||
if (shift) {
|
||||
if (use_planar) {
|
||||
constraint_axis[0] = 1;
|
||||
constraint_axis[2] = 1;
|
||||
}
|
||||
@@ -1872,7 +1872,7 @@ int BIF_do_manipulator(bContext *C, const struct wmEvent *event, wmOperator *op)
|
||||
constraint_axis[1] = 1;
|
||||
break;
|
||||
case MAN_TRANS_Z:
|
||||
if (shift) {
|
||||
if (use_planar) {
|
||||
constraint_axis[0] = 1;
|
||||
constraint_axis[1] = 1;
|
||||
}
|
||||
@@ -1886,7 +1886,7 @@ int BIF_do_manipulator(bContext *C, const struct wmEvent *event, wmOperator *op)
|
||||
else if (drawflags & MAN_SCALE_C) {
|
||||
switch (drawflags) {
|
||||
case MAN_SCALE_X:
|
||||
if (shift) {
|
||||
if (use_planar) {
|
||||
constraint_axis[1] = 1;
|
||||
constraint_axis[2] = 1;
|
||||
}
|
||||
@@ -1894,7 +1894,7 @@ int BIF_do_manipulator(bContext *C, const struct wmEvent *event, wmOperator *op)
|
||||
constraint_axis[0] = 1;
|
||||
break;
|
||||
case MAN_SCALE_Y:
|
||||
if (shift) {
|
||||
if (use_planar) {
|
||||
constraint_axis[0] = 1;
|
||||
constraint_axis[2] = 1;
|
||||
}
|
||||
@@ -1902,7 +1902,7 @@ int BIF_do_manipulator(bContext *C, const struct wmEvent *event, wmOperator *op)
|
||||
constraint_axis[1] = 1;
|
||||
break;
|
||||
case MAN_SCALE_Z:
|
||||
if (shift) {
|
||||
if (use_planar) {
|
||||
constraint_axis[0] = 1;
|
||||
constraint_axis[1] = 1;
|
||||
}
|
||||
|
Reference in New Issue
Block a user