diff options
author | Germano Cavalcante <germano.costa@ig.com.br> | 2021-11-18 19:55:17 +0300 |
---|---|---|
committer | Germano Cavalcante <germano.costa@ig.com.br> | 2021-11-18 20:15:08 +0300 |
commit | 0c33411bddfd3e2ab85dbf8411334f18fdaeb460 (patch) | |
tree | 2aa2e68c6eb20575089787b99481910e1c093657 /source/blender/windowmanager/intern/wm_operator_utils.c | |
parent | ea42c1a22ed3bec36ce968d7fbfcade9efeefdff (diff) |
Revert "Revert "Revert "Revert "Allow navigating while transforming""""
This reverts commit 717a971035071d36af03d65713408f4da1f69cb3.
Diffstat (limited to 'source/blender/windowmanager/intern/wm_operator_utils.c')
-rw-r--r-- | source/blender/windowmanager/intern/wm_operator_utils.c | 101 |
1 files changed, 101 insertions, 0 deletions
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; +} + /** \} */ |