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

Reply via email to