diff options
-rw-r--r-- | source/blender/editors/interface/interface_panel.c | 8 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_ui.c | 3 |
2 files changed, 10 insertions, 1 deletions
diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c index 5f56a93c5eb..2b8e7cdb2e7 100644 --- a/source/blender/editors/interface/interface_panel.c +++ b/source/blender/editors/interface/interface_panel.c @@ -354,13 +354,19 @@ static void panel_delete(ARegion *region, ListBase *panels, Panel *panel) MEM_freeN(panel); } +/** + * Remove instanced panels from the region's panel list. + * + * \note Can be called with NULL \a C, but it should be avoided because + * handlers might not be removed. + */ void UI_panels_free_instanced(bContext *C, ARegion *region) { /* Delete panels with the instanced flag. */ LISTBASE_FOREACH_MUTABLE (Panel *, panel, ®ion->panels) { if ((panel->type != NULL) && (panel->type->flag & PNL_INSTANCED)) { /* Make sure the panel's handler is removed before deleting it. */ - if (panel->activedata != NULL) { + if (C != NULL && panel->activedata != NULL) { panel_activate_state(C, panel, PANEL_STATE_EXIT); } panel_delete(region, ®ion->panels, panel); diff --git a/source/blender/makesrna/intern/rna_ui.c b/source/blender/makesrna/intern/rna_ui.c index 9c9d10afa63..5228f00d0de 100644 --- a/source/blender/makesrna/intern/rna_ui.c +++ b/source/blender/makesrna/intern/rna_ui.c @@ -227,6 +227,9 @@ static void rna_Panel_unregister(Main *bmain, StructRNA *type) } } } + /* The unregistered panel might have had a template that added instanced panels, + * so remove them just in case. They can be re-added on redraw anyway. */ + UI_panels_free_instanced(NULL, region); } } } |