diff options
author | Germano Cavalcante <germano.costa@ig.com.br> | 2020-11-30 19:11:46 +0300 |
---|---|---|
committer | Germano Cavalcante <germano.costa@ig.com.br> | 2020-11-30 20:50:35 +0300 |
commit | c0677b662f4b13429c0738b99ace85403385ff38 (patch) | |
tree | 7a7c069bd1da2d6c587df4d5126b0d76ed872929 | |
parent | 3bdc42f97a837766aec2bcd57917ef631570304f (diff) |
Fix T83177: Industry Compatible keymap: MMB-dragging to transform engages axis-constraining on release
Release confirm did not consider modal keymap events.
-rw-r--r-- | source/blender/editors/transform/transform.c | 59 | ||||
-rw-r--r-- | source/blender/editors/transform/transform.h | 3 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_generics.c | 44 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_ops.c | 4 | ||||
-rw-r--r-- | source/blender/windowmanager/WM_api.h | 4 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 7 |
6 files changed, 67 insertions, 54 deletions
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index bba0b750d0c..356ad8643f8 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -818,9 +818,15 @@ int transformEvent(TransInfo *t, const wmEvent *event) t->redraw |= handleSnapping(t, event); handled = true; } - /* handle modal keymap first */ - /* enforce redraw of transform when modifiers are used */ + else if (event->val == t->release_confirm_event_val && + event->type == t->release_confirm_event_type) { + /* Confirm transform if launch key is released after mouse move. */ + BLI_assert(t->flag & T_RELEASE_CONFIRM); + t->state = TRANS_CONFIRM; + } else if (event->type == EVT_MODAL_MAP) { + /* Handle modal keymap first. */ + /* Enforce redraw of transform when modifiers are used */ switch (event->val) { case TFM_MODAL_CANCEL: t->state = TRANS_CANCEL; @@ -1122,8 +1128,8 @@ int transformEvent(TransInfo *t, const wmEvent *event) break; } } - /* Else do non-mapped events. */ else if (event->val == KM_PRESS) { + /* Do non-mapped events. */ switch (event->type) { case EVT_CKEY: if (event->is_repeat) { @@ -1211,11 +1217,6 @@ int transformEvent(TransInfo *t, const wmEvent *event) } break; } - - /* confirm transform if launch key is released after mouse move */ - if ((t->flag & T_RELEASE_CONFIRM) && event->type == t->launch_event) { - t->state = TRANS_CONFIRM; - } } /* if we change snap options, get the unsnapped values back */ @@ -1687,17 +1688,6 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve t->mode = mode; - /* Needed to translate tweak events to mouse buttons. */ - t->launch_event = event ? WM_userdef_event_type_from_keymap_type(event->type) : -1; - t->is_launch_event_tweak = event ? ISTWEAK(event->type) : false; - - /* XXX Remove this when wm_operator_call_internal doesn't use window->eventstate - * (which can have type = 0) */ - /* For gizmo only, so assume LEFTMOUSE. */ - if (t->launch_event == 0) { - t->launch_event = LEFTMOUSE; - } - unit_m3(t->spacemtx); initTransInfo(C, t, op, event); @@ -1771,37 +1761,6 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve } } - if (event) { - /* keymap for shortcut header prints */ - t->keymap = WM_keymap_active(CTX_wm_manager(C), op->type->modalkeymap); - - /* Stupid code to have Ctrl-Click on gizmo work ok. - * - * Do this only for translation/rotation/resize because only these - * modes are available from gizmo and doing such check could - * lead to keymap conflicts for other modes (see T31584) - */ - if (ELEM(mode, TFM_TRANSLATION, TFM_ROTATION, TFM_RESIZE)) { - wmKeyMapItem *kmi; - - for (kmi = t->keymap->items.first; kmi; kmi = kmi->next) { - if (kmi->flag & KMI_INACTIVE) { - continue; - } - - if (kmi->propvalue == TFM_MODAL_SNAP_INV_ON && kmi->val == KM_PRESS) { - if ((ELEM(kmi->type, EVT_LEFTCTRLKEY, EVT_RIGHTCTRLKEY) && event->ctrl) || - (ELEM(kmi->type, EVT_LEFTSHIFTKEY, EVT_RIGHTSHIFTKEY) && event->shift) || - (ELEM(kmi->type, EVT_LEFTALTKEY, EVT_RIGHTALTKEY) && event->alt) || - ((kmi->type == EVT_OSKEY) && event->oskey)) { - t->modifiers |= MOD_SNAP_INVERT; - } - break; - } - } - } - } - initSnapping(t, op); /* Initialize snapping data AFTER mode flags */ initSnapSpatial(t, t->snap_spatial); diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index 227330e8524..485d5282a62 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -351,7 +351,8 @@ typedef struct TransInfo { /*************** NEW STUFF *********************/ /** event type used to launch transform. */ - short launch_event; + short release_confirm_event_type; + short release_confirm_event_val; /** Is the actual launch event a tweak event? (launch_event above is set to the corresponding * mouse button then.) */ bool is_launch_event_tweak; diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 5b41f6b51bf..27346c9e974 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -593,18 +593,60 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve transform_orientations_current_set(t, (t->con.mode & CON_APPLY) ? 2 : 0); } + if (event) { + t->release_confirm_event_type = WM_userdef_event_type_from_keymap_type(event->type); + t->is_launch_event_tweak = ISTWEAK(event->type); + + /* XXX Remove this when wm_operator_call_internal doesn't use window->eventstate + * (which can have type = 0) */ + /* For gizmo only, so assume LEFTMOUSE. */ + if (t->release_confirm_event_type == 0) { + t->release_confirm_event_type = LEFTMOUSE; + } + } + else { + /* Needed to translate tweak events to mouse buttons. */ + t->release_confirm_event_type = -1; + } + + t->release_confirm_event_val = -2; + if (op && ((prop = RNA_struct_find_property(op->ptr, "release_confirm")) && RNA_property_is_set(op->ptr, prop))) { if (RNA_property_boolean_get(op->ptr, prop)) { t->flag |= T_RELEASE_CONFIRM; + t->release_confirm_event_val = KM_RELEASE; } } else { /* Release confirms preference should not affect node editor (T69288, T70504). */ - if (ISMOUSE(t->launch_event) && + if (ISMOUSE(t->release_confirm_event_type) && ((U.flag & USER_RELEASECONFIRM) || (t->spacetype == SPACE_NODE))) { /* Global "release confirm" on mouse bindings */ t->flag |= T_RELEASE_CONFIRM; + t->release_confirm_event_val = KM_RELEASE; + } + } + + if (op && event) { + /* Keymap for shortcut header prints. */ + t->keymap = WM_keymap_active(CTX_wm_manager(C), op->type->modalkeymap); + + /* Stupid code to have Relase confirm and Ctrl-Click on gizmo work ok. */ + wmKeyMapItem *kmi = WM_event_match_modal_keymap_item(t->keymap, op, event); + if (kmi) { + if ((t->flag & T_RELEASE_CONFIRM) && (event->val == KM_PRESS) && (kmi->val != KM_PRESS)) { + t->release_confirm_event_type = EVT_MODAL_MAP; + t->release_confirm_event_val = kmi->propvalue; + } + + if ((kmi->propvalue == TFM_MODAL_SNAP_INV_ON) && + ELEM(t->mode, TFM_TRANSLATION, TFM_ROTATION, TFM_RESIZE)) { + /* Do this only for translation/rotation/resize because only these + * modes are available from gizmo and doing such check could + * lead to keymap conflicts for other modes (see T31584) */ + t->modifiers |= MOD_SNAP_INVERT; + } } } diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c index c455dd55b8a..aeb34e34d97 100644 --- a/source/blender/editors/transform/transform_ops.c +++ b/source/blender/editors/transform/transform_ops.c @@ -376,7 +376,7 @@ static int transformops_data(bContext *C, wmOperator *op, const wmEvent *event) { int retval = 1; if (op->customdata == NULL) { - TransInfo *t = MEM_callocN(sizeof(TransInfo), "TransInfo data2"); + TransInfo *t = op->customdata = MEM_callocN(sizeof(TransInfo), "TransInfo data2"); TransformModeItem *tmode; int mode = -1; @@ -396,10 +396,10 @@ static int transformops_data(bContext *C, wmOperator *op, const wmEvent *event) /* store data */ if (retval) { G.moving = special_transform_moving(t); - op->customdata = t; } else { MEM_freeN(t); + op->customdata = NULL; } } diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index fd0b99fb9ae..47c5487a458 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -47,6 +47,7 @@ struct ImBuf; struct ImageFormatData; struct Main; struct MenuType; +struct Operator; struct PointerRNA; struct PropertyRNA; struct ScrArea; @@ -255,6 +256,9 @@ void WM_event_set_keymap_handler_post_callback(struct wmEventHandler_Keymap *han wmKeyMap *WM_event_get_keymap_from_handler(wmWindowManager *wm, struct wmEventHandler_Keymap *handler); +wmKeyMapItem *WM_event_match_modal_keymap_item(const wmKeyMap *keymap, + struct wmOperator *op, + const struct wmEvent *event); wmKeyMapItem *WM_event_match_keymap_item(struct bContext *C, wmKeyMap *keymap, const struct wmEvent *event); diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 1bd8c675807..587abf6fa0a 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -1911,6 +1911,13 @@ static wmKeyMapItem *wm_eventmatch_modal_keymap_items(const wmKeyMap *keymap, return NULL; } +wmKeyMapItem *WM_event_match_modal_keymap_item(const wmKeyMap *keymap, + wmOperator *op, + const wmEvent *event) +{ + return wm_eventmatch_modal_keymap_items(keymap, op, event); +} + /** * This function prepares events for use with #wmOperatorType.modal by: * |