diff options
author | Campbell Barton <ideasman42@gmail.com> | 2009-06-07 18:53:08 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2009-06-07 18:53:08 +0400 |
commit | bb06e311a18518740edec42dce26d377ab16f0d7 (patch) | |
tree | 9d163f631f461c5a53e46a44384eefed125bea76 /source | |
parent | eecf7722b635545f0f5c51b74a15418e3cc9f47e (diff) |
added item_enumO() so python menu items can call enum types with string args.
Example sequencer menu
self.layout.column()
self.layout.item_enumO("SEQUENCER_OT_effect_strip_add", property='type', value='ADD', text="Effect Strip (Add)")
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/editors/include/UI_interface.h | 1 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_api.c | 4 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_layout.c | 33 | ||||
-rw-r--r-- | source/blender/python/intern/bpy_rna.c | 4 |
4 files changed, 37 insertions, 5 deletions
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index cb105f2ea3e..f7a0fccf12b 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -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); diff --git a/source/blender/editors/interface/interface_api.c b/source/blender/editors/interface/interface_api.c index 6aed1bc0b52..60bfe4e79ad 100644 --- a/source/blender/editors/interface/interface_api.c +++ b/source/blender/editors/interface/interface_api.c @@ -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."); diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index ea576ad7263..df7d81b8806 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -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; diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index 983e69845bd..12c19bd3471 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -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; } |