[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53587] trunk/blender/source/blender: This patch adds support in bpy.props for getter/setter callback functions.

Lukas Toenne lukas.toenne at googlemail.com
Sat Jan 5 15:56:38 CET 2013


Revision: 53587
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53587
Author:   lukastoenne
Date:     2013-01-05 14:56:37 +0000 (Sat, 05 Jan 2013)
Log Message:
-----------
This patch adds support in bpy.props for getter/setter callback functions. We already have update callbacks, but generic get/set functions can come in handy in some cases where the functionality is too complex to use a single value.

The current C callback functions are too simple allow a straightforward implementation, in particular they don't receive the PropertyRNA pointer itself as an argument, which means the callback cannot directly access the PropertyRNA's py_data pointers which store the python function objects. For this reason a second runtime variant of these callbacks has been added. It is only used for runtime callbacks and not in makesrna, but otherwise works the same way.

Modified Paths:
--------------
    trunk/blender/source/blender/makesrna/RNA_define.h
    trunk/blender/source/blender/makesrna/RNA_types.h
    trunk/blender/source/blender/makesrna/intern/makesrna.c
    trunk/blender/source/blender/makesrna/intern/rna_access.c
    trunk/blender/source/blender/makesrna/intern/rna_define.c
    trunk/blender/source/blender/makesrna/intern/rna_internal_types.h
    trunk/blender/source/blender/python/generic/py_capi_utils.c
    trunk/blender/source/blender/python/generic/py_capi_utils.h
    trunk/blender/source/blender/python/intern/bpy_props.c

Modified: trunk/blender/source/blender/makesrna/RNA_define.h
===================================================================
--- trunk/blender/source/blender/makesrna/RNA_define.h	2013-01-05 13:52:41 UTC (rev 53586)
+++ trunk/blender/source/blender/makesrna/RNA_define.h	2013-01-05 14:56:37 UTC (rev 53587)
@@ -91,7 +91,6 @@
 PropertyRNA *RNA_def_enum(StructOrFunctionRNA *cont, const char *identifier, const EnumPropertyItem *items, int default_value, const char *ui_name, const char *ui_description);
 PropertyRNA *RNA_def_enum_flag(StructOrFunctionRNA *cont, const char *identifier, const EnumPropertyItem *items, int default_value, const char *ui_name, const char *ui_description);
 void RNA_def_enum_funcs(PropertyRNA *prop, EnumPropertyItemFunc itemfunc);
-void RNA_def_enum_py_data(PropertyRNA *prop, void *py_data);
 
 PropertyRNA *RNA_def_float(StructOrFunctionRNA *cont, const char *identifier, float default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax);
 PropertyRNA *RNA_def_float_vector(StructOrFunctionRNA *cont, const char *identifier, int len, const float *default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax);
@@ -177,6 +176,17 @@
 void RNA_def_property_srna(PropertyRNA *prop, const char *type);
 void RNA_def_py_data(PropertyRNA *prop, void *py_data);
 
+void RNA_def_property_boolean_funcs_runtime(PropertyRNA *prop, BooleanPropertyGetFunc getfunc, BooleanPropertySetFunc setfunc);
+void RNA_def_property_boolean_array_funcs_runtime(PropertyRNA *prop, BooleanArrayPropertyGetFunc getfunc, BooleanArrayPropertySetFunc setfunc);
+void RNA_def_property_int_funcs_runtime(PropertyRNA *prop, IntPropertyGetFunc getfunc, IntPropertySetFunc setfunc, IntPropertyRangeFunc rangefunc);
+void RNA_def_property_int_array_funcs_runtime(PropertyRNA *prop, IntArrayPropertyGetFunc getfunc, IntArrayPropertySetFunc setfunc, IntPropertyRangeFunc rangefunc);
+void RNA_def_property_float_funcs_runtime(PropertyRNA *prop, FloatPropertyGetFunc getfunc, FloatPropertySetFunc setfunc, FloatPropertyRangeFunc rangefunc);
+void RNA_def_property_float_array_funcs_runtime(PropertyRNA *prop, FloatArrayPropertyGetFunc getfunc, FloatArrayPropertySetFunc setfunc, FloatPropertyRangeFunc rangefunc);
+void RNA_def_property_enum_funcs_runtime(PropertyRNA *prop, EnumPropertyGetFunc getfunc, EnumPropertySetFunc setfunc, EnumPropertyItemFunc itemfunc);
+void RNA_def_property_string_funcs_runtime(PropertyRNA *prop, StringPropertyGetFunc getfunc, StringPropertyLengthFunc lengthfunc, StringPropertySetFunc setfunc);
+
+void RNA_def_property_enum_py_data(PropertyRNA *prop, void *py_data);
+
 void RNA_def_property_translation_context(PropertyRNA *prop, const char *context);
 
 /* Function */

Modified: trunk/blender/source/blender/makesrna/RNA_types.h
===================================================================
--- trunk/blender/source/blender/makesrna/RNA_types.h	2013-01-05 13:52:41 UTC (rev 53586)
+++ trunk/blender/source/blender/makesrna/RNA_types.h	2013-01-05 14:56:37 UTC (rev 53587)
@@ -269,7 +269,27 @@
 	const char *description;
 } EnumPropertyItem;
 
-/* this is a copy of 'PropEnumItemFunc' defined in rna_internal_types.h */
+/* extended versions with PropertyRNA argument */
+typedef int (*BooleanPropertyGetFunc)(struct PointerRNA *ptr, struct PropertyRNA *prop);
+typedef void (*BooleanPropertySetFunc)(struct PointerRNA *ptr, struct PropertyRNA *prop, int value);
+typedef void (*BooleanArrayPropertyGetFunc)(struct PointerRNA *ptr, struct PropertyRNA *prop, int *values);
+typedef void (*BooleanArrayPropertySetFunc)(struct PointerRNA *ptr, struct PropertyRNA *prop, const int *values);
+typedef int (*IntPropertyGetFunc)(struct PointerRNA *ptr, struct PropertyRNA *prop);
+typedef void (*IntPropertySetFunc)(struct PointerRNA *ptr, struct PropertyRNA *prop, int value);
+typedef void (*IntArrayPropertyGetFunc)(struct PointerRNA *ptr, struct PropertyRNA *prop, int *values);
+typedef void (*IntArrayPropertySetFunc)(struct PointerRNA *ptr, struct PropertyRNA *prop, const int *values);
+typedef void (*IntPropertyRangeFunc)(struct PointerRNA *ptr, struct PropertyRNA *prop, int *min, int *max, int *softmin, int *softmax);
+typedef float (*FloatPropertyGetFunc)(struct PointerRNA *ptr, struct PropertyRNA *prop);
+typedef void (*FloatPropertySetFunc)(struct PointerRNA *ptr, struct PropertyRNA *prop, float value);
+typedef void (*FloatArrayPropertyGetFunc)(struct PointerRNA *ptr, struct PropertyRNA *prop, float *values);
+typedef void (*FloatArrayPropertySetFunc)(struct PointerRNA *ptr, struct PropertyRNA *prop, const float *values);
+typedef void (*FloatPropertyRangeFunc)(struct PointerRNA *ptr, struct PropertyRNA *prop, float *min, float *max, float *softmin, float *softmax);
+typedef void (*StringPropertyGetFunc)(struct PointerRNA *ptr, struct PropertyRNA *prop, char *value);
+typedef int (*StringPropertyLengthFunc)(struct PointerRNA *ptr, struct PropertyRNA *prop);
+typedef void (*StringPropertySetFunc)(struct PointerRNA *ptr, struct PropertyRNA *prop, const char *value);
+typedef int (*EnumPropertyGetFunc)(struct PointerRNA *ptr, struct PropertyRNA *prop);
+typedef void (*EnumPropertySetFunc)(struct PointerRNA *ptr, struct PropertyRNA *prop, int value);
+/* same as PropEnumItemFunc */
 typedef EnumPropertyItem *(*EnumPropertyItemFunc)(struct bContext *C, PointerRNA *ptr, struct PropertyRNA *prop, int *free);
 
 typedef struct PropertyRNA PropertyRNA;

Modified: trunk/blender/source/blender/makesrna/intern/makesrna.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/makesrna.c	2013-01-05 13:52:41 UTC (rev 53586)
+++ trunk/blender/source/blender/makesrna/intern/makesrna.c	2013-01-05 14:56:37 UTC (rev 53587)
@@ -2947,11 +2947,15 @@
 		case PROP_BOOLEAN:
 		{
 			BoolPropertyRNA *bprop = (BoolPropertyRNA *)prop;
-			fprintf(f, "\t%s, %s, %s, %s, %d, ",
+			fprintf(f, "\t%s, %s, %s, %s, %s, %s, %s, %s, %d, ",
 			        rna_function_string(bprop->get),
 			        rna_function_string(bprop->set),
 			        rna_function_string(bprop->getarray),
 			        rna_function_string(bprop->setarray),
+			        rna_function_string(bprop->get_ex),
+			        rna_function_string(bprop->set_ex),
+			        rna_function_string(bprop->getarray_ex),
+			        rna_function_string(bprop->setarray_ex),
 			        bprop->defaultvalue);
 			if (prop->arraydimension && prop->totarraylength)
 				fprintf(f, "rna_%s%s_%s_default\n", srna->identifier, strnest, prop->identifier);
@@ -2961,12 +2965,17 @@
 		case PROP_INT:
 		{
 			IntPropertyRNA *iprop = (IntPropertyRNA *)prop;
-			fprintf(f, "\t%s, %s, %s, %s, %s,\n\t",
+			fprintf(f, "\t%s, %s, %s, %s, %s, %s, %s, %s, %s, %s,\n\t",
 			        rna_function_string(iprop->get),
 			        rna_function_string(iprop->set),
 			        rna_function_string(iprop->getarray),
 			        rna_function_string(iprop->setarray),
-			        rna_function_string(iprop->range));
+			        rna_function_string(iprop->range),
+			        rna_function_string(iprop->get_ex),
+			        rna_function_string(iprop->set_ex),
+			        rna_function_string(iprop->getarray_ex),
+			        rna_function_string(iprop->setarray_ex),
+			        rna_function_string(iprop->range_ex));
 			rna_int_print(f, iprop->softmin); fprintf(f, ", ");
 			rna_int_print(f, iprop->softmax); fprintf(f, ", ");
 			rna_int_print(f, iprop->hardmin); fprintf(f, ", ");
@@ -2981,12 +2990,17 @@
 		case PROP_FLOAT:
 		{
 			FloatPropertyRNA *fprop = (FloatPropertyRNA *)prop;
-			fprintf(f, "\t%s, %s, %s, %s, %s, ",
+			fprintf(f, "\t%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, ",
 			        rna_function_string(fprop->get),
 			        rna_function_string(fprop->set),
 			        rna_function_string(fprop->getarray),
 			        rna_function_string(fprop->setarray),
-			        rna_function_string(fprop->range));
+			        rna_function_string(fprop->range),
+			        rna_function_string(fprop->get_ex),
+			        rna_function_string(fprop->set_ex),
+			        rna_function_string(fprop->getarray_ex),
+			        rna_function_string(fprop->setarray_ex),
+			        rna_function_string(fprop->range_ex));
 			rna_float_print(f, fprop->softmin); fprintf(f, ", ");
 			rna_float_print(f, fprop->softmax); fprintf(f, ", ");
 			rna_float_print(f, fprop->hardmin); fprintf(f, ", ");
@@ -3002,10 +3016,13 @@
 		case PROP_STRING:
 		{
 			StringPropertyRNA *sprop = (StringPropertyRNA *)prop;
-			fprintf(f, "\t%s, %s, %s, %d, ",
+			fprintf(f, "\t%s, %s, %s, %s, %s, %s, %d, ",
 			        rna_function_string(sprop->get),
 			        rna_function_string(sprop->length),
 			        rna_function_string(sprop->set),
+			        rna_function_string(sprop->get_ex),
+			        rna_function_string(sprop->length_ex),
+			        rna_function_string(sprop->set_ex),
 			        sprop->maxlength);
 			rna_print_c_string(f, sprop->defaultvalue); fprintf(f, "\n");
 			break;
@@ -3013,10 +3030,12 @@
 		case PROP_ENUM:
 		{
 			EnumPropertyRNA *eprop = (EnumPropertyRNA *)prop;
-			fprintf(f, "\t%s, %s, %s, NULL, ",
+			fprintf(f, "\t%s, %s, %s, %s, %s, NULL, ",
 			        rna_function_string(eprop->get),
 			        rna_function_string(eprop->set),
-			        rna_function_string(eprop->itemf));
+			        rna_function_string(eprop->itemf),
+			        rna_function_string(eprop->get_ex),
+			        rna_function_string(eprop->set_ex));
 			if (eprop->item)
 				fprintf(f, "rna_%s%s_%s_items, ", srna->identifier, strnest, prop->identifier);
 			else

Modified: trunk/blender/source/blender/makesrna/intern/rna_access.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_access.c	2013-01-05 13:52:41 UTC (rev 53586)
+++ trunk/blender/source/blender/makesrna/intern/rna_access.c	2013-01-05 14:56:37 UTC (rev 53587)
@@ -40,6 +40,7 @@
 #include "BLI_utildefines.h"
 #include "BLI_dynstr.h"
 #include "BLI_ghash.h"
+#include "BLI_math.h"
 
 #include "BLF_api.h"
 #include "BLF_translation.h"
@@ -937,6 +938,12 @@
 
 		iprop->range(ptr, hardmin, hardmax, &softmin, &softmax);
 	}
+	else if (iprop->range_ex) {
+		*hardmin = INT_MIN;
+		*hardmax = INT_MAX;
+
+		iprop->range_ex(ptr, prop, hardmin, hardmax, &softmin, &softmax);
+	}
 	else {

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list