From fb27a9bb983ce74b8d8f5f871cf0706dd1e25051 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 15 Sep 2021 17:44:35 +1000 Subject: Gizmo: show groups flagged with SHOW_MODAL_ALL during interaction Follow up to fix for T73684, which allowed some modal gizmos to hide all others. Also resolve an issue from 917a972b56af103aee406dfffe1f42745b5ad360 where shear the shear gizmo would be visible during interaction. Internally there are some changes to gizmo behavior - The gizmo with modal interaction wont draw if it's poll function fails. - The WM_GIZMOGROUPTYPE_DRAW_MODAL_ALL flag now causes these gizmo groups to draw when another group is being interacted with. --- source/blender/windowmanager/gizmo/WM_gizmo_types.h | 5 ++++- .../windowmanager/gizmo/intern/wm_gizmo_map.c | 21 +++++++-------------- 2 files changed, 11 insertions(+), 15 deletions(-) (limited to 'source/blender/windowmanager/gizmo') diff --git a/source/blender/windowmanager/gizmo/WM_gizmo_types.h b/source/blender/windowmanager/gizmo/WM_gizmo_types.h index eab62ffce4c..b0dd7be4572 100644 --- a/source/blender/windowmanager/gizmo/WM_gizmo_types.h +++ b/source/blender/windowmanager/gizmo/WM_gizmo_types.h @@ -115,7 +115,10 @@ typedef enum eWM_GizmoFlagGroupTypeFlag { WM_GIZMOGROUPTYPE_SELECT = (1 << 3), /** The gizmo group is to be kept (not removed on loading a new file for eg). */ WM_GIZMOGROUPTYPE_PERSISTENT = (1 << 4), - /** Show all other gizmos when interacting. */ + /** + * Show all other gizmos when interacting. + * Also show this group when another group is being interacted with. + */ WM_GIZMOGROUPTYPE_DRAW_MODAL_ALL = (1 << 5), /** * When used with tool, only run when activating the tool, diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c index 6f6a2402d89..1144cd072e0 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c @@ -381,20 +381,6 @@ static void gizmomap_prepare_drawing(wmGizmoMap *gzmap, wmGizmo *gz_modal = gzmap->gzmap_context.modal; - /* only active gizmo needs updating */ - if (gz_modal) { - if ((gz_modal->parent_gzgroup->type->flag & WM_GIZMOGROUPTYPE_DRAW_MODAL_ALL) == 0) { - if ((gz_modal->parent_gzgroup->hide.any == 0) && - wm_gizmogroup_is_visible_in_drawstep(gz_modal->parent_gzgroup, drawstep)) { - if (gizmo_prepare_drawing(gzmap, gz_modal, C, draw_gizmos, drawstep)) { - gzmap->update_flag[drawstep] &= ~GIZMOMAP_IS_PREPARE_DRAW; - } - } - /* don't draw any other gizmos */ - return; - } - } - /* Allow refresh functions to ask to be refreshed again, clear before the loop below. */ const bool do_refresh = gzmap->update_flag[drawstep] & GIZMOMAP_IS_REFRESH_CALLBACK; gzmap->update_flag[drawstep] &= ~GIZMOMAP_IS_REFRESH_CALLBACK; @@ -406,6 +392,13 @@ static void gizmomap_prepare_drawing(wmGizmoMap *gzmap, continue; } + /* When modal only show other gizmo groups tagged with #WM_GIZMOGROUPTYPE_DRAW_MODAL_ALL. */ + if (gz_modal && (gzgroup != gz_modal->parent_gzgroup)) { + if ((gzgroup->type->flag & WM_GIZMOGROUPTYPE_DRAW_MODAL_ALL) == 0) { + continue; + } + } + /* Needs to be initialized on first draw. */ /* XXX weak: Gizmo-group may skip refreshing if it's invisible * (map gets untagged nevertheless). */ -- cgit v1.2.3