[Bf-blender-cvs] [ed351f2784f] refactor-idprop-ui-data: Split setting defaults to a separate function for int and float
Hans Goudey
noreply at git.blender.org
Thu Aug 5 21:01:51 CEST 2021
Commit: ed351f2784fc41a4cb5c4e8de16131ea45758afc
Author: Hans Goudey
Date: Thu Aug 5 13:16:59 2021 -0500
Branches: refactor-idprop-ui-data
https://developer.blender.org/rBed351f2784fc41a4cb5c4e8de16131ea45758afc
Split setting defaults to a separate function for int and float
===================================================================
M source/blender/python/generic/idprop_py_ui_api.c
===================================================================
diff --git a/source/blender/python/generic/idprop_py_ui_api.c b/source/blender/python/generic/idprop_py_ui_api.c
index c9852ec1a38..2b63a9bf6ad 100644
--- a/source/blender/python/generic/idprop_py_ui_api.c
+++ b/source/blender/python/generic/idprop_py_ui_api.c
@@ -79,6 +79,45 @@ static bool idprop_ui_data_update_base(IDProperty *idprop,
return true;
}
+/**
+ * \note The default value needs special handling because for array IDProperties it can
+ * be a single value or an array, but for non-array properties it can only be a value.
+ */
+static bool idprop_ui_data_update_int_default(IDProperty *idprop,
+ IDPropertyUIDataInt *ui_data,
+ PyObject *default_value)
+{
+ if (PySequence_Check(default_value)) {
+ if (idprop->type != IDP_ARRAY) {
+ PyErr_SetString(PyExc_TypeError, "Only array properties can have array default values");
+ return false;
+ }
+
+ Py_ssize_t len = PySequence_Size(default_value);
+ int *new_default_array = (int *)MEM_malloc_arrayN(len, sizeof(int), __func__);
+ if (PyC_AsArray(
+ new_default_array, sizeof(int), default_value, len, &PyLong_Type, "ui_data_update") ==
+ -1) {
+ MEM_freeN(new_default_array);
+ return false;
+ }
+
+ ui_data->default_array_len = len;
+ MEM_SAFE_FREE(ui_data->default_array);
+ ui_data->default_array = new_default_array;
+ }
+ else {
+ const int value = PyC_Long_AsI32(default_value);
+ if ((value == -1) && PyErr_Occurred()) {
+ PyErr_SetString(PyExc_ValueError, "Error converting \"default\" argument to integer");
+ return false;
+ }
+ ui_data->default_value = value;
+ }
+
+ return true;
+}
+
/**
* \return False when parsing fails, in which case caller should return NULL.
*/
@@ -135,39 +174,48 @@ static bool idprop_ui_data_update_int(IDProperty *idprop, PyObject *args, PyObje
ui_data->step = step;
}
- /* The default value needs special handling because for array IDProperties it can be a single
- * value or an array, but for non-array properties it can only be a value. */
if (!ELEM(default_value, NULL, Py_None)) {
- if (PySequence_Check(default_value)) {
- if (idprop->type != IDP_ARRAY) {
- PyErr_SetString(PyExc_TypeError, "Only array properties can have array default values");
- return false;
- }
+ if (!idprop_ui_data_update_int_default(idprop, ui_data, default_value)) {
+ return false;
+ }
+ }
- Py_ssize_t len = PySequence_Size(default_value);
- int *new_default_array = (int *)MEM_malloc_arrayN(len, sizeof(int), __func__);
- if (PyC_AsArray(new_default_array,
- sizeof(int),
- default_value,
- len,
- &PyLong_Type,
- "ui_data_update") == -1) {
- MEM_freeN(new_default_array);
- return false;
- }
+ return true;
+}
- ui_data->default_array_len = len;
- MEM_SAFE_FREE(ui_data->default_array);
- ui_data->default_array = new_default_array;
+static bool idprop_ui_data_update_float_default(IDProperty *idprop,
+ IDPropertyUIDataFloat *ui_data,
+ PyObject *default_value)
+{
+ if (PySequence_Check(default_value)) {
+ if (idprop->type != IDP_ARRAY) {
+ PyErr_SetString(PyExc_TypeError, "Only array properties can have array default values");
+ return false;
}
- else {
- const int value = PyC_Long_AsI32(default_value);
- if ((value == -1) && PyErr_Occurred()) {
- PyErr_SetString(PyExc_ValueError, "Error converting \"default\" argument to integer");
- return false;
- }
- ui_data->default_value = value;
+
+ Py_ssize_t len = PySequence_Size(default_value);
+ double *new_default_array = (double *)MEM_malloc_arrayN(len, sizeof(double), __func__);
+ if (PyC_AsArray(new_default_array,
+ sizeof(double),
+ default_value,
+ len,
+ &PyFloat_Type,
+ "ui_data_update") == -1) {
+ MEM_freeN(new_default_array);
+ return false;
+ }
+
+ ui_data->default_array_len = len;
+ MEM_SAFE_FREE(ui_data->default_array);
+ ui_data->default_array = new_default_array;
+ }
+ else {
+ const double value = PyFloat_AsDouble(default_value);
+ if ((value == -1.0) && PyErr_Occurred()) {
+ PyErr_SetString(PyExc_ValueError, "Error converting \"default\" argument to double");
+ return false;
}
+ ui_data->default_value = value;
}
return true;
@@ -245,35 +293,8 @@ static bool idprop_ui_data_update_float(IDProperty *idprop, PyObject *args, PyOb
/* The default value needs special handling because for array IDProperties it can be a single
* value or an array, but for non-array properties it can only be a value. */
if (!ELEM(default_value, NULL, Py_None)) {
- if (PySequence_Check(default_value)) {
- if (idprop->type != IDP_ARRAY) {
- PyErr_SetString(PyExc_TypeError, "Only array properties can have array default values");
- return false;
- }
-
- Py_ssize_t len = PySequence_Size(default_value);
- double *new_default_array = (double *)MEM_malloc_arrayN(len, sizeof(double), __func__);
- if (PyC_AsArray(new_default_array,
- sizeof(double),
- default_value,
- len,
- &PyFloat_Type,
- "ui_data_update") == -1) {
- MEM_freeN(new_default_array);
- return false;
- }
-
- ui_data->default_array_len = len;
- MEM_SAFE_FREE(ui_data->default_array);
- ui_data->default_array = new_default_array;
- }
- else {
- const double value = PyFloat_AsDouble(default_value);
- if ((value == -1.0) && PyErr_Occurred()) {
- PyErr_SetString(PyExc_ValueError, "Error converting \"default\" argument to double");
- return false;
- }
- ui_data->default_value = value;
+ if (!idprop_ui_data_update_float_default(idprop, ui_data, default_value)) {
+ return false;
}
}
More information about the Bf-blender-cvs
mailing list