Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2019-12-06 19:45:50 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-12-06 22:03:00 +0300
commit6ffcddc10afa07b073ce01c25884e23fc2b661df (patch)
tree86e7ddb017474083890bf16fac4876175a923e57 /source/blender/windowmanager
parent7465078e637b729e8b36a4f4b73a50a347052df4 (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.h8
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c34
-rw-r--r--source/blender/windowmanager/intern/wm_toolsystem.c19
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);