[Bf-blender-cvs] [dcff28e1e7a] master: UI Code Quality: Use derived struct for HSV Cube buttons

Julian Eisel noreply at git.blender.org
Fri Aug 7 17:48:50 CEST 2020


Commit: dcff28e1e7a8b1be9bb6acec24af7ca6f6468e77
Author: Julian Eisel
Date:   Fri Aug 7 17:42:13 2020 +0200
Branches: master
https://developer.blender.org/rBdcff28e1e7a8b1be9bb6acec24af7ca6f6468e77

UI Code Quality: Use derived struct for HSV Cube buttons

For the main rationale behind this design, see 49f088e2d093. Further,
this removes users of uiBut.a1, which is a very ugly design
choice (hard to reason about).

Part of T74432.

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

M	source/blender/editors/include/UI_interface.h
M	source/blender/editors/interface/interface.c
M	source/blender/editors/interface/interface_handlers.c
M	source/blender/editors/interface/interface_intern.h
M	source/blender/editors/interface/interface_region_color_picker.c
M	source/blender/editors/interface/interface_templates.c
M	source/blender/editors/interface/interface_widgets.c

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

diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index e8352bc6b21..c02b4da3599 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -378,7 +378,7 @@ typedef enum {
 #define BUTTYPE (63 << 9)
 
 /** Gradient types, for color picker #UI_BTYPE_HSVCUBE etc. */
-enum {
+typedef enum eButGradientType {
   UI_GRAD_SV = 0,
   UI_GRAD_HV = 1,
   UI_GRAD_HS = 2,
@@ -388,7 +388,7 @@ enum {
 
   UI_GRAD_V_ALT = 9,
   UI_GRAD_L_ALT = 10,
-};
+} eButGradientType;
 
 /* Drawing
  *
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index a84ca33a7d7..22fbffa9030 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -3793,6 +3793,10 @@ static void ui_but_alloc_info(const eButType type,
       alloc_size = sizeof(uiButProgressbar);
       alloc_str = "uiButProgressbar";
       break;
+    case UI_BTYPE_HSVCUBE:
+      alloc_size = sizeof(uiButHSVCube);
+      alloc_str = "uiButHSVCube";
+      break;
     default:
       alloc_size = sizeof(uiBut);
       alloc_str = "uiBut";
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 999ddca65b9..ef1bc3374d0 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -5941,9 +5941,11 @@ static void clamp_axis_max_v3(float v[3], const float max)
   }
 }
 
-static void ui_rgb_to_color_picker_HSVCUBE_compat_v(uiBut *but, const float rgb[3], float hsv[3])
+static void ui_rgb_to_color_picker_HSVCUBE_compat_v(const uiButHSVCube *hsv_but,
+                                                    const float rgb[3],
+                                                    float hsv[3])
 {
-  if (but->a1 == UI_GRAD_L_ALT) {
+  if (hsv_but->gradient_type == UI_GRAD_L_ALT) {
     rgb_to_hsl_compat_v(rgb, hsv);
   }
   else {
@@ -5951,9 +5953,11 @@ static void ui_rgb_to_color_picker_HSVCUBE_compat_v(uiBut *but, const float rgb[
   }
 }
 
-static void ui_rgb_to_color_picker_HSVCUBE_v(uiBut *but, const float rgb[3], float hsv[3])
+static void ui_rgb_to_color_picker_HSVCUBE_v(const uiButHSVCube *hsv_but,
+                                             const float rgb[3],
+                                             float hsv[3])
 {
-  if (but->a1 == UI_GRAD_L_ALT) {
+  if (hsv_but->gradient_type == UI_GRAD_L_ALT) {
     rgb_to_hsl_v(rgb, hsv);
   }
   else {
@@ -5961,9 +5965,11 @@ static void ui_rgb_to_color_picker_HSVCUBE_v(uiBut *but, const float rgb[3], flo
   }
 }
 
-static void ui_color_picker_to_rgb_HSVCUBE_v(uiBut *but, const float hsv[3], float rgb[3])
+static void ui_color_picker_to_rgb_HSVCUBE_v(const uiButHSVCube *hsv_but,
+                                             const float hsv[3],
+                                             float rgb[3])
 {
-  if (but->a1 == UI_GRAD_L_ALT) {
+  if (hsv_but->gradient_type == UI_GRAD_L_ALT) {
     hsl_to_rgb_v(hsv, rgb);
   }
   else {
@@ -5978,6 +5984,7 @@ static bool ui_numedit_but_HSVCUBE(uiBut *but,
                                    const enum eSnapType snap,
                                    const bool shift)
 {
+  const uiButHSVCube *hsv_but = (uiButHSVCube *)but;
   ColorPicker *cpicker = but->custom_data;
   float *hsv = cpicker->color_data;
   float rgb[3];
@@ -5999,7 +6006,7 @@ static bool ui_numedit_but_HSVCUBE(uiBut *but,
   ui_but_v3_get(but, rgb);
   ui_scene_linear_to_color_picker_space(but, rgb);
 
-  ui_rgb_to_color_picker_HSVCUBE_compat_v(but, rgb, hsv);
+  ui_rgb_to_color_picker_HSVCUBE_compat_v(hsv_but, rgb, hsv);
 
   /* only apply the delta motion, not absolute */
   if (shift) {
@@ -6014,10 +6021,10 @@ static bool ui_numedit_but_HSVCUBE(uiBut *but,
 
     copy_v3_v3(hsvo, hsv);
 
-    ui_rgb_to_color_picker_HSVCUBE_compat_v(but, rgb, hsvo);
+    ui_rgb_to_color_picker_HSVCUBE_compat_v(hsv_but, rgb, hsvo);
 
     /* and original position */
-    ui_hsvcube_pos_from_vals(but, &rect_i, hsvo, &xpos, &ypos);
+    ui_hsvcube_pos_from_vals(hsv_but, &rect_i, hsvo, &xpos, &ypos);
 
     mx_fl = xpos - (data->dragstartx - mx_fl);
     my_fl = ypos - (data->dragstarty - my_fl);
@@ -6029,7 +6036,7 @@ static bool ui_numedit_but_HSVCUBE(uiBut *but,
   CLAMP(x, 0.0f, 1.0f);
   CLAMP(y, 0.0f, 1.0f);
 
-  switch ((int)but->a1) {
+  switch (hsv_but->gradient_type) {
     case UI_GRAD_SV:
       hsv[1] = x;
       hsv[2] = y;
@@ -6067,16 +6074,16 @@ static bool ui_numedit_but_HSVCUBE(uiBut *but,
   }
 
   if (snap != SNAP_OFF) {
-    if (ELEM((int)but->a1, UI_GRAD_HV, UI_GRAD_HS, UI_GRAD_H)) {
+    if (ELEM(hsv_but->gradient_type, UI_GRAD_HV, UI_GRAD_HS, UI_GRAD_H)) {
       ui_color_snap_hue(snap, &hsv[0]);
     }
   }
 
-  ui_color_picker_to_rgb_HSVCUBE_v(but, hsv, rgb);
+  ui_color_picker_to_rgb_HSVCUBE_v(hsv_but, hsv, rgb);
   ui_color_picker_to_scene_linear_space(but, rgb);
 
   /* clamp because with color conversion we can exceed range [#34295] */
-  if (but->a1 == UI_GRAD_V_ALT) {
+  if (hsv_but->gradient_type == UI_GRAD_V_ALT) {
     clamp_axis_max_v3(rgb, but->softmax);
   }
 
@@ -6161,6 +6168,7 @@ static void ui_ndofedit_but_HSVCUBE(uiBut *but,
 static int ui_do_but_HSVCUBE(
     bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
 {
+  const uiButHSVCube *hsv_but = (uiButHSVCube *)but;
   int mx, my;
 
   mx = event->x;
@@ -6199,7 +6207,7 @@ static int ui_do_but_HSVCUBE(
 #endif /* WITH_INPUT_NDOF */
     /* XXX hardcoded keymap check.... */
     if (event->type == EVT_BACKSPACEKEY && event->val == KM_PRESS) {
-      if (ELEM(but->a1, UI_GRAD_V_ALT, UI_GRAD_L_ALT)) {
+      if (ELEM(hsv_but->gradient_type, UI_GRAD_V_ALT, UI_GRAD_L_ALT)) {
         int len;
 
         /* reset only value */
@@ -6212,15 +6220,15 @@ static int ui_do_but_HSVCUBE(
           float *hsv = cpicker->color_data;
 
           RNA_property_float_get_default_array(&but->rnapoin, but->rnaprop, def);
-          ui_rgb_to_color_picker_HSVCUBE_v(but, def, def_hsv);
+          ui_rgb_to_color_picker_HSVCUBE_v(hsv_but, def, def_hsv);
 
           ui_but_v3_get(but, rgb);
-          ui_rgb_to_color_picker_HSVCUBE_compat_v(but, rgb, hsv);
+          ui_rgb_to_color_picker_HSVCUBE_compat_v(hsv_but, rgb, hsv);
 
           def_hsv[0] = hsv[0];
           def_hsv[1] = hsv[1];
 
-          ui_color_picker_to_rgb_HSVCUBE_v(but, def_hsv, rgb);
+          ui_color_picker_to_rgb_HSVCUBE_v(hsv_but, def_hsv, rgb);
           ui_but_v3_set(but, rgb);
 
           RNA_property_update(C, &but->rnapoin, but->rnaprop);
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index 41110883729..6718db39e61 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -172,7 +172,6 @@ struct uiBut {
 
   /**
    * For #uiBut.type:
-   * - UI_BTYPE_HSVCUBE:      Use UI_GRAD_* values.
    * - UI_BTYPE_NUM:          Use to store RNA 'step' value, for dragging and click-step.
    * - UI_BTYPE_LABEL:        Use `(a1 == 1.0f)` to use a2 as a blending factor (imaginative!).
    * - UI_BTYPE_SCROLL:       Use as scroll size.
@@ -328,6 +327,12 @@ typedef struct uiButProgressbar {
   float progress;
 } uiButProgressbar;
 
+typedef struct uiButHSVCube {
+  uiBut but;
+
+  eButGradientType gradient_type;
+} uiButHSVCube;
+
 /**
  * Additional, superimposed icon for a button, invoking an operator.
  */
@@ -535,7 +540,7 @@ extern void ui_hsvcircle_vals_from_pos(
 extern void ui_hsvcircle_pos_from_vals(
     const ColorPicker *cpicker, const rcti *rect, const float *hsv, float *xpos, float *ypos);
 extern void ui_hsvcube_pos_from_vals(
-    const struct uiBut *but, const rcti *rect, const float *hsv, float *xp, float *yp);
+    const struct uiButHSVCube *hsv_but, const rcti *rect, const float *hsv, float *xp, float *yp);
 
 extern void ui_but_string_get_ex(uiBut *but,
                                  char *str,
@@ -777,7 +782,10 @@ extern void ui_draw_aligned_panel(struct uiStyle *style,
 extern void ui_draw_dropshadow(
     const rctf *rct, float radius, float aspect, float alpha, int select);
 
-void ui_draw_gradient(const rcti *rect, const float hsv[3], const int type, const float alpha);
+void ui_draw_gradient(const rcti *rect,
+                      const float hsv[3],
+                      const eButGradientType type,
+                      const float alpha);
 
 void ui_draw_but_TAB_outline(const rcti *rect,
                              float rad,
diff --git a/source/blender/editors/interface/interface_region_color_picker.c b/source/blender/editors/interface/interface_region_color_picker.c
index f9873f8b96f..0d1b483716e 100644
--- a/source/blender/editors/interface/interface_region_color_picker.c
+++ b/source/blender/editors/interface/interface_region_color_picker.c
@@ -369,6 +369,7 @@ static void ui_colorpicker_circle(uiBlock *block,
                                   ColorPicker *cpicker)
 {
   uiBut *bt;
+  uiButHSVCube *hsv_but;
 
   /* HS circle */
   bt = uiDefButR_prop(block,
@@ -392,91 +393,99 @@ static void ui_colorpicker_circle(uiBlock *block,
 
   /* value */
   if (U.color_picker_type == USER_CP_CIRCLE_HSL) {
-    bt = uiDefButR_prop(block,
-                        UI_BTYPE_HSVCUBE,
-                        0,
-                        "",
-                        PICKER_W + PICKER_SPACE,
-                        0,
-                        PICKER_BAR,
-                        PICKER_H,
-                        ptr,
-                        prop,
-                        -1,
-                        0.0,
-                        0.0,
-                        UI_GRAD_L_ALT,
-                        0,
-                        "Lightness");
-    UI_but_func_set(bt, ui_colorpicker_rna_cb, bt, NULL);
+    hsv_but = (uiButHSVCube *)uiDefButR_prop(block,
+                                             UI_BTYPE_HSVCUBE,
+                                             0,
+                                             "",
+                                             PICKER_W + PICKER_SPACE,
+         

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list