diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-12-06 19:45:50 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-12-06 22:03:00 +0300 |
commit | 6ffcddc10afa07b073ce01c25884e23fc2b661df (patch) | |
tree | 86e7ddb017474083890bf16fac4876175a923e57 /source/blender/windowmanager | |
parent | 7465078e637b729e8b36a4f4b73a50a347052df4 (diff) |
Tool System: experimental fallback tool support
Implement T66304 as an experimental option,
available under the preferences "Experimental" section.
- When enabled most tools in the 3D view have a gizmo.
- Dragging outside the gizmo uses the 'fallback' tool.
- The fallback tool can be changed or disabled in the tool options
or from a pie menu (Alt-W).
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r-- | source/blender/windowmanager/gizmo/WM_gizmo_types.h | 8 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 34 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_toolsystem.c | 19 |
3 files changed, 60 insertions, 1 deletions
diff --git a/source/blender/windowmanager/gizmo/WM_gizmo_types.h b/source/blender/windowmanager/gizmo/WM_gizmo_types.h index 7bb77375934..d3aa333daea 100644 --- a/source/blender/windowmanager/gizmo/WM_gizmo_types.h +++ b/source/blender/windowmanager/gizmo/WM_gizmo_types.h @@ -120,6 +120,12 @@ typedef enum eWM_GizmoFlagGroupTypeFlag { * We could even move the options into the key-map item. * ~ campbell. */ WM_GIZMOGROUPTYPE_TOOL_INIT = (1 << 6), + + /** + * This gizmo type supports using the fallback tools keymap. + * #wmGizmoGroup.use_tool_fallback will need to be set too. + */ + WM_GIZMOGROUPTYPE_TOOL_FALLBACK_KEYMAP = (1 << 7), } eWM_GizmoFlagGroupTypeFlag; /** @@ -443,6 +449,8 @@ typedef struct wmGizmoGroup { bool tag_remove; + bool use_fallback_keymap; + void *customdata; /** For freeing customdata from above. */ void (*customdata_free)(void *); diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 180a518de2b..d65cf2324a9 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -3728,8 +3728,40 @@ wmKeyMap *WM_event_get_keymap_from_toolsystem(wmWindowManager *wm, wmEventHandle handler->keymap_tool = NULL; bToolRef_Runtime *tref_rt = sa->runtime.tool ? sa->runtime.tool->runtime : NULL; if (tref_rt && tref_rt->keymap[0]) { + const char *keymap_id = tref_rt->keymap; + + /* Support for the gizmo owning the tool keymap. */ + if (U.experimental.use_tool_fallback) { + if (tref_rt->gizmo_group[0] != '\0') { + wmGizmoMap *gzmap = NULL; + wmGizmoGroup *gzgroup = NULL; + for (ARegion *ar = sa->regionbase.first; ar; ar = ar->next) { + if (ar->gizmo_map != NULL) { + gzmap = ar->gizmo_map; + gzgroup = WM_gizmomap_group_find(gzmap, tref_rt->gizmo_group); + if (gzgroup != NULL) { + break; + } + } + } + if (gzgroup != NULL) { + if (gzgroup->type->flag & WM_GIZMOGROUPTYPE_TOOL_FALLBACK_KEYMAP) { + /* If all are hidden, don't override. */ + if (gzgroup->use_fallback_keymap) { + wmGizmo *highlight = wm_gizmomap_highlight_get(gzmap); + if (highlight == NULL) { + if (tref_rt->keymap_fallback[0]) { + keymap_id = tref_rt->keymap_fallback; + } + } + } + } + } + } + } + wmKeyMap *km = WM_keymap_list_find_spaceid_or_empty( - &wm->userconf->keymaps, tref_rt->keymap, sa->spacetype, RGN_TYPE_WINDOW); + &wm->userconf->keymaps, keymap_id, sa->spacetype, RGN_TYPE_WINDOW); /* We shouldn't use keymaps from unrelated spaces. */ if (km != NULL) { handler->keymap_tool = sa->runtime.tool; diff --git a/source/blender/windowmanager/intern/wm_toolsystem.c b/source/blender/windowmanager/intern/wm_toolsystem.c index f64acf20581..d714fdaa19e 100644 --- a/source/blender/windowmanager/intern/wm_toolsystem.c +++ b/source/blender/windowmanager/intern/wm_toolsystem.c @@ -351,6 +351,25 @@ void WM_toolsystem_ref_set_from_runtime(struct bContext *C, *tref->runtime = *tref_rt; } + /* FIXME: ideally Python could check this gizmo group flag and not + * pass in the argument to begin with. */ + bool use_fallback_keymap = false; + + if (U.experimental.use_tool_fallback) { + if (tref_rt->gizmo_group[0]) { + wmGizmoGroupType *gzgt = WM_gizmogrouptype_find(tref_rt->gizmo_group, false); + if (gzgt) { + if (gzgt->flag & WM_GIZMOGROUPTYPE_TOOL_FALLBACK_KEYMAP) { + use_fallback_keymap = true; + } + } + } + } + if (use_fallback_keymap == false) { + tref->runtime->idname_fallback[0] = '\0'; + tref->runtime->keymap_fallback[0] = '\0'; + } + toolsystem_ref_link(C, workspace, tref); toolsystem_refresh_screen_from_active_tool(bmain, workspace, tref); |