[Bf-blender-cvs] [983e84322ac] refactor-idprop-ui-data: Write to a temporary local copy of the UI data

Hans Goudey noreply at git.blender.org
Thu Aug 5 21:01:51 CEST 2021


Commit: 983e84322acbd0bbc42becac7fb126637d7d8836
Author: Hans Goudey
Date:   Thu Aug 5 13:34:19 2021 -0500
Branches: refactor-idprop-ui-data
https://developer.blender.org/rB983e84322acbd0bbc42becac7fb126637d7d8836

Write to a temporary local copy of the UI data

===================================================================

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 ab34844c776..51f9e33fb04 100644
--- a/source/blender/python/generic/idprop_py_ui_api.c
+++ b/source/blender/python/generic/idprop_py_ui_api.c
@@ -59,21 +59,21 @@ static bool args_contain_key(PyObject *kwargs, const char *name)
 /**
  * \return False when parsing fails, in which case caller should return NULL.
  */
-static bool idprop_ui_data_update_base(IDProperty *idprop,
+static bool idprop_ui_data_update_base(IDPropertyUIData *ui_data,
                                        const char *rna_subtype,
                                        const char *description)
 {
   if (rna_subtype != NULL) {
     if (pyrna_enum_value_from_id(rna_enum_property_subtype_items,
                                  rna_subtype,
-                                 &idprop->ui_data->rna_subtype,
+                                 &ui_data->rna_subtype,
                                  "IDPropertyUIManager.update") == -1) {
       return false;
     }
   }
 
   if (description != NULL) {
-    idprop->ui_data->description = BLI_strdup(description);
+    ui_data->description = BLI_strdup(description);
   }
 
   return true;
@@ -144,42 +144,45 @@ static bool idprop_ui_data_update_int(IDProperty *idprop, PyObject *args, PyObje
     return false;
   }
 
-  if (!idprop_ui_data_update_base(idprop, rna_subtype, description)) {
+  /* Write to a temporary copy of the UI data in case some part of the parsing fails. */
+  IDPropertyUIDataInt ui_data = *(IDPropertyUIDataInt *)idprop->ui_data;
+
+  if (!idprop_ui_data_update_base((IDPropertyUIData *)&ui_data, rna_subtype, description)) {
     return false;
   }
 
-  IDPropertyUIDataInt *ui_data = (IDPropertyUIDataInt *)idprop->ui_data;
-
   if (args_contain_key(kwargs, "min")) {
-    ui_data->min = min;
-    ui_data->soft_min = MAX2(ui_data->soft_min, ui_data->min);
-    ui_data->max = MAX2(ui_data->min, ui_data->max);
+    ui_data.min = min;
+    ui_data.soft_min = MAX2(ui_data.soft_min, ui_data.min);
+    ui_data.max = MAX2(ui_data.min, ui_data.max);
   }
   if (args_contain_key(kwargs, "max")) {
-    ui_data->max = max;
-    ui_data->soft_max = MIN2(ui_data->soft_max, ui_data->max);
-    ui_data->min = MIN2(ui_data->min, ui_data->max);
+    ui_data.max = max;
+    ui_data.soft_max = MIN2(ui_data.soft_max, ui_data.max);
+    ui_data.min = MIN2(ui_data.min, ui_data.max);
   }
   if (args_contain_key(kwargs, "soft_min")) {
-    ui_data->soft_min = soft_min;
-    ui_data->soft_min = MAX2(ui_data->soft_min, ui_data->min);
-    ui_data->soft_max = MAX2(ui_data->soft_min, ui_data->soft_max);
+    ui_data.soft_min = soft_min;
+    ui_data.soft_min = MAX2(ui_data.soft_min, ui_data.min);
+    ui_data.soft_max = MAX2(ui_data.soft_min, ui_data.soft_max);
   }
   if (args_contain_key(kwargs, "soft_max")) {
-    ui_data->soft_max = soft_max;
-    ui_data->soft_max = MIN2(ui_data->soft_max, ui_data->max);
-    ui_data->soft_min = MIN2(ui_data->soft_min, ui_data->soft_max);
+    ui_data.soft_max = soft_max;
+    ui_data.soft_max = MIN2(ui_data.soft_max, ui_data.max);
+    ui_data.soft_min = MIN2(ui_data.soft_min, ui_data.soft_max);
   }
   if (args_contain_key(kwargs, "step")) {
-    ui_data->step = step;
+    ui_data.step = step;
   }
 
   if (!ELEM(default_value, NULL, Py_None)) {
-    if (!idprop_ui_data_update_int_default(idprop, ui_data, default_value)) {
+    if (!idprop_ui_data_update_int_default(idprop, &ui_data, default_value)) {
       return false;
     }
   }
 
+  /* Write back to the proeprty's UI data. */
+  *(IDPropertyUIDataInt *)idprop->ui_data = ui_data;
   return true;
 }
 
@@ -257,48 +260,50 @@ static bool idprop_ui_data_update_float(IDProperty *idprop, PyObject *args, PyOb
     return false;
   }
 
-  IDPropertyUIDataFloat *ui_data = (IDPropertyUIDataFloat *)idprop->ui_data;
-  IDPropertyUIDataFloat ui_data_local;
+  /* Write to a temporary copy of the UI data in case some part of the parsing fails. */
+  IDPropertyUIDataFloat ui_data = *(IDPropertyUIDataFloat *)idprop->ui_data;
 
-  if (!idprop_ui_data_update_base(idprop, rna_subtype, description)) {
+  if (!idprop_ui_data_update_base((IDPropertyUIData *)&ui_data, rna_subtype, description)) {
     return false;
   }
 
   if (args_contain_key(kwargs, "min")) {
-    ui_data->min = min;
-    ui_data->soft_min = MAX2(ui_data->soft_min, ui_data->min);
-    ui_data->max = MAX2(ui_data->min, ui_data->max);
+    ui_data.min = min;
+    ui_data.soft_min = MAX2(ui_data.soft_min, ui_data.min);
+    ui_data.max = MAX2(ui_data.min, ui_data.max);
   }
   if (args_contain_key(kwargs, "max")) {
-    ui_data->max = max;
-    ui_data->soft_max = MIN2(ui_data->soft_max, ui_data->max);
-    ui_data->min = MIN2(ui_data->min, ui_data->max);
+    ui_data.max = max;
+    ui_data.soft_max = MIN2(ui_data.soft_max, ui_data.max);
+    ui_data.min = MIN2(ui_data.min, ui_data.max);
   }
   if (args_contain_key(kwargs, "soft_min")) {
-    ui_data->soft_min = soft_min;
-    ui_data->soft_min = MAX2(ui_data->soft_min, ui_data->min);
-    ui_data->soft_max = MAX2(ui_data->soft_min, ui_data->soft_max);
+    ui_data.soft_min = soft_min;
+    ui_data.soft_min = MAX2(ui_data.soft_min, ui_data.min);
+    ui_data.soft_max = MAX2(ui_data.soft_min, ui_data.soft_max);
   }
   if (args_contain_key(kwargs, "soft_max")) {
-    ui_data->soft_max = soft_max;
-    ui_data->soft_max = MIN2(ui_data->soft_max, ui_data->max);
-    ui_data->soft_min = MIN2(ui_data->soft_min, ui_data->soft_max);
+    ui_data.soft_max = soft_max;
+    ui_data.soft_max = MIN2(ui_data.soft_max, ui_data.max);
+    ui_data.soft_min = MIN2(ui_data.soft_min, ui_data.soft_max);
   }
   if (args_contain_key(kwargs, "step")) {
-    ui_data->step = (float)step;
+    ui_data.step = (float)step;
   }
   if (args_contain_key(kwargs, "precision")) {
-    ui_data->precision = precision;
+    ui_data.precision = precision;
   }
 
   /* 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 (!idprop_ui_data_update_float_default(idprop, ui_data, default_value)) {
+    if (!idprop_ui_data_update_float_default(idprop, &ui_data, default_value)) {
       return false;
     }
   }
 
+  /* Write back to the proeprty's UI data. */
+  *(IDPropertyUIDataFloat *)idprop->ui_data = ui_data;
   return true;
 }
 
@@ -321,17 +326,20 @@ static bool idprop_ui_data_update_string(IDProperty *idprop, PyObject *args, PyO
     return false;
   }
 
-  if (!idprop_ui_data_update_base(idprop, rna_subtype, description)) {
+  /* Write to a temporary copy of the UI data in case some part of the parsing fails. */
+  IDPropertyUIDataString ui_data = *(IDPropertyUIDataString *)idprop->ui_data;
+
+  if (!idprop_ui_data_update_base((IDPropertyUIData *)&ui_data, rna_subtype, description)) {
     return false;
   }
 
-  IDPropertyUIDataString *ui_data = (IDPropertyUIDataString *)idprop->ui_data;
-
   if (default_value != NULL) {
-    MEM_SAFE_FREE(ui_data->default_value);
-    ui_data->default_value = BLI_strdup(default_value);
+    MEM_SAFE_FREE(ui_data.default_value);
+    ui_data.default_value = BLI_strdup(default_value);
   }
 
+  /* Write back to the proeprty's UI data. */
+  *(IDPropertyUIDataString *)idprop->ui_data = ui_data;
   return true;
 }
 
@@ -348,10 +356,15 @@ static bool idprop_ui_data_update_id(IDProperty *idprop, PyObject *args, PyObjec
     return false;
   }
 
-  if (!idprop_ui_data_update_base(idprop, rna_subtype, description)) {
+  /* Write to a temporary copy of the UI data in case some part of the parsing fails. */
+  IDPropertyUIDataID ui_data = *(IDPropertyUIDataID *)idprop->ui_data;
+
+  if (!idprop_ui_data_update_base((IDPropertyUIData *)&ui_data, rna_subtype, description)) {
     return false;
   }
 
+  /* Write back to the proeprty's UI data. */
+  *(IDPropertyUIDataID *)idprop->ui_data = ui_data;
   return true;
 }



More information about the Bf-blender-cvs mailing list