Fix T100129: Status bar incorrectly shows "[G] Move" after pressing G once in Edit Mode

Add specific modal keyitem for Vert/Edge Slide or TrackBall.

Note that there is a workround to avoid repeated keys in the status bar.

Reviewed By: campbellbarton

Maniphest Tasks: T100129

Differential Revision: https://developer.blender.org/D15597
This commit is contained in:
Germano Cavalcante 2022-08-03 15:12:18 -03:00 committed by Germano Cavalcante
parent c67d4117d4
commit 791bfae1d6
Notes: blender-bot 2023-02-13 23:39:48 +01:00
Referenced by commit b72eddac61, Fix T100280: GG not toggling the offset transform mode in tracker
Referenced by issue #100280, Regression. Pressing GG should give the tracker an offset. Instead it moves the tracker
Referenced by issue #100265, Regression? - Old keymaps aren't read properly
Referenced by issue #100129, Status bar incorrectly shows "[G] Move" after pressing G once in Edit Mode
4 changed files with 85 additions and 18 deletions

View File

@ -5751,7 +5751,9 @@ def km_transform_modal_map(_params):
("PLANE_Z", {"type": 'Z', "value": 'PRESS', "shift": True}, None),
("CONS_OFF", {"type": 'C', "value": 'PRESS'}, None),
("TRANSLATE", {"type": 'G', "value": 'PRESS'}, None),
("VERT_EDGE_SLIDE", {"type": 'G', "value": 'PRESS'}, None),
("ROTATE", {"type": 'R', "value": 'PRESS'}, None),
("TRACKBALL", {"type": 'R', "value": 'PRESS'}, None),
("RESIZE", {"type": 'S', "value": 'PRESS'}, None),
("SNAP_TOGGLE", {"type": 'TAB', "value": 'PRESS', "shift": True}, None),
("SNAP_INV_ON", {"type": 'LEFT_CTRL', "value": 'PRESS', "any": True}, None),

View File

@ -3968,7 +3968,9 @@ def km_transform_modal_map(_params):
("PLANE_Z", {"type": 'Z', "value": 'PRESS', "shift": True}, None),
("CONS_OFF", {"type": 'C', "value": 'PRESS'}, None),
("TRANSLATE", {"type": 'G', "value": 'PRESS'}, None),
("VERT_EDGE_SLIDE", {"type": 'G', "value": 'PRESS'}, None),
("ROTATE", {"type": 'R', "value": 'PRESS'}, None),
("TRACKBALL", {"type": 'R', "value": 'PRESS'}, None),
("RESIZE", {"type": 'S', "value": 'PRESS'}, None),
("SNAP_TOGGLE", {"type": 'TAB', "value": 'PRESS', "shift": True}, None),
("SNAP_INV_ON", {"type": 'LEFT_CTRL', "value": 'PRESS', "any": True}, None),

View File

@ -641,10 +641,48 @@ static bool transform_modal_item_poll(const wmOperator *op, int value)
}
case TFM_MODAL_TRANSLATE:
case TFM_MODAL_ROTATE:
case TFM_MODAL_RESIZE: {
case TFM_MODAL_RESIZE:
case TFM_MODAL_VERT_EDGE_SLIDE:
case TFM_MODAL_TRACKBALL: {
if (!transform_mode_is_changeable(t->mode)) {
return false;
}
if (value == TFM_MODAL_TRANSLATE && t->mode == TFM_TRANSLATION) {
return false;
}
if (value == TFM_MODAL_ROTATE && t->mode == TFM_ROTATION) {
return false;
}
if (value == TFM_MODAL_RESIZE && t->mode == TFM_RESIZE) {
return false;
}
if (value == TFM_MODAL_VERT_EDGE_SLIDE &&
(t->data_type != &TransConvertType_Mesh ||
/* WORKAROUND: Avoid repeated keys in status bar.
*
* Previously, `Vert/Edge Slide` and `Move` were triggered by the same modal key.
* But now, to fix T100129, `Vert/Edge Slide` has its own modal key.
* However by default it uses the same key as `Move` (G).
* So, to avoid displaying the same key twice (G and G), only display this modal key
* during the `Move` operation.
*
* Ideally we should check if it really uses the same key. */
t->mode != TFM_TRANSLATION)) {
return false;
}
if (value == TFM_MODAL_TRACKBALL &&
/* WORKAROUND: Avoid repeated keys in status bar.
*
* Previously, `Trackball` and `Rotate` were triggered by the same modal key.
* But now, to fix T100129, `Trackball` has its own modal key.
* However by default it uses the same key as `Rotate` (R).
* So, to avoid displaying the same key twice (R and R), only display this modal key
* during the `Rotate` operation.
*
* Ideally we should check if it really uses the same key. */
t->mode != TFM_ROTATION) {
return false;
}
break;
}
}
@ -691,7 +729,9 @@ wmKeyMap *transform_modal_keymap(wmKeyConfig *keyconf)
"Toggle Direction for Node Auto-Offset",
""},
{TFM_MODAL_TRANSLATE, "TRANSLATE", 0, "Move", ""},
{TFM_MODAL_VERT_EDGE_SLIDE, "VERT_EDGE_SLIDE", 0, "Vert/Edge Slide", ""},
{TFM_MODAL_ROTATE, "ROTATE", 0, "Rotate", ""},
{TFM_MODAL_TRACKBALL, "TRACKBALL", 0, "TrackBall", ""},
{TFM_MODAL_RESIZE, "RESIZE", 0, "Resize", ""},
{TFM_MODAL_AUTOCONSTRAINT, "AUTOCONSTRAIN", 0, "Automatic Constraint", ""},
{TFM_MODAL_AUTOCONSTRAINTPLANE, "AUTOCONSTRAINPLANE", 0, "Automatic Constraint Plane", ""},
@ -934,8 +974,15 @@ int transformEvent(TransInfo *t, const wmEvent *event)
handled = true;
break;
case TFM_MODAL_TRANSLATE:
case TFM_MODAL_VERT_EDGE_SLIDE:
/* only switch when... */
if (t->mode == TFM_TRANSLATION) {
if (!transform_mode_is_changeable(t->mode)) {
break;
}
if (event->val == TFM_MODAL_VERT_EDGE_SLIDE) {
if (ELEM(t->mode, TFM_VERT_SLIDE, TFM_EDGE_SLIDE)) {
break;
}
if ((t->obedit_type == OB_MESH) && (t->spacetype == SPACE_VIEW3D)) {
restoreTransObjects(t);
resetTransModal(t);
@ -969,7 +1016,10 @@ int transformEvent(TransInfo *t, const wmEvent *event)
handled = true;
}
}
else if (transform_mode_is_changeable(t->mode)) {
else {
if (t->mode == TFM_TRANSLATION) {
break;
}
restoreTransObjects(t);
resetTransModal(t);
resetTransRestrictions(t);
@ -980,24 +1030,34 @@ int transformEvent(TransInfo *t, const wmEvent *event)
}
break;
case TFM_MODAL_ROTATE:
case TFM_MODAL_TRACKBALL:
/* only switch when... */
if (!(t->options & CTX_TEXTURE_SPACE) && !(t->options & (CTX_MOVIECLIP | CTX_MASK))) {
if (transform_mode_is_changeable(t->mode)) {
restoreTransObjects(t);
resetTransModal(t);
resetTransRestrictions(t);
if (t->mode == TFM_ROTATION) {
transform_mode_init(t, NULL, TFM_TRACKBALL);
}
else {
transform_mode_init(t, NULL, TFM_ROTATION);
}
initSnapping(t, NULL); /* need to reinit after mode change */
t->redraw |= TREDRAW_HARD;
handled = true;
if (!transform_mode_is_changeable(t->mode)) {
break;
}
if (event->val == TFM_MODAL_TRACKBALL) {
if (t->mode == TFM_TRACKBALL) {
break;
}
}
else if (t->mode == TFM_ROTATION) {
break;
}
if (!(t->options & CTX_TEXTURE_SPACE) && !(t->options & (CTX_MOVIECLIP | CTX_MASK))) {
restoreTransObjects(t);
resetTransModal(t);
resetTransRestrictions(t);
if (event->val == TFM_MODAL_TRACKBALL) {
transform_mode_init(t, NULL, TFM_TRACKBALL);
}
else {
transform_mode_init(t, NULL, TFM_ROTATION);
}
initSnapping(t, NULL); /* need to reinit after mode change */
t->redraw |= TREDRAW_HARD;
handled = true;
}
break;
case TFM_MODAL_RESIZE:
/* only switch when... */

View File

@ -253,6 +253,9 @@ enum {
TFM_MODAL_AUTOCONSTRAINTPLANE = 29,
TFM_MODAL_PRECISION = 30,
TFM_MODAL_VERT_EDGE_SLIDE = 31,
TFM_MODAL_TRACKBALL = 32,
};
/** \} */