diff options
Diffstat (limited to 'source/blender/makesrna/intern/rna_ui.c')
-rw-r--r-- | source/blender/makesrna/intern/rna_ui.c | 175 |
1 files changed, 98 insertions, 77 deletions
diff --git a/source/blender/makesrna/intern/rna_ui.c b/source/blender/makesrna/intern/rna_ui.c index 273bef6d239..1449c410d18 100644 --- a/source/blender/makesrna/intern/rna_ui.c +++ b/source/blender/makesrna/intern/rna_ui.c @@ -27,6 +27,8 @@ #include "BKE_idprop.h" +#include "BLI_listbase.h" + #include "RNA_define.h" #include "RNA_enum_types.h" @@ -111,12 +113,12 @@ static bool panel_poll(const bContext *C, PanelType *pt) void *ret; bool visible; - RNA_pointer_create(NULL, pt->ext.srna, NULL, &ptr); /* dummy */ - func = &rna_Panel_poll_func; /* RNA_struct_find_function(&ptr, "poll"); */ + RNA_pointer_create(NULL, pt->rna_ext.srna, NULL, &ptr); /* dummy */ + func = &rna_Panel_poll_func; /* RNA_struct_find_function(&ptr, "poll"); */ RNA_parameter_list_create(&list, &ptr, func); RNA_parameter_set_lookup(&list, "context", &C); - pt->ext.call((bContext *)C, &ptr, func, &list); + pt->rna_ext.call((bContext *)C, &ptr, func, &list); RNA_parameter_get_lookup(&list, "visible", &ret); visible = *(bool *)ret; @@ -126,7 +128,7 @@ static bool panel_poll(const bContext *C, PanelType *pt) return visible; } -static void panel_draw(const bContext *C, Panel *pnl) +static void panel_draw(const bContext *C, Panel *panel) { extern FunctionRNA rna_Panel_draw_func; @@ -134,17 +136,17 @@ static void panel_draw(const bContext *C, Panel *pnl) ParameterList list; FunctionRNA *func; - RNA_pointer_create(&CTX_wm_screen(C)->id, pnl->type->ext.srna, pnl, &ptr); + RNA_pointer_create(&CTX_wm_screen(C)->id, panel->type->rna_ext.srna, panel, &ptr); func = &rna_Panel_draw_func; /* RNA_struct_find_function(&ptr, "draw"); */ RNA_parameter_list_create(&list, &ptr, func); RNA_parameter_set_lookup(&list, "context", &C); - pnl->type->ext.call((bContext *)C, &ptr, func, &list); + panel->type->rna_ext.call((bContext *)C, &ptr, func, &list); RNA_parameter_list_free(&list); } -static void panel_draw_header(const bContext *C, Panel *pnl) +static void panel_draw_header(const bContext *C, Panel *panel) { extern FunctionRNA rna_Panel_draw_header_func; @@ -152,17 +154,17 @@ static void panel_draw_header(const bContext *C, Panel *pnl) ParameterList list; FunctionRNA *func; - RNA_pointer_create(&CTX_wm_screen(C)->id, pnl->type->ext.srna, pnl, &ptr); + RNA_pointer_create(&CTX_wm_screen(C)->id, panel->type->rna_ext.srna, panel, &ptr); func = &rna_Panel_draw_header_func; /* RNA_struct_find_function(&ptr, "draw_header"); */ RNA_parameter_list_create(&list, &ptr, func); RNA_parameter_set_lookup(&list, "context", &C); - pnl->type->ext.call((bContext *)C, &ptr, func, &list); + panel->type->rna_ext.call((bContext *)C, &ptr, func, &list); RNA_parameter_list_free(&list); } -static void panel_draw_header_preset(const bContext *C, Panel *pnl) +static void panel_draw_header_preset(const bContext *C, Panel *panel) { extern FunctionRNA rna_Panel_draw_header_preset_func; @@ -170,12 +172,12 @@ static void panel_draw_header_preset(const bContext *C, Panel *pnl) ParameterList list; FunctionRNA *func; - RNA_pointer_create(&CTX_wm_screen(C)->id, pnl->type->ext.srna, pnl, &ptr); + RNA_pointer_create(&CTX_wm_screen(C)->id, panel->type->rna_ext.srna, panel, &ptr); func = &rna_Panel_draw_header_preset_func; RNA_parameter_list_create(&list, &ptr, func); RNA_parameter_set_lookup(&list, "context", &C); - pnl->type->ext.call((bContext *)C, &ptr, func, &list); + panel->type->rna_ext.call((bContext *)C, &ptr, func, &list); RNA_parameter_list_free(&list); } @@ -192,7 +194,7 @@ static void rna_Panel_unregister(Main *bmain, StructRNA *type) return; } - RNA_struct_free_extension(type, &pt->ext); + RNA_struct_free_extension(type, &pt->rna_ext); RNA_struct_free(&BLENDER_RNA, type); if (pt->parent) { @@ -202,7 +204,7 @@ static void rna_Panel_unregister(Main *bmain, StructRNA *type) WM_paneltype_remove(pt); - for (LinkData *link = pt->children.first; link; link = link->next) { + LISTBASE_FOREACH (LinkData *, link, &pt->children) { PanelType *child_pt = link->data; child_pt->parent = NULL; } @@ -212,15 +214,16 @@ static void rna_Panel_unregister(Main *bmain, StructRNA *type) BLI_freelinkN(&art->paneltypes, pt); 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_FOREACH (ScrArea *, area, &screen->areabase) { + LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) { if (sl->spacetype == space_type) { - ListBase *regionbase = (sl == sa->spacedata.first) ? &sa->regionbase : &sl->regionbase; - for (ARegion *region = regionbase->first; region; region = region->next) { + ListBase *regionbase = (sl == area->spacedata.first) ? &area->regionbase : + &sl->regionbase; + LISTBASE_FOREACH (ARegion *, region, regionbase) { if (region->type == art) { - for (Panel *pa = region->panels.first; pa; pa = pa->next) { - if (pa->type == pt) { - pa->type = NULL; + LISTBASE_FOREACH (Panel *, panel, ®ion->panels) { + if (panel->type == pt) { + panel->type = NULL; } } } @@ -300,8 +303,8 @@ static StructRNA *rna_Panel_register(Main *bmain, for (pt = art->paneltypes.first; pt; pt = pt->next) { if (STREQ(pt->idname, dummypt.idname)) { PanelType *pt_next = pt->next; - if (pt->ext.srna) { - rna_Panel_unregister(bmain, pt->ext.srna); + if (pt->rna_ext.srna) { + rna_Panel_unregister(bmain, pt->rna_ext.srna); } else { BLI_freelinkN(&art->paneltypes, pt); @@ -344,13 +347,13 @@ static StructRNA *rna_Panel_register(Main *bmain, pt = MEM_mallocN(sizeof(PanelType), "python buttons panel"); memcpy(pt, &dummypt, sizeof(dummypt)); - pt->ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, pt->idname, &RNA_Panel); - RNA_def_struct_translation_context(pt->ext.srna, pt->translation_context); - pt->ext.data = data; - pt->ext.call = call; - pt->ext.free = free; - RNA_struct_blender_type_set(pt->ext.srna, pt); - RNA_def_struct_flag(pt->ext.srna, STRUCT_NO_IDPROPERTIES); + pt->rna_ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, pt->idname, &RNA_Panel); + RNA_def_struct_translation_context(pt->rna_ext.srna, pt->translation_context); + pt->rna_ext.data = data; + pt->rna_ext.call = call; + pt->rna_ext.free = free; + RNA_struct_blender_type_set(pt->rna_ext.srna, pt); + RNA_def_struct_flag(pt->rna_ext.srna, STRUCT_NO_IDPROPERTIES); pt->poll = (have_function[0]) ? panel_poll : NULL; pt->draw = (have_function[1]) ? panel_draw : NULL; @@ -390,13 +393,13 @@ static StructRNA *rna_Panel_register(Main *bmain, /* update while blender is running */ WM_main_add_notifier(NC_WINDOW, NULL); - return pt->ext.srna; + return pt->rna_ext.srna; } static StructRNA *rna_Panel_refine(PointerRNA *ptr) { Panel *menu = (Panel *)ptr->data; - return (menu->type && menu->type->ext.srna) ? menu->type->ext.srna : &RNA_Panel; + return (menu->type && menu->type->rna_ext.srna) ? menu->type->rna_ext.srna : &RNA_Panel; } /* UIList */ @@ -433,7 +436,7 @@ static void uilist_draw_item(uiList *ui_list, ParameterList list; FunctionRNA *func; - RNA_pointer_create(&CTX_wm_screen(C)->id, ui_list->type->ext.srna, ui_list, &ul_ptr); + RNA_pointer_create(&CTX_wm_screen(C)->id, ui_list->type->rna_ext.srna, ui_list, &ul_ptr); func = &rna_UIList_draw_item_func; /* RNA_struct_find_function(&ul_ptr, "draw_item"); */ RNA_parameter_list_create(&list, &ul_ptr, func); @@ -446,7 +449,7 @@ static void uilist_draw_item(uiList *ui_list, RNA_parameter_set_lookup(&list, "active_property", &active_propname); RNA_parameter_set_lookup(&list, "index", &index); RNA_parameter_set_lookup(&list, "flt_flag", &flt_flag); - ui_list->type->ext.call((bContext *)C, &ul_ptr, func, &list); + ui_list->type->rna_ext.call((bContext *)C, &ul_ptr, func, &list); RNA_parameter_list_free(&list); } @@ -459,13 +462,13 @@ static void uilist_draw_filter(uiList *ui_list, bContext *C, uiLayout *layout) ParameterList list; FunctionRNA *func; - RNA_pointer_create(&CTX_wm_screen(C)->id, ui_list->type->ext.srna, ui_list, &ul_ptr); + RNA_pointer_create(&CTX_wm_screen(C)->id, ui_list->type->rna_ext.srna, ui_list, &ul_ptr); func = &rna_UIList_draw_filter_func; /* RNA_struct_find_function(&ul_ptr, "draw_filter"); */ RNA_parameter_list_create(&list, &ul_ptr, func); RNA_parameter_set_lookup(&list, "context", &C); RNA_parameter_set_lookup(&list, "layout", &layout); - ui_list->type->ext.call((bContext *)C, &ul_ptr, func, &list); + ui_list->type->rna_ext.call((bContext *)C, &ul_ptr, func, &list); RNA_parameter_list_free(&list); } @@ -488,7 +491,7 @@ static void uilist_filter_items(uiList *ui_list, int ret_len; int len = flt_data->items_len = RNA_collection_length(dataptr, propname); - RNA_pointer_create(&CTX_wm_screen(C)->id, ui_list->type->ext.srna, ui_list, &ul_ptr); + RNA_pointer_create(&CTX_wm_screen(C)->id, ui_list->type->rna_ext.srna, ui_list, &ul_ptr); func = &rna_UIList_filter_items_func; /* RNA_struct_find_function(&ul_ptr, "filter_items"); */ RNA_parameter_list_create(&list, &ul_ptr, func); @@ -496,7 +499,7 @@ static void uilist_filter_items(uiList *ui_list, RNA_parameter_set_lookup(&list, "data", dataptr); RNA_parameter_set_lookup(&list, "property", &propname); - ui_list->type->ext.call((bContext *)C, &ul_ptr, func, &list); + ui_list->type->rna_ext.call((bContext *)C, &ul_ptr, func, &list); parm = RNA_function_find_parameter(NULL, func, "filter_flags"); ret_len = RNA_parameter_dynamic_length_get(&list, parm); @@ -599,7 +602,7 @@ static void rna_UIList_unregister(Main *UNUSED(bmain), StructRNA *type) return; } - RNA_struct_free_extension(type, &ult->ext); + RNA_struct_free_extension(type, &ult->rna_ext); RNA_struct_free(&BLENDER_RNA, type); WM_uilisttype_freelink(ult); @@ -642,8 +645,8 @@ static StructRNA *rna_UIList_register(Main *bmain, /* check if we have registered this uilist type before, and remove it */ ult = WM_uilisttype_find(dummyult.idname, true); - if (ult && ult->ext.srna) { - rna_UIList_unregister(bmain, ult->ext.srna); + if (ult && ult->rna_ext.srna) { + rna_UIList_unregister(bmain, ult->rna_ext.srna); } if (!RNA_struct_available_or_report(reports, dummyult.idname)) { return NULL; @@ -656,11 +659,11 @@ static StructRNA *rna_UIList_register(Main *bmain, ult = MEM_callocN(sizeof(uiListType) + over_alloc, "python uilist"); memcpy(ult, &dummyult, sizeof(dummyult)); - ult->ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, ult->idname, &RNA_UIList); - ult->ext.data = data; - ult->ext.call = call; - ult->ext.free = free; - RNA_struct_blender_type_set(ult->ext.srna, ult); + ult->rna_ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, ult->idname, &RNA_UIList); + ult->rna_ext.data = data; + ult->rna_ext.call = call; + ult->rna_ext.free = free; + RNA_struct_blender_type_set(ult->rna_ext.srna, ult); ult->draw_item = (have_function[0]) ? uilist_draw_item : NULL; ult->draw_filter = (have_function[1]) ? uilist_draw_filter : NULL; @@ -671,13 +674,14 @@ static StructRNA *rna_UIList_register(Main *bmain, /* update while blender is running */ WM_main_add_notifier(NC_WINDOW, NULL); - return ult->ext.srna; + return ult->rna_ext.srna; } static StructRNA *rna_UIList_refine(PointerRNA *ptr) { uiList *ui_list = (uiList *)ptr->data; - return (ui_list->type && ui_list->type->ext.srna) ? ui_list->type->ext.srna : &RNA_UIList; + return (ui_list->type && ui_list->type->rna_ext.srna) ? ui_list->type->rna_ext.srna : + &RNA_UIList; } /* Header */ @@ -690,12 +694,12 @@ static void header_draw(const bContext *C, Header *hdr) ParameterList list; FunctionRNA *func; - RNA_pointer_create(&CTX_wm_screen(C)->id, hdr->type->ext.srna, hdr, &htr); + RNA_pointer_create(&CTX_wm_screen(C)->id, hdr->type->rna_ext.srna, hdr, &htr); func = &rna_Header_draw_func; /* RNA_struct_find_function(&htr, "draw"); */ RNA_parameter_list_create(&list, &htr, func); RNA_parameter_set_lookup(&list, "context", &C); - hdr->type->ext.call((bContext *)C, &htr, func, &list); + hdr->type->rna_ext.call((bContext *)C, &htr, func, &list); RNA_parameter_list_free(&list); } @@ -712,7 +716,7 @@ static void rna_Header_unregister(Main *UNUSED(bmain), StructRNA *type) return; } - RNA_struct_free_extension(type, &ht->ext); + RNA_struct_free_extension(type, &ht->rna_ext); RNA_struct_free(&BLENDER_RNA, type); BLI_freelinkN(&art->headertypes, ht); @@ -761,8 +765,8 @@ static StructRNA *rna_Header_register(Main *bmain, /* check if we have registered this header type before, and remove it */ for (ht = art->headertypes.first; ht; ht = ht->next) { if (STREQ(ht->idname, dummyht.idname)) { - if (ht->ext.srna) { - rna_Header_unregister(bmain, ht->ext.srna); + if (ht->rna_ext.srna) { + rna_Header_unregister(bmain, ht->rna_ext.srna); } break; } @@ -778,11 +782,11 @@ static StructRNA *rna_Header_register(Main *bmain, ht = MEM_mallocN(sizeof(HeaderType), "python buttons header"); memcpy(ht, &dummyht, sizeof(dummyht)); - ht->ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, ht->idname, &RNA_Header); - ht->ext.data = data; - ht->ext.call = call; - ht->ext.free = free; - RNA_struct_blender_type_set(ht->ext.srna, ht); + ht->rna_ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, ht->idname, &RNA_Header); + ht->rna_ext.data = data; + ht->rna_ext.call = call; + ht->rna_ext.free = free; + RNA_struct_blender_type_set(ht->rna_ext.srna, ht); ht->draw = (have_function[0]) ? header_draw : NULL; @@ -791,13 +795,13 @@ static StructRNA *rna_Header_register(Main *bmain, /* update while blender is running */ WM_main_add_notifier(NC_WINDOW, NULL); - return ht->ext.srna; + return ht->rna_ext.srna; } static StructRNA *rna_Header_refine(PointerRNA *htr) { Header *hdr = (Header *)htr->data; - return (hdr->type && hdr->type->ext.srna) ? hdr->type->ext.srna : &RNA_Header; + return (hdr->type && hdr->type->rna_ext.srna) ? hdr->type->rna_ext.srna : &RNA_Header; } /* Menu */ @@ -812,12 +816,12 @@ static bool menu_poll(const bContext *C, MenuType *pt) void *ret; bool visible; - RNA_pointer_create(NULL, pt->ext.srna, NULL, &ptr); /* dummy */ - func = &rna_Menu_poll_func; /* RNA_struct_find_function(&ptr, "poll"); */ + RNA_pointer_create(NULL, pt->rna_ext.srna, NULL, &ptr); /* dummy */ + func = &rna_Menu_poll_func; /* RNA_struct_find_function(&ptr, "poll"); */ RNA_parameter_list_create(&list, &ptr, func); RNA_parameter_set_lookup(&list, "context", &C); - pt->ext.call((bContext *)C, &ptr, func, &list); + pt->rna_ext.call((bContext *)C, &ptr, func, &list); RNA_parameter_get_lookup(&list, "visible", &ret); visible = *(bool *)ret; @@ -835,12 +839,12 @@ static void menu_draw(const bContext *C, Menu *menu) ParameterList list; FunctionRNA *func; - RNA_pointer_create(&CTX_wm_screen(C)->id, menu->type->ext.srna, menu, &mtr); + RNA_pointer_create(&CTX_wm_screen(C)->id, menu->type->rna_ext.srna, menu, &mtr); func = &rna_Menu_draw_func; /* RNA_struct_find_function(&mtr, "draw"); */ RNA_parameter_list_create(&list, &mtr, func); RNA_parameter_set_lookup(&list, "context", &C); - menu->type->ext.call((bContext *)C, &mtr, func, &list); + menu->type->rna_ext.call((bContext *)C, &mtr, func, &list); RNA_parameter_list_free(&list); } @@ -853,7 +857,7 @@ static void rna_Menu_unregister(Main *UNUSED(bmain), StructRNA *type) return; } - RNA_struct_free_extension(type, &mt->ext); + RNA_struct_free_extension(type, &mt->rna_ext); RNA_struct_free(&BLENDER_RNA, type); WM_menutype_freelink(mt); @@ -903,8 +907,8 @@ static StructRNA *rna_Menu_register(Main *bmain, /* check if we have registered this menu type before, and remove it */ mt = WM_menutype_find(dummymt.idname, true); - if (mt && mt->ext.srna) { - rna_Menu_unregister(bmain, mt->ext.srna); + if (mt && mt->rna_ext.srna) { + rna_Menu_unregister(bmain, mt->rna_ext.srna); } if (!RNA_struct_available_or_report(reports, dummymt.idname)) { return NULL; @@ -931,13 +935,13 @@ static StructRNA *rna_Menu_register(Main *bmain, mt->description = NULL; } - mt->ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, mt->idname, &RNA_Menu); - RNA_def_struct_translation_context(mt->ext.srna, mt->translation_context); - mt->ext.data = data; - mt->ext.call = call; - mt->ext.free = free; - RNA_struct_blender_type_set(mt->ext.srna, mt); - RNA_def_struct_flag(mt->ext.srna, STRUCT_NO_IDPROPERTIES); + mt->rna_ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, mt->idname, &RNA_Menu); + RNA_def_struct_translation_context(mt->rna_ext.srna, mt->translation_context); + mt->rna_ext.data = data; + mt->rna_ext.call = call; + mt->rna_ext.free = free; + RNA_struct_blender_type_set(mt->rna_ext.srna, mt); + RNA_def_struct_flag(mt->rna_ext.srna, STRUCT_NO_IDPROPERTIES); mt->poll = (have_function[0]) ? menu_poll : NULL; mt->draw = (have_function[1]) ? menu_draw : NULL; @@ -954,13 +958,13 @@ static StructRNA *rna_Menu_register(Main *bmain, /* update while blender is running */ WM_main_add_notifier(NC_WINDOW, NULL); - return mt->ext.srna; + return mt->rna_ext.srna; } static StructRNA *rna_Menu_refine(PointerRNA *mtr) { Menu *menu = (Menu *)mtr->data; - return (menu->type && menu->type->ext.srna) ? menu->type->ext.srna : &RNA_Menu; + return (menu->type && menu->type->rna_ext.srna) ? menu->type->rna_ext.srna : &RNA_Menu; } static void rna_Menu_bl_description_set(PointerRNA *ptr, const char *value) @@ -1281,6 +1285,18 @@ static void rna_def_panel(BlenderRNA *brna) "Hide Header", "If set to False, the panel shows a header, which contains a clickable " "arrow to collapse the panel and the label (see bl_label)"}, + {PNL_INSTANCED, + "INSTANCED", + 0, + "Instanced Panel", + "Multiple panels with this type can be used as part of a list depending on data external " + "to the UI. Used to create panels for the modifiers and other stacks."}, + {PNL_LAYOUT_HEADER_EXPAND, + "HEADER_LAYOUT_EXPAND", + 0, + "Expand Header Layout", + "Allow buttons in the header to stretch and shrink to fill the entire layout width"}, + {PNL_DRAW_BOX, "DRAW_BOX", 0, "Box Style", "Draw panel with the box widget theme"}, {0, NULL, 0, NULL, NULL}, }; @@ -1328,6 +1344,11 @@ static void rna_def_panel(BlenderRNA *brna) RNA_def_property_string_sdna(prop, NULL, "drawname"); RNA_def_property_ui_text(prop, "Text", "XXX todo"); + prop = RNA_def_int( + srna, "list_panel_index", 0, 0, INT_MAX, "Instanced Panel Data Index", "", 0, INT_MAX); + RNA_def_property_int_sdna(prop, NULL, "runtime.list_index"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + /* registration */ prop = RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "type->idname"); |