added item_enumO() so python menu items can call enum types with string args.
authorCampbell Barton <ideasman42@gmail.com>
Sun, 7 Jun 2009 14:53:08 +0000 (14:53 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Sun, 7 Jun 2009 14:53:08 +0000 (14:53 +0000)
Example sequencer menu
self.layout.column()
self.layout.item_enumO("SEQUENCER_OT_effect_strip_add", property='type', value='ADD', text="Effect Strip (Add)")

source/blender/editors/include/UI_interface.h
source/blender/editors/interface/interface_api.c
source/blender/editors/interface/interface_layout.c
source/blender/python/intern/bpy_rna.c

index cb105f2ea3ef4ffaa066424b7d5ec0f0e64062a0..f7a0fccf12b60e8a272afe6fab315aeaa4b27349 100644 (file)
@@ -611,6 +611,7 @@ void uiTemplateCurveMapping(uiLayout *layout, struct CurveMapping *cumap, int ty
 /* items */
 void uiItemO(uiLayout *layout, char *name, int icon, char *opname);
 void uiItemEnumO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value);
+void uiItemEnumO_string(uiLayout *layout, char *name, int icon, char *opname, char *propname, char *value);
 void uiItemsEnumO(uiLayout *layout, char *opname, char *propname);
 void uiItemBooleanO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value);
 void uiItemIntO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value);
index 6aed1bc0b524bb7561bceb88e4e52a53e6eb69e2..60bfe4e79ad774571d9d8540aab05b4fd31c0708 100644 (file)
@@ -124,12 +124,12 @@ void RNA_api_ui_layout(StructRNA *srna)
        func= RNA_def_function(srna, "itemO", "uiItemO");
        api_ui_item_op_common(func);
 
-       /*func= RNA_def_function(srna, "item_enumO", "uiItemEnumO");
+       func= RNA_def_function(srna, "item_enumO", "uiItemEnumO_string");
        api_ui_item_op_common(func);
        parm= RNA_def_string(func, "property", "", 0, "", "Identifier of property in operator.");
        RNA_def_property_flag(parm, PROP_REQUIRED);
        parm= RNA_def_string(func, "value", "", 0, "", "Enum property value.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);*/
+       RNA_def_property_flag(parm, PROP_REQUIRED);
 
        func= RNA_def_function(srna, "items_enumO", "uiItemsEnumO");
        parm= RNA_def_string(func, "operator", "", 0, "", "Identifier of the operator.");
index ea576ad726340f88f0cb793002b841e4b1154dba..df7d81b8806667b25ff317793341608d03849ca5 100644 (file)
@@ -597,6 +597,39 @@ void uiItemsEnumO(uiLayout *layout, char *opname, char *propname)
        }
 }
 
+/* for use in cases where we have */
+void uiItemEnumO_string(uiLayout *layout, char *name, int icon, char *opname, char *propname, char *value_str)
+{
+       PointerRNA ptr;
+       
+       /* for getting the enum */
+       PropertyRNA *prop;
+       const EnumPropertyItem *item;
+       int totitem;
+       int value;
+
+       WM_operator_properties_create(&ptr, opname);
+       
+       /*RNA_enum_set(&ptr, propname, value);*/
+       if(prop= RNA_struct_find_property(&ptr, propname)) {
+               RNA_property_enum_items(&ptr, prop, &item, &totitem);
+               if(RNA_enum_value_from_id(item, value_str, &value)==0) {
+                       printf("uiItemEnumO_string: %s.%s, enum %s not found.\n", RNA_struct_identifier(ptr.type), propname, value);
+                       return;
+               }
+       }
+       else {
+               printf("uiItemEnumO_string: %s.%s not found.\n", RNA_struct_identifier(ptr.type), propname);
+               return;
+       }
+       
+       /* same as uiItemEnumO */
+       if(!name)
+               name= ui_menu_enumpropname(opname, propname, value);
+
+       uiItemFullO(layout, name, icon, opname, ptr.data, layout->root->opcontext);
+}
+
 void uiItemBooleanO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value)
 {
        PointerRNA ptr;
index 983e69845bd29e5cf994f6c76efe0092a6b5387d..12c19bd34710b73b47249ac79790308bb9b32143 100644 (file)
@@ -2059,9 +2059,7 @@ PyObject *pyrna_basetype_register(PyObject *self, PyObject *args)
        item= PyObject_GetAttrString(py_class, "__rna__");
 
        if(!item || !BPy_StructRNA_Check(item)) {
-               if(item) {
-                       Py_DECREF(item);
-               }
+               Py_XDECREF(item);
                PyErr_SetString(PyExc_AttributeError, "expected a Type subclassed from a registerable rna type (no __rna__ property).");
                return NULL;
        }