[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20711] branches/blender2.5/blender/source /blender: added item_enumO() so python menu items can call enum types with string args.

Campbell Barton ideasman42 at gmail.com
Sun Jun 7 16:53:09 CEST 2009


Revision: 20711
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20711
Author:   campbellbarton
Date:     2009-06-07 16:53:08 +0200 (Sun, 07 Jun 2009)

Log Message:
-----------
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)")

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/include/UI_interface.h
    branches/blender2.5/blender/source/blender/editors/interface/interface_api.c
    branches/blender2.5/blender/source/blender/editors/interface/interface_layout.c
    branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c

Modified: branches/blender2.5/blender/source/blender/editors/include/UI_interface.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/UI_interface.h	2009-06-07 13:53:48 UTC (rev 20710)
+++ branches/blender2.5/blender/source/blender/editors/include/UI_interface.h	2009-06-07 14:53:08 UTC (rev 20711)
@@ -611,6 +611,7 @@
 /* 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);

Modified: branches/blender2.5/blender/source/blender/editors/interface/interface_api.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface_api.c	2009-06-07 13:53:48 UTC (rev 20710)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_api.c	2009-06-07 14:53:08 UTC (rev 20711)
@@ -124,12 +124,12 @@
 	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.");

Modified: branches/blender2.5/blender/source/blender/editors/interface/interface_layout.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface_layout.c	2009-06-07 13:53:48 UTC (rev 20710)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_layout.c	2009-06-07 14:53:08 UTC (rev 20711)
@@ -597,6 +597,39 @@
 	}
 }
 
+/* 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;

Modified: branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c	2009-06-07 13:53:48 UTC (rev 20710)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c	2009-06-07 14:53:08 UTC (rev 20711)
@@ -2059,9 +2059,7 @@
 	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;
 	}





More information about the Bf-blender-cvs mailing list