From 0c33411bddfd3e2ab85dbf8411334f18fdaeb460 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Thu, 18 Nov 2021 13:55:17 -0300 Subject: Revert "Revert "Revert "Revert "Allow navigating while transforming"""" This reverts commit 717a971035071d36af03d65713408f4da1f69cb3. --- source/blender/windowmanager/WM_api.h | 3 + .../blender/windowmanager/intern/wm_event_system.c | 2 +- .../windowmanager/intern/wm_operator_utils.c | 101 +++++++++++++++++++++ source/blender/windowmanager/wm_event_system.h | 1 + 4 files changed, 106 insertions(+), 1 deletion(-) (limited to 'source/blender/windowmanager') diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 8d25ece3753..35bd5ef4e3f 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -640,6 +640,9 @@ char *WM_operatortype_description_or_name(struct bContext *C, /* wm_operator_utils.c */ void WM_operator_type_modal_from_exec_for_object_edit_coords(struct wmOperatorType *ot); +bool WM_operator_do_navigation(struct bContext *C, + struct wmOperator *op, + const struct wmEvent *event); /* wm_uilist_type.c */ void WM_uilisttype_init(void); 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 +#include +#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; +} + /** \} */ diff --git a/source/blender/windowmanager/wm_event_system.h b/source/blender/windowmanager/wm_event_system.h index 9b0f128d071..c90a808c65e 100644 --- a/source/blender/windowmanager/wm_event_system.h +++ b/source/blender/windowmanager/wm_event_system.h @@ -147,6 +147,7 @@ typedef struct wmEventHandler_Dropbox { void wm_event_free_all(wmWindow *win); void wm_event_free(wmEvent *event); void wm_event_free_handler(wmEventHandler *handler); +bool wm_eventmatch(const wmEvent *winevent, const wmKeyMapItem *kmi); /* goes over entire hierarchy: events -> window -> screen -> area -> region */ void wm_event_do_handlers(bContext *C); -- cgit v1.2.3