Fix T66229: gizmos overlap when switching modes
This commit is contained in:
parent
1a5e1273c1
commit
fc10a5cf9e
Notes:
blender-bot
2023-02-14 02:22:13 +01:00
Referenced by issue #66229, overlapping gizmos when switching modes.
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
|
Loading…
Reference in New Issue