[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