diff options
author | Germano Cavalcante <mano-wii> | 2021-11-17 03:05:30 +0300 |
---|---|---|
committer | Germano Cavalcante <germano.costa@ig.com.br> | 2021-11-18 19:52:39 +0300 |
commit | 2a9cfdac7e126e37afb82e15a131717041f3d2f8 (patch) | |
tree | ff05a5c68e03f62c11f59f0abffe4ca4c24584d0 /source/blender/windowmanager/intern | |
parent | c7f9a782aafcdd08868504584b2621afcf1356c2 (diff) |
Revert "Revert "Allow navigating while transforming""
This reverts commit 5e6fdaa07fff907e02b36813ccde0702bad4fb4d.
Diffstat (limited to 'source/blender/windowmanager/intern')
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 2 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_operator_utils.c | 101 |
2 files changed, 102 insertions, 1 deletions
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index f51c8c48c48..f08c23c6543 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -2003,7 +2003,7 @@ void WM_event_remove_handlers(bContext *C, ListBase *handlers) } } -static bool wm_eventmatch(const wmEvent *winevent, const wmKeyMapItem *kmi) +bool wm_eventmatch(const wmEvent *winevent, const wmKeyMapItem *kmi) { if (kmi->flag & KMI_INACTIVE) { return false; diff --git a/source/blender/windowmanager/intern/wm_operator_utils.c b/source/blender/windowmanager/intern/wm_operator_utils.c index 85a0a28de79..4f4259408d8 100644 --- a/source/blender/windowmanager/intern/wm_operator_utils.c +++ b/source/blender/windowmanager/intern/wm_operator_utils.c @@ -21,7 +21,9 @@ */ #include <math.h> +#include <string.h> +#include "BLI_listbase.h" #include "BLI_string.h" #include "BLI_utildefines.h" @@ -35,6 +37,8 @@ #include "WM_api.h" /* Own include. */ #include "WM_types.h" +#include "wm_event_system.h" + #include "MEM_guardedalloc.h" #include "ED_object.h" @@ -358,4 +362,101 @@ void WM_operator_type_modal_from_exec_for_object_edit_coords(wmOperatorType *ot) RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE); } +bool WM_operator_do_navigation(bContext *C, wmOperator *op, const wmEvent *event) +{ + const char *op_names[] = { + /* 3D View. */ + "VIEW3D_OT_zoom", + "VIEW3D_OT_rotate", + "VIEW3D_OT_move", + "VIEW3D_OT_view_pan", + "VIEW3D_OT_dolly", + "VIEW3D_OT_view_orbit", + "VIEW3D_OT_view_roll", +#ifdef WITH_INPUT_NDOF + "VIEW3D_OT_ndof_orbit_zoom", + "VIEW3D_OT_ndof_orbit", + "VIEW3D_OT_ndof_pan", + "VIEW3D_OT_ndof_all", +#endif + /* Image. */ + "IMAGE_OT_view_pan", + "IMAGE_OT_view_zoom_in", + "IMAGE_OT_view_zoom_out", +#ifdef WITH_INPUT_NDOF + "IMAGE_OT_view_ndof", +#endif + /* View2D. */ + "VIEW2D_OT_pan", + "VIEW2D_OT_zoom_in", + "VIEW2D_OT_zoom_out", +#ifdef WITH_INPUT_NDOF + "VIEW2D_OT_ndof", +#endif + }; + + static struct { + wmKeyMapItem *kmi; + wmOperatorType *ot; + } kmi_ot[70]; + static int kmi_ot_len; + + /* Lazy initialization (avoids having to allocating a context). */ + static wmOperatorType *ot_last = NULL; + static char spacetype_last = SPACE_EMPTY; + SpaceLink *sl = CTX_wm_space_data(C); + if ((ot_last != op->type) || (spacetype_last != sl->spacetype)) { + ot_last = op->type; + spacetype_last = sl->spacetype; + + wmWindowManager *wm = CTX_wm_manager(C); + wmKeyMap *km; + if (sl->spacetype == SPACE_VIEW3D) { + km = WM_keymap_find_all(wm, "3D View", SPACE_VIEW3D, 0); + } + else if (sl->spacetype == SPACE_IMAGE) { + km = WM_keymap_find_all(wm, "Image", SPACE_IMAGE, 0); + } + else { + km = WM_keymap_find_all(wm, "View2D", 0, 0); + } + + kmi_ot_len = 0; + LISTBASE_FOREACH (wmKeyMapItem *, kmi, &km->items) { + if (!(STRPREFIX(kmi->idname, "VIEW") || STRPREFIX(kmi->idname, "IMAGE"))) { + continue; + } + if (kmi->flag & KMI_INACTIVE) { + continue; + } + for (int i = 0; i < ARRAY_SIZE(op_names); i++) { + if (STREQ(kmi->idname, op_names[i])) { + kmi_ot[kmi_ot_len].kmi = kmi; + kmi_ot[kmi_ot_len].ot = WM_operatortype_find(op_names[i], true); + kmi_ot_len++; + break; + } + } + if (kmi_ot_len == ARRAY_SIZE(kmi_ot)) { + BLI_assert(false); + break; + } + } + } + + if (event->type == EVT_MODAL_MAP) { + wmWindow *win = CTX_wm_window(C); + event = win->eventstate; + } + + for (int i = 0; i < kmi_ot_len; i++) { + if (wm_eventmatch(event, kmi_ot[i].kmi)) { + return WM_operator_name_call_ptr( + C, kmi_ot[i].ot, WM_OP_INVOKE_DEFAULT, kmi_ot[i].kmi->ptr) != OPERATOR_CANCELLED; + } + } + + return false; +} + /** \} */ |