diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-06-03 14:32:36 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-06-03 22:30:35 +0300 |
commit | d7c2b78822ff20fb78418c43d6badd692fa98784 (patch) | |
tree | c1f8b9a0580afc173dd0829615f74a94a3254589 /source/blender/makesrna/intern/rna_ui.c | |
parent | 9b01e7bc27c4a8c8c9f95aa074f458f3e734d23b (diff) |
UI: add subpanel support.
In the Python API, any panel becomes a subpanel by setting bl_parent_id
to the name of the parent panel. These subpanels can contain advanced or
less commonly used settings.
Diffstat (limited to 'source/blender/makesrna/intern/rna_ui.c')
-rw-r--r-- | source/blender/makesrna/intern/rna_ui.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/source/blender/makesrna/intern/rna_ui.c b/source/blender/makesrna/intern/rna_ui.c index 173eaf56f0c..354fa43367e 100644 --- a/source/blender/makesrna/intern/rna_ui.c +++ b/source/blender/makesrna/intern/rna_ui.c @@ -179,6 +179,12 @@ static void rna_Panel_unregister(Main *UNUSED(bmain), StructRNA *type) RNA_struct_free_extension(type, &pt->ext); RNA_struct_free(&BLENDER_RNA, type); + if (pt->parent) { + LinkData *link = BLI_findptr(&pt->parent->children, pt, offsetof(LinkData, data)); + BLI_freelinkN(&pt->parent->children, link); + } + + BLI_freelistN(&pt->children); BLI_freelinkN(&art->paneltypes, pt); /* update while blender is running */ @@ -190,7 +196,7 @@ static StructRNA *rna_Panel_register( StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free) { ARegionType *art; - PanelType *pt, dummypt = {NULL}; + PanelType *pt, *parent = NULL, dummypt = {NULL}; Panel dummypanel = {NULL}; PointerRNA dummyptr; int have_function[3]; @@ -229,6 +235,10 @@ static StructRNA *rna_Panel_register( BLI_freelinkN(&art->paneltypes, pt); break; } + + if (dummypt.parent_id[0] && STREQ(pt->idname, dummypt.parent_id)) { + parent = pt; + } } if (!RNA_struct_available_or_report(reports, dummypt.idname)) { return NULL; @@ -236,6 +246,11 @@ static StructRNA *rna_Panel_register( if (!RNA_struct_bl_idname_ok_or_report(reports, dummypt.idname, "_PT_")) { return NULL; } + if (dummypt.parent_id[0] && !parent) { + BKE_reportf(reports, RPT_ERROR, "Registering panel class: parent '%s' for '%s' not found", + dummypt.parent_id, dummypt.idname); + return NULL; + } /* create a new panel type */ pt = MEM_callocN(sizeof(PanelType), "python buttons panel"); @@ -267,6 +282,11 @@ static StructRNA *rna_Panel_register( else BLI_addtail(&art->paneltypes, pt); + if (parent) { + pt->parent = parent; + BLI_addtail(&parent->children, BLI_genericNodeN(pt)); + } + { const char *owner_id = RNA_struct_state_owner_get(); if (owner_id) { @@ -1102,6 +1122,11 @@ static void rna_def_panel(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL | PROP_ENUM_FLAG); RNA_def_property_ui_text(prop, "Options", "Options for this panel type"); + prop = RNA_def_property(srna, "bl_parent_id", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "type->parent_id"); + RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL); + RNA_def_property_ui_text(prop, "Parent ID Name", "If this is set, the panel becomes a subpanel"); + prop = RNA_def_property(srna, "use_pin", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", PNL_PIN); RNA_def_property_ui_text(prop, "Pin", ""); |