diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-06-28 03:04:52 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-06-28 04:27:11 +0300 |
commit | 83d92f55b81f3d2b6b20c2c39a140df30caef5e4 (patch) | |
tree | dcd6acc52c27f28c97dada6a9119b30435ba42c8 /source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c | |
parent | 651e574153ac7295c0061f1518000cc3b1b8b4ca (diff) |
Fix error for tools that share gizmo types doubling up gizmos
Introduced in recent commit c93af8529dfec
Diffstat (limited to 'source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c')
-rw-r--r-- | source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c index 2ec0e4e7ec3..f996d938dd7 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c @@ -80,6 +80,11 @@ wmGizmoGroup *wm_gizmogroup_new_from_type(wmGizmoMap *gzmap, wmGizmoGroupType *g return gzgroup; } +wmGizmoGroup *wm_gizmogroup_find_by_type(const wmGizmoMap *gzmap, const wmGizmoGroupType *gzgt) +{ + return BLI_findptr(&gzmap->groups, gzgt, offsetof(wmGizmoGroup, type)); +} + void wm_gizmogroup_free(bContext *C, wmGizmoGroup *gzgroup) { wmGizmoMap *gzmap = gzgroup->parent_gzmap; @@ -285,6 +290,34 @@ bool WM_gizmo_group_type_poll(const bContext *C, const struct wmGizmoGroupType * return (!gzgt->poll || gzgt->poll(C, (wmGizmoGroupType *)gzgt)); } +void WM_gizmo_group_remove_by_tool(bContext *C, + Main *bmain, + const wmGizmoGroupType *gzgt, + const bToolRef *tref) +{ + wmGizmoMapType *gzmap_type = WM_gizmomaptype_find(&gzgt->gzmap_params); + for (bScreen *sc = bmain->screens.first; sc; sc = sc->id.next) { + for (ScrArea *sa = sc->areabase.first; sa; sa = sa->next) { + if (sa->runtime.tool == tref) { + for (ARegion *ar = sa->regionbase.first; ar; ar = ar->next) { + wmGizmoMap *gzmap = ar->gizmo_map; + if (gzmap && gzmap->type == gzmap_type) { + wmGizmoGroup *gzgroup, *gzgroup_next; + for (gzgroup = gzmap->groups.first; gzgroup; gzgroup = gzgroup_next) { + gzgroup_next = gzgroup->next; + if (gzgroup->type == gzgt) { + BLI_assert(gzgroup->parent_gzmap == gzmap); + wm_gizmogroup_free(C, gzgroup); + ED_region_tag_redraw(ar); + } + } + } + } + } + } + } +} + bool wm_gizmogroup_is_visible_in_drawstep(const wmGizmoGroup *gzgroup, const eWM_GizmoFlagMapDrawStep drawstep) { |