[Bf-blender-cvs] [565d7f75ccf] master: UI: improve errors when evaluating a number button fails

Campbell Barton noreply at git.blender.org
Mon Jul 27 13:02:15 CEST 2020


Commit: 565d7f75ccfe955821991793fcd6335e58b6825b
Author: Campbell Barton
Date:   Mon Jul 27 13:46:58 2020 +1000
Branches: master
https://developer.blender.org/rB565d7f75ccfe955821991793fcd6335e58b6825b

UI: improve errors when evaluating a number button fails

Showing the Python error without any explanation is often
not enough information and doesn't hint that the error was in the
user input.

The error report from a invalid expression such as '..1' used to be:
   ('invalid syntax', ('<string>', 1, 1, '..1'))

Now reads:
   Error evaluating number, see Info editor for details: invalid syntax

Address issue raised by T78913.

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

M	source/blender/editors/include/ED_numinput.h
M	source/blender/editors/interface/interface.c
M	source/blender/editors/interface/interface_context_menu.c
M	source/blender/editors/interface/interface_region_tooltip.c
M	source/blender/editors/util/numinput.c
M	source/blender/python/BPY_extern.h
M	source/blender/python/intern/bpy_capi_utils.c
M	source/blender/python/intern/bpy_capi_utils.h
M	source/blender/python/intern/bpy_interface.c

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

diff --git a/source/blender/editors/include/ED_numinput.h b/source/blender/editors/include/ED_numinput.h
index 8c8f3e6f4a3..16d05a7793a 100644
--- a/source/blender/editors/include/ED_numinput.h
+++ b/source/blender/editors/include/ED_numinput.h
@@ -103,8 +103,12 @@ bool handleNumInput(struct bContext *C, NumInput *n, const struct wmEvent *event
 #define NUM_MODAL_INCREMENT_UP 18
 #define NUM_MODAL_INCREMENT_DOWN 19
 
-bool user_string_to_number(
-    bContext *C, const char *str, const struct UnitSettings *unit, int type, double *r_value);
+bool user_string_to_number(bContext *C,
+                           const char *str,
+                           const struct UnitSettings *unit,
+                           int type,
+                           const char *error_prefix,
+                           double *r_value);
 
 /** \} */
 
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index 8c4f337f2d9..9441e48ef24 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -2800,10 +2800,16 @@ char *ui_but_string_get_dynamic(uiBut *but, int *r_str_size)
   return str;
 }
 
+/**
+ * Report a generic error prefix when evaluating a string with #BPY_execute_string_as_number
+ * as the Python error on it's own doesn't provide enough context.
+ */
+#define UI_NUMBER_EVAL_ERROR_PREFIX IFACE_("Error evaluating number, see Info editor for details")
+
 static bool ui_number_from_string_units(
     bContext *C, const char *str, const int unit_type, const UnitSettings *unit, double *r_value)
 {
-  return user_string_to_number(C, str, unit, unit_type, r_value);
+  return user_string_to_number(C, str, unit, unit_type, UI_NUMBER_EVAL_ERROR_PREFIX, r_value);
 }
 
 static bool ui_number_from_string_units_with_but(bContext *C,
@@ -2820,7 +2826,7 @@ static bool ui_number_from_string(bContext *C, const char *str, double *r_value)
 {
   bool ok;
 #ifdef WITH_PYTHON
-  ok = BPY_execute_string_as_number(C, NULL, str, true, r_value);
+  ok = BPY_execute_string_as_number(C, NULL, str, UI_NUMBER_EVAL_ERROR_PREFIX, r_value);
 #else
   UNUSED_VARS(C);
   *r_value = atof(str);
diff --git a/source/blender/editors/interface/interface_context_menu.c b/source/blender/editors/interface/interface_context_menu.c
index a08c5c45b6f..aaa5e1c0cf1 100644
--- a/source/blender/editors/interface/interface_context_menu.c
+++ b/source/blender/editors/interface/interface_context_menu.c
@@ -407,7 +407,7 @@ static void ui_but_user_menu_add(bContext *C, uiBut *but, bUserMenu *um)
                    "'%s').label",
                    idname);
           char *expr_result = NULL;
-          if (BPY_execute_string_as_string(C, expr_imports, expr, true, &expr_result)) {
+          if (BPY_execute_string_as_string(C, expr_imports, expr, __func__, &expr_result)) {
             STRNCPY(drawstr, expr_result);
             MEM_freeN(expr_result);
           }
diff --git a/source/blender/editors/interface/interface_region_tooltip.c b/source/blender/editors/interface/interface_region_tooltip.c
index 46814e11b9e..7c64e4c2709 100644
--- a/source/blender/editors/interface/interface_region_tooltip.c
+++ b/source/blender/editors/interface/interface_region_tooltip.c
@@ -433,7 +433,7 @@ static uiTooltipData *ui_tooltip_data_from_tool(bContext *C, uiBut *but, bool is
     if (has_valid_context == false) {
       expr_result = BLI_strdup(has_valid_context_error);
     }
-    else if (BPY_execute_string_as_string(C, expr_imports, expr, true, &expr_result)) {
+    else if (BPY_execute_string_as_string(C, expr_imports, expr, __func__, &expr_result)) {
       if (STREQ(expr_result, "")) {
         MEM_freeN(expr_result);
         expr_result = NULL;
@@ -490,7 +490,7 @@ static uiTooltipData *ui_tooltip_data_from_tool(bContext *C, uiBut *but, bool is
     if (has_valid_context == false) {
       expr_result = BLI_strdup(has_valid_context_error);
     }
-    else if (BPY_execute_string_as_string(C, expr_imports, expr, true, &expr_result)) {
+    else if (BPY_execute_string_as_string(C, expr_imports, expr, __func__, &expr_result)) {
       if (STREQ(expr_result, ".")) {
         MEM_freeN(expr_result);
         expr_result = NULL;
@@ -594,7 +594,7 @@ static uiTooltipData *ui_tooltip_data_from_tool(bContext *C, uiBut *but, bool is
         if (has_valid_context == false) {
           shortcut = BLI_strdup(has_valid_context_error);
         }
-        else if (BPY_execute_string_as_intptr(C, expr_imports, expr, true, &expr_result)) {
+        else if (BPY_execute_string_as_intptr(C, expr_imports, expr, __func__, &expr_result)) {
           if (expr_result != 0) {
             wmKeyMap *keymap = (wmKeyMap *)expr_result;
             LISTBASE_FOREACH (wmKeyMapItem *, kmi, &keymap->items) {
@@ -659,7 +659,7 @@ static uiTooltipData *ui_tooltip_data_from_tool(bContext *C, uiBut *but, bool is
         /* pass */
       }
       else if (BPY_execute_string_as_string_and_size(
-                   C, expr_imports, expr, true, &expr_result, &expr_result_len)) {
+                   C, expr_imports, expr, __func__, &expr_result, &expr_result_len)) {
         /* pass. */
       }
     }
@@ -736,7 +736,7 @@ static uiTooltipData *ui_tooltip_data_from_tool(bContext *C, uiBut *but, bool is
     if (has_valid_context == false) {
       /* pass */
     }
-    else if (BPY_execute_string_as_intptr(C, expr_imports, expr, true, &expr_result)) {
+    else if (BPY_execute_string_as_intptr(C, expr_imports, expr, __func__, &expr_result)) {
       if (expr_result != 0) {
         {
           uiTooltipField *field = text_field_add(data,
diff --git a/source/blender/editors/util/numinput.c b/source/blender/editors/util/numinput.c
index 3c747a29361..384da6fb931 100644
--- a/source/blender/editors/util/numinput.c
+++ b/source/blender/editors/util/numinput.c
@@ -26,6 +26,8 @@
 #include "BLI_string_utf8.h"
 #include "BLI_utildefines.h"
 
+#include "BLT_translation.h"
+
 #include "BKE_context.h"
 #include "BKE_scene.h"
 #include "BKE_unit.h"
@@ -277,8 +279,12 @@ static bool editstr_insert_at_cursor(NumInput *n, const char *buf, const int buf
   return true;
 }
 
-bool user_string_to_number(
-    bContext *C, const char *str, const UnitSettings *unit, int type, double *r_value)
+bool user_string_to_number(bContext *C,
+                           const char *str,
+                           const UnitSettings *unit,
+                           int type,
+                           const char *error_prefix,
+                           double *r_value)
 {
 #ifdef WITH_PYTHON
   double unit_scale = BKE_scene_unit_scale(unit, type, 1.0);
@@ -288,10 +294,10 @@ bool user_string_to_number(
     bUnit_ReplaceString(
         str_unit_convert, sizeof(str_unit_convert), str, unit_scale, unit->system, type);
 
-    return BPY_execute_string_as_number(C, NULL, str_unit_convert, true, r_value);
+    return BPY_execute_string_as_number(C, NULL, str_unit_convert, error_prefix, r_value);
   }
 
-  int success = BPY_execute_string_as_number(C, NULL, str, true, r_value);
+  int success = BPY_execute_string_as_number(C, NULL, str, error_prefix, r_value);
   *r_value *= bUnit_PreferredInputUnitScalar(unit, type);
   *r_value /= unit_scale;
   return success;
@@ -573,7 +579,8 @@ bool handleNumInput(bContext *C, NumInput *n, const wmEvent *event)
     Scene *sce = CTX_data_scene(C);
 
     double val;
-    int success = user_string_to_number(C, n->str, &sce->unit, n->unit_type[idx], &val);
+    int success = user_string_to_number(
+        C, n->str, &sce->unit, n->unit_type[idx], IFACE_("Numeric input evaluation"), &val);
 
     if (success) {
       n->val[idx] = (float)val;
diff --git a/source/blender/python/BPY_extern.h b/source/blender/python/BPY_extern.h
index 5c6e0b0a308..049b919b4a4 100644
--- a/source/blender/python/BPY_extern.h
+++ b/source/blender/python/BPY_extern.h
@@ -82,23 +82,23 @@ bool BPY_execute_text(struct bContext *C,
 bool BPY_execute_string_as_number(struct bContext *C,
                                   const char *imports[],
                                   const char *expr,
-                                  const bool verbose,
+                                  const char *report_prefix,
                                   double *r_value);
 bool BPY_execute_string_as_intptr(struct bContext *C,
                                   const char *imports[],
                                   const char *expr,
-                                  const bool verbose,
+                                  const char *report_prefix,
                                   intptr_t *r_value);
 bool BPY_execute_string_as_string_and_size(struct bContext *C,
                                            const char *imports[],
                                            const char *expr,
-                                           const bool verbose,
+                                           const char *report_prefix,
                                            char **r_value,
                                            size_t *r_value_size);
 bool BPY_execute_string_as_string(struct bContext *C,
                                   const char *imports[],
                                   const char *expr,
-                                  const bool verbose,
+                                  const char *report_prefix,
                                   char **r_value);
 
 bool BPY_execute_string_ex(struct bContext *C,
diff --git a/source/blender/python/intern/bpy_capi_utils.c b/source/blender/python/intern/bpy_capi_utils.c
index 0befd6aad2f..27eea80f1f6 100644
--- a/source/blender/python/intern/bpy_capi_utils.c
+++ b/source/blender/python/intern/bpy_capi_utils.c
@@ -97,7 +97,10 @@ void BPy_reports_write_stdout(const ReportList *reports, const char *header)
   }
 }
 
-bool BPy_errors_to_report_ex(ReportList *reports, const bool use_full, const bool use_location)
+bool BPy_errors_to_report_ex(ReportList *reports,
+                             const char *error_prefix,
+                             const bool use_full,
+                             const bool use_location)
 {
   PyObject *pystring;
 
@@ -124,6 +127,11 @@ bool BPy_errors_to_report_ex(ReportList *reports, co

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list