diff options
author | Campbell Barton <ideasman42@gmail.com> | 2021-09-01 09:30:47 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2021-09-01 09:33:42 +0300 |
commit | 1730829592478f584d15f7874fa7e9cade1eb169 (patch) | |
tree | f7fbc703403a1f8675af9f7ae9966e7ae44d4f0a /source/blender/python/intern/bpy_rna.c | |
parent | 5352b335983279a479abf22abe3a2d3d457597b4 (diff) |
Cleanup: move RNA utility functions into a generic module
Avoid having to include bpy_rna.h for enum utility functions,
recently added to idprop_py_ui_api.c.
Diffstat (limited to 'source/blender/python/intern/bpy_rna.c')
-rw-r--r-- | source/blender/python/intern/bpy_rna.c | 188 |
1 files changed, 1 insertions, 187 deletions
diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index 19b2a7d1377..42db49b7688 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -74,6 +74,7 @@ #include "../generic/idprop_py_api.h" /* For IDprop lookups. */ #include "../generic/idprop_py_ui_api.h" +#include "../generic/py_capi_rna.h" #include "../generic/py_capi_utils.h" #include "../generic/python_utildefines.h" @@ -782,66 +783,6 @@ PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop) return ret; } -/** - * Same as #RNA_enum_value_from_id, but raises an exception. - */ -int pyrna_enum_value_from_id(const EnumPropertyItem *item, - const char *identifier, - int *r_value, - const char *error_prefix) -{ - if (RNA_enum_value_from_id(item, identifier, r_value) == 0) { - const char *enum_str = BPy_enum_as_string(item); - PyErr_Format( - PyExc_ValueError, "%s: '%.200s' not found in (%s)", error_prefix, identifier, enum_str); - MEM_freeN((void *)enum_str); - return -1; - } - - return 0; -} - -/** - * Use with #PyArg_ParseTuple's `O&` formatting. - */ -int pyrna_enum_value_parse_string(PyObject *o, void *p) -{ - const char *identifier = PyUnicode_AsUTF8(o); - if (identifier == NULL) { - PyErr_Format(PyExc_TypeError, "expected a string enum, not %.200s", Py_TYPE(o)->tp_name); - return 0; - } - struct BPy_EnumProperty_Parse *parse_data = p; - if (pyrna_enum_value_from_id( - parse_data->items, identifier, &parse_data->value, "enum identifier") == -1) { - return 0; - } - - parse_data->value_orig = o; - parse_data->is_set = true; - return 1; -} - -/** - * Use with #PyArg_ParseTuple's `O&` formatting. - */ -int pyrna_enum_bitfield_parse_set(PyObject *o, void *p) -{ - if (!PySet_Check(o)) { - PyErr_Format(PyExc_TypeError, "expected a set, not %.200s", Py_TYPE(o)->tp_name); - return 0; - } - - struct BPy_EnumProperty_Parse *parse_data = p; - if (pyrna_set_to_enum_bitfield( - parse_data->items, o, &parse_data->value, "enum identifier set") == -1) { - return 0; - } - parse_data->value_orig = o; - parse_data->is_set = true; - return 1; -} - /* NOTE(campbell): Regarding comparison `__cmp__`: * checking the 'ptr->data' matches works in almost all cases, * however there are a few RNA properties that are fake sub-structs and @@ -1312,115 +1253,6 @@ static int pyrna_string_to_enum( return 0; } -/** - * Takes a set of strings and map it to and array of booleans. - * - * Useful when the values aren't flags. - * - * \param type_convert_sign: Maps signed to unsigned range, - * needed when we want to use the full range of a signed short/char. - */ -BLI_bitmap *pyrna_set_to_enum_bitmap(const EnumPropertyItem *items, - PyObject *value, - int type_size, - bool type_convert_sign, - int bitmap_size, - const char *error_prefix) -{ - /* Set looping. */ - Py_ssize_t pos = 0; - Py_ssize_t hash = 0; - PyObject *key; - - BLI_bitmap *bitmap = BLI_BITMAP_NEW(bitmap_size, __func__); - - while (_PySet_NextEntry(value, &pos, &key, &hash)) { - const char *param = PyUnicode_AsUTF8(key); - if (param == NULL) { - PyErr_Format(PyExc_TypeError, - "%.200s expected a string, not %.200s", - error_prefix, - Py_TYPE(key)->tp_name); - goto error; - } - - int ret; - if (pyrna_enum_value_from_id(items, param, &ret, error_prefix) == -1) { - goto error; - } - - int index = ret; - - if (type_convert_sign) { - if (type_size == 2) { - union { - signed short as_signed; - ushort as_unsigned; - } ret_convert; - ret_convert.as_signed = (signed short)ret; - index = (int)ret_convert.as_unsigned; - } - else if (type_size == 1) { - union { - signed char as_signed; - uchar as_unsigned; - } ret_convert; - ret_convert.as_signed = (signed char)ret; - index = (int)ret_convert.as_unsigned; - } - else { - BLI_assert_unreachable(); - } - } - BLI_assert(index < bitmap_size); - BLI_BITMAP_ENABLE(bitmap, index); - } - - return bitmap; - -error: - MEM_freeN(bitmap); - return NULL; -} - -/* 'value' _must_ be a set type, error check before calling. */ -int pyrna_set_to_enum_bitfield(const EnumPropertyItem *items, - PyObject *value, - int *r_value, - const char *error_prefix) -{ - /* Set of enum items, concatenate all values with OR. */ - int ret, flag = 0; - - /* Set looping. */ - Py_ssize_t pos = 0; - Py_ssize_t hash = 0; - PyObject *key; - - *r_value = 0; - - while (_PySet_NextEntry(value, &pos, &key, &hash)) { - const char *param = PyUnicode_AsUTF8(key); - - if (param == NULL) { - PyErr_Format(PyExc_TypeError, - "%.200s expected a string, not %.200s", - error_prefix, - Py_TYPE(key)->tp_name); - return -1; - } - - if (pyrna_enum_value_from_id(items, param, &ret, error_prefix) == -1) { - return -1; - } - - flag |= ret; - } - - *r_value = flag; - return 0; -} - static int pyrna_prop_to_enum_bitfield( PointerRNA *ptr, PropertyRNA *prop, PyObject *value, int *r_value, const char *error_prefix) { @@ -1465,24 +1297,6 @@ static int pyrna_prop_to_enum_bitfield( return ret; } -PyObject *pyrna_enum_bitfield_to_py(const EnumPropertyItem *items, int value) -{ - PyObject *ret = PySet_New(NULL); - const char *identifier[RNA_ENUM_BITFLAG_SIZE + 1]; - - if (RNA_enum_bitflag_identifiers(items, value, identifier)) { - PyObject *item; - int index; - for (index = 0; identifier[index]; index++) { - item = PyUnicode_FromString(identifier[index]); - PySet_Add(ret, item); - Py_DECREF(item); - } - } - - return ret; -} - static PyObject *pyrna_enum_to_py(PointerRNA *ptr, PropertyRNA *prop, int val) { PyObject *item, *ret = NULL; |