[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22297] branches/soc-2009-kazanbas/source/ blender/python/intern/bpy_rna.c: bpyrna: interpret a tuple of enum items ( e1, e2, ...) as a bitmask (e1 | e2 | ...).
Arystanbek Dyussenov
arystan.d at gmail.com
Fri Aug 7 15:00:39 CEST 2009
Revision: 22297
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22297
Author: kazanbas
Date: 2009-08-07 15:00:39 +0200 (Fri, 07 Aug 2009)
Log Message:
-----------
bpyrna: interpret a tuple of enum items (e1, e2, ...) as a bitmask (e1 | e2 | ...).
Modified Paths:
--------------
branches/soc-2009-kazanbas/source/blender/python/intern/bpy_rna.c
Modified: branches/soc-2009-kazanbas/source/blender/python/intern/bpy_rna.c
===================================================================
--- branches/soc-2009-kazanbas/source/blender/python/intern/bpy_rna.c 2009-08-07 10:41:13 UTC (rev 22296)
+++ branches/soc-2009-kazanbas/source/blender/python/intern/bpy_rna.c 2009-08-07 13:00:39 UTC (rev 22297)
@@ -33,6 +33,7 @@
#include "RNA_access.h"
#include "RNA_define.h" /* for defining our own rna */
+#include "rna_internal_types.h"
#include "MEM_guardedalloc.h"
#include "BKE_utildefines.h"
@@ -241,6 +242,27 @@
return result;
}
+static int pyrna_string_to_enum(PyObject *item, PointerRNA *ptr, PropertyRNA *prop, int *val, const char *error_prefix)
+{
+ char *param= _PyUnicode_AsString(item);
+
+ if (param==NULL) {
+ char *enum_str= pyrna_enum_as_string(ptr, prop);
+ PyErr_Format(PyExc_TypeError, "%.200s expected a string enum type in (%.200s)", error_prefix, enum_str);
+ MEM_freeN(enum_str);
+ return 0;
+ } else {
+ if (!RNA_property_enum_value(BPy_GetContext(), ptr, prop, param, val)) {
+ char *enum_str= pyrna_enum_as_string(ptr, prop);
+ PyErr_Format(PyExc_TypeError, "%.200s enum \"%.200s\" not found in (%.200s)", error_prefix, param, enum_str);
+ MEM_freeN(enum_str);
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
{
PyObject *ret;
@@ -641,25 +663,34 @@
}
case PROP_ENUM:
{
- char *param = _PyUnicode_AsString(value);
-
- if (param==NULL) {
+ int val, i;
+
+ if (PyUnicode_Check(value)) {
+ if (!pyrna_string_to_enum(value, ptr, prop, &val, error_prefix))
+ return -1;
+ }
+ else if (PyTuple_Check(value)) {
+ /* tuple of enum items, concatenate all values with OR */
+ val= 0;
+ for (i= 0; i < PyTuple_Size(value); i++) {
+ int tmpval;
+
+ /* PyTuple_GET_ITEM returns a borrowed reference */
+ if (!pyrna_string_to_enum(PyTuple_GET_ITEM(value, i), ptr, prop, &tmpval, error_prefix))
+ return -1;
+
+ val |= tmpval;
+ }
+ }
+ else {
char *enum_str= pyrna_enum_as_string(ptr, prop);
- PyErr_Format(PyExc_TypeError, "%.200s expected a string enum type in (%.200s)", error_prefix, enum_str);
+ PyErr_Format(PyExc_TypeError, "%.200s expected a string enum or a tuple of strings in (%.200s)", error_prefix, enum_str);
MEM_freeN(enum_str);
return -1;
- } else {
- int val;
- if (RNA_property_enum_value(BPy_GetContext(), ptr, prop, param, &val)) {
- if(data) *((int*)data)= val;
- else RNA_property_enum_set(ptr, prop, val);
- } else {
- char *enum_str= pyrna_enum_as_string(ptr, prop);
- PyErr_Format(PyExc_TypeError, "%.200s enum \"%.200s\" not found in (%.200s)", error_prefix, param, enum_str);
- MEM_freeN(enum_str);
- return -1;
- }
}
+
+ if(data) *((int*)data)= val;
+ else RNA_property_enum_set(ptr, prop, val);
break;
}
@@ -1803,7 +1834,7 @@
/* for return values, data is a pointer to an array, not first element pointer */
if (prop->flag & PROP_DYNAMIC_ARRAY)
- data = *((char**)data)
+ data = *(char**)(char*)data;
switch (type) {
case PROP_BOOLEAN:
More information about the Bf-blender-cvs
mailing list