diff options
Diffstat (limited to 'source/blender/python/intern/bpy_props.c')
-rw-r--r-- | source/blender/python/intern/bpy_props.c | 5644 |
1 files changed, 2924 insertions, 2720 deletions
diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c index 18a39f39e70..19315d9f2cc 100644 --- a/source/blender/python/intern/bpy_props.c +++ b/source/blender/python/intern/bpy_props.c @@ -22,7 +22,6 @@ * existing blender types. */ - #include <Python.h> #include "RNA_types.h" @@ -45,102 +44,110 @@ /* initial definition of callback slots we'll probably have more than 1 */ enum { - BPY_DATA_CB_SLOT_UPDATE = 0, - BPY_DATA_CB_SLOT_GET = 1, - BPY_DATA_CB_SLOT_SET = 2, - BPY_DATA_CB_SLOT_POLL = 3, - BPY_DATA_CB_SLOT_SIZE = 4, + BPY_DATA_CB_SLOT_UPDATE = 0, + BPY_DATA_CB_SLOT_GET = 1, + BPY_DATA_CB_SLOT_SET = 2, + BPY_DATA_CB_SLOT_POLL = 3, + BPY_DATA_CB_SLOT_SIZE = 4, }; static const EnumPropertyItem property_flag_items[] = { - {PROP_HIDDEN, "HIDDEN", 0, "Hidden", ""}, - {PROP_SKIP_SAVE, "SKIP_SAVE", 0, "Skip Save", ""}, - {PROP_ANIMATABLE, "ANIMATABLE", 0, "Animatable", ""}, - {PROP_LIB_EXCEPTION, "LIBRARY_EDITABLE", 0, "Library Editable", ""}, - {PROP_PROPORTIONAL, "PROPORTIONAL", 0, "Adjust values proportionally to eachother", ""}, - {PROP_TEXTEDIT_UPDATE, "TEXTEDIT_UPDATE", 0, "Update on every keystroke in textedit 'mode'", ""}, - {0, NULL, 0, NULL, NULL}, + {PROP_HIDDEN, "HIDDEN", 0, "Hidden", ""}, + {PROP_SKIP_SAVE, "SKIP_SAVE", 0, "Skip Save", ""}, + {PROP_ANIMATABLE, "ANIMATABLE", 0, "Animatable", ""}, + {PROP_LIB_EXCEPTION, "LIBRARY_EDITABLE", 0, "Library Editable", ""}, + {PROP_PROPORTIONAL, "PROPORTIONAL", 0, "Adjust values proportionally to eachother", ""}, + {PROP_TEXTEDIT_UPDATE, + "TEXTEDIT_UPDATE", + 0, + "Update on every keystroke in textedit 'mode'", + ""}, + {0, NULL, 0, NULL, NULL}, }; #define BPY_PROPDEF_OPTIONS_DOC \ -" :arg options: Enumerator in ['HIDDEN', 'SKIP_SAVE', 'ANIMATABLE', 'LIBRARY_EDITABLE', 'PROPORTIONAL'," \ - "'TEXTEDIT_UPDATE'].\n" \ -" :type options: set\n" \ + " :arg options: Enumerator in ['HIDDEN', 'SKIP_SAVE', 'ANIMATABLE', 'LIBRARY_EDITABLE', " \ + "'PROPORTIONAL'," \ + "'TEXTEDIT_UPDATE'].\n" \ + " :type options: set\n" static const EnumPropertyItem property_flag_enum_items[] = { - {PROP_HIDDEN, "HIDDEN", 0, "Hidden", ""}, - {PROP_SKIP_SAVE, "SKIP_SAVE", 0, "Skip Save", ""}, - {PROP_ANIMATABLE, "ANIMATABLE", 0, "Animatable", ""}, - {PROP_LIB_EXCEPTION, "LIBRARY_EDITABLE", 0, "Library Editable", ""}, - {PROP_ENUM_FLAG, "ENUM_FLAG", 0, "Enum Flag", ""}, - {0, NULL, 0, NULL, NULL}, + {PROP_HIDDEN, "HIDDEN", 0, "Hidden", ""}, + {PROP_SKIP_SAVE, "SKIP_SAVE", 0, "Skip Save", ""}, + {PROP_ANIMATABLE, "ANIMATABLE", 0, "Animatable", ""}, + {PROP_LIB_EXCEPTION, "LIBRARY_EDITABLE", 0, "Library Editable", ""}, + {PROP_ENUM_FLAG, "ENUM_FLAG", 0, "Enum Flag", ""}, + {0, NULL, 0, NULL, NULL}, }; #define BPY_PROPDEF_OPTIONS_ENUM_DOC \ -" :arg options: Enumerator in ['HIDDEN', 'SKIP_SAVE', 'ANIMATABLE', 'ENUM_FLAG', 'LIBRARY_EDITABLE'].\n" \ -" :type options: set\n" \ + " :arg options: Enumerator in ['HIDDEN', 'SKIP_SAVE', 'ANIMATABLE', 'ENUM_FLAG', " \ + "'LIBRARY_EDITABLE'].\n" \ + " :type options: set\n" /* subtypes */ /* XXX Keep in sync with rna_rna.c's rna_enum_property_subtype_items ??? * Currently it is not... */ static const EnumPropertyItem property_subtype_string_items[] = { - {PROP_FILEPATH, "FILE_PATH", 0, "File Path", ""}, - {PROP_DIRPATH, "DIR_PATH", 0, "Directory Path", ""}, - {PROP_FILENAME, "FILE_NAME", 0, "Filename", ""}, - {PROP_BYTESTRING, "BYTE_STRING", 0, "Byte String", ""}, - {PROP_PASSWORD, "PASSWORD", 0, "Password", "A string that is displayed hidden ('********')"}, - - {PROP_NONE, "NONE", 0, "None", ""}, - {0, NULL, 0, NULL, NULL}, + {PROP_FILEPATH, "FILE_PATH", 0, "File Path", ""}, + {PROP_DIRPATH, "DIR_PATH", 0, "Directory Path", ""}, + {PROP_FILENAME, "FILE_NAME", 0, "Filename", ""}, + {PROP_BYTESTRING, "BYTE_STRING", 0, "Byte String", ""}, + {PROP_PASSWORD, "PASSWORD", 0, "Password", "A string that is displayed hidden ('********')"}, + + {PROP_NONE, "NONE", 0, "None", ""}, + {0, NULL, 0, NULL, NULL}, }; #define BPY_PROPDEF_SUBTYPE_STRING_DOC \ -" :arg subtype: Enumerator in ['FILE_PATH', 'DIR_PATH', 'FILE_NAME', 'BYTE_STRING', 'PASSWORD', 'NONE'].\n" \ -" :type subtype: string\n" \ + " :arg subtype: Enumerator in ['FILE_PATH', 'DIR_PATH', 'FILE_NAME', 'BYTE_STRING', " \ + "'PASSWORD', 'NONE'].\n" \ + " :type subtype: string\n" static const EnumPropertyItem property_subtype_number_items[] = { - {PROP_PIXEL, "PIXEL", 0, "Pixel", ""}, - {PROP_UNSIGNED, "UNSIGNED", 0, "Unsigned", ""}, - {PROP_PERCENTAGE, "PERCENTAGE", 0, "Percentage", ""}, - {PROP_FACTOR, "FACTOR", 0, "Factor", ""}, - {PROP_ANGLE, "ANGLE", 0, "Angle", ""}, - {PROP_TIME, "TIME", 0, "Time", ""}, - {PROP_DISTANCE, "DISTANCE", 0, "Distance", ""}, - - {PROP_NONE, "NONE", 0, "None", ""}, - {0, NULL, 0, NULL, NULL}, + {PROP_PIXEL, "PIXEL", 0, "Pixel", ""}, + {PROP_UNSIGNED, "UNSIGNED", 0, "Unsigned", ""}, + {PROP_PERCENTAGE, "PERCENTAGE", 0, "Percentage", ""}, + {PROP_FACTOR, "FACTOR", 0, "Factor", ""}, + {PROP_ANGLE, "ANGLE", 0, "Angle", ""}, + {PROP_TIME, "TIME", 0, "Time", ""}, + {PROP_DISTANCE, "DISTANCE", 0, "Distance", ""}, + + {PROP_NONE, "NONE", 0, "None", ""}, + {0, NULL, 0, NULL, NULL}, }; #define BPY_PROPDEF_SUBTYPE_NUMBER_DOC \ -" :arg subtype: Enumerator in ['PIXEL', 'UNSIGNED', 'PERCENTAGE', 'FACTOR', 'ANGLE', 'TIME', 'DISTANCE', 'NONE'].\n" \ -" :type subtype: string\n" \ + " :arg subtype: Enumerator in ['PIXEL', 'UNSIGNED', 'PERCENTAGE', 'FACTOR', 'ANGLE', " \ + "'TIME', 'DISTANCE', 'NONE'].\n" \ + " :type subtype: string\n" static const EnumPropertyItem property_subtype_array_items[] = { - {PROP_COLOR, "COLOR", 0, "Color", ""}, - {PROP_TRANSLATION, "TRANSLATION", 0, "Translation", ""}, - {PROP_DIRECTION, "DIRECTION", 0, "Direction", ""}, - {PROP_VELOCITY, "VELOCITY", 0, "Velocity", ""}, - {PROP_ACCELERATION, "ACCELERATION", 0, "Acceleration", ""}, - {PROP_MATRIX, "MATRIX", 0, "Matrix", ""}, - {PROP_EULER, "EULER", 0, "Euler", ""}, - {PROP_QUATERNION, "QUATERNION", 0, "Quaternion", ""}, - {PROP_AXISANGLE, "AXISANGLE", 0, "Axis Angle", ""}, - {PROP_XYZ, "XYZ", 0, "XYZ", ""}, - {PROP_COLOR_GAMMA, "COLOR_GAMMA", 0, "Color Gamma", ""}, - {PROP_LAYER, "LAYER", 0, "Layer", ""}, - {PROP_LAYER_MEMBER, "LAYER_MEMBER", 0, "Layer Member", ""}, - {PROP_POWER, "POWER", 0, "Power", ""}, - - {PROP_NONE, "NONE", 0, "None", ""}, - {0, NULL, 0, NULL, NULL}, + {PROP_COLOR, "COLOR", 0, "Color", ""}, + {PROP_TRANSLATION, "TRANSLATION", 0, "Translation", ""}, + {PROP_DIRECTION, "DIRECTION", 0, "Direction", ""}, + {PROP_VELOCITY, "VELOCITY", 0, "Velocity", ""}, + {PROP_ACCELERATION, "ACCELERATION", 0, "Acceleration", ""}, + {PROP_MATRIX, "MATRIX", 0, "Matrix", ""}, + {PROP_EULER, "EULER", 0, "Euler", ""}, + {PROP_QUATERNION, "QUATERNION", 0, "Quaternion", ""}, + {PROP_AXISANGLE, "AXISANGLE", 0, "Axis Angle", ""}, + {PROP_XYZ, "XYZ", 0, "XYZ", ""}, + {PROP_COLOR_GAMMA, "COLOR_GAMMA", 0, "Color Gamma", ""}, + {PROP_LAYER, "LAYER", 0, "Layer", ""}, + {PROP_LAYER_MEMBER, "LAYER_MEMBER", 0, "Layer Member", ""}, + {PROP_POWER, "POWER", 0, "Power", ""}, + + {PROP_NONE, "NONE", 0, "None", ""}, + {0, NULL, 0, NULL, NULL}, }; #define BPY_PROPDEF_SUBTYPE_ARRAY_DOC \ -" :arg subtype: Enumerator in ['COLOR', 'TRANSLATION', 'DIRECTION', " \ - "'VELOCITY', 'ACCELERATION', 'MATRIX', 'EULER', 'QUATERNION', 'AXISANGLE', " \ - "'XYZ', 'COLOR_GAMMA', 'LAYER', 'LAYER_MEMBER', 'POWER', 'NONE'].\n" \ -" :type subtype: string\n" + " :arg subtype: Enumerator in ['COLOR', 'TRANSLATION', 'DIRECTION', " \ + "'VELOCITY', 'ACCELERATION', 'MATRIX', 'EULER', 'QUATERNION', 'AXISANGLE', " \ + "'XYZ', 'COLOR_GAMMA', 'LAYER', 'LAYER_MEMBER', 'POWER', 'NONE'].\n" \ + " :type subtype: string\n" /* PyObject's */ static PyObject *pymeth_BoolProperty = NULL; @@ -157,39 +164,39 @@ static PyObject *pymeth_RemoveProperty = NULL; static PyObject *pyrna_struct_as_instance(PointerRNA *ptr) { - PyObject *self = NULL; - /* first get self */ - /* operators can store their own instance for later use */ - if (ptr->data) { - void **instance = RNA_struct_instance(ptr); - - if (instance) { - if (*instance) { - self = *instance; - Py_INCREF(self); - } - } - } - - /* in most cases this will run */ - if (self == NULL) { - self = pyrna_struct_CreatePyObject(ptr); - } - - return self; + PyObject *self = NULL; + /* first get self */ + /* operators can store their own instance for later use */ + if (ptr->data) { + void **instance = RNA_struct_instance(ptr); + + if (instance) { + if (*instance) { + self = *instance; + Py_INCREF(self); + } + } + } + + /* in most cases this will run */ + if (self == NULL) { + self = pyrna_struct_CreatePyObject(ptr); + } + + return self; } static void bpy_prop_assign_flag(PropertyRNA *prop, const int flag) { - const int flag_mask = ((PROP_ANIMATABLE) & ~flag); + const int flag_mask = ((PROP_ANIMATABLE) & ~flag); - if (flag) { - RNA_def_property_flag(prop, flag); - } + if (flag) { + RNA_def_property_flag(prop, flag); + } - if (flag_mask) { - RNA_def_property_clear_flag(prop, flag_mask); - } + if (flag_mask) { + RNA_def_property_clear_flag(prop, flag_mask); + } } /* operators and classes use this so it can store the args given but defer @@ -197,3092 +204,3289 @@ static void bpy_prop_assign_flag(PropertyRNA *prop, const int flag) * the default args for that operator instance */ static PyObject *bpy_prop_deferred_return(PyObject *func, PyObject *kw) { - PyObject *ret = PyTuple_New(2); - PyTuple_SET_ITEM(ret, 0, func); - Py_INCREF(func); + PyObject *ret = PyTuple_New(2); + PyTuple_SET_ITEM(ret, 0, func); + Py_INCREF(func); - if (kw == NULL) { - kw = PyDict_New(); - } - else { - Py_INCREF(kw); - } + if (kw == NULL) { + kw = PyDict_New(); + } + else { + Py_INCREF(kw); + } - PyTuple_SET_ITEM(ret, 1, kw); + PyTuple_SET_ITEM(ret, 1, kw); - return ret; + return ret; } /* callbacks */ -static void bpy_prop_update_cb(struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop) +static void bpy_prop_update_cb(struct bContext *C, + struct PointerRNA *ptr, + struct PropertyRNA *prop) { - PyGILState_STATE gilstate; - PyObject **py_data = RNA_property_py_data_get(prop); - PyObject *py_func; - PyObject *args; - PyObject *self; - PyObject *ret; - const bool is_write_ok = pyrna_write_check(); + PyGILState_STATE gilstate; + PyObject **py_data = RNA_property_py_data_get(prop); + PyObject *py_func; + PyObject *args; + PyObject *self; + PyObject *ret; + const bool is_write_ok = pyrna_write_check(); - BLI_assert(py_data != NULL); + BLI_assert(py_data != NULL); - if (!is_write_ok) { - pyrna_write_set(true); - } + if (!is_write_ok) { + pyrna_write_set(true); + } - bpy_context_set(C, &gilstate); + bpy_context_set(C, &gilstate); - py_func = py_data[BPY_DATA_CB_SLOT_UPDATE]; + py_func = py_data[BPY_DATA_CB_SLOT_UPDATE]; - args = PyTuple_New(2); - self = pyrna_struct_as_instance(ptr); - PyTuple_SET_ITEM(args, 0, self); + args = PyTuple_New(2); + self = pyrna_struct_as_instance(ptr); + PyTuple_SET_ITEM(args, 0, self); - PyTuple_SET_ITEM(args, 1, (PyObject *)bpy_context_module); - Py_INCREF(bpy_context_module); + PyTuple_SET_ITEM(args, 1, (PyObject *)bpy_context_module); + Py_INCREF(bpy_context_module); - ret = PyObject_CallObject(py_func, args); + ret = PyObject_CallObject(py_func, args); - Py_DECREF(args); + Py_DECREF(args); - if (ret == NULL) { - PyC_Err_PrintWithFunc(py_func); - } - else { - if (ret != Py_None) { - PyErr_SetString(PyExc_ValueError, "the return value must be None"); - PyC_Err_PrintWithFunc(py_func); - } + if (ret == NULL) { + PyC_Err_PrintWithFunc(py_func); + } + else { + if (ret != Py_None) { + PyErr_SetString(PyExc_ValueError, "the return value must be None"); + PyC_Err_PrintWithFunc(py_func); + } - Py_DECREF(ret); - } + Py_DECREF(ret); + } - bpy_context_clear(C, &gilstate); + bpy_context_clear(C, &gilstate); - if (!is_write_ok) { - pyrna_write_set(false); - } + if (!is_write_ok) { + pyrna_write_set(false); + } } static bool bpy_prop_boolean_get_cb(struct PointerRNA *ptr, struct PropertyRNA *prop) { - PyObject **py_data = RNA_property_py_data_get(prop); - PyObject *py_func; - PyObject *args; - PyObject *self; - PyObject *ret; - PyGILState_STATE gilstate; - bool use_gil; - const bool is_write_ok = pyrna_write_check(); - bool value; + PyObject **py_data = RNA_property_py_data_get(prop); + PyObject *py_func; + PyObject *args; + PyObject *self; + PyObject *ret; + PyGILState_STATE gilstate; + bool use_gil; + const bool is_write_ok = pyrna_write_check(); + bool value; - BLI_assert(py_data != NULL); + BLI_assert(py_data != NULL); - if (!is_write_ok) { - pyrna_write_set(true); - } + if (!is_write_ok) { + pyrna_write_set(true); + } - use_gil = true; /* !PyC_IsInterpreterActive(); */ + use_gil = true; /* !PyC_IsInterpreterActive(); */ - if (use_gil) { - gilstate = PyGILState_Ensure(); - } + if (use_gil) { + gilstate = PyGILState_Ensure(); + } - py_func = py_data[BPY_DATA_CB_SLOT_GET]; + py_func = py_data[BPY_DATA_CB_SLOT_GET]; - args = PyTuple_New(1); - self = pyrna_struct_as_instance(ptr); - PyTuple_SET_ITEM(args, 0, self); + args = PyTuple_New(1); + self = pyrna_struct_as_instance(ptr); + PyTuple_SET_ITEM(args, 0, self); - ret = PyObject_CallObject(py_func, args); + ret = PyObject_CallObject(py_func, args); - Py_DECREF(args); + Py_DECREF(args); - if (ret == NULL) { - PyC_Err_PrintWithFunc(py_func); - value = false; - } - else { - int value_i = PyC_Long_AsBool(ret); + if (ret == NULL) { + PyC_Err_PrintWithFunc(py_func); + value = false; + } + else { + int value_i = PyC_Long_AsBool(ret); - if (value_i == -1 && PyErr_Occurred()) { - PyC_Err_PrintWithFunc(py_func); - value = false; - } - else { - value = (bool)value_i; - } + if (value_i == -1 && PyErr_Occurred()) { + PyC_Err_PrintWithFunc(py_func); + value = false; + } + else { + value = (bool)value_i; + } - Py_DECREF(ret); - } + Py_DECREF(ret); + } - if (use_gil) { - PyGILState_Release(gilstate); - } + if (use_gil) { + PyGILState_Release(gilstate); + } - if (!is_write_ok) { - pyrna_write_set(false); - } + if (!is_write_ok) { + pyrna_write_set(false); + } - return value; + return value; } static void bpy_prop_boolean_set_cb(struct PointerRNA *ptr, struct PropertyRNA *prop, bool value) { - PyObject **py_data = RNA_property_py_data_get(prop); - PyObject *py_func; - PyObject *args; - PyObject *self; - PyObject *ret; - PyGILState_STATE gilstate; - bool use_gil; - const bool is_write_ok = pyrna_write_check(); + PyObject **py_data = RNA_property_py_data_get(prop); + PyObject *py_func; + PyObject *args; + PyObject *self; + PyObject *ret; + PyGILState_STATE gilstate; + bool use_gil; + const bool is_write_ok = pyrna_write_check(); - BLI_assert(py_data != NULL); + BLI_assert(py_data != NULL); - if (!is_write_ok) { - pyrna_write_set(true); - } + if (!is_write_ok) { + pyrna_write_set(true); + } - use_gil = true; /* !PyC_IsInterpreterActive(); */ + use_gil = true; /* !PyC_IsInterpreterActive(); */ - if (use_gil) { - gilstate = PyGILState_Ensure(); - } + if (use_gil) { + gilstate = PyGILState_Ensure(); + } - py_func = py_data[BPY_DATA_CB_SLOT_SET]; + py_func = py_data[BPY_DATA_CB_SLOT_SET]; - args = PyTuple_New(2); - self = pyrna_struct_as_instance(ptr); - PyTuple_SET_ITEM(args, 0, self); + args = PyTuple_New(2); + self = pyrna_struct_as_instance(ptr); + PyTuple_SET_ITEM(args, 0, self); - PyTuple_SET_ITEM(args, 1, PyBool_FromLong(value)); + PyTuple_SET_ITEM(args, 1, PyBool_FromLong(value)); - ret = PyObject_CallObject(py_func, args); + ret = PyObject_CallObject(py_func, args); - Py_DECREF(args); + Py_DECREF(args); - if (ret == NULL) { - PyC_Err_PrintWithFunc(py_func); - } - else { - if (ret != Py_None) { - PyErr_SetString(PyExc_ValueError, "the return value must be None"); - PyC_Err_PrintWithFunc(py_func); - } + if (ret == NULL) { + PyC_Err_PrintWithFunc(py_func); + } + else { + if (ret != Py_None) { + PyErr_SetString(PyExc_ValueError, "the return value must be None"); + PyC_Err_PrintWithFunc(py_func); + } - Py_DECREF(ret); - } + Py_DECREF(ret); + } - if (use_gil) { - PyGILState_Release(gilstate); - } + if (use_gil) { + PyGILState_Release(gilstate); + } - if (!is_write_ok) { - pyrna_write_set(false); - } + if (!is_write_ok) { + pyrna_write_set(false); + } } -static bool bpy_prop_poll_cb(struct PointerRNA *self, PointerRNA candidate, struct PropertyRNA *prop) +static bool bpy_prop_poll_cb(struct PointerRNA *self, + PointerRNA candidate, + struct PropertyRNA *prop) { - PyObject *py_self; - PyObject *py_candidate; - PyObject *py_func; - PyObject **py_data = RNA_property_py_data_get(prop); - PyObject *args; - PyObject *ret; - bool result; - const int is_write_ok = pyrna_write_check(); - PyGILState_STATE gilstate = PyGILState_Ensure(); - - BLI_assert(self != NULL); - - py_self = pyrna_struct_as_instance(self); - py_candidate = pyrna_struct_as_instance(&candidate); - py_func = py_data[BPY_DATA_CB_SLOT_POLL]; - - if (!is_write_ok) { - pyrna_write_set(true); - } - - args = PyTuple_New(2); - PyTuple_SET_ITEM(args, 0, py_self); - PyTuple_SET_ITEM(args, 1, py_candidate); - - ret = PyObject_CallObject(py_func, args); - - Py_DECREF(args); - - if (ret == NULL) { - PyC_Err_PrintWithFunc(py_func); - result = false; - } - else { - result = PyObject_IsTrue(ret); - Py_DECREF(ret); - } - - PyGILState_Release(gilstate); - if (!is_write_ok) { - pyrna_write_set(false); - } - - return result; + PyObject *py_self; + PyObject *py_candidate; + PyObject *py_func; + PyObject **py_data = RNA_property_py_data_get(prop); + PyObject *args; + PyObject *ret; + bool result; + const int is_write_ok = pyrna_write_check(); + PyGILState_STATE gilstate = PyGILState_Ensure(); + + BLI_assert(self != NULL); + + py_self = pyrna_struct_as_instance(self); + py_candidate = pyrna_struct_as_instance(&candidate); + py_func = py_data[BPY_DATA_CB_SLOT_POLL]; + + if (!is_write_ok) { + pyrna_write_set(true); + } + + args = PyTuple_New(2); + PyTuple_SET_ITEM(args, 0, py_self); + PyTuple_SET_ITEM(args, 1, py_candidate); + + ret = PyObject_CallObject(py_func, args); + + Py_DECREF(args); + + if (ret == NULL) { + PyC_Err_PrintWithFunc(py_func); + result = false; + } + else { + result = PyObject_IsTrue(ret); + Py_DECREF(ret); + } + + PyGILState_Release(gilstate); + if (!is_write_ok) { + pyrna_write_set(false); + } + + return result; } -static void bpy_prop_boolean_array_get_cb(struct PointerRNA *ptr, struct PropertyRNA *prop, bool *values) +static void bpy_prop_boolean_array_get_cb(struct PointerRNA *ptr, + struct PropertyRNA *prop, + bool *values) { - PyObject **py_data = RNA_property_py_data_get(prop); - PyObject *py_func; - PyObject *args; - PyObject *self; - PyObject *ret; - PyGILState_STATE gilstate; - bool use_gil; - const bool is_write_ok = pyrna_write_check(); - int i, len = RNA_property_array_length(ptr, prop); - - BLI_assert(py_data != NULL); - - if (!is_write_ok) { - pyrna_write_set(true); - } - - use_gil = true; /* !PyC_IsInterpreterActive(); */ - - if (use_gil) { - gilstate = PyGILState_Ensure(); - } - - py_func = py_data[BPY_DATA_CB_SLOT_GET]; - - args = PyTuple_New(1); - self = pyrna_struct_as_instance(ptr); - PyTuple_SET_ITEM(args, 0, self); - - ret = PyObject_CallObject(py_func, args); - - Py_DECREF(args); - - if (ret == NULL) { - PyC_Err_PrintWithFunc(py_func); - - for (i = 0; i < len; ++i) { - values[i] = false; - } - } - else { - if (PyC_AsArray(values, ret, len, &PyBool_Type, false, "BoolVectorProperty get") == -1) { - PyC_Err_PrintWithFunc(py_func); - - for (i = 0; i < len; ++i) { - values[i] = false; - } - - /* PyC_AsArray decrements refcount internally on error */ - } - else { - Py_DECREF(ret); - } - } - - if (use_gil) { - PyGILState_Release(gilstate); - } - - if (!is_write_ok) { - pyrna_write_set(false); - } + PyObject **py_data = RNA_property_py_data_get(prop); + PyObject *py_func; + PyObject *args; + PyObject *self; + PyObject *ret; + PyGILState_STATE gilstate; + bool use_gil; + const bool is_write_ok = pyrna_write_check(); + int i, len = RNA_property_array_length(ptr, prop); + + BLI_assert(py_data != NULL); + + if (!is_write_ok) { + pyrna_write_set(true); + } + + use_gil = true; /* !PyC_IsInterpreterActive(); */ + + if (use_gil) { + gilstate = PyGILState_Ensure(); + } + + py_func = py_data[BPY_DATA_CB_SLOT_GET]; + + args = PyTuple_New(1); + self = pyrna_struct_as_instance(ptr); + PyTuple_SET_ITEM(args, 0, self); + + ret = PyObject_CallObject(py_func, args); + + Py_DECREF(args); + + if (ret == NULL) { + PyC_Err_PrintWithFunc(py_func); + + for (i = 0; i < len; ++i) { + values[i] = false; + } + } + else { + if (PyC_AsArray(values, ret, len, &PyBool_Type, false, "BoolVectorProperty get") == -1) { + PyC_Err_PrintWithFunc(py_func); + + for (i = 0; i < len; ++i) { + values[i] = false; + } + + /* PyC_AsArray decrements refcount internally on error */ + } + else { + Py_DECREF(ret); + } + } + + if (use_gil) { + PyGILState_Release(gilstate); + } + + if (!is_write_ok) { + pyrna_write_set(false); + } } -static void bpy_prop_boolean_array_set_cb(struct PointerRNA *ptr, struct PropertyRNA *prop, const bool *values) +static void bpy_prop_boolean_array_set_cb(struct PointerRNA *ptr, + struct PropertyRNA *prop, + const bool *values) { - PyObject **py_data = RNA_property_py_data_get(prop); - PyObject *py_func; - PyObject *args; - PyObject *self; - PyObject *ret; - PyObject *py_values; - PyGILState_STATE gilstate; - bool use_gil; - const bool is_write_ok = pyrna_write_check(); - int len = RNA_property_array_length(ptr, prop); + PyObject **py_data = RNA_property_py_data_get(prop); + PyObject *py_func; + PyObject *args; + PyObject *self; + PyObject *ret; + PyObject *py_values; + PyGILState_STATE gilstate; + bool use_gil; + const bool is_write_ok = pyrna_write_check(); + int len = RNA_property_array_length(ptr, prop); - BLI_assert(py_data != NULL); + BLI_assert(py_data != NULL); - if (!is_write_ok) { - pyrna_write_set(true); - } + if (!is_write_ok) { + pyrna_write_set(true); + } - use_gil = true; /* !PyC_IsInterpreterActive(); */ + use_gil = true; /* !PyC_IsInterpreterActive(); */ - if (use_gil) { - gilstate = PyGILState_Ensure(); - } + if (use_gil) { + gilstate = PyGILState_Ensure(); + } - py_func = py_data[BPY_DATA_CB_SLOT_SET]; + py_func = py_data[BPY_DATA_CB_SLOT_SET]; - args = PyTuple_New(2); - self = pyrna_struct_as_instance(ptr); - PyTuple_SET_ITEM(args, 0, self); + args = PyTuple_New(2); + self = pyrna_struct_as_instance(ptr); + PyTuple_SET_ITEM(args, 0, self); - py_values = PyC_Tuple_PackArray_Bool(values, len); - PyTuple_SET_ITEM(args, 1, py_values); + py_values = PyC_Tuple_PackArray_Bool(values, len); + PyTuple_SET_ITEM(args, 1, py_values); - ret = PyObject_CallObject(py_func, args); + ret = PyObject_CallObject(py_func, args); - Py_DECREF(args); + Py_DECREF(args); - if (ret == NULL) { - PyC_Err_PrintWithFunc(py_func); - } - else { - if (ret != Py_None) { - PyErr_SetString(PyExc_ValueError, "the return value must be None"); - PyC_Err_PrintWithFunc(py_func); - } + if (ret == NULL) { + PyC_Err_PrintWithFunc(py_func); + } + else { + if (ret != Py_None) { + PyErr_SetString(PyExc_ValueError, "the return value must be None"); + PyC_Err_PrintWithFunc(py_func); + } - Py_DECREF(ret); - } + Py_DECREF(ret); + } - if (use_gil) { - PyGILState_Release(gilstate); - } + if (use_gil) { + PyGILState_Release(gilstate); + } - if (!is_write_ok) { - pyrna_write_set(false); - } + if (!is_write_ok) { + pyrna_write_set(false); + } } static int bpy_prop_int_get_cb(struct PointerRNA *ptr, struct PropertyRNA *prop) { - PyObject **py_data = RNA_property_py_data_get(prop); - PyObject *py_func; - PyObject *args; - PyObject *self; - PyObject *ret; - PyGILState_STATE gilstate; - bool use_gil; - const bool is_write_ok = pyrna_write_check(); - int value; + PyObject **py_data = RNA_property_py_data_get(prop); + PyObject *py_func; + PyObject *args; + PyObject *self; + PyObject *ret; + PyGILState_STATE gilstate; + bool use_gil; + const bool is_write_ok = pyrna_write_check(); + int value; - BLI_assert(py_data != NULL); + BLI_assert(py_data != NULL); - if (!is_write_ok) { - pyrna_write_set(true); - } + if (!is_write_ok) { + pyrna_write_set(true); + } - use_gil = true; /* !PyC_IsInterpreterActive(); */ + use_gil = true; /* !PyC_IsInterpreterActive(); */ - if (use_gil) { - gilstate = PyGILState_Ensure(); - } + if (use_gil) { + gilstate = PyGILState_Ensure(); + } - py_func = py_data[BPY_DATA_CB_SLOT_GET]; + py_func = py_data[BPY_DATA_CB_SLOT_GET]; - args = PyTuple_New(1); - self = pyrna_struct_as_instance(ptr); - PyTuple_SET_ITEM(args, 0, self); + args = PyTuple_New(1); + self = pyrna_struct_as_instance(ptr); + PyTuple_SET_ITEM(args, 0, self); - ret = PyObject_CallObject(py_func, args); + ret = PyObject_CallObject(py_func, args); - Py_DECREF(args); + Py_DECREF(args); - if (ret == NULL) { - PyC_Err_PrintWithFunc(py_func); - value = 0.0f; - } - else { - value = PyC_Long_AsI32(ret); + if (ret == NULL) { + PyC_Err_PrintWithFunc(py_func); + value = 0.0f; + } + else { + value = PyC_Long_AsI32(ret); - if (value == -1 && PyErr_Occurred()) { - PyC_Err_PrintWithFunc(py_func); - value = 0; - } + if (value == -1 && PyErr_Occurred()) { + PyC_Err_PrintWithFunc(py_func); + value = 0; + } - Py_DECREF(ret); - } + Py_DECREF(ret); + } - if (use_gil) { - PyGILState_Release(gilstate); - } + if (use_gil) { + PyGILState_Release(gilstate); + } - if (!is_write_ok) { - pyrna_write_set(false); - } + if (!is_write_ok) { + pyrna_write_set(false); + } - return value; + return value; } static void bpy_prop_int_set_cb(struct PointerRNA *ptr, struct PropertyRNA *prop, int value) { - PyObject **py_data = RNA_property_py_data_get(prop); - PyObject *py_func; - PyObject *args; - PyObject *self; - PyObject *ret; - PyGILState_STATE gilstate; - bool use_gil; - const bool is_write_ok = pyrna_write_check(); + PyObject **py_data = RNA_property_py_data_get(prop); + PyObject *py_func; + PyObject *args; + PyObject *self; + PyObject *ret; + PyGILState_STATE gilstate; + bool use_gil; + const bool is_write_ok = pyrna_write_check(); - BLI_assert(py_data != NULL); + BLI_assert(py_data != NULL); - if (!is_write_ok) { - pyrna_write_set(true); - } + if (!is_write_ok) { + pyrna_write_set(true); + } - use_gil = true; /* !PyC_IsInterpreterActive(); */ + use_gil = true; /* !PyC_IsInterpreterActive(); */ - if (use_gil) { - gilstate = PyGILState_Ensure(); - } + if (use_gil) { + gilstate = PyGILState_Ensure(); + } - py_func = py_data[BPY_DATA_CB_SLOT_SET]; + py_func = py_data[BPY_DATA_CB_SLOT_SET]; - args = PyTuple_New(2); - self = pyrna_struct_as_instance(ptr); - PyTuple_SET_ITEM(args, 0, self); + args = PyTuple_New(2); + self = pyrna_struct_as_instance(ptr); + PyTuple_SET_ITEM(args, 0, self); - PyTuple_SET_ITEM(args, 1, PyLong_FromLong(value)); + PyTuple_SET_ITEM(args, 1, PyLong_FromLong(value)); - ret = PyObject_CallObject(py_func, args); + ret = PyObject_CallObject(py_func, args); - Py_DECREF(args); + Py_DECREF(args); - if (ret == NULL) { - PyC_Err_PrintWithFunc(py_func); - } - else { - if (ret != Py_None) { - PyErr_SetString(PyExc_ValueError, "the return value must be None"); - PyC_Err_PrintWithFunc(py_func); - } + if (ret == NULL) { + PyC_Err_PrintWithFunc(py_func); + } + else { + if (ret != Py_None) { + PyErr_SetString(PyExc_ValueError, "the return value must be None"); + PyC_Err_PrintWithFunc(py_func); + } - Py_DECREF(ret); - } + Py_DECREF(ret); + } - if (use_gil) { - PyGILState_Release(gilstate); - } + if (use_gil) { + PyGILState_Release(gilstate); + } - if (!is_write_ok) { - pyrna_write_set(false); - } + if (!is_write_ok) { + pyrna_write_set(false); + } } -static void bpy_prop_int_array_get_cb(struct PointerRNA *ptr, struct PropertyRNA *prop, int *values) +static void bpy_prop_int_array_get_cb(struct PointerRNA *ptr, + struct PropertyRNA *prop, + int *values) { - PyObject **py_data = RNA_property_py_data_get(prop); - PyObject *py_func; - PyObject *args; - PyObject *self; - PyObject *ret; - PyGILState_STATE gilstate; - bool use_gil; - const bool is_write_ok = pyrna_write_check(); - int i, len = RNA_property_array_length(ptr, prop); - - BLI_assert(py_data != NULL); - - if (!is_write_ok) { - pyrna_write_set(true); - } - - use_gil = true; /* !PyC_IsInterpreterActive(); */ - - if (use_gil) { - gilstate = PyGILState_Ensure(); - } - - py_func = py_data[BPY_DATA_CB_SLOT_GET]; - - args = PyTuple_New(1); - self = pyrna_struct_as_instance(ptr); - PyTuple_SET_ITEM(args, 0, self); - - ret = PyObject_CallObject(py_func, args); - - Py_DECREF(args); - - if (ret == NULL) { - PyC_Err_PrintWithFunc(py_func); - - for (i = 0; i < len; ++i) { - values[i] = 0; - } - } - else { - if (PyC_AsArray(values, ret, len, &PyLong_Type, false, "IntVectorProperty get") == -1) { - PyC_Err_PrintWithFunc(py_func); - - for (i = 0; i < len; ++i) { - values[i] = 0; - } - - /* PyC_AsArray decrements refcount internally on error */ - } - else { - Py_DECREF(ret); - } - } - - if (use_gil) { - PyGILState_Release(gilstate); - } - - if (!is_write_ok) { - pyrna_write_set(false); - } + PyObject **py_data = RNA_property_py_data_get(prop); + PyObject *py_func; + PyObject *args; + PyObject *self; + PyObject *ret; + PyGILState_STATE gilstate; + bool use_gil; + const bool is_write_ok = pyrna_write_check(); + int i, len = RNA_property_array_length(ptr, prop); + + BLI_assert(py_data != NULL); + + if (!is_write_ok) { + pyrna_write_set(true); + } + + use_gil = true; /* !PyC_IsInterpreterActive(); */ + + if (use_gil) { + gilstate = PyGILState_Ensure(); + } + + py_func = py_data[BPY_DATA_CB_SLOT_GET]; + + args = PyTuple_New(1); + self = pyrna_struct_as_instance(ptr); + PyTuple_SET_ITEM(args, 0, self); + + ret = PyObject_CallObject(py_func, args); + + Py_DECREF(args); + + if (ret == NULL) { + PyC_Err_PrintWithFunc(py_func); + + for (i = 0; i < len; ++i) { + values[i] = 0; + } + } + else { + if (PyC_AsArray(values, ret, len, &PyLong_Type, false, "IntVectorProperty get") == -1) { + PyC_Err_PrintWithFunc(py_func); + + for (i = 0; i < len; ++i) { + values[i] = 0; + } + + /* PyC_AsArray decrements refcount internally on error */ + } + else { + Py_DECREF(ret); + } + } + + if (use_gil) { + PyGILState_Release(gilstate); + } + + if (!is_write_ok) { + pyrna_write_set(false); + } } -static void bpy_prop_int_array_set_cb(struct PointerRNA *ptr, struct PropertyRNA *prop, const int *values) +static void bpy_prop_int_array_set_cb(struct PointerRNA *ptr, + struct PropertyRNA *prop, + const int *values) { - PyObject **py_data = RNA_property_py_data_get(prop); - PyObject *py_func; - PyObject *args; - PyObject *self; - PyObject *ret; - PyObject *py_values; - PyGILState_STATE gilstate; - bool use_gil; - const bool is_write_ok = pyrna_write_check(); - int len = RNA_property_array_length(ptr, prop); + PyObject **py_data = RNA_property_py_data_get(prop); + PyObject *py_func; + PyObject *args; + PyObject *self; + PyObject *ret; + PyObject *py_values; + PyGILState_STATE gilstate; + bool use_gil; + const bool is_write_ok = pyrna_write_check(); + int len = RNA_property_array_length(ptr, prop); - BLI_assert(py_data != NULL); + BLI_assert(py_data != NULL); - if (!is_write_ok) { - pyrna_write_set(true); - } + if (!is_write_ok) { + pyrna_write_set(true); + } - use_gil = true; /* !PyC_IsInterpreterActive(); */ + use_gil = true; /* !PyC_IsInterpreterActive(); */ - if (use_gil) { - gilstate = PyGILState_Ensure(); - } + if (use_gil) { + gilstate = PyGILState_Ensure(); + } - py_func = py_data[BPY_DATA_CB_SLOT_SET]; + py_func = py_data[BPY_DATA_CB_SLOT_SET]; - args = PyTuple_New(2); - self = pyrna_struct_as_instance(ptr); - PyTuple_SET_ITEM(args, 0, self); + args = PyTuple_New(2); + self = pyrna_struct_as_instance(ptr); + PyTuple_SET_ITEM(args, 0, self); - py_values = PyC_Tuple_PackArray_I32(values, len); - PyTuple_SET_ITEM(args, 1, py_values); + py_values = PyC_Tuple_PackArray_I32(values, len); + PyTuple_SET_ITEM(args, 1, py_values); - ret = PyObject_CallObject(py_func, args); + ret = PyObject_CallObject(py_func, args); - Py_DECREF(args); + Py_DECREF(args); - if (ret == NULL) { - PyC_Err_PrintWithFunc(py_func); - } - else { - if (ret != Py_None) { - PyErr_SetString(PyExc_ValueError, "the return value must be None"); - PyC_Err_PrintWithFunc(py_func); - } + if (ret == NULL) { + PyC_Err_PrintWithFunc(py_func); + } + else { + if (ret != Py_None) { + PyErr_SetString(PyExc_ValueError, "the return value must be None"); + PyC_Err_PrintWithFunc(py_func); + } - Py_DECREF(ret); - } + Py_DECREF(ret); + } - if (use_gil) { - PyGILState_Release(gilstate); - } + if (use_gil) { + PyGILState_Release(gilstate); + } - if (!is_write_ok) { - pyrna_write_set(false); - } + if (!is_write_ok) { + pyrna_write_set(false); + } } static float bpy_prop_float_get_cb(struct PointerRNA *ptr, struct PropertyRNA *prop) { - PyObject **py_data = RNA_property_py_data_get(prop); - PyObject *py_func; - PyObject *args; - PyObject *self; - PyObject *ret; - PyGILState_STATE gilstate; - bool use_gil; - const bool is_write_ok = pyrna_write_check(); - float value; + PyObject **py_data = RNA_property_py_data_get(prop); + PyObject *py_func; + PyObject *args; + PyObject *self; + PyObject *ret; + PyGILState_STATE gilstate; + bool use_gil; + const bool is_write_ok = pyrna_write_check(); + float value; - BLI_assert(py_data != NULL); + BLI_assert(py_data != NULL); - if (!is_write_ok) { - pyrna_write_set(true); - } + if (!is_write_ok) { + pyrna_write_set(true); + } - use_gil = true; /* !PyC_IsInterpreterActive(); */ + use_gil = true; /* !PyC_IsInterpreterActive(); */ - if (use_gil) { - gilstate = PyGILState_Ensure(); - } + if (use_gil) { + gilstate = PyGILState_Ensure(); + } - py_func = py_data[BPY_DATA_CB_SLOT_GET]; + py_func = py_data[BPY_DATA_CB_SLOT_GET]; - args = PyTuple_New(1); - self = pyrna_struct_as_instance(ptr); - PyTuple_SET_ITEM(args, 0, self); + args = PyTuple_New(1); + self = pyrna_struct_as_instance(ptr); + PyTuple_SET_ITEM(args, 0, self); - ret = PyObject_CallObject(py_func, args); + ret = PyObject_CallObject(py_func, args); - Py_DECREF(args); + Py_DECREF(args); - if (ret == NULL) { - PyC_Err_PrintWithFunc(py_func); - value = 0.0f; - } - else { - value = PyFloat_AsDouble(ret); + if (ret == NULL) { + PyC_Err_PrintWithFunc(py_func); + value = 0.0f; + } + else { + value = PyFloat_AsDouble(ret); - if (value == -1.0f && PyErr_Occurred()) { - PyC_Err_PrintWithFunc(py_func); - value = 0.0f; - } + if (value == -1.0f && PyErr_Occurred()) { + PyC_Err_PrintWithFunc(py_func); + value = 0.0f; + } - Py_DECREF(ret); - } + Py_DECREF(ret); + } - if (use_gil) { - PyGILState_Release(gilstate); - } + if (use_gil) { + PyGILState_Release(gilstate); + } - if (!is_write_ok) { - pyrna_write_set(false); - } + if (!is_write_ok) { + pyrna_write_set(false); + } - return value; + return value; } static void bpy_prop_float_set_cb(struct PointerRNA *ptr, struct PropertyRNA *prop, float value) { - PyObject **py_data = RNA_property_py_data_get(prop); - PyObject *py_func; - PyObject *args; - PyObject *self; - PyObject *ret; - PyGILState_STATE gilstate; - bool use_gil; - const bool is_write_ok = pyrna_write_check(); + PyObject **py_data = RNA_property_py_data_get(prop); + PyObject *py_func; + PyObject *args; + PyObject *self; + PyObject *ret; + PyGILState_STATE gilstate; + bool use_gil; + const bool is_write_ok = pyrna_write_check(); - BLI_assert(py_data != NULL); + BLI_assert(py_data != NULL); - if (!is_write_ok) { - pyrna_write_set(true); - } + if (!is_write_ok) { + pyrna_write_set(true); + } - use_gil = true; /* !PyC_IsInterpreterActive(); */ + use_gil = true; /* !PyC_IsInterpreterActive(); */ - if (use_gil) { - gilstate = PyGILState_Ensure(); - } + if (use_gil) { + gilstate = PyGILState_Ensure(); + } - py_func = py_data[BPY_DATA_CB_SLOT_SET]; + py_func = py_data[BPY_DATA_CB_SLOT_SET]; - args = PyTuple_New(2); - self = pyrna_struct_as_instance(ptr); - PyTuple_SET_ITEM(args, 0, self); + args = PyTuple_New(2); + self = pyrna_struct_as_instance(ptr); + PyTuple_SET_ITEM(args, 0, self); - PyTuple_SET_ITEM(args, 1, PyFloat_FromDouble(value)); + PyTuple_SET_ITEM(args, 1, PyFloat_FromDouble(value)); - ret = PyObject_CallObject(py_func, args); + ret = PyObject_CallObject(py_func, args); - Py_DECREF(args); + Py_DECREF(args); - if (ret == NULL) { - PyC_Err_PrintWithFunc(py_func); - } - else { - if (ret != Py_None) { - PyErr_SetString(PyExc_ValueError, "the return value must be None"); - PyC_Err_PrintWithFunc(py_func); - } + if (ret == NULL) { + PyC_Err_PrintWithFunc(py_func); + } + else { + if (ret != Py_None) { + PyErr_SetString(PyExc_ValueError, "the return value must be None"); + PyC_Err_PrintWithFunc(py_func); + } - Py_DECREF(ret); - } + Py_DECREF(ret); + } - if (use_gil) { - PyGILState_Release(gilstate); - } + if (use_gil) { + PyGILState_Release(gilstate); + } - if (!is_write_ok) { - pyrna_write_set(false); - } + if (!is_write_ok) { + pyrna_write_set(false); + } } -static void bpy_prop_float_array_get_cb(struct PointerRNA *ptr, struct PropertyRNA *prop, float *values) +static void bpy_prop_float_array_get_cb(struct PointerRNA *ptr, + struct PropertyRNA *prop, + float *values) { - PyObject **py_data = RNA_property_py_data_get(prop); - PyObject *py_func; - PyObject *args; - PyObject *self; - PyObject *ret; - PyGILState_STATE gilstate; - bool use_gil; - const bool is_write_ok = pyrna_write_check(); - int i, len = RNA_property_array_length(ptr, prop); - - BLI_assert(py_data != NULL); - - if (!is_write_ok) { - pyrna_write_set(true); - } - - use_gil = true; /* !PyC_IsInterpreterActive(); */ - - if (use_gil) { - gilstate = PyGILState_Ensure(); - } - - py_func = py_data[BPY_DATA_CB_SLOT_GET]; - - args = PyTuple_New(1); - self = pyrna_struct_as_instance(ptr); - PyTuple_SET_ITEM(args, 0, self); - - ret = PyObject_CallObject(py_func, args); - - Py_DECREF(args); - - if (ret == NULL) { - PyC_Err_PrintWithFunc(py_func); - - for (i = 0; i < len; ++i) { - values[i] = 0.0f; - } - } - else { - if (PyC_AsArray(values, ret, len, &PyFloat_Type, false, "FloatVectorProperty get") == -1) { - PyC_Err_PrintWithFunc(py_func); - - for (i = 0; i < len; ++i) { - values[i] = 0.0f; - } - - /* PyC_AsArray decrements refcount internally on error */ - } - else { - Py_DECREF(ret); - } - } - - if (use_gil) { - PyGILState_Release(gilstate); - } - - if (!is_write_ok) { - pyrna_write_set(false); - } + PyObject **py_data = RNA_property_py_data_get(prop); + PyObject *py_func; + PyObject *args; + PyObject *self; + PyObject *ret; + PyGILState_STATE gilstate; + bool use_gil; + const bool is_write_ok = pyrna_write_check(); + int i, len = RNA_property_array_length(ptr, prop); + + BLI_assert(py_data != NULL); + + if (!is_write_ok) { + pyrna_write_set(true); + } + + use_gil = true; /* !PyC_IsInterpreterActive(); */ + + if (use_gil) { + gilstate = PyGILState_Ensure(); + } + + py_func = py_data[BPY_DATA_CB_SLOT_GET]; + + args = PyTuple_New(1); + self = pyrna_struct_as_instance(ptr); + PyTuple_SET_ITEM(args, 0, self); + + ret = PyObject_CallObject(py_func, args); + + Py_DECREF(args); + + if (ret == NULL) { + PyC_Err_PrintWithFunc(py_func); + + for (i = 0; i < len; ++i) { + values[i] = 0.0f; + } + } + else { + if (PyC_AsArray(values, ret, len, &PyFloat_Type, false, "FloatVectorProperty get") == -1) { + PyC_Err_PrintWithFunc(py_func); + + for (i = 0; i < len; ++i) { + values[i] = 0.0f; + } + + /* PyC_AsArray decrements refcount internally on error */ + } + else { + Py_DECREF(ret); + } + } + + if (use_gil) { + PyGILState_Release(gilstate); + } + + if (!is_write_ok) { + pyrna_write_set(false); + } } -static void bpy_prop_float_array_set_cb(struct PointerRNA *ptr, struct PropertyRNA *prop, const float *values) +static void bpy_prop_float_array_set_cb(struct PointerRNA *ptr, + struct PropertyRNA *prop, + const float *values) { - PyObject **py_data = RNA_property_py_data_get(prop); - PyObject *py_func; - PyObject *args; - PyObject *self; - PyObject *ret; - PyObject *py_values; - PyGILState_STATE gilstate; - bool use_gil; - const bool is_write_ok = pyrna_write_check(); - int len = RNA_property_array_length(ptr, prop); + PyObject **py_data = RNA_property_py_data_get(prop); + PyObject *py_func; + PyObject *args; + PyObject *self; + PyObject *ret; + PyObject *py_values; + PyGILState_STATE gilstate; + bool use_gil; + const bool is_write_ok = pyrna_write_check(); + int len = RNA_property_array_length(ptr, prop); - BLI_assert(py_data != NULL); + BLI_assert(py_data != NULL); - if (!is_write_ok) { - pyrna_write_set(true); - } + if (!is_write_ok) { + pyrna_write_set(true); + } - use_gil = true; /* !PyC_IsInterpreterActive(); */ + use_gil = true; /* !PyC_IsInterpreterActive(); */ - if (use_gil) { - gilstate = PyGILState_Ensure(); - } + if (use_gil) { + gilstate = PyGILState_Ensure(); + } - py_func = py_data[BPY_DATA_CB_SLOT_SET]; + py_func = py_data[BPY_DATA_CB_SLOT_SET]; - args = PyTuple_New(2); - self = pyrna_struct_as_instance(ptr); - PyTuple_SET_ITEM(args, 0, self); + args = PyTuple_New(2); + self = pyrna_struct_as_instance(ptr); + PyTuple_SET_ITEM(args, 0, self); - py_values = PyC_Tuple_PackArray_F32(values, len); - PyTuple_SET_ITEM(args, 1, py_values); + py_values = PyC_Tuple_PackArray_F32(values, len); + PyTuple_SET_ITEM(args, 1, py_values); - ret = PyObject_CallObject(py_func, args); + ret = PyObject_CallObject(py_func, args); - Py_DECREF(args); + Py_DECREF(args); - if (ret == NULL) { - PyC_Err_PrintWithFunc(py_func); - } - else { - if (ret != Py_None) { - PyErr_SetString(PyExc_ValueError, "the return value must be None"); - PyC_Err_PrintWithFunc(py_func); - } + if (ret == NULL) { + PyC_Err_PrintWithFunc(py_func); + } + else { + if (ret != Py_None) { + PyErr_SetString(PyExc_ValueError, "the return value must be None"); + PyC_Err_PrintWithFunc(py_func); + } - Py_DECREF(ret); - } + Py_DECREF(ret); + } - if (use_gil) { - PyGILState_Release(gilstate); - } + if (use_gil) { + PyGILState_Release(gilstate); + } - if (!is_write_ok) { - pyrna_write_set(false); - } + if (!is_write_ok) { + pyrna_write_set(false); + } } static void bpy_prop_string_get_cb(struct PointerRNA *ptr, struct PropertyRNA *prop, char *value) { - PyObject **py_data = RNA_property_py_data_get(prop); - PyObject *py_func; - PyObject *args; - PyObject *self; - PyObject *ret; - PyGILState_STATE gilstate; - bool use_gil; - const bool is_write_ok = pyrna_write_check(); - - BLI_assert(py_data != NULL); - - if (!is_write_ok) { - pyrna_write_set(true); - } - - use_gil = true; /* !PyC_IsInterpreterActive(); */ - - if (use_gil) { - gilstate = PyGILState_Ensure(); - } - - py_func = py_data[BPY_DATA_CB_SLOT_GET]; - - args = PyTuple_New(1); - self = pyrna_struct_as_instance(ptr); - PyTuple_SET_ITEM(args, 0, self); - - ret = PyObject_CallObject(py_func, args); - - Py_DECREF(args); - - if (ret == NULL) { - PyC_Err_PrintWithFunc(py_func); - value[0] = '\0'; - } - else if (!PyUnicode_Check(ret)) { - PyErr_Format(PyExc_TypeError, - "return value must be a string, not %.200s", - Py_TYPE(ret)->tp_name); - PyC_Err_PrintWithFunc(py_func); - value[0] = '\0'; - Py_DECREF(ret); - } - else { - Py_ssize_t length; - const char *buffer = _PyUnicode_AsStringAndSize(ret, &length); - memcpy(value, buffer, length + 1); - Py_DECREF(ret); - } - - if (use_gil) { - PyGILState_Release(gilstate); - } - - if (!is_write_ok) { - pyrna_write_set(false); - } + PyObject **py_data = RNA_property_py_data_get(prop); + PyObject *py_func; + PyObject *args; + PyObject *self; + PyObject *ret; + PyGILState_STATE gilstate; + bool use_gil; + const bool is_write_ok = pyrna_write_check(); + + BLI_assert(py_data != NULL); + + if (!is_write_ok) { + pyrna_write_set(true); + } + + use_gil = true; /* !PyC_IsInterpreterActive(); */ + + if (use_gil) { + gilstate = PyGILState_Ensure(); + } + + py_func = py_data[BPY_DATA_CB_SLOT_GET]; + + args = PyTuple_New(1); + self = pyrna_struct_as_instance(ptr); + PyTuple_SET_ITEM(args, 0, self); + + ret = PyObject_CallObject(py_func, args); + + Py_DECREF(args); + + if (ret == NULL) { + PyC_Err_PrintWithFunc(py_func); + value[0] = '\0'; + } + else if (!PyUnicode_Check(ret)) { + PyErr_Format( + PyExc_TypeError, "return value must be a string, not %.200s", Py_TYPE(ret)->tp_name); + PyC_Err_PrintWithFunc(py_func); + value[0] = '\0'; + Py_DECREF(ret); + } + else { + Py_ssize_t length; + const char *buffer = _PyUnicode_AsStringAndSize(ret, &length); + memcpy(value, buffer, length + 1); + Py_DECREF(ret); + } + + if (use_gil) { + PyGILState_Release(gilstate); + } + + if (!is_write_ok) { + pyrna_write_set(false); + } } static int bpy_prop_string_length_cb(struct PointerRNA *ptr, struct PropertyRNA *prop) { - PyObject **py_data = RNA_property_py_data_get(prop); - PyObject *py_func; - PyObject *args; - PyObject *self; - PyObject *ret; - PyGILState_STATE gilstate; - bool use_gil; - const bool is_write_ok = pyrna_write_check(); - int length; - - BLI_assert(py_data != NULL); - - if (!is_write_ok) { - pyrna_write_set(true); - } - - use_gil = true; /* !PyC_IsInterpreterActive(); */ - - if (use_gil) { - gilstate = PyGILState_Ensure(); - } - - py_func = py_data[BPY_DATA_CB_SLOT_GET]; - - args = PyTuple_New(1); - self = pyrna_struct_as_instance(ptr); - PyTuple_SET_ITEM(args, 0, self); - - ret = PyObject_CallObject(py_func, args); - - Py_DECREF(args); - - if (ret == NULL) { - PyC_Err_PrintWithFunc(py_func); - length = 0; - } - else if (!PyUnicode_Check(ret)) { - PyErr_Format(PyExc_TypeError, - "return value must be a string, not %.200s", - Py_TYPE(ret)->tp_name); - PyC_Err_PrintWithFunc(py_func); - length = 0; - Py_DECREF(ret); - } - else { - Py_ssize_t length_ssize_t = 0; - _PyUnicode_AsStringAndSize(ret, &length_ssize_t); - length = length_ssize_t; - Py_DECREF(ret); - } - - if (use_gil) { - PyGILState_Release(gilstate); - } - - if (!is_write_ok) { - pyrna_write_set(false); - } - - return length; + PyObject **py_data = RNA_property_py_data_get(prop); + PyObject *py_func; + PyObject *args; + PyObject *self; + PyObject *ret; + PyGILState_STATE gilstate; + bool use_gil; + const bool is_write_ok = pyrna_write_check(); + int length; + + BLI_assert(py_data != NULL); + + if (!is_write_ok) { + pyrna_write_set(true); + } + + use_gil = true; /* !PyC_IsInterpreterActive(); */ + + if (use_gil) { + gilstate = PyGILState_Ensure(); + } + + py_func = py_data[BPY_DATA_CB_SLOT_GET]; + + args = PyTuple_New(1); + self = pyrna_struct_as_instance(ptr); + PyTuple_SET_ITEM(args, 0, self); + + ret = PyObject_CallObject(py_func, args); + + Py_DECREF(args); + + if (ret == NULL) { + PyC_Err_PrintWithFunc(py_func); + length = 0; + } + else if (!PyUnicode_Check(ret)) { + PyErr_Format( + PyExc_TypeError, "return value must be a string, not %.200s", Py_TYPE(ret)->tp_name); + PyC_Err_PrintWithFunc(py_func); + length = 0; + Py_DECREF(ret); + } + else { + Py_ssize_t length_ssize_t = 0; + _PyUnicode_AsStringAndSize(ret, &length_ssize_t); + length = length_ssize_t; + Py_DECREF(ret); + } + + if (use_gil) { + PyGILState_Release(gilstate); + } + + if (!is_write_ok) { + pyrna_write_set(false); + } + + return length; } -static void bpy_prop_string_set_cb(struct PointerRNA *ptr, struct PropertyRNA *prop, const char *value) +static void bpy_prop_string_set_cb(struct PointerRNA *ptr, + struct PropertyRNA *prop, + const char *value) { - PyObject **py_data = RNA_property_py_data_get(prop); - PyObject *py_func; - PyObject *args; - PyObject *self; - PyObject *ret; - PyGILState_STATE gilstate; - bool use_gil; - const bool is_write_ok = pyrna_write_check(); - PyObject *py_value; - - BLI_assert(py_data != NULL); - - if (!is_write_ok) { - pyrna_write_set(true); - } - - use_gil = true; /* !PyC_IsInterpreterActive(); */ - - if (use_gil) { - gilstate = PyGILState_Ensure(); - } - - py_func = py_data[BPY_DATA_CB_SLOT_SET]; - - args = PyTuple_New(2); - self = pyrna_struct_as_instance(ptr); - PyTuple_SET_ITEM(args, 0, self); - - py_value = PyUnicode_FromString(value); - if (!py_value) { - PyErr_SetString(PyExc_ValueError, "the return value must be a string"); - PyC_Err_PrintWithFunc(py_func); - } - else { - PyTuple_SET_ITEM(args, 1, py_value); - } - - ret = PyObject_CallObject(py_func, args); - - Py_DECREF(args); - - if (ret == NULL) { - PyC_Err_PrintWithFunc(py_func); - } - else { - if (ret != Py_None) { - PyErr_SetString(PyExc_ValueError, "the return value must be None"); - PyC_Err_PrintWithFunc(py_func); - } - - Py_DECREF(ret); - } - - if (use_gil) { - PyGILState_Release(gilstate); - } - - if (!is_write_ok) { - pyrna_write_set(false); - } + PyObject **py_data = RNA_property_py_data_get(prop); + PyObject *py_func; + PyObject *args; + PyObject *self; + PyObject *ret; + PyGILState_STATE gilstate; + bool use_gil; + const bool is_write_ok = pyrna_write_check(); + PyObject *py_value; + + BLI_assert(py_data != NULL); + + if (!is_write_ok) { + pyrna_write_set(true); + } + + use_gil = true; /* !PyC_IsInterpreterActive(); */ + + if (use_gil) { + gilstate = PyGILState_Ensure(); + } + + py_func = py_data[BPY_DATA_CB_SLOT_SET]; + + args = PyTuple_New(2); + self = pyrna_struct_as_instance(ptr); + PyTuple_SET_ITEM(args, 0, self); + + py_value = PyUnicode_FromString(value); + if (!py_value) { + PyErr_SetString(PyExc_ValueError, "the return value must be a string"); + PyC_Err_PrintWithFunc(py_func); + } + else { + PyTuple_SET_ITEM(args, 1, py_value); + } + + ret = PyObject_CallObject(py_func, args); + + Py_DECREF(args); + + if (ret == NULL) { + PyC_Err_PrintWithFunc(py_func); + } + else { + if (ret != Py_None) { + PyErr_SetString(PyExc_ValueError, "the return value must be None"); + PyC_Err_PrintWithFunc(py_func); + } + + Py_DECREF(ret); + } + + if (use_gil) { + PyGILState_Release(gilstate); + } + + if (!is_write_ok) { + pyrna_write_set(false); + } } static int bpy_prop_enum_get_cb(struct PointerRNA *ptr, struct PropertyRNA *prop) { - PyObject **py_data = RNA_property_py_data_get(prop); - PyObject *py_func; - PyObject *args; - PyObject *self; - PyObject *ret; - PyGILState_STATE gilstate; - bool use_gil; - const bool is_write_ok = pyrna_write_check(); - int value; + PyObject **py_data = RNA_property_py_data_get(prop); + PyObject *py_func; + PyObject *args; + PyObject *self; + PyObject *ret; + PyGILState_STATE gilstate; + bool use_gil; + const bool is_write_ok = pyrna_write_check(); + int value; - BLI_assert(py_data != NULL); + BLI_assert(py_data != NULL); - if (!is_write_ok) { - pyrna_write_set(true); - } + if (!is_write_ok) { + pyrna_write_set(true); + } - use_gil = true; /* !PyC_IsInterpreterActive(); */ + use_gil = true; /* !PyC_IsInterpreterActive(); */ - if (use_gil) { - gilstate = PyGILState_Ensure(); - } + if (use_gil) { + gilstate = PyGILState_Ensure(); + } - py_func = py_data[BPY_DATA_CB_SLOT_GET]; + py_func = py_data[BPY_DATA_CB_SLOT_GET]; - args = PyTuple_New(1); - self = pyrna_struct_as_instance(ptr); - PyTuple_SET_ITEM(args, 0, self); + args = PyTuple_New(1); + self = pyrna_struct_as_instance(ptr); + PyTuple_SET_ITEM(args, 0, self); - ret = PyObject_CallObject(py_func, args); + ret = PyObject_CallObject(py_func, args); - Py_DECREF(args); + Py_DECREF(args); - if (ret == NULL) { - PyC_Err_PrintWithFunc(py_func); - value = RNA_property_enum_get_default(ptr, prop); - } - else { - value = PyC_Long_AsI32(ret); + if (ret == NULL) { + PyC_Err_PrintWithFunc(py_func); + value = RNA_property_enum_get_default(ptr, prop); + } + else { + value = PyC_Long_AsI32(ret); - if (value == -1 && PyErr_Occurred()) { - PyC_Err_PrintWithFunc(py_func); - value = RNA_property_enum_get_default(ptr, prop); - } + if (value == -1 && PyErr_Occurred()) { + PyC_Err_PrintWithFunc(py_func); + value = RNA_property_enum_get_default(ptr, prop); + } - Py_DECREF(ret); - } + Py_DECREF(ret); + } - if (use_gil) { - PyGILState_Release(gilstate); - } + if (use_gil) { + PyGILState_Release(gilstate); + } - if (!is_write_ok) { - pyrna_write_set(false); - } + if (!is_write_ok) { + pyrna_write_set(false); + } - return value; + return value; } static void bpy_prop_enum_set_cb(struct PointerRNA *ptr, struct PropertyRNA *prop, int value) { - PyObject **py_data = RNA_property_py_data_get(prop); - PyObject *py_func; - PyObject *args; - PyObject *self; - PyObject *ret; - PyGILState_STATE gilstate; - bool use_gil; - const bool is_write_ok = pyrna_write_check(); + PyObject **py_data = RNA_property_py_data_get(prop); + PyObject *py_func; + PyObject *args; + PyObject *self; + PyObject *ret; + PyGILState_STATE gilstate; + bool use_gil; + const bool is_write_ok = pyrna_write_check(); - BLI_assert(py_data != NULL); + BLI_assert(py_data != NULL); - if (!is_write_ok) { - pyrna_write_set(true); - } + if (!is_write_ok) { + pyrna_write_set(true); + } - use_gil = true; /* !PyC_IsInterpreterActive(); */ + use_gil = true; /* !PyC_IsInterpreterActive(); */ - if (use_gil) { - gilstate = PyGILState_Ensure(); - } + if (use_gil) { + gilstate = PyGILState_Ensure(); + } - py_func = py_data[BPY_DATA_CB_SLOT_SET]; + py_func = py_data[BPY_DATA_CB_SLOT_SET]; - args = PyTuple_New(2); - self = pyrna_struct_as_instance(ptr); - PyTuple_SET_ITEM(args, 0, self); + args = PyTuple_New(2); + self = pyrna_struct_as_instance(ptr); + PyTuple_SET_ITEM(args, 0, self); - PyTuple_SET_ITEM(args, 1, PyLong_FromLong(value)); + PyTuple_SET_ITEM(args, 1, PyLong_FromLong(value)); - ret = PyObject_CallObject(py_func, args); + ret = PyObject_CallObject(py_func, args); - Py_DECREF(args); + Py_DECREF(args); - if (ret == NULL) { - PyC_Err_PrintWithFunc(py_func); - } - else { - if (ret != Py_None) { - PyErr_SetString(PyExc_ValueError, "the return value must be None"); - PyC_Err_PrintWithFunc(py_func); - } + if (ret == NULL) { + PyC_Err_PrintWithFunc(py_func); + } + else { + if (ret != Py_None) { + PyErr_SetString(PyExc_ValueError, "the return value must be None"); + PyC_Err_PrintWithFunc(py_func); + } - Py_DECREF(ret); - } + Py_DECREF(ret); + } - if (use_gil) { - PyGILState_Release(gilstate); - } + if (use_gil) { + PyGILState_Release(gilstate); + } - if (!is_write_ok) { - pyrna_write_set(false); - } + if (!is_write_ok) { + pyrna_write_set(false); + } } /* utility function we need for parsing int's in an if statement */ static int py_long_as_int(PyObject *py_long, int *r_int) { - if (PyLong_CheckExact(py_long)) { - *r_int = (int)PyLong_AS_LONG(py_long); - return 0; - } - else { - return -1; - } + if (PyLong_CheckExact(py_long)) { + *r_int = (int)PyLong_AS_LONG(py_long); + return 0; + } + else { + return -1; + } } #if 0 /* copies orig to buf, then sets orig to buf, returns copy length */ static size_t strswapbufcpy(char *buf, const char **orig) { - const char *src = *orig; - char *dst = buf; - size_t i = 0; - *orig = buf; - while ((*dst = *src)) { dst++; src++; i++; } - return i + 1; /* include '\0' */ + const char *src = *orig; + char *dst = buf; + size_t i = 0; + *orig = buf; + while ((*dst = *src)) { dst++; src++; i++; } + return i + 1; /* include '\0' */ } #endif static int icon_id_from_name(const char *name) { - const EnumPropertyItem *item; - int id; - - if (name[0]) { - for (item = rna_enum_icon_items, id = 0; item->identifier; item++, id++) { - if (STREQ(item->name, name)) { - return item->value; - } - } - } - - return 0; + const EnumPropertyItem *item; + int id; + + if (name[0]) { + for (item = rna_enum_icon_items, id = 0; item->identifier; item++, id++) { + if (STREQ(item->name, name)) { + return item->value; + } + } + } + + return 0; } -static const EnumPropertyItem *enum_items_from_py(PyObject *seq_fast, PyObject *def, int *defvalue, const bool is_enum_flag) +static const EnumPropertyItem *enum_items_from_py(PyObject *seq_fast, + PyObject *def, + int *defvalue, + const bool is_enum_flag) { - EnumPropertyItem *items; - PyObject *item; - const Py_ssize_t seq_len = PySequence_Fast_GET_SIZE(seq_fast); - PyObject **seq_fast_items = PySequence_Fast_ITEMS(seq_fast); - Py_ssize_t totbuf = 0; - int i; - short def_used = 0; - const char *def_cmp = NULL; - - if (is_enum_flag) { - if (seq_len > RNA_ENUM_BITFLAG_SIZE) { - PyErr_SetString(PyExc_TypeError, - "EnumProperty(...): maximum " - STRINGIFY(RNA_ENUM_BITFLAG_SIZE) - " members for a ENUM_FLAG type property"); - return NULL; - } - if (def && !PySet_Check(def)) { - PyErr_Format(PyExc_TypeError, - "EnumProperty(...): default option must be a 'set' " - "type when ENUM_FLAG is enabled, not a '%.200s'", - Py_TYPE(def)->tp_name); - return NULL; - } - } - else { - if (def) { - def_cmp = _PyUnicode_AsString(def); - if (def_cmp == NULL) { - PyErr_Format(PyExc_TypeError, - "EnumProperty(...): default option must be a 'str' " - "type when ENUM_FLAG is disabled, not a '%.200s'", - Py_TYPE(def)->tp_name); - return NULL; - } - } - } - - /* blank value */ - *defvalue = 0; - - items = MEM_callocN(sizeof(EnumPropertyItem) * (seq_len + 1), "enum_items_from_py1"); - - for (i = 0; i < seq_len; i++) { - EnumPropertyItem tmp = {0, "", 0, "", ""}; - const char *tmp_icon = NULL; - Py_ssize_t item_size; - Py_ssize_t id_str_size; - Py_ssize_t name_str_size; - Py_ssize_t desc_str_size; - - item = seq_fast_items[i]; - - if ((PyTuple_CheckExact(item)) && - (item_size = PyTuple_GET_SIZE(item)) && - (item_size >= 3 && item_size <= 5) && - (tmp.identifier = _PyUnicode_AsStringAndSize(PyTuple_GET_ITEM(item, 0), &id_str_size)) && - (tmp.name = _PyUnicode_AsStringAndSize(PyTuple_GET_ITEM(item, 1), &name_str_size)) && - (tmp.description = _PyUnicode_AsStringAndSize(PyTuple_GET_ITEM(item, 2), &desc_str_size)) && - /* TODO, number isn't ensured to be unique from the script author */ - (item_size != 4 || py_long_as_int(PyTuple_GET_ITEM(item, 3), &tmp.value) != -1) && - (item_size != 5 || ((py_long_as_int(PyTuple_GET_ITEM(item, 3), &tmp.icon) != -1 || - (tmp_icon = _PyUnicode_AsString(PyTuple_GET_ITEM(item, 3)))) && - py_long_as_int(PyTuple_GET_ITEM(item, 4), &tmp.value) != -1))) - { - if (is_enum_flag) { - if (item_size < 4) { - tmp.value = 1 << i; - } - - if (def && PySet_Contains(def, PyTuple_GET_ITEM(item, 0))) { - *defvalue |= tmp.value; - def_used++; - } - } - else { - if (item_size < 4) { - tmp.value = i; - } - - if (def && def_used == 0 && STREQ(def_cmp, tmp.identifier)) { - *defvalue = tmp.value; - def_used++; /* only ever 1 */ - } - } - - if (tmp_icon) { - tmp.icon = icon_id_from_name(tmp_icon); - } - - items[i] = tmp; - - /* calculate combine string length */ - totbuf += id_str_size + name_str_size + desc_str_size + 3; /* 3 is for '\0's */ - } - else { - MEM_freeN(items); - PyErr_SetString(PyExc_TypeError, - "EnumProperty(...): expected a tuple containing " - "(identifier, name, description) and optionally an " - "icon name and unique number"); - return NULL; - } - - } - - if (is_enum_flag) { - /* strict check that all set members were used */ - if (def && def_used != PySet_GET_SIZE(def)) { - MEM_freeN(items); - - PyErr_Format(PyExc_TypeError, - "EnumProperty(..., default={...}): set has %d unused member(s)", - PySet_GET_SIZE(def) - def_used); - return NULL; - } - } - else { - if (def && def_used == 0) { - MEM_freeN(items); - - PyErr_Format(PyExc_TypeError, - "EnumProperty(..., default=\'%s\'): not found in enum members", - def_cmp); - return NULL; - } - } - - /* disabled duplicating strings because the array can still be freed and - * the strings from it referenced, for now we can't support dynamically - * created strings from python. */ + EnumPropertyItem *items; + PyObject *item; + const Py_ssize_t seq_len = PySequence_Fast_GET_SIZE(seq_fast); + PyObject **seq_fast_items = PySequence_Fast_ITEMS(seq_fast); + Py_ssize_t totbuf = 0; + int i; + short def_used = 0; + const char *def_cmp = NULL; + + if (is_enum_flag) { + if (seq_len > RNA_ENUM_BITFLAG_SIZE) { + PyErr_SetString(PyExc_TypeError, + "EnumProperty(...): maximum " STRINGIFY( + RNA_ENUM_BITFLAG_SIZE) " members for a ENUM_FLAG type property"); + return NULL; + } + if (def && !PySet_Check(def)) { + PyErr_Format(PyExc_TypeError, + "EnumProperty(...): default option must be a 'set' " + "type when ENUM_FLAG is enabled, not a '%.200s'", + Py_TYPE(def)->tp_name); + return NULL; + } + } + else { + if (def) { + def_cmp = _PyUnicode_AsString(def); + if (def_cmp == NULL) { + PyErr_Format(PyExc_TypeError, + "EnumProperty(...): default option must be a 'str' " + "type when ENUM_FLAG is disabled, not a '%.200s'", + Py_TYPE(def)->tp_name); + return NULL; + } + } + } + + /* blank value */ + *defvalue = 0; + + items = MEM_callocN(sizeof(EnumPropertyItem) * (seq_len + 1), "enum_items_from_py1"); + + for (i = 0; i < seq_len; i++) { + EnumPropertyItem tmp = {0, "", 0, "", ""}; + const char *tmp_icon = NULL; + Py_ssize_t item_size; + Py_ssize_t id_str_size; + Py_ssize_t name_str_size; + Py_ssize_t desc_str_size; + + item = seq_fast_items[i]; + + if ((PyTuple_CheckExact(item)) && (item_size = PyTuple_GET_SIZE(item)) && + (item_size >= 3 && item_size <= 5) && + (tmp.identifier = _PyUnicode_AsStringAndSize(PyTuple_GET_ITEM(item, 0), &id_str_size)) && + (tmp.name = _PyUnicode_AsStringAndSize(PyTuple_GET_ITEM(item, 1), &name_str_size)) && + (tmp.description = _PyUnicode_AsStringAndSize(PyTuple_GET_ITEM(item, 2), + &desc_str_size)) && + /* TODO, number isn't ensured to be unique from the script author */ + (item_size != 4 || py_long_as_int(PyTuple_GET_ITEM(item, 3), &tmp.value) != -1) && + (item_size != 5 || ((py_long_as_int(PyTuple_GET_ITEM(item, 3), &tmp.icon) != -1 || + (tmp_icon = _PyUnicode_AsString(PyTuple_GET_ITEM(item, 3)))) && + py_long_as_int(PyTuple_GET_ITEM(item, 4), &tmp.value) != -1))) { + if (is_enum_flag) { + if (item_size < 4) { + tmp.value = 1 << i; + } + + if (def && PySet_Contains(def, PyTuple_GET_ITEM(item, 0))) { + *defvalue |= tmp.value; + def_used++; + } + } + else { + if (item_size < 4) { + tmp.value = i; + } + + if (def && def_used == 0 && STREQ(def_cmp, tmp.identifier)) { + *defvalue = tmp.value; + def_used++; /* only ever 1 */ + } + } + + if (tmp_icon) { + tmp.icon = icon_id_from_name(tmp_icon); + } + + items[i] = tmp; + + /* calculate combine string length */ + totbuf += id_str_size + name_str_size + desc_str_size + 3; /* 3 is for '\0's */ + } + else { + MEM_freeN(items); + PyErr_SetString(PyExc_TypeError, + "EnumProperty(...): expected a tuple containing " + "(identifier, name, description) and optionally an " + "icon name and unique number"); + return NULL; + } + } + + if (is_enum_flag) { + /* strict check that all set members were used */ + if (def && def_used != PySet_GET_SIZE(def)) { + MEM_freeN(items); + + PyErr_Format(PyExc_TypeError, + "EnumProperty(..., default={...}): set has %d unused member(s)", + PySet_GET_SIZE(def) - def_used); + return NULL; + } + } + else { + if (def && def_used == 0) { + MEM_freeN(items); + + PyErr_Format(PyExc_TypeError, + "EnumProperty(..., default=\'%s\'): not found in enum members", + def_cmp); + return NULL; + } + } + + /* disabled duplicating strings because the array can still be freed and + * the strings from it referenced, for now we can't support dynamically + * created strings from python. */ #if 0 - /* this would all work perfectly _but_ the python strings may be freed - * immediately after use, so we need to duplicate them, ugh. - * annoying because it works most of the time without this. */ - { - EnumPropertyItem *items_dup = MEM_mallocN((sizeof(EnumPropertyItem) * (seq_len + 1)) + (sizeof(char) * totbuf), - "enum_items_from_py2"); - EnumPropertyItem *items_ptr = items_dup; - char *buf = ((char *)items_dup) + (sizeof(EnumPropertyItem) * (seq_len + 1)); - memcpy(items_dup, items, sizeof(EnumPropertyItem) * (seq_len + 1)); - for (i = 0; i < seq_len; i++, items_ptr++) { - buf += strswapbufcpy(buf, &items_ptr->identifier); - buf += strswapbufcpy(buf, &items_ptr->name); - buf += strswapbufcpy(buf, &items_ptr->description); - } - MEM_freeN(items); - items = items_dup; - } - /* end string duplication */ + /* this would all work perfectly _but_ the python strings may be freed + * immediately after use, so we need to duplicate them, ugh. + * annoying because it works most of the time without this. */ + { + EnumPropertyItem *items_dup = MEM_mallocN((sizeof(EnumPropertyItem) * (seq_len + 1)) + (sizeof(char) * totbuf), + "enum_items_from_py2"); + EnumPropertyItem *items_ptr = items_dup; + char *buf = ((char *)items_dup) + (sizeof(EnumPropertyItem) * (seq_len + 1)); + memcpy(items_dup, items, sizeof(EnumPropertyItem) * (seq_len + 1)); + for (i = 0; i < seq_len; i++, items_ptr++) { + buf += strswapbufcpy(buf, &items_ptr->identifier); + buf += strswapbufcpy(buf, &items_ptr->name); + buf += strswapbufcpy(buf, &items_ptr->description); + } + MEM_freeN(items); + items = items_dup; + } + /* end string duplication */ #endif - return items; + return items; } -static const EnumPropertyItem *bpy_prop_enum_itemf_cb(struct bContext *C, PointerRNA *ptr, PropertyRNA *prop, bool *r_free) +static const EnumPropertyItem *bpy_prop_enum_itemf_cb(struct bContext *C, + PointerRNA *ptr, + PropertyRNA *prop, + bool *r_free) { - PyGILState_STATE gilstate; - - PyObject *py_func = RNA_property_enum_py_data_get(prop); - PyObject *self = NULL; - PyObject *args; - PyObject *items; /* returned from the function call */ - - const EnumPropertyItem *eitems = NULL; - int err = 0; - - if (C) { - bpy_context_set(C, &gilstate); - } - else { - gilstate = PyGILState_Ensure(); - } - - args = PyTuple_New(2); - self = pyrna_struct_as_instance(ptr); - PyTuple_SET_ITEM(args, 0, self); - - /* now get the context */ - if (C) { - PyTuple_SET_ITEM(args, 1, (PyObject *)bpy_context_module); - Py_INCREF(bpy_context_module); - } - else { - PyTuple_SET_ITEM(args, 1, Py_None); - Py_INCREF(Py_None); - } - - items = PyObject_CallObject(py_func, args); - - Py_DECREF(args); - - if (items == NULL) { - err = -1; - } - else { - PyObject *items_fast; - int defvalue_dummy = 0; - - if (!(items_fast = PySequence_Fast(items, "EnumProperty(...): " - "return value from the callback was not a sequence"))) - { - err = -1; - } - else { - eitems = enum_items_from_py(items_fast, NULL, &defvalue_dummy, - (RNA_property_flag(prop) & PROP_ENUM_FLAG) != 0); - - Py_DECREF(items_fast); - - if (!eitems) { - err = -1; - } - } - - Py_DECREF(items); - } - - if (err != -1) { /* worked */ - *r_free = true; - } - else { - PyC_Err_PrintWithFunc(py_func); - - eitems = DummyRNA_NULL_items; - } - - if (C) { - bpy_context_clear(C, &gilstate); - } - else { - PyGILState_Release(gilstate); - } - - return eitems; + PyGILState_STATE gilstate; + + PyObject *py_func = RNA_property_enum_py_data_get(prop); + PyObject *self = NULL; + PyObject *args; + PyObject *items; /* returned from the function call */ + + const EnumPropertyItem *eitems = NULL; + int err = 0; + + if (C) { + bpy_context_set(C, &gilstate); + } + else { + gilstate = PyGILState_Ensure(); + } + + args = PyTuple_New(2); + self = pyrna_struct_as_instance(ptr); + PyTuple_SET_ITEM(args, 0, self); + + /* now get the context */ + if (C) { + PyTuple_SET_ITEM(args, 1, (PyObject *)bpy_context_module); + Py_INCREF(bpy_context_module); + } + else { + PyTuple_SET_ITEM(args, 1, Py_None); + Py_INCREF(Py_None); + } + + items = PyObject_CallObject(py_func, args); + + Py_DECREF(args); + + if (items == NULL) { + err = -1; + } + else { + PyObject *items_fast; + int defvalue_dummy = 0; + + if (!(items_fast = PySequence_Fast(items, + "EnumProperty(...): " + "return value from the callback was not a sequence"))) { + err = -1; + } + else { + eitems = enum_items_from_py( + items_fast, NULL, &defvalue_dummy, (RNA_property_flag(prop) & PROP_ENUM_FLAG) != 0); + + Py_DECREF(items_fast); + + if (!eitems) { + err = -1; + } + } + + Py_DECREF(items); + } + + if (err != -1) { /* worked */ + *r_free = true; + } + else { + PyC_Err_PrintWithFunc(py_func); + + eitems = DummyRNA_NULL_items; + } + + if (C) { + bpy_context_clear(C, &gilstate); + } + else { + PyGILState_Release(gilstate); + } + + return eitems; } static int bpy_prop_callback_check(PyObject *py_func, const char *keyword, int argcount) { - if (py_func && py_func != Py_None) { - if (!PyFunction_Check(py_func)) { - PyErr_Format(PyExc_TypeError, - "%s keyword: expected a function type, not a %.200s", - keyword, Py_TYPE(py_func)->tp_name); - return -1; - } - else { - PyCodeObject *f_code = (PyCodeObject *)PyFunction_GET_CODE(py_func); - if (f_code->co_argcount != argcount) { - PyErr_Format(PyExc_TypeError, - "%s keyword: expected a function taking %d arguments, not %d", - keyword, argcount, f_code->co_argcount); - return -1; - } - } - } - - return 0; + if (py_func && py_func != Py_None) { + if (!PyFunction_Check(py_func)) { + PyErr_Format(PyExc_TypeError, + "%s keyword: expected a function type, not a %.200s", + keyword, + Py_TYPE(py_func)->tp_name); + return -1; + } + else { + PyCodeObject *f_code = (PyCodeObject *)PyFunction_GET_CODE(py_func); + if (f_code->co_argcount != argcount) { + PyErr_Format(PyExc_TypeError, + "%s keyword: expected a function taking %d arguments, not %d", + keyword, + argcount, + f_code->co_argcount); + return -1; + } + } + } + + return 0; } static PyObject **bpy_prop_py_data_get(struct PropertyRNA *prop) { - PyObject **py_data = RNA_property_py_data_get(prop); - if (!py_data) { - py_data = MEM_callocN(sizeof(PyObject *) * BPY_DATA_CB_SLOT_SIZE, __func__); - RNA_def_py_data(prop, py_data); - } - return py_data; + PyObject **py_data = RNA_property_py_data_get(prop); + if (!py_data) { + py_data = MEM_callocN(sizeof(PyObject *) * BPY_DATA_CB_SLOT_SIZE, __func__); + RNA_def_py_data(prop, py_data); + } + return py_data; } static void bpy_prop_callback_assign_update(struct PropertyRNA *prop, PyObject *update_cb) { - /* assume this is already checked for type and arg length */ - if (update_cb && update_cb != Py_None) { - PyObject **py_data = bpy_prop_py_data_get(prop); + /* assume this is already checked for type and arg length */ + if (update_cb && update_cb != Py_None) { + PyObject **py_data = bpy_prop_py_data_get(prop); - RNA_def_property_update_runtime(prop, (void *)bpy_prop_update_cb); - py_data[BPY_DATA_CB_SLOT_UPDATE] = update_cb; + RNA_def_property_update_runtime(prop, (void *)bpy_prop_update_cb); + py_data[BPY_DATA_CB_SLOT_UPDATE] = update_cb; - RNA_def_property_flag(prop, PROP_CONTEXT_PROPERTY_UPDATE); - } + RNA_def_property_flag(prop, PROP_CONTEXT_PROPERTY_UPDATE); + } } static void bpy_prop_callback_assign_pointer(struct PropertyRNA *prop, PyObject *poll_cb) { - if (poll_cb && poll_cb != Py_None) { - PyObject **py_data = bpy_prop_py_data_get(prop); + if (poll_cb && poll_cb != Py_None) { + PyObject **py_data = bpy_prop_py_data_get(prop); - RNA_def_property_poll_runtime(prop, (void *) bpy_prop_poll_cb); - py_data[BPY_DATA_CB_SLOT_POLL] = poll_cb; - } + RNA_def_property_poll_runtime(prop, (void *)bpy_prop_poll_cb); + py_data[BPY_DATA_CB_SLOT_POLL] = poll_cb; + } } -static void bpy_prop_callback_assign_boolean(struct PropertyRNA *prop, PyObject *get_cb, PyObject *set_cb) +static void bpy_prop_callback_assign_boolean(struct PropertyRNA *prop, + PyObject *get_cb, + PyObject *set_cb) { - BooleanPropertyGetFunc rna_get_cb = NULL; - BooleanPropertySetFunc rna_set_cb = NULL; + BooleanPropertyGetFunc rna_get_cb = NULL; + BooleanPropertySetFunc rna_set_cb = NULL; - if (get_cb && get_cb != Py_None) { - PyObject **py_data = bpy_prop_py_data_get(prop); + if (get_cb && get_cb != Py_None) { + PyObject **py_data = bpy_prop_py_data_get(prop); - rna_get_cb = bpy_prop_boolean_get_cb; - py_data[BPY_DATA_CB_SLOT_GET] = get_cb; - } + rna_get_cb = bpy_prop_boolean_get_cb; + py_data[BPY_DATA_CB_SLOT_GET] = get_cb; + } - if (set_cb && set_cb != Py_None) { - PyObject **py_data = bpy_prop_py_data_get(prop); + if (set_cb && set_cb != Py_None) { + PyObject **py_data = bpy_prop_py_data_get(prop); - rna_set_cb = bpy_prop_boolean_set_cb; - py_data[BPY_DATA_CB_SLOT_SET] = set_cb; - } + rna_set_cb = bpy_prop_boolean_set_cb; + py_data[BPY_DATA_CB_SLOT_SET] = set_cb; + } - RNA_def_property_boolean_funcs_runtime(prop, rna_get_cb, rna_set_cb); + RNA_def_property_boolean_funcs_runtime(prop, rna_get_cb, rna_set_cb); } -static void bpy_prop_callback_assign_boolean_array(struct PropertyRNA *prop, PyObject *get_cb, PyObject *set_cb) +static void bpy_prop_callback_assign_boolean_array(struct PropertyRNA *prop, + PyObject *get_cb, + PyObject *set_cb) { - BooleanArrayPropertyGetFunc rna_get_cb = NULL; - BooleanArrayPropertySetFunc rna_set_cb = NULL; + BooleanArrayPropertyGetFunc rna_get_cb = NULL; + BooleanArrayPropertySetFunc rna_set_cb = NULL; - if (get_cb && get_cb != Py_None) { - PyObject **py_data = bpy_prop_py_data_get(prop); + if (get_cb && get_cb != Py_None) { + PyObject **py_data = bpy_prop_py_data_get(prop); - rna_get_cb = bpy_prop_boolean_array_get_cb; - py_data[BPY_DATA_CB_SLOT_GET] = get_cb; - } + rna_get_cb = bpy_prop_boolean_array_get_cb; + py_data[BPY_DATA_CB_SLOT_GET] = get_cb; + } - if (set_cb && set_cb != Py_None) { - PyObject **py_data = bpy_prop_py_data_get(prop); + if (set_cb && set_cb != Py_None) { + PyObject **py_data = bpy_prop_py_data_get(prop); - rna_set_cb = bpy_prop_boolean_array_set_cb; - py_data[BPY_DATA_CB_SLOT_SET] = set_cb; - } + rna_set_cb = bpy_prop_boolean_array_set_cb; + py_data[BPY_DATA_CB_SLOT_SET] = set_cb; + } - RNA_def_property_boolean_array_funcs_runtime(prop, rna_get_cb, rna_set_cb); + RNA_def_property_boolean_array_funcs_runtime(prop, rna_get_cb, rna_set_cb); } -static void bpy_prop_callback_assign_int(struct PropertyRNA *prop, PyObject *get_cb, PyObject *set_cb) +static void bpy_prop_callback_assign_int(struct PropertyRNA *prop, + PyObject *get_cb, + PyObject *set_cb) { - IntPropertyGetFunc rna_get_cb = NULL; - IntPropertySetFunc rna_set_cb = NULL; + IntPropertyGetFunc rna_get_cb = NULL; + IntPropertySetFunc rna_set_cb = NULL; - if (get_cb && get_cb != Py_None) { - PyObject **py_data = bpy_prop_py_data_get(prop); + if (get_cb && get_cb != Py_None) { + PyObject **py_data = bpy_prop_py_data_get(prop); - rna_get_cb = bpy_prop_int_get_cb; - py_data[BPY_DATA_CB_SLOT_GET] = get_cb; - } + rna_get_cb = bpy_prop_int_get_cb; + py_data[BPY_DATA_CB_SLOT_GET] = get_cb; + } - if (set_cb && set_cb != Py_None) { - PyObject **py_data = bpy_prop_py_data_get(prop); + if (set_cb && set_cb != Py_None) { + PyObject **py_data = bpy_prop_py_data_get(prop); - rna_set_cb = bpy_prop_int_set_cb; - py_data[BPY_DATA_CB_SLOT_SET] = set_cb; - } + rna_set_cb = bpy_prop_int_set_cb; + py_data[BPY_DATA_CB_SLOT_SET] = set_cb; + } - RNA_def_property_int_funcs_runtime(prop, rna_get_cb, rna_set_cb, NULL); + RNA_def_property_int_funcs_runtime(prop, rna_get_cb, rna_set_cb, NULL); } -static void bpy_prop_callback_assign_int_array(struct PropertyRNA *prop, PyObject *get_cb, PyObject *set_cb) +static void bpy_prop_callback_assign_int_array(struct PropertyRNA *prop, + PyObject *get_cb, + PyObject *set_cb) { - IntArrayPropertyGetFunc rna_get_cb = NULL; - IntArrayPropertySetFunc rna_set_cb = NULL; + IntArrayPropertyGetFunc rna_get_cb = NULL; + IntArrayPropertySetFunc rna_set_cb = NULL; - if (get_cb && get_cb != Py_None) { - PyObject **py_data = bpy_prop_py_data_get(prop); + if (get_cb && get_cb != Py_None) { + PyObject **py_data = bpy_prop_py_data_get(prop); - rna_get_cb = bpy_prop_int_array_get_cb; - py_data[BPY_DATA_CB_SLOT_GET] = get_cb; - } + rna_get_cb = bpy_prop_int_array_get_cb; + py_data[BPY_DATA_CB_SLOT_GET] = get_cb; + } - if (set_cb && set_cb != Py_None) { - PyObject **py_data = bpy_prop_py_data_get(prop); + if (set_cb && set_cb != Py_None) { + PyObject **py_data = bpy_prop_py_data_get(prop); - rna_set_cb = bpy_prop_int_array_set_cb; - py_data[BPY_DATA_CB_SLOT_SET] = set_cb; - } + rna_set_cb = bpy_prop_int_array_set_cb; + py_data[BPY_DATA_CB_SLOT_SET] = set_cb; + } - RNA_def_property_int_array_funcs_runtime(prop, rna_get_cb, rna_set_cb, NULL); + RNA_def_property_int_array_funcs_runtime(prop, rna_get_cb, rna_set_cb, NULL); } -static void bpy_prop_callback_assign_float(struct PropertyRNA *prop, PyObject *get_cb, PyObject *set_cb) +static void bpy_prop_callback_assign_float(struct PropertyRNA *prop, + PyObject *get_cb, + PyObject *set_cb) { - FloatPropertyGetFunc rna_get_cb = NULL; - FloatPropertySetFunc rna_set_cb = NULL; + FloatPropertyGetFunc rna_get_cb = NULL; + FloatPropertySetFunc rna_set_cb = NULL; - if (get_cb && get_cb != Py_None) { - PyObject **py_data = bpy_prop_py_data_get(prop); + if (get_cb && get_cb != Py_None) { + PyObject **py_data = bpy_prop_py_data_get(prop); - rna_get_cb = bpy_prop_float_get_cb; - py_data[BPY_DATA_CB_SLOT_GET] = get_cb; - } + rna_get_cb = bpy_prop_float_get_cb; + py_data[BPY_DATA_CB_SLOT_GET] = get_cb; + } - if (set_cb && set_cb != Py_None) { - PyObject **py_data = bpy_prop_py_data_get(prop); + if (set_cb && set_cb != Py_None) { + PyObject **py_data = bpy_prop_py_data_get(prop); - rna_set_cb = bpy_prop_float_set_cb; - py_data[BPY_DATA_CB_SLOT_SET] = set_cb; - } + rna_set_cb = bpy_prop_float_set_cb; + py_data[BPY_DATA_CB_SLOT_SET] = set_cb; + } - RNA_def_property_float_funcs_runtime(prop, rna_get_cb, rna_set_cb, NULL); + RNA_def_property_float_funcs_runtime(prop, rna_get_cb, rna_set_cb, NULL); } -static void bpy_prop_callback_assign_float_array(struct PropertyRNA *prop, PyObject *get_cb, PyObject *set_cb) +static void bpy_prop_callback_assign_float_array(struct PropertyRNA *prop, + PyObject *get_cb, + PyObject *set_cb) { - FloatArrayPropertyGetFunc rna_get_cb = NULL; - FloatArrayPropertySetFunc rna_set_cb = NULL; + FloatArrayPropertyGetFunc rna_get_cb = NULL; + FloatArrayPropertySetFunc rna_set_cb = NULL; - if (get_cb && get_cb != Py_None) { - PyObject **py_data = bpy_prop_py_data_get(prop); + if (get_cb && get_cb != Py_None) { + PyObject **py_data = bpy_prop_py_data_get(prop); - rna_get_cb = bpy_prop_float_array_get_cb; - py_data[BPY_DATA_CB_SLOT_GET] = get_cb; - } + rna_get_cb = bpy_prop_float_array_get_cb; + py_data[BPY_DATA_CB_SLOT_GET] = get_cb; + } - if (set_cb && set_cb != Py_None) { - PyObject **py_data = bpy_prop_py_data_get(prop); + if (set_cb && set_cb != Py_None) { + PyObject **py_data = bpy_prop_py_data_get(prop); - rna_set_cb = bpy_prop_float_array_set_cb; - py_data[BPY_DATA_CB_SLOT_SET] = set_cb; - } + rna_set_cb = bpy_prop_float_array_set_cb; + py_data[BPY_DATA_CB_SLOT_SET] = set_cb; + } - RNA_def_property_float_array_funcs_runtime(prop, rna_get_cb, rna_set_cb, NULL); + RNA_def_property_float_array_funcs_runtime(prop, rna_get_cb, rna_set_cb, NULL); } -static void bpy_prop_callback_assign_string(struct PropertyRNA *prop, PyObject *get_cb, PyObject *set_cb) +static void bpy_prop_callback_assign_string(struct PropertyRNA *prop, + PyObject *get_cb, + PyObject *set_cb) { - StringPropertyGetFunc rna_get_cb = NULL; - StringPropertyLengthFunc rna_length_cb = NULL; - StringPropertySetFunc rna_set_cb = NULL; + StringPropertyGetFunc rna_get_cb = NULL; + StringPropertyLengthFunc rna_length_cb = NULL; + StringPropertySetFunc rna_set_cb = NULL; - if (get_cb && get_cb != Py_None) { - PyObject **py_data = bpy_prop_py_data_get(prop); + if (get_cb && get_cb != Py_None) { + PyObject **py_data = bpy_prop_py_data_get(prop); - rna_get_cb = bpy_prop_string_get_cb; - rna_length_cb = bpy_prop_string_length_cb; - py_data[BPY_DATA_CB_SLOT_GET] = get_cb; - } + rna_get_cb = bpy_prop_string_get_cb; + rna_length_cb = bpy_prop_string_length_cb; + py_data[BPY_DATA_CB_SLOT_GET] = get_cb; + } - if (set_cb && set_cb != Py_None) { - PyObject **py_data = bpy_prop_py_data_get(prop); + if (set_cb && set_cb != Py_None) { + PyObject **py_data = bpy_prop_py_data_get(prop); - rna_set_cb = bpy_prop_string_set_cb; - py_data[BPY_DATA_CB_SLOT_SET] = set_cb; - } + rna_set_cb = bpy_prop_string_set_cb; + py_data[BPY_DATA_CB_SLOT_SET] = set_cb; + } - RNA_def_property_string_funcs_runtime(prop, rna_get_cb, rna_length_cb, rna_set_cb); + RNA_def_property_string_funcs_runtime(prop, rna_get_cb, rna_length_cb, rna_set_cb); } -static void bpy_prop_callback_assign_enum(struct PropertyRNA *prop, PyObject *get_cb, PyObject *set_cb, PyObject *itemf_cb) +static void bpy_prop_callback_assign_enum(struct PropertyRNA *prop, + PyObject *get_cb, + PyObject *set_cb, + PyObject *itemf_cb) { - EnumPropertyGetFunc rna_get_cb = NULL; - EnumPropertyItemFunc rna_itemf_cb = NULL; - EnumPropertySetFunc rna_set_cb = NULL; + EnumPropertyGetFunc rna_get_cb = NULL; + EnumPropertyItemFunc rna_itemf_cb = NULL; + EnumPropertySetFunc rna_set_cb = NULL; - if (get_cb && get_cb != Py_None) { - PyObject **py_data = bpy_prop_py_data_get(prop); + if (get_cb && get_cb != Py_None) { + PyObject **py_data = bpy_prop_py_data_get(prop); - rna_get_cb = bpy_prop_enum_get_cb; - py_data[BPY_DATA_CB_SLOT_GET] = get_cb; - } + rna_get_cb = bpy_prop_enum_get_cb; + py_data[BPY_DATA_CB_SLOT_GET] = get_cb; + } - if (set_cb && set_cb != Py_None) { - PyObject **py_data = bpy_prop_py_data_get(prop); + if (set_cb && set_cb != Py_None) { + PyObject **py_data = bpy_prop_py_data_get(prop); - rna_set_cb = bpy_prop_enum_set_cb; - py_data[BPY_DATA_CB_SLOT_SET] = set_cb; - } + rna_set_cb = bpy_prop_enum_set_cb; + py_data[BPY_DATA_CB_SLOT_SET] = set_cb; + } - if (itemf_cb && itemf_cb != Py_None) { - rna_itemf_cb = bpy_prop_enum_itemf_cb; - RNA_def_property_enum_py_data(prop, (void *)itemf_cb); + if (itemf_cb && itemf_cb != Py_None) { + rna_itemf_cb = bpy_prop_enum_itemf_cb; + RNA_def_property_enum_py_data(prop, (void *)itemf_cb); - /* watch out!, if a user is tricky they can probably crash blender - * if they manage to free the callback, take care! */ - /* Py_INCREF(itemf_cb); */ - } + /* watch out!, if a user is tricky they can probably crash blender + * if they manage to free the callback, take care! */ + /* Py_INCREF(itemf_cb); */ + } - RNA_def_property_enum_funcs_runtime(prop, rna_get_cb, rna_set_cb, rna_itemf_cb); + RNA_def_property_enum_funcs_runtime(prop, rna_get_cb, rna_set_cb, rna_itemf_cb); } /* this define runs at the start of each function and deals with * returning a deferred property (to be registered later) */ -#define BPY_PROPDEF_HEAD(_func) \ - if (PyTuple_GET_SIZE(args) == 1) { \ - PyObject *ret; \ - self = PyTuple_GET_ITEM(args, 0); \ - args = PyTuple_New(0); \ - ret = BPy_##_func(self, args, kw); \ - Py_DECREF(args); \ - return ret; \ - } \ - else if (PyTuple_GET_SIZE(args) > 1) { \ - PyErr_SetString(PyExc_ValueError, "all args must be keywords"); \ - return NULL; \ - } \ - srna = srna_from_self(self, #_func"(...):"); \ - if (srna == NULL) { \ - if (PyErr_Occurred()) \ - return NULL; \ - return bpy_prop_deferred_return(pymeth_##_func, kw); \ - } (void)0 +#define BPY_PROPDEF_HEAD(_func) \ + if (PyTuple_GET_SIZE(args) == 1) { \ + PyObject *ret; \ + self = PyTuple_GET_ITEM(args, 0); \ + args = PyTuple_New(0); \ + ret = BPy_##_func(self, args, kw); \ + Py_DECREF(args); \ + return ret; \ + } \ + else if (PyTuple_GET_SIZE(args) > 1) { \ + PyErr_SetString(PyExc_ValueError, "all args must be keywords"); \ + return NULL; \ + } \ + srna = srna_from_self(self, #_func "(...):"); \ + if (srna == NULL) { \ + if (PyErr_Occurred()) \ + return NULL; \ + return bpy_prop_deferred_return(pymeth_##_func, kw); \ + } \ + (void)0 /* terse macros for error checks shared between all funcs cant use function * calls because of static strings passed to pyrna_set_to_enum_bitfield */ -#define BPY_PROPDEF_CHECK(_func, _property_flag_items) \ - if (UNLIKELY(id_len >= MAX_IDPROP_NAME)) { \ - PyErr_Format(PyExc_TypeError, \ - #_func"(): '%.200s' too long, max length is %d", \ - id, MAX_IDPROP_NAME - 1); \ - return NULL; \ - } \ - if (UNLIKELY(RNA_def_property_free_identifier(srna, id) == -1)) { \ - PyErr_Format(PyExc_TypeError, \ - #_func"(): '%s' is defined as a non-dynamic type", \ - id); \ - return NULL; \ - } \ - if (UNLIKELY(pyopts && pyrna_set_to_enum_bitfield(_property_flag_items, \ - pyopts, \ - &opts, \ - #_func"(options={ ...}):"))) \ - { \ - return NULL; \ - } \ - { \ - const EnumPropertyItem *tag_defines = RNA_struct_property_tag_defines(srna); \ - if (py_tags && !tag_defines) { \ - PyErr_Format(PyExc_TypeError, \ - #_func"(): property-tags not available for '%s'", \ - RNA_struct_identifier(srna)); \ - return NULL; \ - } \ - if (UNLIKELY(py_tags && pyrna_set_to_enum_bitfield( \ - tag_defines, py_tags, \ - &prop_tags, #_func"(tags={ ...}):"))) \ - { \ - return NULL; \ - } \ - }(void)0 - -#define BPY_PROPDEF_SUBTYPE_CHECK(_func, _property_flag_items, _subtype) \ - BPY_PROPDEF_CHECK(_func, _property_flag_items); \ - if (UNLIKELY(pysubtype && RNA_enum_value_from_id(_subtype, \ - pysubtype, \ - &subtype) == 0)) \ - { \ - const char *enum_str = BPy_enum_as_string(_subtype); \ - PyErr_Format(PyExc_TypeError, \ - #_func"(subtype='%s'): " \ - "subtype not found in (%s)", \ - pysubtype, enum_str); \ - MEM_freeN((void *)enum_str); \ - return NULL; \ - } (void)0 - +#define BPY_PROPDEF_CHECK(_func, _property_flag_items) \ + if (UNLIKELY(id_len >= MAX_IDPROP_NAME)) { \ + PyErr_Format(PyExc_TypeError, \ + #_func "(): '%.200s' too long, max length is %d", \ + id, \ + MAX_IDPROP_NAME - 1); \ + return NULL; \ + } \ + if (UNLIKELY(RNA_def_property_free_identifier(srna, id) == -1)) { \ + PyErr_Format(PyExc_TypeError, #_func "(): '%s' is defined as a non-dynamic type", id); \ + return NULL; \ + } \ + if (UNLIKELY(pyopts && pyrna_set_to_enum_bitfield( \ + _property_flag_items, pyopts, &opts, #_func "(options={ ...}):"))) { \ + return NULL; \ + } \ + { \ + const EnumPropertyItem *tag_defines = RNA_struct_property_tag_defines(srna); \ + if (py_tags && !tag_defines) { \ + PyErr_Format(PyExc_TypeError, \ + #_func "(): property-tags not available for '%s'", \ + RNA_struct_identifier(srna)); \ + return NULL; \ + } \ + if (UNLIKELY(py_tags && pyrna_set_to_enum_bitfield( \ + tag_defines, py_tags, &prop_tags, #_func "(tags={ ...}):"))) { \ + return NULL; \ + } \ + } \ + (void)0 + +#define BPY_PROPDEF_SUBTYPE_CHECK(_func, _property_flag_items, _subtype) \ + BPY_PROPDEF_CHECK(_func, _property_flag_items); \ + if (UNLIKELY(pysubtype && RNA_enum_value_from_id(_subtype, pysubtype, &subtype) == 0)) { \ + const char *enum_str = BPy_enum_as_string(_subtype); \ + PyErr_Format(PyExc_TypeError, \ + #_func \ + "(subtype='%s'): " \ + "subtype not found in (%s)", \ + pysubtype, \ + enum_str); \ + MEM_freeN((void *)enum_str); \ + return NULL; \ + } \ + (void)0 #define BPY_PROPDEF_NAME_DOC \ -" :arg name: Name used in the user interface.\n" \ -" :type name: string\n" \ + " :arg name: Name used in the user interface.\n" \ + " :type name: string\n" #define BPY_PROPDEF_DESC_DOC \ -" :arg description: Text used for the tooltip and api documentation.\n" \ -" :type description: string\n" \ + " :arg description: Text used for the tooltip and api documentation.\n" \ + " :type description: string\n" #define BPY_PROPDEF_UNIT_DOC \ -" :arg unit: Enumerator in ['NONE', 'LENGTH', 'AREA', 'VOLUME', 'ROTATION', 'TIME', 'VELOCITY', 'ACCELERATION', 'MASS', 'CAMERA', 'POWER'].\n" \ -" :type unit: string\n" \ + " :arg unit: Enumerator in ['NONE', 'LENGTH', 'AREA', 'VOLUME', 'ROTATION', 'TIME', " \ + "'VELOCITY', 'ACCELERATION', 'MASS', 'CAMERA', 'POWER'].\n" \ + " :type unit: string\n" #define BPY_PROPDEF_NUM_MIN_DOC \ -" :arg min: Hard minimum, trying to assign a value below will silently assign this minimum instead.\n" \ + " :arg min: Hard minimum, trying to assign a value below will silently assign this minimum " \ + "instead.\n" #define BPY_PROPDEF_NUM_MAX_DOC \ -" :arg max: Hard maximum, trying to assign a value above will silently assign this maximum instead.\n" \ + " :arg max: Hard maximum, trying to assign a value above will silently assign this maximum " \ + "instead.\n" #define BPY_PROPDEF_NUM_SOFTMIN_DOC \ -" :arg soft_min: Soft minimum (>= *min*), user won't be able to drag the widget below this value in the UI.\n" \ + " :arg soft_min: Soft minimum (>= *min*), user won't be able to drag the widget below this " \ + "value in the UI.\n" #define BPY_PROPDEF_NUM_SOFTMAX_DOC \ -" :arg soft_max: Soft maximum (<= *max*), user won't be able to drag the widget above this value in the UI.\n" \ + " :arg soft_max: Soft maximum (<= *max*), user won't be able to drag the widget above this " \ + "value in the UI.\n" #define BPY_PROPDEF_VECSIZE_DOC \ -" :arg size: Vector dimensions in [1, " STRINGIFY(PYRNA_STACK_ARRAY) "].\n" \ -" :type size: int\n" \ + " :arg size: Vector dimensions in [1, " STRINGIFY(PYRNA_STACK_ARRAY) "].\n" \ +" :type size: int\n" #define BPY_PROPDEF_INT_STEP_DOC \ -" :arg step: Step of increment/decrement in UI, in [1, 100], defaults to 1 (WARNING: unused currently!).\n" \ -" :type step: int\n" \ + " :arg step: Step of increment/decrement in UI, in [1, 100], defaults to 1 (WARNING: unused " \ + "currently!).\n" \ + " :type step: int\n" #define BPY_PROPDEF_FLOAT_STEP_DOC \ -" :arg step: Step of increment/decrement in UI, in [1, 100], defaults to 3 (WARNING: actual value is /100).\n" \ -" :type step: int\n" \ + " :arg step: Step of increment/decrement in UI, in [1, 100], defaults to 3 (WARNING: actual " \ + "value is /100).\n" \ + " :type step: int\n" #define BPY_PROPDEF_FLOAT_PREC_DOC \ -" :arg precision: Maximum number of decimal digits to display, in [0, 6].\n" \ -" :type precision: int\n" \ + " :arg precision: Maximum number of decimal digits to display, in [0, 6].\n" \ + " :type precision: int\n" #define BPY_PROPDEF_UPDATE_DOC \ -" :arg update: Function to be called when this value is modified,\n" \ -" This function must take 2 values (self, context) and return None.\n" \ -" *Warning* there are no safety checks to avoid infinite recursion.\n" \ -" :type update: function\n" \ + " :arg update: Function to be called when this value is modified,\n" \ + " This function must take 2 values (self, context) and return None.\n" \ + " *Warning* there are no safety checks to avoid infinite recursion.\n" \ + " :type update: function\n" #define BPY_PROPDEF_POLL_DOC \ -" :arg poll: function to be called to determine whether an item is valid for this property.\n" \ -" The function must take 2 values (self, object) and return Bool.\n" \ -" :type poll: function\n" \ + " :arg poll: function to be called to determine whether an item is valid for this " \ + "property.\n" \ + " The function must take 2 values (self, object) and return Bool.\n" \ + " :type poll: function\n" #define BPY_PROPDEF_GET_DOC \ -" :arg get: Function to be called when this value is 'read',\n" \ -" This function must take 1 value (self) and return the value of the property.\n" \ -" :type get: function\n" \ + " :arg get: Function to be called when this value is 'read',\n" \ + " This function must take 1 value (self) and return the value of the property.\n" \ + " :type get: function\n" #define BPY_PROPDEF_SET_DOC \ -" :arg set: Function to be called when this value is 'written',\n" \ -" This function must take 2 values (self, value) and return None.\n" \ -" :type set: function\n" \ + " :arg set: Function to be called when this value is 'written',\n" \ + " This function must take 2 values (self, value) and return None.\n" \ + " :type set: function\n" #define BPY_PROPDEF_TYPE_DOC \ -" :arg type: A subclass of :class:`bpy.types.PropertyGroup` or :class:`bpy.types.ID`.\n" \ -" :type type: class\n" \ + " :arg type: A subclass of :class:`bpy.types.PropertyGroup` or :class:`bpy.types.ID`.\n" \ + " :type type: class\n" #define BPY_PROPDEF_TAGS_DOC \ -" :arg tags: Enumerator of tags that are defined by parent class.\n" \ -" :type tags: set\n" \ + " :arg tags: Enumerator of tags that are defined by parent class.\n" \ + " :type tags: set\n" #if 0 static int bpy_struct_id_used(StructRNA *srna, char *identifier) { - PointerRNA ptr; - RNA_pointer_create(NULL, srna, NULL, &ptr); - return (RNA_struct_find_property(&ptr, identifier) != NULL); + PointerRNA ptr; + RNA_pointer_create(NULL, srna, NULL, &ptr); + return (RNA_struct_find_property(&ptr, identifier) != NULL); } #endif - /* Function that sets RNA, NOTE - self is NULL when called from python, * but being abused from C so we can pass the srna along. * This isn't incorrect since its a python object - but be careful */ PyDoc_STRVAR(BPy_BoolProperty_doc, -".. function:: BoolProperty(name=\"\", " - "description=\"\", " - "default=False, " - "options={'ANIMATABLE'}, " - "tags={}, " - "subtype='NONE', " - "update=None, " - "get=None, " - "set=None)\n" -"\n" -" Returns a new boolean property definition.\n" -"\n" -BPY_PROPDEF_NAME_DOC -BPY_PROPDEF_DESC_DOC -BPY_PROPDEF_OPTIONS_DOC -BPY_PROPDEF_TAGS_DOC -BPY_PROPDEF_SUBTYPE_NUMBER_DOC -BPY_PROPDEF_UPDATE_DOC -BPY_PROPDEF_GET_DOC -BPY_PROPDEF_SET_DOC -); + ".. function:: BoolProperty(name=\"\", " + "description=\"\", " + "default=False, " + "options={'ANIMATABLE'}, " + "tags={}, " + "subtype='NONE', " + "update=None, " + "get=None, " + "set=None)\n" + "\n" + " Returns a new boolean property definition.\n" + "\n" BPY_PROPDEF_NAME_DOC BPY_PROPDEF_DESC_DOC BPY_PROPDEF_OPTIONS_DOC + BPY_PROPDEF_TAGS_DOC BPY_PROPDEF_SUBTYPE_NUMBER_DOC BPY_PROPDEF_UPDATE_DOC + BPY_PROPDEF_GET_DOC BPY_PROPDEF_SET_DOC); static PyObject *BPy_BoolProperty(PyObject *self, PyObject *args, PyObject *kw) { - StructRNA *srna; - - BPY_PROPDEF_HEAD(BoolProperty); - - if (srna) { - const char *id = NULL, *name = NULL, *description = ""; - int id_len; - bool def = false; - PropertyRNA *prop; - PyObject *pyopts = NULL; - int opts = 0; - int prop_tags = 0; - const char *pysubtype = NULL; - int subtype = PROP_NONE; - PyObject *update_cb = NULL; - PyObject *get_cb = NULL; - PyObject *set_cb = NULL; - PyObject *py_tags = NULL; - - static const char *_keywords[] = { - "attr", "name", "description", "default", - "options", "tags", "subtype", - "update", "get", "set", NULL, - }; - static _PyArg_Parser _parser = {"s#|ssO&O!O!sOOO:BoolProperty", _keywords, 0}; - if (!_PyArg_ParseTupleAndKeywordsFast( - args, kw, &_parser, - &id, &id_len, - &name, &description, PyC_ParseBool, &def, - &PySet_Type, &pyopts, &PySet_Type, &py_tags, &pysubtype, - &update_cb, &get_cb, &set_cb)) - { - return NULL; - } - - BPY_PROPDEF_SUBTYPE_CHECK(BoolProperty, property_flag_items, property_subtype_number_items); - - if (bpy_prop_callback_check(update_cb, "update", 2) == -1) { - return NULL; - } - if (bpy_prop_callback_check(get_cb, "get", 1) == -1) { - return NULL; - } - if (bpy_prop_callback_check(set_cb, "set", 2) == -1) { - return NULL; - } - - prop = RNA_def_property(srna, id, PROP_BOOLEAN, subtype); - RNA_def_property_boolean_default(prop, def); - RNA_def_property_ui_text(prop, name ? name : id, description); - - if (py_tags) { - RNA_def_property_tags(prop, prop_tags); - } - if (pyopts) { - bpy_prop_assign_flag(prop, opts); - } - bpy_prop_callback_assign_update(prop, update_cb); - bpy_prop_callback_assign_boolean(prop, get_cb, set_cb); - RNA_def_property_duplicate_pointers(srna, prop); - } - - Py_RETURN_NONE; + StructRNA *srna; + + BPY_PROPDEF_HEAD(BoolProperty); + + if (srna) { + const char *id = NULL, *name = NULL, *description = ""; + int id_len; + bool def = false; + PropertyRNA *prop; + PyObject *pyopts = NULL; + int opts = 0; + int prop_tags = 0; + const char *pysubtype = NULL; + int subtype = PROP_NONE; + PyObject *update_cb = NULL; + PyObject *get_cb = NULL; + PyObject *set_cb = NULL; + PyObject *py_tags = NULL; + + static const char *_keywords[] = { + "attr", + "name", + "description", + "default", + "options", + "tags", + "subtype", + "update", + "get", + "set", + NULL, + }; + static _PyArg_Parser _parser = {"s#|ssO&O!O!sOOO:BoolProperty", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast(args, + kw, + &_parser, + &id, + &id_len, + &name, + &description, + PyC_ParseBool, + &def, + &PySet_Type, + &pyopts, + &PySet_Type, + &py_tags, + &pysubtype, + &update_cb, + &get_cb, + &set_cb)) { + return NULL; + } + + BPY_PROPDEF_SUBTYPE_CHECK(BoolProperty, property_flag_items, property_subtype_number_items); + + if (bpy_prop_callback_check(update_cb, "update", 2) == -1) { + return NULL; + } + if (bpy_prop_callback_check(get_cb, "get", 1) == -1) { + return NULL; + } + if (bpy_prop_callback_check(set_cb, "set", 2) == -1) { + return NULL; + } + + prop = RNA_def_property(srna, id, PROP_BOOLEAN, subtype); + RNA_def_property_boolean_default(prop, def); + RNA_def_property_ui_text(prop, name ? name : id, description); + + if (py_tags) { + RNA_def_property_tags(prop, prop_tags); + } + if (pyopts) { + bpy_prop_assign_flag(prop, opts); + } + bpy_prop_callback_assign_update(prop, update_cb); + bpy_prop_callback_assign_boolean(prop, get_cb, set_cb); + RNA_def_property_duplicate_pointers(srna, prop); + } + + Py_RETURN_NONE; } PyDoc_STRVAR(BPy_BoolVectorProperty_doc, -".. function:: BoolVectorProperty(name=\"\", " - "description=\"\", " - "default=(False, False, False), " - "options={'ANIMATABLE'}, " - "tags={}, " - "subtype='NONE', " - "size=3, " - "update=None, " - "get=None, " - "set=None)\n" -"\n" -" Returns a new vector boolean property definition.\n" -"\n" -BPY_PROPDEF_NAME_DOC -BPY_PROPDEF_DESC_DOC -" :arg default: sequence of booleans the length of *size*.\n" -" :type default: sequence\n" -BPY_PROPDEF_OPTIONS_DOC -BPY_PROPDEF_TAGS_DOC -BPY_PROPDEF_SUBTYPE_ARRAY_DOC -BPY_PROPDEF_VECSIZE_DOC -BPY_PROPDEF_UPDATE_DOC -BPY_PROPDEF_GET_DOC -BPY_PROPDEF_SET_DOC -); + ".. function:: BoolVectorProperty(name=\"\", " + "description=\"\", " + "default=(False, False, False), " + "options={'ANIMATABLE'}, " + "tags={}, " + "subtype='NONE', " + "size=3, " + "update=None, " + "get=None, " + "set=None)\n" + "\n" + " Returns a new vector boolean property definition.\n" + "\n" BPY_PROPDEF_NAME_DOC BPY_PROPDEF_DESC_DOC + " :arg default: sequence of booleans the length of *size*.\n" + " :type default: sequence\n" BPY_PROPDEF_OPTIONS_DOC BPY_PROPDEF_TAGS_DOC + BPY_PROPDEF_SUBTYPE_ARRAY_DOC BPY_PROPDEF_VECSIZE_DOC BPY_PROPDEF_UPDATE_DOC + BPY_PROPDEF_GET_DOC BPY_PROPDEF_SET_DOC); static PyObject *BPy_BoolVectorProperty(PyObject *self, PyObject *args, PyObject *kw) { - StructRNA *srna; - - BPY_PROPDEF_HEAD(BoolVectorProperty); - - if (srna) { - const char *id = NULL, *name = NULL, *description = ""; - int id_len; - bool def[PYRNA_STACK_ARRAY] = {0}; - int size = 3; - PropertyRNA *prop; - PyObject *pydef = NULL; - PyObject *pyopts = NULL; - int opts = 0; - int prop_tags = 0; - const char *pysubtype = NULL; - int subtype = PROP_NONE; - PyObject *update_cb = NULL; - PyObject *get_cb = NULL; - PyObject *set_cb = NULL; - PyObject *py_tags = NULL; - - static const char *_keywords[] = { - "attr", "name", "description", "default", - "options", "tags", "subtype", "size", - "update", "get", "set", NULL, - }; - static _PyArg_Parser _parser = {"s#|ssOO!O!siOOO:BoolVectorProperty", _keywords, 0}; - if (!_PyArg_ParseTupleAndKeywordsFast( - args, kw, &_parser, - &id, &id_len, - &name, &description, &pydef, - &PySet_Type, &pyopts, &PySet_Type, &py_tags, - &pysubtype, &size, - &update_cb, &get_cb, &set_cb)) - { - return NULL; - } - - BPY_PROPDEF_SUBTYPE_CHECK(BoolVectorProperty, property_flag_items, property_subtype_array_items); - - if (size < 1 || size > PYRNA_STACK_ARRAY) { - PyErr_Format(PyExc_TypeError, - "BoolVectorProperty(size=%d): size must be between 0 and " - STRINGIFY(PYRNA_STACK_ARRAY), size); - return NULL; - } - - if (pydef && PyC_AsArray(def, pydef, size, &PyBool_Type, false, "BoolVectorProperty(default=sequence)") == -1) { - return NULL; - } - - if (bpy_prop_callback_check(update_cb, "update", 2) == -1) { - return NULL; - } - if (bpy_prop_callback_check(get_cb, "get", 1) == -1) { - return NULL; - } - if (bpy_prop_callback_check(set_cb, "set", 2) == -1) { - return NULL; - } - - // prop = RNA_def_boolean_array(srna, id, size, pydef ? def:NULL, name ? name : id, description); - prop = RNA_def_property(srna, id, PROP_BOOLEAN, subtype); - RNA_def_property_array(prop, size); - if (pydef) { - RNA_def_property_boolean_array_default(prop, def); - } - RNA_def_property_ui_text(prop, name ? name : id, description); - - if (py_tags) { - RNA_def_property_tags(prop, prop_tags); - } - if (pyopts) { - bpy_prop_assign_flag(prop, opts); - } - bpy_prop_callback_assign_update(prop, update_cb); - bpy_prop_callback_assign_boolean_array(prop, get_cb, set_cb); - RNA_def_property_duplicate_pointers(srna, prop); - } - - Py_RETURN_NONE; + StructRNA *srna; + + BPY_PROPDEF_HEAD(BoolVectorProperty); + + if (srna) { + const char *id = NULL, *name = NULL, *description = ""; + int id_len; + bool def[PYRNA_STACK_ARRAY] = {0}; + int size = 3; + PropertyRNA *prop; + PyObject *pydef = NULL; + PyObject *pyopts = NULL; + int opts = 0; + int prop_tags = 0; + const char *pysubtype = NULL; + int subtype = PROP_NONE; + PyObject *update_cb = NULL; + PyObject *get_cb = NULL; + PyObject *set_cb = NULL; + PyObject *py_tags = NULL; + + static const char *_keywords[] = { + "attr", + "name", + "description", + "default", + "options", + "tags", + "subtype", + "size", + "update", + "get", + "set", + NULL, + }; + static _PyArg_Parser _parser = {"s#|ssOO!O!siOOO:BoolVectorProperty", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast(args, + kw, + &_parser, + &id, + &id_len, + &name, + &description, + &pydef, + &PySet_Type, + &pyopts, + &PySet_Type, + &py_tags, + &pysubtype, + &size, + &update_cb, + &get_cb, + &set_cb)) { + return NULL; + } + + BPY_PROPDEF_SUBTYPE_CHECK( + BoolVectorProperty, property_flag_items, property_subtype_array_items); + + if (size < 1 || size > PYRNA_STACK_ARRAY) { + PyErr_Format( + PyExc_TypeError, + "BoolVectorProperty(size=%d): size must be between 0 and " STRINGIFY(PYRNA_STACK_ARRAY), + size); + return NULL; + } + + if (pydef && + PyC_AsArray( + def, pydef, size, &PyBool_Type, false, "BoolVectorProperty(default=sequence)") == -1) { + return NULL; + } + + if (bpy_prop_callback_check(update_cb, "update", 2) == -1) { + return NULL; + } + if (bpy_prop_callback_check(get_cb, "get", 1) == -1) { + return NULL; + } + if (bpy_prop_callback_check(set_cb, "set", 2) == -1) { + return NULL; + } + + // prop = RNA_def_boolean_array(srna, id, size, pydef ? def:NULL, name ? name : id, description); + prop = RNA_def_property(srna, id, PROP_BOOLEAN, subtype); + RNA_def_property_array(prop, size); + if (pydef) { + RNA_def_property_boolean_array_default(prop, def); + } + RNA_def_property_ui_text(prop, name ? name : id, description); + + if (py_tags) { + RNA_def_property_tags(prop, prop_tags); + } + if (pyopts) { + bpy_prop_assign_flag(prop, opts); + } + bpy_prop_callback_assign_update(prop, update_cb); + bpy_prop_callback_assign_boolean_array(prop, get_cb, set_cb); + RNA_def_property_duplicate_pointers(srna, prop); + } + + Py_RETURN_NONE; } PyDoc_STRVAR(BPy_IntProperty_doc, -".. function:: IntProperty(name=\"\", " - "description=\"\", " - "default=0, " - "min=-2**31, max=2**31-1, " - "soft_min=-2**31, soft_max=2**31-1, " - "step=1, " - "options={'ANIMATABLE'}, " - "tags={}, " - "subtype='NONE', " - "update=None, " - "get=None, " - "set=None)\n" -"\n" -" Returns a new int property definition.\n" -"\n" -BPY_PROPDEF_NAME_DOC -BPY_PROPDEF_DESC_DOC -BPY_PROPDEF_NUM_MIN_DOC -" :type min: int\n" -BPY_PROPDEF_NUM_MAX_DOC -" :type max: int\n" -BPY_PROPDEF_NUM_SOFTMAX_DOC -" :type soft_min: int\n" -BPY_PROPDEF_NUM_SOFTMIN_DOC -" :type soft_max: int\n" -BPY_PROPDEF_INT_STEP_DOC -BPY_PROPDEF_OPTIONS_DOC -BPY_PROPDEF_TAGS_DOC -BPY_PROPDEF_SUBTYPE_NUMBER_DOC -BPY_PROPDEF_UPDATE_DOC -BPY_PROPDEF_GET_DOC -BPY_PROPDEF_SET_DOC -); + ".. function:: IntProperty(name=\"\", " + "description=\"\", " + "default=0, " + "min=-2**31, max=2**31-1, " + "soft_min=-2**31, soft_max=2**31-1, " + "step=1, " + "options={'ANIMATABLE'}, " + "tags={}, " + "subtype='NONE', " + "update=None, " + "get=None, " + "set=None)\n" + "\n" + " Returns a new int property definition.\n" + "\n" BPY_PROPDEF_NAME_DOC BPY_PROPDEF_DESC_DOC BPY_PROPDEF_NUM_MIN_DOC + " :type min: int\n" BPY_PROPDEF_NUM_MAX_DOC + " :type max: int\n" BPY_PROPDEF_NUM_SOFTMAX_DOC + " :type soft_min: int\n" BPY_PROPDEF_NUM_SOFTMIN_DOC + " :type soft_max: int\n" BPY_PROPDEF_INT_STEP_DOC BPY_PROPDEF_OPTIONS_DOC + BPY_PROPDEF_TAGS_DOC BPY_PROPDEF_SUBTYPE_NUMBER_DOC BPY_PROPDEF_UPDATE_DOC + BPY_PROPDEF_GET_DOC BPY_PROPDEF_SET_DOC); static PyObject *BPy_IntProperty(PyObject *self, PyObject *args, PyObject *kw) { - StructRNA *srna; - - BPY_PROPDEF_HEAD(IntProperty); - - if (srna) { - const char *id = NULL, *name = NULL, *description = ""; - int id_len; - int min = INT_MIN, max = INT_MAX, soft_min = INT_MIN, soft_max = INT_MAX, step = 1, def = 0; - PropertyRNA *prop; - PyObject *pyopts = NULL; - int opts = 0; - int prop_tags = 0; - const char *pysubtype = NULL; - int subtype = PROP_NONE; - PyObject *update_cb = NULL; - PyObject *get_cb = NULL; - PyObject *set_cb = NULL; - PyObject *py_tags = NULL; - - static const char *_keywords[] = { - "attr", "name", "description", "default", - "min", "max", "soft_min", "soft_max", - "step", "options", "tags", "subtype", - "update", "get", "set", NULL, - }; - static _PyArg_Parser _parser = {"s#|ssiiiiiiO!O!sOOO:IntProperty", _keywords, 0}; - if (!_PyArg_ParseTupleAndKeywordsFast( - args, kw, &_parser, - &id, &id_len, - &name, &description, &def, - &min, &max, &soft_min, &soft_max, - &step, &PySet_Type, &pyopts, &PySet_Type, &py_tags, &pysubtype, - &update_cb, &get_cb, &set_cb)) - { - return NULL; - } - - BPY_PROPDEF_SUBTYPE_CHECK(IntProperty, property_flag_items, property_subtype_number_items); - - if (bpy_prop_callback_check(update_cb, "update", 2) == -1) { - return NULL; - } - if (bpy_prop_callback_check(get_cb, "get", 1) == -1) { - return NULL; - } - if (bpy_prop_callback_check(set_cb, "set", 2) == -1) { - return NULL; - } - - prop = RNA_def_property(srna, id, PROP_INT, subtype); - RNA_def_property_int_default(prop, def); - RNA_def_property_ui_text(prop, name ? name : id, description); - RNA_def_property_range(prop, min, max); - RNA_def_property_ui_range(prop, MAX2(soft_min, min), MIN2(soft_max, max), step, 3); - - if (py_tags) { - RNA_def_property_tags(prop, prop_tags); - } - if (pyopts) { - bpy_prop_assign_flag(prop, opts); - } - bpy_prop_callback_assign_update(prop, update_cb); - bpy_prop_callback_assign_int(prop, get_cb, set_cb); - RNA_def_property_duplicate_pointers(srna, prop); - } - Py_RETURN_NONE; + StructRNA *srna; + + BPY_PROPDEF_HEAD(IntProperty); + + if (srna) { + const char *id = NULL, *name = NULL, *description = ""; + int id_len; + int min = INT_MIN, max = INT_MAX, soft_min = INT_MIN, soft_max = INT_MAX, step = 1, def = 0; + PropertyRNA *prop; + PyObject *pyopts = NULL; + int opts = 0; + int prop_tags = 0; + const char *pysubtype = NULL; + int subtype = PROP_NONE; + PyObject *update_cb = NULL; + PyObject *get_cb = NULL; + PyObject *set_cb = NULL; + PyObject *py_tags = NULL; + + static const char *_keywords[] = { + "attr", + "name", + "description", + "default", + "min", + "max", + "soft_min", + "soft_max", + "step", + "options", + "tags", + "subtype", + "update", + "get", + "set", + NULL, + }; + static _PyArg_Parser _parser = {"s#|ssiiiiiiO!O!sOOO:IntProperty", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast(args, + kw, + &_parser, + &id, + &id_len, + &name, + &description, + &def, + &min, + &max, + &soft_min, + &soft_max, + &step, + &PySet_Type, + &pyopts, + &PySet_Type, + &py_tags, + &pysubtype, + &update_cb, + &get_cb, + &set_cb)) { + return NULL; + } + + BPY_PROPDEF_SUBTYPE_CHECK(IntProperty, property_flag_items, property_subtype_number_items); + + if (bpy_prop_callback_check(update_cb, "update", 2) == -1) { + return NULL; + } + if (bpy_prop_callback_check(get_cb, "get", 1) == -1) { + return NULL; + } + if (bpy_prop_callback_check(set_cb, "set", 2) == -1) { + return NULL; + } + + prop = RNA_def_property(srna, id, PROP_INT, subtype); + RNA_def_property_int_default(prop, def); + RNA_def_property_ui_text(prop, name ? name : id, description); + RNA_def_property_range(prop, min, max); + RNA_def_property_ui_range(prop, MAX2(soft_min, min), MIN2(soft_max, max), step, 3); + + if (py_tags) { + RNA_def_property_tags(prop, prop_tags); + } + if (pyopts) { + bpy_prop_assign_flag(prop, opts); + } + bpy_prop_callback_assign_update(prop, update_cb); + bpy_prop_callback_assign_int(prop, get_cb, set_cb); + RNA_def_property_duplicate_pointers(srna, prop); + } + Py_RETURN_NONE; } PyDoc_STRVAR(BPy_IntVectorProperty_doc, -".. function:: IntVectorProperty(name=\"\", " - "description=\"\", " - "default=(0, 0, 0), min=-2**31, max=2**31-1, " - "soft_min=-2**31, " - "soft_max=2**31-1, " - "step=1, " - "options={'ANIMATABLE'}, " - "tags={}, " - "subtype='NONE', " - "size=3, " - "update=None, " - "get=None, " - "set=None)\n" -"\n" -" Returns a new vector int property definition.\n" -"\n" -BPY_PROPDEF_NAME_DOC -BPY_PROPDEF_DESC_DOC -" :arg default: sequence of ints the length of *size*.\n" -" :type default: sequence\n" -BPY_PROPDEF_NUM_MIN_DOC -" :type min: int\n" -BPY_PROPDEF_NUM_MAX_DOC -" :type max: int\n" -BPY_PROPDEF_NUM_SOFTMIN_DOC -" :type soft_min: int\n" -BPY_PROPDEF_NUM_SOFTMAX_DOC -" :type soft_max: int\n" -BPY_PROPDEF_INT_STEP_DOC -BPY_PROPDEF_OPTIONS_DOC -BPY_PROPDEF_TAGS_DOC -BPY_PROPDEF_SUBTYPE_ARRAY_DOC -BPY_PROPDEF_VECSIZE_DOC -BPY_PROPDEF_UPDATE_DOC -BPY_PROPDEF_GET_DOC -BPY_PROPDEF_SET_DOC -); + ".. function:: IntVectorProperty(name=\"\", " + "description=\"\", " + "default=(0, 0, 0), min=-2**31, max=2**31-1, " + "soft_min=-2**31, " + "soft_max=2**31-1, " + "step=1, " + "options={'ANIMATABLE'}, " + "tags={}, " + "subtype='NONE', " + "size=3, " + "update=None, " + "get=None, " + "set=None)\n" + "\n" + " Returns a new vector int property definition.\n" + "\n" BPY_PROPDEF_NAME_DOC BPY_PROPDEF_DESC_DOC + " :arg default: sequence of ints the length of *size*.\n" + " :type default: sequence\n" BPY_PROPDEF_NUM_MIN_DOC + " :type min: int\n" BPY_PROPDEF_NUM_MAX_DOC + " :type max: int\n" BPY_PROPDEF_NUM_SOFTMIN_DOC + " :type soft_min: int\n" BPY_PROPDEF_NUM_SOFTMAX_DOC + " :type soft_max: int\n" BPY_PROPDEF_INT_STEP_DOC BPY_PROPDEF_OPTIONS_DOC + BPY_PROPDEF_TAGS_DOC BPY_PROPDEF_SUBTYPE_ARRAY_DOC BPY_PROPDEF_VECSIZE_DOC + BPY_PROPDEF_UPDATE_DOC BPY_PROPDEF_GET_DOC BPY_PROPDEF_SET_DOC); static PyObject *BPy_IntVectorProperty(PyObject *self, PyObject *args, PyObject *kw) { - StructRNA *srna; - - BPY_PROPDEF_HEAD(IntVectorProperty); - - if (srna) { - const char *id = NULL, *name = NULL, *description = ""; - int id_len; - int min = INT_MIN, max = INT_MAX, soft_min = INT_MIN, soft_max = INT_MAX, step = 1; - int def[PYRNA_STACK_ARRAY] = {0}; - int size = 3; - PropertyRNA *prop; - PyObject *pydef = NULL; - PyObject *pyopts = NULL; - int opts = 0; - int prop_tags = 0; - const char *pysubtype = NULL; - int subtype = PROP_NONE; - PyObject *update_cb = NULL; - PyObject *get_cb = NULL; - PyObject *set_cb = NULL; - PyObject *py_tags = NULL; - - static const char *_keywords[] = { - "attr", "name", "description", "default", - "min", "max", "soft_min", "soft_max", - "step", "options", "tags", "subtype", "size", - "update", "get", "set", NULL, - }; - static _PyArg_Parser _parser = {"s#|ssOiiiiiO!O!siOOO:IntVectorProperty", _keywords, 0}; - if (!_PyArg_ParseTupleAndKeywordsFast( - args, kw, &_parser, - &id, &id_len, - &name, &description, &pydef, - &min, &max, &soft_min, &soft_max, - &step, &PySet_Type, &pyopts, &PySet_Type, &py_tags, - &pysubtype, &size, - &update_cb, &get_cb, &set_cb)) - { - return NULL; - } - - BPY_PROPDEF_SUBTYPE_CHECK(IntVectorProperty, property_flag_items, property_subtype_array_items); - - if (size < 1 || size > PYRNA_STACK_ARRAY) { - PyErr_Format(PyExc_TypeError, - "IntVectorProperty(size=%d): size must be between 0 and " - STRINGIFY(PYRNA_STACK_ARRAY), size); - return NULL; - } - - if (pydef && PyC_AsArray(def, pydef, size, &PyLong_Type, false, "IntVectorProperty(default=sequence)") == -1) { - return NULL; - } - - if (bpy_prop_callback_check(update_cb, "update", 2) == -1) { - return NULL; - } - if (bpy_prop_callback_check(get_cb, "get", 1) == -1) { - return NULL; - } - if (bpy_prop_callback_check(set_cb, "set", 2) == -1) { - return NULL; - } - - prop = RNA_def_property(srna, id, PROP_INT, subtype); - RNA_def_property_array(prop, size); - if (pydef) { - RNA_def_property_int_array_default(prop, def); - } - RNA_def_property_range(prop, min, max); - RNA_def_property_ui_text(prop, name ? name : id, description); - RNA_def_property_ui_range(prop, MAX2(soft_min, min), MIN2(soft_max, max), step, 3); - - if (py_tags) { - RNA_def_property_tags(prop, prop_tags); - } - if (pyopts) { - bpy_prop_assign_flag(prop, opts); - } - bpy_prop_callback_assign_update(prop, update_cb); - bpy_prop_callback_assign_int_array(prop, get_cb, set_cb); - RNA_def_property_duplicate_pointers(srna, prop); - } - Py_RETURN_NONE; + StructRNA *srna; + + BPY_PROPDEF_HEAD(IntVectorProperty); + + if (srna) { + const char *id = NULL, *name = NULL, *description = ""; + int id_len; + int min = INT_MIN, max = INT_MAX, soft_min = INT_MIN, soft_max = INT_MAX, step = 1; + int def[PYRNA_STACK_ARRAY] = {0}; + int size = 3; + PropertyRNA *prop; + PyObject *pydef = NULL; + PyObject *pyopts = NULL; + int opts = 0; + int prop_tags = 0; + const char *pysubtype = NULL; + int subtype = PROP_NONE; + PyObject *update_cb = NULL; + PyObject *get_cb = NULL; + PyObject *set_cb = NULL; + PyObject *py_tags = NULL; + + static const char *_keywords[] = { + "attr", + "name", + "description", + "default", + "min", + "max", + "soft_min", + "soft_max", + "step", + "options", + "tags", + "subtype", + "size", + "update", + "get", + "set", + NULL, + }; + static _PyArg_Parser _parser = {"s#|ssOiiiiiO!O!siOOO:IntVectorProperty", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast(args, + kw, + &_parser, + &id, + &id_len, + &name, + &description, + &pydef, + &min, + &max, + &soft_min, + &soft_max, + &step, + &PySet_Type, + &pyopts, + &PySet_Type, + &py_tags, + &pysubtype, + &size, + &update_cb, + &get_cb, + &set_cb)) { + return NULL; + } + + BPY_PROPDEF_SUBTYPE_CHECK( + IntVectorProperty, property_flag_items, property_subtype_array_items); + + if (size < 1 || size > PYRNA_STACK_ARRAY) { + PyErr_Format( + PyExc_TypeError, + "IntVectorProperty(size=%d): size must be between 0 and " STRINGIFY(PYRNA_STACK_ARRAY), + size); + return NULL; + } + + if (pydef && + PyC_AsArray( + def, pydef, size, &PyLong_Type, false, "IntVectorProperty(default=sequence)") == -1) { + return NULL; + } + + if (bpy_prop_callback_check(update_cb, "update", 2) == -1) { + return NULL; + } + if (bpy_prop_callback_check(get_cb, "get", 1) == -1) { + return NULL; + } + if (bpy_prop_callback_check(set_cb, "set", 2) == -1) { + return NULL; + } + + prop = RNA_def_property(srna, id, PROP_INT, subtype); + RNA_def_property_array(prop, size); + if (pydef) { + RNA_def_property_int_array_default(prop, def); + } + RNA_def_property_range(prop, min, max); + RNA_def_property_ui_text(prop, name ? name : id, description); + RNA_def_property_ui_range(prop, MAX2(soft_min, min), MIN2(soft_max, max), step, 3); + + if (py_tags) { + RNA_def_property_tags(prop, prop_tags); + } + if (pyopts) { + bpy_prop_assign_flag(prop, opts); + } + bpy_prop_callback_assign_update(prop, update_cb); + bpy_prop_callback_assign_int_array(prop, get_cb, set_cb); + RNA_def_property_duplicate_pointers(srna, prop); + } + Py_RETURN_NONE; } - PyDoc_STRVAR(BPy_FloatProperty_doc, -".. function:: FloatProperty(name=\"\", " - "description=\"\", " - "default=0.0, " - "min=sys.float_info.min, max=sys.float_info.max, " - "soft_min=sys.float_info.min, soft_max=sys.float_info.max, " - "step=3, " - "precision=2, " - "options={'ANIMATABLE'}, " - "tags={}, " - "subtype='NONE', " - "unit='NONE', " - "update=None, " - "get=None, " - "set=None)\n" -"\n" -" Returns a new float property definition.\n" -"\n" -BPY_PROPDEF_NAME_DOC -BPY_PROPDEF_DESC_DOC -BPY_PROPDEF_NUM_MIN_DOC -" :type min: float\n" -BPY_PROPDEF_NUM_MAX_DOC -" :type max: float\n" -BPY_PROPDEF_NUM_SOFTMIN_DOC -" :type soft_min: float\n" -BPY_PROPDEF_NUM_SOFTMAX_DOC -" :type soft_max: float\n" -BPY_PROPDEF_FLOAT_STEP_DOC -BPY_PROPDEF_FLOAT_PREC_DOC -BPY_PROPDEF_OPTIONS_DOC -BPY_PROPDEF_TAGS_DOC -BPY_PROPDEF_SUBTYPE_NUMBER_DOC -BPY_PROPDEF_UNIT_DOC -BPY_PROPDEF_UPDATE_DOC -BPY_PROPDEF_GET_DOC -BPY_PROPDEF_SET_DOC -); + ".. function:: FloatProperty(name=\"\", " + "description=\"\", " + "default=0.0, " + "min=sys.float_info.min, max=sys.float_info.max, " + "soft_min=sys.float_info.min, soft_max=sys.float_info.max, " + "step=3, " + "precision=2, " + "options={'ANIMATABLE'}, " + "tags={}, " + "subtype='NONE', " + "unit='NONE', " + "update=None, " + "get=None, " + "set=None)\n" + "\n" + " Returns a new float property definition.\n" + "\n" BPY_PROPDEF_NAME_DOC BPY_PROPDEF_DESC_DOC BPY_PROPDEF_NUM_MIN_DOC + " :type min: float\n" BPY_PROPDEF_NUM_MAX_DOC + " :type max: float\n" BPY_PROPDEF_NUM_SOFTMIN_DOC + " :type soft_min: float\n" BPY_PROPDEF_NUM_SOFTMAX_DOC + " :type soft_max: float\n" BPY_PROPDEF_FLOAT_STEP_DOC BPY_PROPDEF_FLOAT_PREC_DOC + BPY_PROPDEF_OPTIONS_DOC BPY_PROPDEF_TAGS_DOC BPY_PROPDEF_SUBTYPE_NUMBER_DOC + BPY_PROPDEF_UNIT_DOC BPY_PROPDEF_UPDATE_DOC BPY_PROPDEF_GET_DOC + BPY_PROPDEF_SET_DOC); static PyObject *BPy_FloatProperty(PyObject *self, PyObject *args, PyObject *kw) { - StructRNA *srna; - - BPY_PROPDEF_HEAD(FloatProperty); - - if (srna) { - const char *id = NULL, *name = NULL, *description = ""; - int id_len; - float min = -FLT_MAX, max = FLT_MAX, soft_min = -FLT_MAX, soft_max = FLT_MAX, step = 3, def = 0.0f; - int precision = 2; - PropertyRNA *prop; - PyObject *pyopts = NULL; - int opts = 0; - int prop_tags = 0; - const char *pysubtype = NULL; - int subtype = PROP_NONE; - const char *pyunit = NULL; - int unit = PROP_UNIT_NONE; - PyObject *update_cb = NULL; - PyObject *get_cb = NULL; - PyObject *set_cb = NULL; - PyObject *py_tags = NULL; - - static const char *_keywords[] = { - "attr", "name", "description", "default", - "min", "max", "soft_min", "soft_max", - "step", "precision", "options", "tags", "subtype", - "unit", "update", "get", "set", NULL, - }; - static _PyArg_Parser _parser = {"s#|ssffffffiO!O!ssOOO:FloatProperty", _keywords, 0}; - if (!_PyArg_ParseTupleAndKeywordsFast( - args, kw, &_parser, - &id, &id_len, - &name, &description, &def, - &min, &max, &soft_min, &soft_max, - &step, &precision, &PySet_Type, - &pyopts, &PySet_Type, &py_tags, &pysubtype, &pyunit, - &update_cb, &get_cb, &set_cb)) - { - return NULL; - } - - BPY_PROPDEF_SUBTYPE_CHECK(FloatProperty, property_flag_items, property_subtype_number_items); - - if (pyunit && RNA_enum_value_from_id(rna_enum_property_unit_items, pyunit, &unit) == 0) { - PyErr_Format(PyExc_TypeError, "FloatProperty(unit='%s'): invalid unit", pyunit); - return NULL; - } - - if (bpy_prop_callback_check(update_cb, "update", 2) == -1) { - return NULL; - } - if (bpy_prop_callback_check(get_cb, "get", 1) == -1) { - return NULL; - } - if (bpy_prop_callback_check(set_cb, "set", 2) == -1) { - return NULL; - } - - prop = RNA_def_property(srna, id, PROP_FLOAT, subtype | unit); - RNA_def_property_float_default(prop, def); - RNA_def_property_range(prop, min, max); - RNA_def_property_ui_text(prop, name ? name : id, description); - RNA_def_property_ui_range(prop, MAX2(soft_min, min), MIN2(soft_max, max), step, precision); - - if (py_tags) { - RNA_def_property_tags(prop, prop_tags); - } - if (pyopts) { - bpy_prop_assign_flag(prop, opts); - } - bpy_prop_callback_assign_update(prop, update_cb); - bpy_prop_callback_assign_float(prop, get_cb, set_cb); - RNA_def_property_duplicate_pointers(srna, prop); - } - Py_RETURN_NONE; + StructRNA *srna; + + BPY_PROPDEF_HEAD(FloatProperty); + + if (srna) { + const char *id = NULL, *name = NULL, *description = ""; + int id_len; + float min = -FLT_MAX, max = FLT_MAX, soft_min = -FLT_MAX, soft_max = FLT_MAX, step = 3, + def = 0.0f; + int precision = 2; + PropertyRNA *prop; + PyObject *pyopts = NULL; + int opts = 0; + int prop_tags = 0; + const char *pysubtype = NULL; + int subtype = PROP_NONE; + const char *pyunit = NULL; + int unit = PROP_UNIT_NONE; + PyObject *update_cb = NULL; + PyObject *get_cb = NULL; + PyObject *set_cb = NULL; + PyObject *py_tags = NULL; + + static const char *_keywords[] = { + "attr", + "name", + "description", + "default", + "min", + "max", + "soft_min", + "soft_max", + "step", + "precision", + "options", + "tags", + "subtype", + "unit", + "update", + "get", + "set", + NULL, + }; + static _PyArg_Parser _parser = {"s#|ssffffffiO!O!ssOOO:FloatProperty", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast(args, + kw, + &_parser, + &id, + &id_len, + &name, + &description, + &def, + &min, + &max, + &soft_min, + &soft_max, + &step, + &precision, + &PySet_Type, + &pyopts, + &PySet_Type, + &py_tags, + &pysubtype, + &pyunit, + &update_cb, + &get_cb, + &set_cb)) { + return NULL; + } + + BPY_PROPDEF_SUBTYPE_CHECK(FloatProperty, property_flag_items, property_subtype_number_items); + + if (pyunit && RNA_enum_value_from_id(rna_enum_property_unit_items, pyunit, &unit) == 0) { + PyErr_Format(PyExc_TypeError, "FloatProperty(unit='%s'): invalid unit", pyunit); + return NULL; + } + + if (bpy_prop_callback_check(update_cb, "update", 2) == -1) { + return NULL; + } + if (bpy_prop_callback_check(get_cb, "get", 1) == -1) { + return NULL; + } + if (bpy_prop_callback_check(set_cb, "set", 2) == -1) { + return NULL; + } + + prop = RNA_def_property(srna, id, PROP_FLOAT, subtype | unit); + RNA_def_property_float_default(prop, def); + RNA_def_property_range(prop, min, max); + RNA_def_property_ui_text(prop, name ? name : id, description); + RNA_def_property_ui_range(prop, MAX2(soft_min, min), MIN2(soft_max, max), step, precision); + + if (py_tags) { + RNA_def_property_tags(prop, prop_tags); + } + if (pyopts) { + bpy_prop_assign_flag(prop, opts); + } + bpy_prop_callback_assign_update(prop, update_cb); + bpy_prop_callback_assign_float(prop, get_cb, set_cb); + RNA_def_property_duplicate_pointers(srna, prop); + } + Py_RETURN_NONE; } PyDoc_STRVAR(BPy_FloatVectorProperty_doc, -".. function:: FloatVectorProperty(name=\"\", " - "description=\"\", " - "default=(0.0, 0.0, 0.0), " - "min=sys.float_info.min, max=sys.float_info.max, " - "soft_min=sys.float_info.min, soft_max=sys.float_info.max, " - "step=3, " - "precision=2, " - "options={'ANIMATABLE'}, " - "tags={}, " - "subtype='NONE', " - "unit='NONE', " - "size=3, " - "update=None, " - "get=None, " - "set=None)\n" -"\n" -" Returns a new vector float property definition.\n" -"\n" -BPY_PROPDEF_NAME_DOC -BPY_PROPDEF_DESC_DOC -" :arg default: sequence of floats the length of *size*.\n" -" :type default: sequence\n" -BPY_PROPDEF_NUM_MIN_DOC -" :type min: float\n" -BPY_PROPDEF_NUM_MAX_DOC -" :type max: float\n" -BPY_PROPDEF_NUM_SOFTMIN_DOC -" :type soft_min: float\n" -BPY_PROPDEF_NUM_SOFTMAX_DOC -" :type soft_max: float\n" -BPY_PROPDEF_OPTIONS_DOC -BPY_PROPDEF_TAGS_DOC -BPY_PROPDEF_FLOAT_STEP_DOC -BPY_PROPDEF_FLOAT_PREC_DOC -BPY_PROPDEF_SUBTYPE_ARRAY_DOC -BPY_PROPDEF_UNIT_DOC -BPY_PROPDEF_VECSIZE_DOC -BPY_PROPDEF_UPDATE_DOC -BPY_PROPDEF_GET_DOC -BPY_PROPDEF_SET_DOC -); + ".. function:: FloatVectorProperty(name=\"\", " + "description=\"\", " + "default=(0.0, 0.0, 0.0), " + "min=sys.float_info.min, max=sys.float_info.max, " + "soft_min=sys.float_info.min, soft_max=sys.float_info.max, " + "step=3, " + "precision=2, " + "options={'ANIMATABLE'}, " + "tags={}, " + "subtype='NONE', " + "unit='NONE', " + "size=3, " + "update=None, " + "get=None, " + "set=None)\n" + "\n" + " Returns a new vector float property definition.\n" + "\n" BPY_PROPDEF_NAME_DOC BPY_PROPDEF_DESC_DOC + " :arg default: sequence of floats the length of *size*.\n" + " :type default: sequence\n" BPY_PROPDEF_NUM_MIN_DOC + " :type min: float\n" BPY_PROPDEF_NUM_MAX_DOC + " :type max: float\n" BPY_PROPDEF_NUM_SOFTMIN_DOC + " :type soft_min: float\n" BPY_PROPDEF_NUM_SOFTMAX_DOC + " :type soft_max: float\n" BPY_PROPDEF_OPTIONS_DOC BPY_PROPDEF_TAGS_DOC + BPY_PROPDEF_FLOAT_STEP_DOC BPY_PROPDEF_FLOAT_PREC_DOC + BPY_PROPDEF_SUBTYPE_ARRAY_DOC BPY_PROPDEF_UNIT_DOC BPY_PROPDEF_VECSIZE_DOC + BPY_PROPDEF_UPDATE_DOC BPY_PROPDEF_GET_DOC BPY_PROPDEF_SET_DOC); static PyObject *BPy_FloatVectorProperty(PyObject *self, PyObject *args, PyObject *kw) { - StructRNA *srna; - - BPY_PROPDEF_HEAD(FloatVectorProperty); - - if (srna) { - const char *id = NULL, *name = NULL, *description = ""; - int id_len; - float min = -FLT_MAX, max = FLT_MAX, soft_min = -FLT_MAX, soft_max = FLT_MAX, step = 3; - float def[PYRNA_STACK_ARRAY] = {0.0f}; - int precision = 2, size = 3; - PropertyRNA *prop; - PyObject *pydef = NULL; - PyObject *pyopts = NULL; - int opts = 0; - int prop_tags = 0; - const char *pysubtype = NULL; - int subtype = PROP_NONE; - const char *pyunit = NULL; - int unit = PROP_UNIT_NONE; - PyObject *update_cb = NULL; - PyObject *get_cb = NULL; - PyObject *set_cb = NULL; - PyObject *py_tags = NULL; - - static const char *_keywords[] = { - "attr", "name", "description", "default", - "min", "max", "soft_min", "soft_max", - "step", "precision", "options", "tags", "subtype", - "unit", "size", "update", "get", "set", NULL, - }; - static _PyArg_Parser _parser = {"s#|ssOfffffiO!O!ssiOOO:FloatVectorProperty", _keywords, 0}; - if (!_PyArg_ParseTupleAndKeywordsFast( - args, kw, &_parser, - &id, &id_len, - &name, &description, &pydef, - &min, &max, &soft_min, &soft_max, - &step, &precision, &PySet_Type, - &pyopts, &PySet_Type, &py_tags, &pysubtype, &pyunit, &size, - &update_cb, &get_cb, &set_cb)) - { - return NULL; - } - - BPY_PROPDEF_SUBTYPE_CHECK(FloatVectorProperty, property_flag_items, property_subtype_array_items); - - if (pyunit && RNA_enum_value_from_id(rna_enum_property_unit_items, pyunit, &unit) == 0) { - PyErr_Format(PyExc_TypeError, "FloatVectorProperty(unit='%s'): invalid unit", pyunit); - return NULL; - } - - if (size < 1 || size > PYRNA_STACK_ARRAY) { - PyErr_Format(PyExc_TypeError, - "FloatVectorProperty(size=%d): size must be between 0 and " - STRINGIFY(PYRNA_STACK_ARRAY), size); - return NULL; - } - - if (pydef && PyC_AsArray(def, pydef, size, &PyFloat_Type, false, "FloatVectorProperty(default=sequence)") == -1) { - return NULL; - } - - if (bpy_prop_callback_check(update_cb, "update", 2) == -1) { - return NULL; - } - if (bpy_prop_callback_check(get_cb, "get", 1) == -1) { - return NULL; - } - if (bpy_prop_callback_check(set_cb, "set", 2) == -1) { - return NULL; - } - - prop = RNA_def_property(srna, id, PROP_FLOAT, subtype | unit); - RNA_def_property_array(prop, size); - if (pydef) { - RNA_def_property_float_array_default(prop, def); - } - RNA_def_property_range(prop, min, max); - RNA_def_property_ui_text(prop, name ? name : id, description); - RNA_def_property_ui_range(prop, MAX2(soft_min, min), MIN2(soft_max, max), step, precision); - - if (py_tags) { - RNA_def_property_tags(prop, prop_tags); - } - if (pyopts) { - bpy_prop_assign_flag(prop, opts); - } - bpy_prop_callback_assign_update(prop, update_cb); - bpy_prop_callback_assign_float_array(prop, get_cb, set_cb); - RNA_def_property_duplicate_pointers(srna, prop); - } - Py_RETURN_NONE; + StructRNA *srna; + + BPY_PROPDEF_HEAD(FloatVectorProperty); + + if (srna) { + const char *id = NULL, *name = NULL, *description = ""; + int id_len; + float min = -FLT_MAX, max = FLT_MAX, soft_min = -FLT_MAX, soft_max = FLT_MAX, step = 3; + float def[PYRNA_STACK_ARRAY] = {0.0f}; + int precision = 2, size = 3; + PropertyRNA *prop; + PyObject *pydef = NULL; + PyObject *pyopts = NULL; + int opts = 0; + int prop_tags = 0; + const char *pysubtype = NULL; + int subtype = PROP_NONE; + const char *pyunit = NULL; + int unit = PROP_UNIT_NONE; + PyObject *update_cb = NULL; + PyObject *get_cb = NULL; + PyObject *set_cb = NULL; + PyObject *py_tags = NULL; + + static const char *_keywords[] = { + "attr", "name", "description", "default", "min", "max", "soft_min", + "soft_max", "step", "precision", "options", "tags", "subtype", "unit", + "size", "update", "get", "set", NULL, + }; + static _PyArg_Parser _parser = {"s#|ssOfffffiO!O!ssiOOO:FloatVectorProperty", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast(args, + kw, + &_parser, + &id, + &id_len, + &name, + &description, + &pydef, + &min, + &max, + &soft_min, + &soft_max, + &step, + &precision, + &PySet_Type, + &pyopts, + &PySet_Type, + &py_tags, + &pysubtype, + &pyunit, + &size, + &update_cb, + &get_cb, + &set_cb)) { + return NULL; + } + + BPY_PROPDEF_SUBTYPE_CHECK( + FloatVectorProperty, property_flag_items, property_subtype_array_items); + + if (pyunit && RNA_enum_value_from_id(rna_enum_property_unit_items, pyunit, &unit) == 0) { + PyErr_Format(PyExc_TypeError, "FloatVectorProperty(unit='%s'): invalid unit", pyunit); + return NULL; + } + + if (size < 1 || size > PYRNA_STACK_ARRAY) { + PyErr_Format( + PyExc_TypeError, + "FloatVectorProperty(size=%d): size must be between 0 and " STRINGIFY(PYRNA_STACK_ARRAY), + size); + return NULL; + } + + if (pydef && + PyC_AsArray( + def, pydef, size, &PyFloat_Type, false, "FloatVectorProperty(default=sequence)") == + -1) { + return NULL; + } + + if (bpy_prop_callback_check(update_cb, "update", 2) == -1) { + return NULL; + } + if (bpy_prop_callback_check(get_cb, "get", 1) == -1) { + return NULL; + } + if (bpy_prop_callback_check(set_cb, "set", 2) == -1) { + return NULL; + } + + prop = RNA_def_property(srna, id, PROP_FLOAT, subtype | unit); + RNA_def_property_array(prop, size); + if (pydef) { + RNA_def_property_float_array_default(prop, def); + } + RNA_def_property_range(prop, min, max); + RNA_def_property_ui_text(prop, name ? name : id, description); + RNA_def_property_ui_range(prop, MAX2(soft_min, min), MIN2(soft_max, max), step, precision); + + if (py_tags) { + RNA_def_property_tags(prop, prop_tags); + } + if (pyopts) { + bpy_prop_assign_flag(prop, opts); + } + bpy_prop_callback_assign_update(prop, update_cb); + bpy_prop_callback_assign_float_array(prop, get_cb, set_cb); + RNA_def_property_duplicate_pointers(srna, prop); + } + Py_RETURN_NONE; } PyDoc_STRVAR(BPy_StringProperty_doc, -".. function:: StringProperty(name=\"\", " - "description=\"\", " - "default=\"\", " - "maxlen=0, " - "options={'ANIMATABLE'}, " - "tags={}, " - "subtype='NONE', " - "update=None, " - "get=None, " - "set=None)\n" -"\n" -" Returns a new string property definition.\n" -"\n" -BPY_PROPDEF_NAME_DOC -BPY_PROPDEF_DESC_DOC -" :arg default: initializer string.\n" -" :type default: string\n" -" :arg maxlen: maximum length of the string.\n" -" :type maxlen: int\n" -BPY_PROPDEF_OPTIONS_DOC -BPY_PROPDEF_TAGS_DOC -BPY_PROPDEF_SUBTYPE_STRING_DOC -BPY_PROPDEF_UPDATE_DOC -BPY_PROPDEF_GET_DOC -BPY_PROPDEF_SET_DOC -); + ".. function:: StringProperty(name=\"\", " + "description=\"\", " + "default=\"\", " + "maxlen=0, " + "options={'ANIMATABLE'}, " + "tags={}, " + "subtype='NONE', " + "update=None, " + "get=None, " + "set=None)\n" + "\n" + " Returns a new string property definition.\n" + "\n" BPY_PROPDEF_NAME_DOC BPY_PROPDEF_DESC_DOC + " :arg default: initializer string.\n" + " :type default: string\n" + " :arg maxlen: maximum length of the string.\n" + " :type maxlen: int\n" BPY_PROPDEF_OPTIONS_DOC BPY_PROPDEF_TAGS_DOC + BPY_PROPDEF_SUBTYPE_STRING_DOC BPY_PROPDEF_UPDATE_DOC BPY_PROPDEF_GET_DOC + BPY_PROPDEF_SET_DOC); static PyObject *BPy_StringProperty(PyObject *self, PyObject *args, PyObject *kw) { - StructRNA *srna; - - BPY_PROPDEF_HEAD(StringProperty); - - if (srna) { - const char *id = NULL, *name = NULL, *description = "", *def = ""; - int id_len; - int maxlen = 0; - PropertyRNA *prop; - PyObject *pyopts = NULL; - int opts = 0; - int prop_tags = 0; - const char *pysubtype = NULL; - int subtype = PROP_NONE; - PyObject *update_cb = NULL; - PyObject *get_cb = NULL; - PyObject *set_cb = NULL; - PyObject *py_tags = NULL; - - static const char *_keywords[] = { - "attr", "name", "description", "default", - "maxlen", "options", "tags", "subtype", - "update", "get", "set", NULL, - }; - static _PyArg_Parser _parser = {"s#|sssiO!O!sOOO:StringProperty", _keywords, 0}; - if (!_PyArg_ParseTupleAndKeywordsFast( - args, kw, &_parser, - &id, &id_len, - &name, &description, &def, - &maxlen, &PySet_Type, &pyopts, &PySet_Type, &py_tags, &pysubtype, - &update_cb, &get_cb, &set_cb)) - { - return NULL; - } - - BPY_PROPDEF_SUBTYPE_CHECK(StringProperty, property_flag_items, property_subtype_string_items); - - if (bpy_prop_callback_check(update_cb, "update", 2) == -1) { - return NULL; - } - if (bpy_prop_callback_check(get_cb, "get", 1) == -1) { - return NULL; - } - if (bpy_prop_callback_check(set_cb, "set", 2) == -1) { - return NULL; - } - - prop = RNA_def_property(srna, id, PROP_STRING, subtype); - if (maxlen != 0) { - RNA_def_property_string_maxlength(prop, maxlen + 1); /* +1 since it includes null terminator */ - } - if (def && def[0]) { - RNA_def_property_string_default(prop, def); - } - RNA_def_property_ui_text(prop, name ? name : id, description); - - if (py_tags) { - RNA_def_property_tags(prop, prop_tags); - } - if (pyopts) { - bpy_prop_assign_flag(prop, opts); - } - bpy_prop_callback_assign_update(prop, update_cb); - bpy_prop_callback_assign_string(prop, get_cb, set_cb); - RNA_def_property_duplicate_pointers(srna, prop); - } - Py_RETURN_NONE; + StructRNA *srna; + + BPY_PROPDEF_HEAD(StringProperty); + + if (srna) { + const char *id = NULL, *name = NULL, *description = "", *def = ""; + int id_len; + int maxlen = 0; + PropertyRNA *prop; + PyObject *pyopts = NULL; + int opts = 0; + int prop_tags = 0; + const char *pysubtype = NULL; + int subtype = PROP_NONE; + PyObject *update_cb = NULL; + PyObject *get_cb = NULL; + PyObject *set_cb = NULL; + PyObject *py_tags = NULL; + + static const char *_keywords[] = { + "attr", + "name", + "description", + "default", + "maxlen", + "options", + "tags", + "subtype", + "update", + "get", + "set", + NULL, + }; + static _PyArg_Parser _parser = {"s#|sssiO!O!sOOO:StringProperty", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast(args, + kw, + &_parser, + &id, + &id_len, + &name, + &description, + &def, + &maxlen, + &PySet_Type, + &pyopts, + &PySet_Type, + &py_tags, + &pysubtype, + &update_cb, + &get_cb, + &set_cb)) { + return NULL; + } + + BPY_PROPDEF_SUBTYPE_CHECK(StringProperty, property_flag_items, property_subtype_string_items); + + if (bpy_prop_callback_check(update_cb, "update", 2) == -1) { + return NULL; + } + if (bpy_prop_callback_check(get_cb, "get", 1) == -1) { + return NULL; + } + if (bpy_prop_callback_check(set_cb, "set", 2) == -1) { + return NULL; + } + + prop = RNA_def_property(srna, id, PROP_STRING, subtype); + if (maxlen != 0) { + RNA_def_property_string_maxlength(prop, + maxlen + 1); /* +1 since it includes null terminator */ + } + if (def && def[0]) { + RNA_def_property_string_default(prop, def); + } + RNA_def_property_ui_text(prop, name ? name : id, description); + + if (py_tags) { + RNA_def_property_tags(prop, prop_tags); + } + if (pyopts) { + bpy_prop_assign_flag(prop, opts); + } + bpy_prop_callback_assign_update(prop, update_cb); + bpy_prop_callback_assign_string(prop, get_cb, set_cb); + RNA_def_property_duplicate_pointers(srna, prop); + } + Py_RETURN_NONE; } -PyDoc_STRVAR(BPy_EnumProperty_doc, -".. function:: EnumProperty(items, " - "name=\"\", " - "description=\"\", " - "default=None, " - "options={'ANIMATABLE'}, " - "tags={}, " - "update=None, " - "get=None, " - "set=None)\n" -"\n" -" Returns a new enumerator property definition.\n" -"\n" -" :arg items: sequence of enum items formatted:\n" -" ``[(identifier, name, description, icon, number), ...]``.\n" -"\n" -" The first three elements of the tuples are mandatory.\n" -"\n" -" :identifier: The identifier is used for Python access.\n" -" :name: Name for the interace.\n" -" :description: Used for documentation and tooltips.\n" -" :icon: An icon string identifier or integer icon value\n" -" (e.g. returned by :class:`bpy.types.UILayout.icon`)\n" -" :number: Unique value used as the identifier for this item (stored in file data).\n" -" Use when the identifier may need to change. If the *ENUM_FLAG* option is used,\n" -" the values are bitmasks and should be powers of two.\n" -"\n" -" When an item only contains 4 items they define ``(identifier, name, description, number)``.\n" -"\n" -" For dynamic values a callback can be passed which returns a list in\n" -" the same format as the static list.\n" -" This function must take 2 arguments ``(self, context)``, **context may be None**.\n" -"\n" -" .. warning::\n" -"\n" -" There is a known bug with using a callback,\n" -" Python must keep a reference to the strings returned or Blender will misbehave\n" -" or even crash." -"\n" -" :type items: sequence of string tuples or a function\n" -BPY_PROPDEF_NAME_DOC -BPY_PROPDEF_DESC_DOC -" :arg default: The default value for this enum, a string from the identifiers used in *items*.\n" -" If the *ENUM_FLAG* option is used this must be a set of such string identifiers instead.\n" -" WARNING: It shall not be specified (or specified to its default *None* value) for dynamic enums\n" -" (i.e. if a callback function is given as *items* parameter).\n" -" :type default: string or set\n" -BPY_PROPDEF_OPTIONS_ENUM_DOC -BPY_PROPDEF_TAGS_DOC -BPY_PROPDEF_UPDATE_DOC -BPY_PROPDEF_GET_DOC -BPY_PROPDEF_SET_DOC -); +PyDoc_STRVAR( + BPy_EnumProperty_doc, + ".. function:: EnumProperty(items, " + "name=\"\", " + "description=\"\", " + "default=None, " + "options={'ANIMATABLE'}, " + "tags={}, " + "update=None, " + "get=None, " + "set=None)\n" + "\n" + " Returns a new enumerator property definition.\n" + "\n" + " :arg items: sequence of enum items formatted:\n" + " ``[(identifier, name, description, icon, number), ...]``.\n" + "\n" + " The first three elements of the tuples are mandatory.\n" + "\n" + " :identifier: The identifier is used for Python access.\n" + " :name: Name for the interace.\n" + " :description: Used for documentation and tooltips.\n" + " :icon: An icon string identifier or integer icon value\n" + " (e.g. returned by :class:`bpy.types.UILayout.icon`)\n" + " :number: Unique value used as the identifier for this item (stored in file data).\n" + " Use when the identifier may need to change. If the *ENUM_FLAG* option is used,\n" + " the values are bitmasks and should be powers of two.\n" + "\n" + " When an item only contains 4 items they define ``(identifier, name, description, " + "number)``.\n" + "\n" + " For dynamic values a callback can be passed which returns a list in\n" + " the same format as the static list.\n" + " This function must take 2 arguments ``(self, context)``, **context may be None**.\n" + "\n" + " .. warning::\n" + "\n" + " There is a known bug with using a callback,\n" + " Python must keep a reference to the strings returned or Blender will misbehave\n" + " or even crash." + "\n" + " :type items: sequence of string tuples or a function\n" BPY_PROPDEF_NAME_DOC + BPY_PROPDEF_DESC_DOC + " :arg default: The default value for this enum, a string from the identifiers used in " + "*items*.\n" + " If the *ENUM_FLAG* option is used this must be a set of such string identifiers " + "instead.\n" + " WARNING: It shall not be specified (or specified to its default *None* value) for " + "dynamic enums\n" + " (i.e. if a callback function is given as *items* parameter).\n" + " :type default: string or set\n" BPY_PROPDEF_OPTIONS_ENUM_DOC BPY_PROPDEF_TAGS_DOC + BPY_PROPDEF_UPDATE_DOC BPY_PROPDEF_GET_DOC BPY_PROPDEF_SET_DOC); static PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw) { - StructRNA *srna; - - BPY_PROPDEF_HEAD(EnumProperty); - - if (srna) { - const char *id = NULL, *name = NULL, *description = ""; - PyObject *def = NULL; - int id_len; - int defvalue = 0; - PyObject *items, *items_fast; - const EnumPropertyItem *eitems; - PropertyRNA *prop; - PyObject *pyopts = NULL; - int opts = 0; - int prop_tags = 0; - bool is_itemf = false; - PyObject *update_cb = NULL; - PyObject *get_cb = NULL; - PyObject *set_cb = NULL; - PyObject *py_tags = NULL; - - static const char *_keywords[] = { - "attr", "items", "name", "description", "default", - "options", "tags", "update", "get", "set", NULL, - }; - static _PyArg_Parser _parser = {"s#O|ssOO!O!OOO:EnumProperty", _keywords, 0}; - if (!_PyArg_ParseTupleAndKeywordsFast( - args, kw, &_parser, - &id, &id_len, - &items, &name, &description, - &def, &PySet_Type, &pyopts, &PySet_Type, &py_tags, - &update_cb, &get_cb, &set_cb)) - { - return NULL; - } - - BPY_PROPDEF_CHECK(EnumProperty, property_flag_enum_items); - - if (bpy_prop_callback_check(update_cb, "update", 2) == -1) { - return NULL; - } - if (bpy_prop_callback_check(get_cb, "get", 1) == -1) { - return NULL; - } - if (bpy_prop_callback_check(set_cb, "set", 2) == -1) { - return NULL; - } - - if (def == Py_None) { - /* This allows to get same behavior when explicitly passing None as default value, - * and not defining a default value at all! */ - def = NULL; - } - - /* items can be a list or a callable */ - if (PyFunction_Check(items)) { /* don't use PyCallable_Check because we need the function code for errors */ - PyCodeObject *f_code = (PyCodeObject *)PyFunction_GET_CODE(items); - if (f_code->co_argcount != 2) { - PyErr_Format(PyExc_ValueError, - "EnumProperty(...): expected 'items' function to take 2 arguments, not %d", - f_code->co_argcount); - return NULL; - } - - if (def) { - /* note, using type error here is odd but python does this for invalid arguments */ - PyErr_SetString(PyExc_TypeError, - "EnumProperty(...): 'default' can't be set when 'items' is a function"); - return NULL; - } - - is_itemf = true; - eitems = DummyRNA_NULL_items; - } - else { - if (!(items_fast = PySequence_Fast(items, "EnumProperty(...): " - "expected a sequence of tuples for the enum items or a function"))) - { - return NULL; - } - - eitems = enum_items_from_py(items_fast, def, &defvalue, - (opts & PROP_ENUM_FLAG) != 0); - - if (!eitems) { - Py_DECREF(items_fast); - return NULL; - } - } - - if (opts & PROP_ENUM_FLAG) { - prop = RNA_def_enum_flag(srna, id, eitems, defvalue, name ? name : id, description); - } - else { - prop = RNA_def_enum(srna, id, eitems, defvalue, name ? name : id, description); - } - - if (py_tags) { - RNA_def_property_tags(prop, prop_tags); - } - if (pyopts) { - bpy_prop_assign_flag(prop, opts); - } - bpy_prop_callback_assign_update(prop, update_cb); - bpy_prop_callback_assign_enum(prop, get_cb, set_cb, (is_itemf ? items : NULL)); - RNA_def_property_duplicate_pointers(srna, prop); - - if (is_itemf == false) { - /* note: this must be postponed until after #RNA_def_property_duplicate_pointers - * otherwise if this is a generator it may free the strings before we copy them */ - Py_DECREF(items_fast); - - MEM_freeN((void *)eitems); - } - } - Py_RETURN_NONE; + StructRNA *srna; + + BPY_PROPDEF_HEAD(EnumProperty); + + if (srna) { + const char *id = NULL, *name = NULL, *description = ""; + PyObject *def = NULL; + int id_len; + int defvalue = 0; + PyObject *items, *items_fast; + const EnumPropertyItem *eitems; + PropertyRNA *prop; + PyObject *pyopts = NULL; + int opts = 0; + int prop_tags = 0; + bool is_itemf = false; + PyObject *update_cb = NULL; + PyObject *get_cb = NULL; + PyObject *set_cb = NULL; + PyObject *py_tags = NULL; + + static const char *_keywords[] = { + "attr", + "items", + "name", + "description", + "default", + "options", + "tags", + "update", + "get", + "set", + NULL, + }; + static _PyArg_Parser _parser = {"s#O|ssOO!O!OOO:EnumProperty", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast(args, + kw, + &_parser, + &id, + &id_len, + &items, + &name, + &description, + &def, + &PySet_Type, + &pyopts, + &PySet_Type, + &py_tags, + &update_cb, + &get_cb, + &set_cb)) { + return NULL; + } + + BPY_PROPDEF_CHECK(EnumProperty, property_flag_enum_items); + + if (bpy_prop_callback_check(update_cb, "update", 2) == -1) { + return NULL; + } + if (bpy_prop_callback_check(get_cb, "get", 1) == -1) { + return NULL; + } + if (bpy_prop_callback_check(set_cb, "set", 2) == -1) { + return NULL; + } + + if (def == Py_None) { + /* This allows to get same behavior when explicitly passing None as default value, + * and not defining a default value at all! */ + def = NULL; + } + + /* items can be a list or a callable */ + if (PyFunction_Check( + items)) { /* don't use PyCallable_Check because we need the function code for errors */ + PyCodeObject *f_code = (PyCodeObject *)PyFunction_GET_CODE(items); + if (f_code->co_argcount != 2) { + PyErr_Format(PyExc_ValueError, + "EnumProperty(...): expected 'items' function to take 2 arguments, not %d", + f_code->co_argcount); + return NULL; + } + + if (def) { + /* note, using type error here is odd but python does this for invalid arguments */ + PyErr_SetString(PyExc_TypeError, + "EnumProperty(...): 'default' can't be set when 'items' is a function"); + return NULL; + } + + is_itemf = true; + eitems = DummyRNA_NULL_items; + } + else { + if (!(items_fast = PySequence_Fast( + items, + "EnumProperty(...): " + "expected a sequence of tuples for the enum items or a function"))) { + return NULL; + } + + eitems = enum_items_from_py(items_fast, def, &defvalue, (opts & PROP_ENUM_FLAG) != 0); + + if (!eitems) { + Py_DECREF(items_fast); + return NULL; + } + } + + if (opts & PROP_ENUM_FLAG) { + prop = RNA_def_enum_flag(srna, id, eitems, defvalue, name ? name : id, description); + } + else { + prop = RNA_def_enum(srna, id, eitems, defvalue, name ? name : id, description); + } + + if (py_tags) { + RNA_def_property_tags(prop, prop_tags); + } + if (pyopts) { + bpy_prop_assign_flag(prop, opts); + } + bpy_prop_callback_assign_update(prop, update_cb); + bpy_prop_callback_assign_enum(prop, get_cb, set_cb, (is_itemf ? items : NULL)); + RNA_def_property_duplicate_pointers(srna, prop); + + if (is_itemf == false) { + /* note: this must be postponed until after #RNA_def_property_duplicate_pointers + * otherwise if this is a generator it may free the strings before we copy them */ + Py_DECREF(items_fast); + + MEM_freeN((void *)eitems); + } + } + Py_RETURN_NONE; } StructRNA *pointer_type_from_py(PyObject *value, const char *error_prefix) { - StructRNA *srna; - - srna = srna_from_self(value, ""); - if (!srna) { - if (PyErr_Occurred()) { - PyObject *msg = PyC_ExceptionBuffer(); - const char *msg_char = _PyUnicode_AsString(msg); - PyErr_Format(PyExc_TypeError, - "%.200s expected an RNA type, failed with: %s", - error_prefix, msg_char); - Py_DECREF(msg); - } - else { - PyErr_Format(PyExc_TypeError, - "%.200s expected an RNA type, failed with type '%s'", - error_prefix, Py_TYPE(value)->tp_name); - } - return NULL; - } - - return srna; + StructRNA *srna; + + srna = srna_from_self(value, ""); + if (!srna) { + if (PyErr_Occurred()) { + PyObject *msg = PyC_ExceptionBuffer(); + const char *msg_char = _PyUnicode_AsString(msg); + PyErr_Format( + PyExc_TypeError, "%.200s expected an RNA type, failed with: %s", error_prefix, msg_char); + Py_DECREF(msg); + } + else { + PyErr_Format(PyExc_TypeError, + "%.200s expected an RNA type, failed with type '%s'", + error_prefix, + Py_TYPE(value)->tp_name); + } + return NULL; + } + + return srna; } PyDoc_STRVAR(BPy_PointerProperty_doc, -".. function:: PointerProperty(type=None, " - "name=\"\", " - "description=\"\", " - "options={'ANIMATABLE'}, " - "tags={}, " - "poll=None, " - "update=None)\n" -"\n" -" Returns a new pointer property definition.\n" -"\n" -BPY_PROPDEF_TYPE_DOC -BPY_PROPDEF_NAME_DOC -BPY_PROPDEF_DESC_DOC -BPY_PROPDEF_OPTIONS_DOC -BPY_PROPDEF_TAGS_DOC -BPY_PROPDEF_POLL_DOC -BPY_PROPDEF_UPDATE_DOC -); + ".. function:: PointerProperty(type=None, " + "name=\"\", " + "description=\"\", " + "options={'ANIMATABLE'}, " + "tags={}, " + "poll=None, " + "update=None)\n" + "\n" + " Returns a new pointer property definition.\n" + "\n" BPY_PROPDEF_TYPE_DOC BPY_PROPDEF_NAME_DOC BPY_PROPDEF_DESC_DOC + BPY_PROPDEF_OPTIONS_DOC BPY_PROPDEF_TAGS_DOC BPY_PROPDEF_POLL_DOC + BPY_PROPDEF_UPDATE_DOC); PyObject *BPy_PointerProperty(PyObject *self, PyObject *args, PyObject *kw) { - StructRNA *srna; - - BPY_PROPDEF_HEAD(PointerProperty); - - if (srna) { - const char *id = NULL, *name = NULL, *description = ""; - int id_len; - PropertyRNA *prop; - StructRNA *ptype; - PyObject *type = Py_None; - PyObject *pyopts = NULL; - PyObject *py_tags = NULL; - int opts = 0; - int prop_tags = 0; - PyObject *update_cb = NULL, *poll_cb = NULL; - - static const char *_keywords[] = { - "attr", "type", "name", "description", "options", - "tags", "poll", "update", NULL, - }; - static _PyArg_Parser _parser = {"s#O|ssO!O!OO:PointerProperty", _keywords, 0}; - if (!_PyArg_ParseTupleAndKeywordsFast( - args, kw, &_parser, - &id, &id_len, - &type, &name, &description, - &PySet_Type, &pyopts, &PySet_Type, &py_tags, - &poll_cb, &update_cb)) - { - return NULL; - } - - BPY_PROPDEF_CHECK(PointerProperty, property_flag_items); - - ptype = pointer_type_from_py(type, "PointerProperty(...)"); - if (!ptype) { - return NULL; - } - if (!RNA_struct_is_a(ptype, &RNA_PropertyGroup) && !RNA_struct_is_ID(ptype)) { - PyErr_Format(PyExc_TypeError, - "PointerProperty(...) expected an RNA type derived from %.200s or %.200s", - RNA_struct_ui_name(&RNA_ID), RNA_struct_ui_name(&RNA_PropertyGroup)); - return NULL; - } - if (bpy_prop_callback_check(update_cb, "update", 2) == -1) { - return NULL; - } - if (bpy_prop_callback_check(poll_cb, "poll", 2) == -1) { - return NULL; - } - prop = RNA_def_pointer_runtime(srna, id, ptype, name ? name : id, description); - if (py_tags) { - RNA_def_property_tags(prop, prop_tags); - } - if (pyopts) { - bpy_prop_assign_flag(prop, opts); - } - - if (RNA_struct_idprops_contains_datablock(ptype)) { - if (RNA_struct_is_a(srna, &RNA_PropertyGroup)) { - RNA_def_struct_flag(srna, STRUCT_CONTAINS_DATABLOCK_IDPROPERTIES); - } - } - bpy_prop_callback_assign_update(prop, update_cb); - bpy_prop_callback_assign_pointer(prop, poll_cb); - RNA_def_property_duplicate_pointers(srna, prop); - } - Py_RETURN_NONE; + StructRNA *srna; + + BPY_PROPDEF_HEAD(PointerProperty); + + if (srna) { + const char *id = NULL, *name = NULL, *description = ""; + int id_len; + PropertyRNA *prop; + StructRNA *ptype; + PyObject *type = Py_None; + PyObject *pyopts = NULL; + PyObject *py_tags = NULL; + int opts = 0; + int prop_tags = 0; + PyObject *update_cb = NULL, *poll_cb = NULL; + + static const char *_keywords[] = { + "attr", + "type", + "name", + "description", + "options", + "tags", + "poll", + "update", + NULL, + }; + static _PyArg_Parser _parser = {"s#O|ssO!O!OO:PointerProperty", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast(args, + kw, + &_parser, + &id, + &id_len, + &type, + &name, + &description, + &PySet_Type, + &pyopts, + &PySet_Type, + &py_tags, + &poll_cb, + &update_cb)) { + return NULL; + } + + BPY_PROPDEF_CHECK(PointerProperty, property_flag_items); + + ptype = pointer_type_from_py(type, "PointerProperty(...)"); + if (!ptype) { + return NULL; + } + if (!RNA_struct_is_a(ptype, &RNA_PropertyGroup) && !RNA_struct_is_ID(ptype)) { + PyErr_Format(PyExc_TypeError, + "PointerProperty(...) expected an RNA type derived from %.200s or %.200s", + RNA_struct_ui_name(&RNA_ID), + RNA_struct_ui_name(&RNA_PropertyGroup)); + return NULL; + } + if (bpy_prop_callback_check(update_cb, "update", 2) == -1) { + return NULL; + } + if (bpy_prop_callback_check(poll_cb, "poll", 2) == -1) { + return NULL; + } + prop = RNA_def_pointer_runtime(srna, id, ptype, name ? name : id, description); + if (py_tags) { + RNA_def_property_tags(prop, prop_tags); + } + if (pyopts) { + bpy_prop_assign_flag(prop, opts); + } + + if (RNA_struct_idprops_contains_datablock(ptype)) { + if (RNA_struct_is_a(srna, &RNA_PropertyGroup)) { + RNA_def_struct_flag(srna, STRUCT_CONTAINS_DATABLOCK_IDPROPERTIES); + } + } + bpy_prop_callback_assign_update(prop, update_cb); + bpy_prop_callback_assign_pointer(prop, poll_cb); + RNA_def_property_duplicate_pointers(srna, prop); + } + Py_RETURN_NONE; } PyDoc_STRVAR(BPy_CollectionProperty_doc, -".. function:: CollectionProperty(type=None, " - "name=\"\", " - "description=\"\", " - "options={'ANIMATABLE'}, " - "tags={})\n" -"\n" -" Returns a new collection property definition.\n" -"\n" -BPY_PROPDEF_TYPE_DOC -BPY_PROPDEF_NAME_DOC -BPY_PROPDEF_DESC_DOC -BPY_PROPDEF_OPTIONS_DOC -BPY_PROPDEF_TAGS_DOC -); + ".. function:: CollectionProperty(type=None, " + "name=\"\", " + "description=\"\", " + "options={'ANIMATABLE'}, " + "tags={})\n" + "\n" + " Returns a new collection property definition.\n" + "\n" BPY_PROPDEF_TYPE_DOC BPY_PROPDEF_NAME_DOC BPY_PROPDEF_DESC_DOC + BPY_PROPDEF_OPTIONS_DOC BPY_PROPDEF_TAGS_DOC); PyObject *BPy_CollectionProperty(PyObject *self, PyObject *args, PyObject *kw) { - StructRNA *srna; - - BPY_PROPDEF_HEAD(CollectionProperty); - - if (srna) { - int id_len; - const char *id = NULL, *name = NULL, *description = ""; - PropertyRNA *prop; - StructRNA *ptype; - PyObject *type = Py_None; - PyObject *pyopts = NULL; - PyObject *py_tags = NULL; - int opts = 0; - int prop_tags = 0; - - static const char *_keywords[] = { - "attr", "type", "name", "description", - "options", "tags", NULL, - }; - static _PyArg_Parser _parser = {"s#O|ssO!O!:CollectionProperty", _keywords, 0}; - if (!_PyArg_ParseTupleAndKeywordsFast( - args, kw, &_parser, - &id, &id_len, - &type, &name, &description, - &PySet_Type, &pyopts, &PySet_Type, &py_tags)) - { - return NULL; - } - - BPY_PROPDEF_CHECK(CollectionProperty, property_flag_items); - - ptype = pointer_type_from_py(type, "CollectionProperty(...):"); - if (!ptype) { - return NULL; - } - - if (!RNA_struct_is_a(ptype, &RNA_PropertyGroup)) { - PyErr_Format( - PyExc_TypeError, - "CollectionProperty(...) expected an RNA type derived from %.200s", - RNA_struct_ui_name(&RNA_ID), RNA_struct_ui_name(&RNA_PropertyGroup)); - return NULL; - } - - prop = RNA_def_collection_runtime(srna, id, ptype, name ? name : id, description); - if (py_tags) { - RNA_def_property_tags(prop, prop_tags); - } - if (pyopts) { - bpy_prop_assign_flag(prop, opts); - } - - if (RNA_struct_idprops_contains_datablock(ptype)) { - if (RNA_struct_is_a(srna, &RNA_PropertyGroup)) { - RNA_def_struct_flag(srna, STRUCT_CONTAINS_DATABLOCK_IDPROPERTIES); - } - } - RNA_def_property_duplicate_pointers(srna, prop); - } - Py_RETURN_NONE; + StructRNA *srna; + + BPY_PROPDEF_HEAD(CollectionProperty); + + if (srna) { + int id_len; + const char *id = NULL, *name = NULL, *description = ""; + PropertyRNA *prop; + StructRNA *ptype; + PyObject *type = Py_None; + PyObject *pyopts = NULL; + PyObject *py_tags = NULL; + int opts = 0; + int prop_tags = 0; + + static const char *_keywords[] = { + "attr", + "type", + "name", + "description", + "options", + "tags", + NULL, + }; + static _PyArg_Parser _parser = {"s#O|ssO!O!:CollectionProperty", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast(args, + kw, + &_parser, + &id, + &id_len, + &type, + &name, + &description, + &PySet_Type, + &pyopts, + &PySet_Type, + &py_tags)) { + return NULL; + } + + BPY_PROPDEF_CHECK(CollectionProperty, property_flag_items); + + ptype = pointer_type_from_py(type, "CollectionProperty(...):"); + if (!ptype) { + return NULL; + } + + if (!RNA_struct_is_a(ptype, &RNA_PropertyGroup)) { + PyErr_Format(PyExc_TypeError, + "CollectionProperty(...) expected an RNA type derived from %.200s", + RNA_struct_ui_name(&RNA_ID), + RNA_struct_ui_name(&RNA_PropertyGroup)); + return NULL; + } + + prop = RNA_def_collection_runtime(srna, id, ptype, name ? name : id, description); + if (py_tags) { + RNA_def_property_tags(prop, prop_tags); + } + if (pyopts) { + bpy_prop_assign_flag(prop, opts); + } + + if (RNA_struct_idprops_contains_datablock(ptype)) { + if (RNA_struct_is_a(srna, &RNA_PropertyGroup)) { + RNA_def_struct_flag(srna, STRUCT_CONTAINS_DATABLOCK_IDPROPERTIES); + } + } + RNA_def_property_duplicate_pointers(srna, prop); + } + Py_RETURN_NONE; } PyDoc_STRVAR(BPy_RemoveProperty_doc, -".. function:: RemoveProperty(cls, attr)\n" -"\n" -" Removes a dynamically defined property.\n" -"\n" -" :arg cls: The class containing the property (must be a positional argument).\n" -" :type cls: type\n" -" :arg attr: Property name (must be passed as a keyword).\n" -" :type attr: string\n" -"\n" -".. note:: Typically this function doesn't need to be accessed directly.\n" -" Instead use ``del cls.attr``\n" -); + ".. function:: RemoveProperty(cls, attr)\n" + "\n" + " Removes a dynamically defined property.\n" + "\n" + " :arg cls: The class containing the property (must be a positional argument).\n" + " :type cls: type\n" + " :arg attr: Property name (must be passed as a keyword).\n" + " :type attr: string\n" + "\n" + ".. note:: Typically this function doesn't need to be accessed directly.\n" + " Instead use ``del cls.attr``\n"); static PyObject *BPy_RemoveProperty(PyObject *self, PyObject *args, PyObject *kw) { - StructRNA *srna; - - if (PyTuple_GET_SIZE(args) == 1) { - PyObject *ret; - self = PyTuple_GET_ITEM(args, 0); - args = PyTuple_New(0); - ret = BPy_RemoveProperty(self, args, kw); - Py_DECREF(args); - return ret; - } - else if (PyTuple_GET_SIZE(args) > 1) { - PyErr_SetString(PyExc_ValueError, "expected one positional arg, one keyword arg"); - return NULL; - } - - srna = srna_from_self(self, "RemoveProperty(...):"); - if (srna == NULL && PyErr_Occurred()) { - return NULL; /* self's type was compatible but error getting the srna */ - } - else if (srna == NULL) { - PyErr_SetString(PyExc_TypeError, "RemoveProperty(): struct rna not available for this type"); - return NULL; - } - else { - const char *id = NULL; - - static const char *_keywords[] = { - "attr", NULL, - }; - static _PyArg_Parser _parser = {"s:RemoveProperty", _keywords, 0}; - if (!_PyArg_ParseTupleAndKeywordsFast( - args, kw, &_parser, - &id)) - { - return NULL; - } - - if (RNA_def_property_free_identifier(srna, id) != 1) { - PyErr_Format(PyExc_TypeError, "RemoveProperty(): '%s' not a defined dynamic property", id); - return NULL; - } - } - Py_RETURN_NONE; + StructRNA *srna; + + if (PyTuple_GET_SIZE(args) == 1) { + PyObject *ret; + self = PyTuple_GET_ITEM(args, 0); + args = PyTuple_New(0); + ret = BPy_RemoveProperty(self, args, kw); + Py_DECREF(args); + return ret; + } + else if (PyTuple_GET_SIZE(args) > 1) { + PyErr_SetString(PyExc_ValueError, "expected one positional arg, one keyword arg"); + return NULL; + } + + srna = srna_from_self(self, "RemoveProperty(...):"); + if (srna == NULL && PyErr_Occurred()) { + return NULL; /* self's type was compatible but error getting the srna */ + } + else if (srna == NULL) { + PyErr_SetString(PyExc_TypeError, "RemoveProperty(): struct rna not available for this type"); + return NULL; + } + else { + const char *id = NULL; + + static const char *_keywords[] = { + "attr", + NULL, + }; + static _PyArg_Parser _parser = {"s:RemoveProperty", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast(args, kw, &_parser, &id)) { + return NULL; + } + + if (RNA_def_property_free_identifier(srna, id) != 1) { + PyErr_Format(PyExc_TypeError, "RemoveProperty(): '%s' not a defined dynamic property", id); + return NULL; + } + } + Py_RETURN_NONE; } static struct PyMethodDef props_methods[] = { - {"BoolProperty", (PyCFunction)BPy_BoolProperty, METH_VARARGS | METH_KEYWORDS, BPy_BoolProperty_doc}, - {"BoolVectorProperty", (PyCFunction)BPy_BoolVectorProperty, METH_VARARGS | METH_KEYWORDS, BPy_BoolVectorProperty_doc}, - {"IntProperty", (PyCFunction)BPy_IntProperty, METH_VARARGS | METH_KEYWORDS, BPy_IntProperty_doc}, - {"IntVectorProperty", (PyCFunction)BPy_IntVectorProperty, METH_VARARGS | METH_KEYWORDS, BPy_IntVectorProperty_doc}, - {"FloatProperty", (PyCFunction)BPy_FloatProperty, METH_VARARGS | METH_KEYWORDS, BPy_FloatProperty_doc}, - {"FloatVectorProperty", (PyCFunction)BPy_FloatVectorProperty, METH_VARARGS | METH_KEYWORDS, BPy_FloatVectorProperty_doc}, - {"StringProperty", (PyCFunction)BPy_StringProperty, METH_VARARGS | METH_KEYWORDS, BPy_StringProperty_doc}, - {"EnumProperty", (PyCFunction)BPy_EnumProperty, METH_VARARGS | METH_KEYWORDS, BPy_EnumProperty_doc}, - {"PointerProperty", (PyCFunction)BPy_PointerProperty, METH_VARARGS | METH_KEYWORDS, BPy_PointerProperty_doc}, - {"CollectionProperty", (PyCFunction)BPy_CollectionProperty, METH_VARARGS | METH_KEYWORDS, BPy_CollectionProperty_doc}, - - {"RemoveProperty", (PyCFunction)BPy_RemoveProperty, METH_VARARGS | METH_KEYWORDS, BPy_RemoveProperty_doc}, - {NULL, NULL, 0, NULL}, + {"BoolProperty", + (PyCFunction)BPy_BoolProperty, + METH_VARARGS | METH_KEYWORDS, + BPy_BoolProperty_doc}, + {"BoolVectorProperty", + (PyCFunction)BPy_BoolVectorProperty, + METH_VARARGS | METH_KEYWORDS, + BPy_BoolVectorProperty_doc}, + {"IntProperty", + (PyCFunction)BPy_IntProperty, + METH_VARARGS | METH_KEYWORDS, + BPy_IntProperty_doc}, + {"IntVectorProperty", + (PyCFunction)BPy_IntVectorProperty, + METH_VARARGS | METH_KEYWORDS, + BPy_IntVectorProperty_doc}, + {"FloatProperty", + (PyCFunction)BPy_FloatProperty, + METH_VARARGS | METH_KEYWORDS, + BPy_FloatProperty_doc}, + {"FloatVectorProperty", + (PyCFunction)BPy_FloatVectorProperty, + METH_VARARGS | METH_KEYWORDS, + BPy_FloatVectorProperty_doc}, + {"StringProperty", + (PyCFunction)BPy_StringProperty, + METH_VARARGS | METH_KEYWORDS, + BPy_StringProperty_doc}, + {"EnumProperty", + (PyCFunction)BPy_EnumProperty, + METH_VARARGS | METH_KEYWORDS, + BPy_EnumProperty_doc}, + {"PointerProperty", + (PyCFunction)BPy_PointerProperty, + METH_VARARGS | METH_KEYWORDS, + BPy_PointerProperty_doc}, + {"CollectionProperty", + (PyCFunction)BPy_CollectionProperty, + METH_VARARGS | METH_KEYWORDS, + BPy_CollectionProperty_doc}, + + {"RemoveProperty", + (PyCFunction)BPy_RemoveProperty, + METH_VARARGS | METH_KEYWORDS, + BPy_RemoveProperty_doc}, + {NULL, NULL, 0, NULL}, }; static struct PyModuleDef props_module = { - PyModuleDef_HEAD_INIT, - "bpy.props", - "This module defines properties to extend Blender's internal data. The result of these functions" - " is used to assign properties to classes registered with Blender and can't be used directly.\n" - "\n" - ".. note:: All parameters to these functions must be passed as keywords.\n", - -1, /* multiple "initialization" just copies the module dict. */ - props_methods, - NULL, NULL, NULL, NULL, + PyModuleDef_HEAD_INIT, + "bpy.props", + "This module defines properties to extend Blender's internal data. The result of these " + "functions" + " is used to assign properties to classes registered with Blender and can't be used " + "directly.\n" + "\n" + ".. note:: All parameters to these functions must be passed as keywords.\n", + -1, /* multiple "initialization" just copies the module dict. */ + props_methods, + NULL, + NULL, + NULL, + NULL, }; PyObject *BPY_rna_props(void) { - PyObject *submodule; - PyObject *submodule_dict; + PyObject *submodule; + PyObject *submodule_dict; - submodule = PyModule_Create(&props_module); - PyDict_SetItemString(PyImport_GetModuleDict(), props_module.m_name, submodule); + submodule = PyModule_Create(&props_module); + PyDict_SetItemString(PyImport_GetModuleDict(), props_module.m_name, submodule); - /* api needs the PyObjects internally */ - submodule_dict = PyModule_GetDict(submodule); + /* api needs the PyObjects internally */ + submodule_dict = PyModule_GetDict(submodule); #define ASSIGN_STATIC(_name) pymeth_##_name = PyDict_GetItemString(submodule_dict, #_name) - ASSIGN_STATIC(BoolProperty); - ASSIGN_STATIC(BoolVectorProperty); - ASSIGN_STATIC(IntProperty); - ASSIGN_STATIC(IntVectorProperty); - ASSIGN_STATIC(FloatProperty); - ASSIGN_STATIC(FloatVectorProperty); - ASSIGN_STATIC(StringProperty); - ASSIGN_STATIC(EnumProperty); - ASSIGN_STATIC(PointerProperty); - ASSIGN_STATIC(CollectionProperty); - ASSIGN_STATIC(RemoveProperty); - - return submodule; + ASSIGN_STATIC(BoolProperty); + ASSIGN_STATIC(BoolVectorProperty); + ASSIGN_STATIC(IntProperty); + ASSIGN_STATIC(IntVectorProperty); + ASSIGN_STATIC(FloatProperty); + ASSIGN_STATIC(FloatVectorProperty); + ASSIGN_STATIC(StringProperty); + ASSIGN_STATIC(EnumProperty); + ASSIGN_STATIC(PointerProperty); + ASSIGN_STATIC(CollectionProperty); + ASSIGN_STATIC(RemoveProperty); + + return submodule; } |