From fc10a5cf9e008343ecb925fdb87a4faa18918359 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 1 Jul 2019 13:51:13 +1000 Subject: Fix T66229: gizmos overlap when switching modes --- .../windowmanager/gizmo/intern/wm_gizmo_group.c | 9 ++++ .../windowmanager/gizmo/intern/wm_gizmo_map.c | 52 +++++++++++----------- 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c index 40d99ce8ba6..50c98630a16 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c @@ -927,6 +927,15 @@ wmGizmoGroup *WM_gizmomaptype_group_init_runtime_with_region(wmGizmoMapType *gzm wmGizmoGroup *gzgroup = wm_gizmogroup_new_from_type(gzmap, gzgt); + /* Don't allow duplicates when switching modes for e.g. see: T66229. */ + LISTBASE_FOREACH (wmGizmoGroup *, gzgroup_iter, &gzmap->groups) { + if (gzgroup_iter->type == gzgt) { + if (gzgroup_iter != gzgroup) { + WM_gizmo_group_tag_remove(gzgroup_iter); + } + } + } + wm_gizmomap_highlight_set(gzmap, NULL, NULL, 0); ED_region_tag_redraw(ar); diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c index be123bee5df..6ec908bcf29 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c @@ -1283,32 +1283,6 @@ void WM_gizmoconfig_update(struct Main *bmain) return; } - if (wm_gzmap_type_update_flag & WM_GIZMOTYPE_GLOBAL_UPDATE_REMOVE) { - for (bScreen *screen = bmain->screens.first; screen; screen = screen->id.next) { - for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) { - for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) { - ListBase *regionbase = (sl == sa->spacedata.first) ? &sa->regionbase : &sl->regionbase; - for (ARegion *ar = regionbase->first; ar; ar = ar->next) { - wmGizmoMap *gzmap = ar->gizmo_map; - if (gzmap != NULL && gzmap->tag_remove_group) { - gzmap->tag_remove_group = false; - - for (wmGizmoGroup *gzgroup = gzmap->groups.first, *gzgroup_next; gzgroup; - gzgroup = gzgroup_next) { - gzgroup_next = gzgroup->next; - if (gzgroup->tag_remove) { - wm_gizmogroup_free(NULL, gzgroup); - ED_region_tag_redraw(ar); - } - } - } - } - } - } - } - wm_gzmap_type_update_flag &= ~WM_GIZMOTYPE_GLOBAL_UPDATE_REMOVE; - } - if (wm_gzmap_type_update_flag & WM_GIZMOMAPTYPE_GLOBAL_UPDATE_REMOVE) { for (wmGizmoMapType *gzmap_type = gizmomaptypes.first; gzmap_type; gzmap_type = gzmap_type->next) { @@ -1352,6 +1326,32 @@ void WM_gizmoconfig_update(struct Main *bmain) wm_gzmap_type_update_flag &= ~WM_GIZMOMAPTYPE_GLOBAL_UPDATE_INIT; } + + if (wm_gzmap_type_update_flag & WM_GIZMOTYPE_GLOBAL_UPDATE_REMOVE) { + for (bScreen *screen = bmain->screens.first; screen; screen = screen->id.next) { + for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) { + for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) { + ListBase *regionbase = (sl == sa->spacedata.first) ? &sa->regionbase : &sl->regionbase; + for (ARegion *ar = regionbase->first; ar; ar = ar->next) { + wmGizmoMap *gzmap = ar->gizmo_map; + if (gzmap != NULL && gzmap->tag_remove_group) { + gzmap->tag_remove_group = false; + + for (wmGizmoGroup *gzgroup = gzmap->groups.first, *gzgroup_next; gzgroup; + gzgroup = gzgroup_next) { + gzgroup_next = gzgroup->next; + if (gzgroup->tag_remove) { + wm_gizmogroup_free(NULL, gzgroup); + ED_region_tag_redraw(ar); + } + } + } + } + } + } + } + wm_gzmap_type_update_flag &= ~WM_GIZMOTYPE_GLOBAL_UPDATE_REMOVE; + } } /** \} */ -- cgit v1.2.3