Revision: 21506 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21506 Author: blendix Date: 2009-07-10 21:56:13 +0200 (Fri, 10 Jul 2009)
Log Message: ----------- RNA * Enums can now be dynamically created in the _itemf callback, using RNA_enum_item(s)_add, RNA_enum_item_end. All places asking for enum items now need to potentially free the items. * This callback now also gets context, this was added specifically for operators. This doesn't fit design well at all, needed to do some ugly hacks, but can't find a good solution at the moment. * All enums must have a default list of items too, even with an _itemf callback, for docs and fallback in case there is no context. * Used by MESH_OT_merge, MESH_OT_select_similar, TFM_OT_select_orientation. * Also changes some operator properties that were enums to booleas (unselected, deselect), to make them consistent with other ops. Modified Paths: -------------- branches/blender2.5/blender/release/ui/space_sequencer.py branches/blender2.5/blender/source/blender/editors/include/ED_transform.h branches/blender2.5/blender/source/blender/editors/interface/interface.c branches/blender2.5/blender/source/blender/editors/interface/interface_intern.h branches/blender2.5/blender/source/blender/editors/interface/interface_layout.c branches/blender2.5/blender/source/blender/editors/mesh/editmesh.c branches/blender2.5/blender/source/blender/editors/mesh/editmesh_mods.c branches/blender2.5/blender/source/blender/editors/mesh/editmesh_tools.c branches/blender2.5/blender/source/blender/editors/mesh/mesh_ops.c branches/blender2.5/blender/source/blender/editors/object/object_edit.c branches/blender2.5/blender/source/blender/editors/space_sequencer/sequencer_edit.c branches/blender2.5/blender/source/blender/editors/space_sequencer/sequencer_ops.c branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_ops.c branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_select.c branches/blender2.5/blender/source/blender/editors/transform/transform_ops.c branches/blender2.5/blender/source/blender/editors/transform/transform_orientations.c branches/blender2.5/blender/source/blender/makesrna/RNA_access.h branches/blender2.5/blender/source/blender/makesrna/RNA_define.h branches/blender2.5/blender/source/blender/makesrna/RNA_types.h branches/blender2.5/blender/source/blender/makesrna/intern/makesrna.c branches/blender2.5/blender/source/blender/makesrna/intern/rna_access.c branches/blender2.5/blender/source/blender/makesrna/intern/rna_constraint.c branches/blender2.5/blender/source/blender/makesrna/intern/rna_define.c branches/blender2.5/blender/source/blender/makesrna/intern/rna_internal_types.h branches/blender2.5/blender/source/blender/makesrna/intern/rna_particle.c branches/blender2.5/blender/source/blender/makesrna/intern/rna_space.c branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c branches/blender2.5/blender/source/blender/python/intern/bpy_util.c Modified: branches/blender2.5/blender/release/ui/space_sequencer.py =================================================================== --- branches/blender2.5/blender/release/ui/space_sequencer.py 2009-07-10 19:55:16 UTC (rev 21505) +++ branches/blender2.5/blender/release/ui/space_sequencer.py 2009-07-10 19:56:13 UTC (rev 21506) @@ -242,7 +242,7 @@ layout.itemO("SEQUENCER_OT_mute") layout.itemO("SEQUENCER_OT_unmute") - layout.item_enumO("SEQUENCER_OT_mute", property="type", value='UNSELECTED', text="Mute Deselected Strips") + layout.item_booleanO("SEQUENCER_OT_mute", "unselected", 1, text="Mute Deselected Strips") layout.itemO("SEQUENCER_OT_snap") Modified: branches/blender2.5/blender/source/blender/editors/include/ED_transform.h =================================================================== --- branches/blender2.5/blender/source/blender/editors/include/ED_transform.h 2009-07-10 19:55:16 UTC (rev 21505) +++ branches/blender2.5/blender/source/blender/editors/include/ED_transform.h 2009-07-10 19:56:13 UTC (rev 21506) @@ -38,6 +38,7 @@ struct bContext; struct Object; struct uiLayout; +struct EnumPropertyItem; void transform_keymap_for_space(struct wmWindowManager *wm, struct ListBase *keymap, int spaceid); void transform_operatortypes(void); @@ -114,7 +115,7 @@ void BIF_selectTransformOrientation(struct bContext *C, struct TransformOrientation *ts); void BIF_selectTransformOrientationValue(struct bContext *C, int orientation); -void BIF_menuTransformOrientation(struct bContext *C, struct uiLayout *layout, void *arg); +struct EnumPropertyItem *BIF_enumTransformOrientation(struct bContext *C); char * BIF_menustringTransformOrientation(const struct bContext *C, char *title); /* the returned value was allocated and needs to be freed after use */ int BIF_countTransformOrientation(const struct bContext *C); Modified: branches/blender2.5/blender/source/blender/editors/interface/interface.c =================================================================== --- branches/blender2.5/blender/source/blender/editors/interface/interface.c 2009-07-10 19:55:16 UTC (rev 21505) +++ branches/blender2.5/blender/source/blender/editors/interface/interface.c 2009-07-10 19:56:13 UTC (rev 21506) @@ -1615,6 +1615,7 @@ block= MEM_callocN(sizeof(uiBlock), "uiBlock"); block->active= 1; block->dt= dt; + block->evil_C= C; // XXX BLI_strncpy(block->name, name, sizeof(block->name)); if(region) @@ -2113,11 +2114,11 @@ /* use rna values if parameters are not specified */ if(!str) { if(type == MENU && proptype == PROP_ENUM) { - const EnumPropertyItem *item; + EnumPropertyItem *item; DynStr *dynstr; - int i, totitem, value; + int i, totitem, value, free; - RNA_property_enum_items(ptr, prop, &item, &totitem); + RNA_property_enum_items(block->evil_C, ptr, prop, &item, &totitem, &free); value= RNA_property_enum_get(ptr, prop); dynstr= BLI_dynstr_new(); @@ -2136,13 +2137,16 @@ str= BLI_dynstr_get_cstring(dynstr); BLI_dynstr_free(dynstr); + if(free) + MEM_freeN(item); + freestr= 1; } else if(type == ROW && proptype == PROP_ENUM) { - const EnumPropertyItem *item; - int i, totitem; + EnumPropertyItem *item; + int i, totitem, free; - RNA_property_enum_items(ptr, prop, &item, &totitem); + RNA_property_enum_items(block->evil_C, ptr, prop, &item, &totitem, &free); for(i=0; i<totitem; i++) { if(item[i].identifier[0] && item[i].value == (int)max) { str= (char*)item[i].name; @@ -2152,6 +2156,8 @@ if(!str) str= (char*)RNA_property_ui_name(prop); + if(free) + MEM_freeN(item); } else { str= (char*)RNA_property_ui_name(prop); @@ -2161,10 +2167,10 @@ if(!tip) { if(type == ROW && proptype == PROP_ENUM) { - const EnumPropertyItem *item; - int i, totitem; + EnumPropertyItem *item; + int i, totitem, free; - RNA_property_enum_items(ptr, prop, &item, &totitem); + RNA_property_enum_items(block->evil_C, ptr, prop, &item, &totitem, &free); for(i=0; i<totitem; i++) { if(item[i].identifier[0] && item[i].value == (int)max) { @@ -2173,6 +2179,9 @@ break; } } + + if(free) + MEM_freeN(item); } } Modified: branches/blender2.5/blender/source/blender/editors/interface/interface_intern.h =================================================================== --- branches/blender2.5/blender/source/blender/editors/interface/interface_intern.h 2009-07-10 19:55:16 UTC (rev 21505) +++ branches/blender2.5/blender/source/blender/editors/interface/interface_intern.h 2009-07-10 19:56:13 UTC (rev 21506) @@ -290,6 +290,8 @@ int tooltipdisabled; // to avoid tooltip after click int active; // to keep blocks while drawing and free them afterwards + + void *evil_C; // XXX hack for dynamic operator enums }; typedef struct uiSafetyRct { Modified: branches/blender2.5/blender/source/blender/editors/interface/interface_layout.c =================================================================== --- branches/blender2.5/blender/source/blender/editors/interface/interface_layout.c 2009-07-10 19:55:16 UTC (rev 21505) +++ branches/blender2.5/blender/source/blender/editors/interface/interface_layout.c 2009-07-10 19:56:13 UTC (rev 21506) @@ -429,13 +429,13 @@ static void ui_item_enum_row(uiLayout *layout, uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, char *uiname, int x, int y, int w, int h) { - const EnumPropertyItem *item; + EnumPropertyItem *item; const char *identifier; char *name; - int a, totitem, itemw, icon, value; + int a, totitem, itemw, icon, value, free; identifier= RNA_property_identifier(prop); - RNA_property_enum_items(ptr, prop, &item, &totitem); + RNA_property_enum_items(block->evil_C, ptr, prop, &item, &totitem, &free); uiBlockSetCurLayout(block, ui_item_local_sublayout(layout, layout, 1)); for(a=0; a<totitem; a++) { @@ -455,6 +455,9 @@ uiDefButR(block, ROW, 0, name, 0, 0, itemw, h, ptr, identifier, -1, 0, value, -1, -1, NULL); } uiBlockSetCurLayout(block, layout); + + if(free) + MEM_freeN(item); } /* create label + button for RNA property */ @@ -545,7 +548,7 @@ } } -static char *ui_menu_enumpropname(char *opname, char *propname, int retval) +static char *ui_menu_enumpropname(uiLayout *layout, char *opname, char *propname, int retval) { wmOperatorType *ot= WM_operatortype_find(opname); PointerRNA ptr; @@ -558,13 +561,18 @@ prop= RNA_struct_find_property(&ptr, propname); if(prop) { - const EnumPropertyItem *item; - int totitem; + EnumPropertyItem *item; + int totitem, free; const char *name; - RNA_property_enum_items(&ptr, prop, &item, &totitem); - if(RNA_enum_name(item, retval, &name)) + RNA_property_enum_items(layout->root->block->evil_C, &ptr, prop, &item, &totitem, &free); + if(RNA_enum_name(item, retval, &name)) { + if(free) MEM_freeN(item); return (char*)name; + } + + if(free) + MEM_freeN(item); } return ""; @@ -578,7 +586,7 @@ RNA_enum_set(&ptr, propname, value); if(!name) - name= ui_menu_enumpropname(opname, propname, value); + name= ui_menu_enumpropname(layout, opname, propname, value); uiItemFullO(layout, name, icon, opname, ptr.data, layout->root->opcontext); } @@ -598,16 +606,19 @@ prop= RNA_struct_find_property(&ptr, propname); if(prop && RNA_property_type(prop) == PROP_ENUM) { - const EnumPropertyItem *item; - int totitem, i; + EnumPropertyItem *item; + int totitem, i, free; - RNA_property_enum_items(&ptr, prop, &item, &totitem); + RNA_property_enum_items(layout->root->block->evil_C, &ptr, prop, &item, &totitem, &free); for(i=0; i<totitem; i++) if(item[i].identifier[0]) uiItemEnumO(layout, (char*)item[i].name, item[i].icon, opname, propname, item[i].value); else uiItemS(layout); + + if(free) + MEM_freeN(item); } } @@ -618,18 +629,22 @@ /* for getting the enum */ PropertyRNA *prop; - const EnumPropertyItem *item; - int value; + EnumPropertyItem *item; + int value, free; WM_operator_properties_create(&ptr, opname); /* enum lookup */ if((prop= RNA_struct_find_property(&ptr, propname))) { - RNA_property_enum_items(&ptr, prop, &item, NULL); + RNA_property_enum_items(layout->root->block->evil_C, &ptr, prop, &item, NULL, &free); if(RNA_enum_value_from_id(item, value_str, &value)==0) { + if(free) MEM_freeN(item); printf("uiItemEnumO_string: %s.%s, enum %s not found.\n", RNA_struct_identifier(ptr.type), propname, value_str); return; } + + if(free) + MEM_freeN(item); } else { printf("uiItemEnumO_string: %s.%s not found.\n", RNA_struct_identifier(ptr.type), propname); @@ -640,7 +655,7 @@ /* same as uiItemEnumO */ if(!name) - name= ui_menu_enumpropname(opname, propname, value); + name= ui_menu_enumpropname(layout, opname, propname, value); uiItemFullO(layout, name, icon, opname, ptr.data, layout->root->opcontext); } @@ -845,8 +860,8 @@ void uiItemEnumR_string(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, char *value) { PropertyRNA *prop; - const EnumPropertyItem *item; - int ivalue, a; + EnumPropertyItem *item; + int ivalue, a, free; if(!ptr->data || !propname) return; @@ -859,9 +874,10 @@ return; } - RNA_property_enum_items(ptr, prop, &item, NULL); + RNA_property_enum_items(layout->root->block->evil_C, ptr, prop, &item, NULL, &free); if(!RNA_enum_value_from_id(item, value, &ivalue)) { + if(free) MEM_freeN(item); ui_item_disabled(layout, propname); printf("uiItemEnumR: enum property value not found: %s\n", value); return; @@ -873,6 +889,9 @@ break; } } + + if(free) + MEM_freeN(item); } void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname) @@ -887,16 +906,19 @@ } if(RNA_property_type(prop) == PROP_ENUM) { - const EnumPropertyItem *item; - int totitem, i; + EnumPropertyItem *item; + int totitem, i, free; - RNA_property_enum_items(ptr, prop, &item, &totitem); + RNA_property_enum_items(layout->root->block->evil_C, ptr, prop, &item, &totitem, &free); for(i=0; i<totitem; i++) if(item[i].identifier[0]) uiItemEnumR(layout, (char*)item[i].name, 0, ptr, propname, item[i].value); else uiItemS(layout); + + if(free) + MEM_freeN(item); } } Modified: branches/blender2.5/blender/source/blender/editors/mesh/editmesh.c =================================================================== @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs