From b01d64cb915d2aee631f6f0361590759fb2f8b52 Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Tue, 23 May 2023 15:49:52 -0700 Subject: [PATCH 01/13] UI: uiBut Indeterminate State Setting a new uiBut drawflag shows items in an indeterminate state, not indicating a specific value or state. --- source/blender/editors/include/UI_interface.h | 3 ++ source/blender/editors/interface/interface.cc | 11 ++++-- .../editors/interface/interface_widgets.cc | 34 +++++++++++++++++-- 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 6c6fbc9b058..b87b51ea961 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -317,6 +317,9 @@ enum { /* Draw the checkbox buttons inverted. */ UI_BUT_CHECKBOX_INVERT = 1 << 25, + + /* Drawn in a way that indicates that the state/value is unknown. */ + UI_BUT_INDETERMINATE = 1 << 26, }; /** diff --git a/source/blender/editors/interface/interface.cc b/source/blender/editors/interface/interface.cc index a54b1318bb8..b3dc6bef9b1 100644 --- a/source/blender/editors/interface/interface.cc +++ b/source/blender/editors/interface/interface.cc @@ -3861,7 +3861,9 @@ static void ui_but_update_ex(uiBut *but, const bool validate) } } } - STRNCPY(but->drawstr, but->str); + if (!(but->drawflag & UI_BUT_INDETERMINATE)) { + STRNCPY(but->drawstr, but->str); + } } break; @@ -3871,7 +3873,10 @@ static void ui_but_update_ex(uiBut *but, const bool validate) break; } UI_GET_BUT_VALUE_INIT(but, value); - if (ui_but_is_float(but)) { + if (but->drawflag & UI_BUT_INDETERMINATE) { + /* Pass. */ + } + else if (ui_but_is_float(but)) { ui_but_build_drawstr_float(but, value); } else { @@ -3893,7 +3898,7 @@ static void ui_but_update_ex(uiBut *but, const bool validate) case UI_BTYPE_TEXT: case UI_BTYPE_SEARCH_MENU: - if (!but->editstr) { + if (!but->editstr && !(but->drawflag & UI_BUT_INDETERMINATE)) { char str[UI_MAX_DRAW_STR]; ui_but_string_get(but, str, UI_MAX_DRAW_STR); diff --git a/source/blender/editors/interface/interface_widgets.cc b/source/blender/editors/interface/interface_widgets.cc index 37b528eeab7..f0eab6b3bf7 100644 --- a/source/blender/editors/interface/interface_widgets.cc +++ b/source/blender/editors/interface/interface_widgets.cc @@ -3716,7 +3716,7 @@ static void widget_numslider(uiBut *but, widgetbase_draw(&wtb, wcol); /* Draw slider part only when not in text editing. */ - if (!state->is_text_input) { + if (!state->is_text_input && !(but->drawflag & UI_BUT_INDETERMINATE)) { int roundboxalign_slider = roundboxalign; uchar outline[3]; @@ -4151,16 +4151,46 @@ static void widget_optionbut(uiWidgetColors *wcol, /* Keep one edge in place. */ BLI_rcti_translate(&recttemp, text_before_widget ? delta : -delta, 0); + if (state->but_drawflag & UI_BUT_INDETERMINATE) { + /* The same muted background color regardless of state. */ + wcol->inner[0] = wcol->inner_sel[0]; + wcol->inner[1] = wcol->inner_sel[1]; + wcol->inner[2] = wcol->inner_sel[2]; + wcol->inner[3] = 96; + } + const float rad = widget_radius_from_rcti(&recttemp, wcol); round_box_edges(&wtb, UI_CNR_ALL, &recttemp, rad); /* decoration */ - if (state->but_flag & UI_SELECT) { + if (state->but_flag & UI_SELECT && !(state->but_drawflag & UI_BUT_INDETERMINATE)) { shape_preset_trias_from_rect_checkmark(&wtb.tria1, &recttemp); } widgetbase_draw(&wtb, wcol); + if (state->but_drawflag & UI_BUT_INDETERMINATE) { + + /* Flush the widget cache so we can draw on top. */ + GPU_blend(GPU_BLEND_ALPHA); + UI_widgetbase_draw_cache_flush(); + + /* Draw a horizontal line instead of checkmark. */ + const uint pos = GPU_vertformat_attr_add( + immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); + immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); + immUniformColor3ubvAlpha(wcol->text, 192); + + float extent = (recttemp.ymax - recttemp.ymin); + float w = extent * 0.6f; + float h = MAX2(w / 6.0f, U.pixelsize); + float x = recttemp.xmin + (extent * 0.2f); + float y = recttemp.ymin + (extent * 0.5f) - (h * 0.5f); + immRectf(pos, x, y, x + w, y + h); + immUnbindProgram(); + GPU_blend(GPU_BLEND_NONE); + } + /* Text space - factor is really just eyeballed. */ const float offset = delta * 0.9; if (text_before_widget) { -- 2.30.2 From e7badb3b181aca243795279507f0fe5a0b2b9452 Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Tue, 23 May 2023 16:51:20 -0700 Subject: [PATCH 02/13] Setting some variables const --- source/blender/editors/interface/interface_widgets.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/blender/editors/interface/interface_widgets.cc b/source/blender/editors/interface/interface_widgets.cc index f0eab6b3bf7..3ca74a341e8 100644 --- a/source/blender/editors/interface/interface_widgets.cc +++ b/source/blender/editors/interface/interface_widgets.cc @@ -4181,11 +4181,11 @@ static void widget_optionbut(uiWidgetColors *wcol, immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); immUniformColor3ubvAlpha(wcol->text, 192); - float extent = (recttemp.ymax - recttemp.ymin); - float w = extent * 0.6f; - float h = MAX2(w / 6.0f, U.pixelsize); - float x = recttemp.xmin + (extent * 0.2f); - float y = recttemp.ymin + (extent * 0.5f) - (h * 0.5f); + const float extent = (recttemp.ymax - recttemp.ymin); + const float w = extent * 0.6f; + const float h = MAX2(w / 6.0f, U.pixelsize); + const float x = recttemp.xmin + (extent * 0.2f); + const float y = recttemp.ymin + (extent * 0.5f) - (h * 0.5f); immRectf(pos, x, y, x + w, y + h); immUnbindProgram(); GPU_blend(GPU_BLEND_NONE); -- 2.30.2 From f88c5075a60ea4aa5c751d76421be6fe06e6e966 Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Fri, 2 Jun 2023 12:18:53 -0700 Subject: [PATCH 03/13] Using emdash instead of blank for some input types --- source/blender/editors/interface/interface.cc | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/source/blender/editors/interface/interface.cc b/source/blender/editors/interface/interface.cc index b3dc6bef9b1..1b9dfdaee1e 100644 --- a/source/blender/editors/interface/interface.cc +++ b/source/blender/editors/interface/interface.cc @@ -3861,7 +3861,10 @@ static void ui_but_update_ex(uiBut *but, const bool validate) } } } - if (!(but->drawflag & UI_BUT_INDETERMINATE)) { + if (but->drawflag & UI_BUT_INDETERMINATE) { + STRNCPY(but->drawstr, "\u2014"); + } + else { STRNCPY(but->drawstr, but->str); } } @@ -3874,7 +3877,7 @@ static void ui_but_update_ex(uiBut *but, const bool validate) } UI_GET_BUT_VALUE_INIT(but, value); if (but->drawflag & UI_BUT_INDETERMINATE) { - /* Pass. */ + STRNCPY(but->drawstr, "\u2014"); } else if (ui_but_is_float(but)) { ui_but_build_drawstr_float(but, value); @@ -3898,11 +3901,15 @@ static void ui_but_update_ex(uiBut *but, const bool validate) case UI_BTYPE_TEXT: case UI_BTYPE_SEARCH_MENU: - if (!but->editstr && !(but->drawflag & UI_BUT_INDETERMINATE)) { - char str[UI_MAX_DRAW_STR]; - - ui_but_string_get(but, str, UI_MAX_DRAW_STR); - SNPRINTF(but->drawstr, "%s%s", but->str, str); + if (!but->editstr) { + if (but->drawflag & UI_BUT_INDETERMINATE) { + STRNCPY(but->drawstr, "\u2014"); + } + else { + char str[UI_MAX_DRAW_STR]; + ui_but_string_get(but, str, UI_MAX_DRAW_STR); + SNPRINTF(but->drawstr, "%s%s", but->str, str); + } } break; -- 2.30.2 From 1bcef01adc99072aeb3f6c983c870d57e2197844 Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Sat, 3 Jun 2023 10:44:30 -0700 Subject: [PATCH 04/13] Centering the emdash --- source/blender/editors/interface/interface.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/blender/editors/interface/interface.cc b/source/blender/editors/interface/interface.cc index 1b9dfdaee1e..6d1e0fed40c 100644 --- a/source/blender/editors/interface/interface.cc +++ b/source/blender/editors/interface/interface.cc @@ -3797,6 +3797,10 @@ static void ui_but_update_ex(uiBut *but, const bool validate) } } + if (but->drawflag & UI_BUT_INDETERMINATE) { + but->drawflag &= ~(UI_BUT_TEXT_LEFT | UI_BUT_TEXT_RIGHT); + } + /* test for min and max, icon sliders, etc */ switch (but->type) { case UI_BTYPE_NUM: -- 2.30.2 From 77b1df8ca6fc5025438dccb4f4ebbde67eadb5bb Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Sat, 3 Jun 2023 11:16:54 -0700 Subject: [PATCH 05/13] Toggle buttons, colors, etc. --- source/blender/editors/interface/interface.cc | 1 + source/blender/editors/interface/interface_widgets.cc | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/interface/interface.cc b/source/blender/editors/interface/interface.cc index 6d1e0fed40c..84cde2213b4 100644 --- a/source/blender/editors/interface/interface.cc +++ b/source/blender/editors/interface/interface.cc @@ -3799,6 +3799,7 @@ static void ui_but_update_ex(uiBut *but, const bool validate) if (but->drawflag & UI_BUT_INDETERMINATE) { but->drawflag &= ~(UI_BUT_TEXT_LEFT | UI_BUT_TEXT_RIGHT); + but->flag &= ~(UI_SELECT); } /* test for min and max, icon sliders, etc */ diff --git a/source/blender/editors/interface/interface_widgets.cc b/source/blender/editors/interface/interface_widgets.cc index 3ca74a341e8..ca405e01d30 100644 --- a/source/blender/editors/interface/interface_widgets.cc +++ b/source/blender/editors/interface/interface_widgets.cc @@ -3843,6 +3843,10 @@ static void widget_swatch(uiBut *but, ui_but_v3_get(but, col); + if (but->drawflag & UI_BUT_INDETERMINATE) { + col[0] = col[1] = col[2] = col[3] = 0.5f; + } + if ((state->but_flag & (UI_BUT_ANIMATED | UI_BUT_ANIMATED_KEY | UI_BUT_DRIVEN | UI_BUT_OVERRIDDEN | UI_BUT_REDALERT)) || (state->but_drawflag & UI_BUT_ANIMATED_CHANGED)) @@ -4156,7 +4160,7 @@ static void widget_optionbut(uiWidgetColors *wcol, wcol->inner[0] = wcol->inner_sel[0]; wcol->inner[1] = wcol->inner_sel[1]; wcol->inner[2] = wcol->inner_sel[2]; - wcol->inner[3] = 96; + wcol->inner[3] = 60; } const float rad = widget_radius_from_rcti(&recttemp, wcol); -- 2.30.2 From f8b05e5620eec114758e284816bbc112fa7aa55e Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Thu, 8 Jun 2023 17:16:21 -0700 Subject: [PATCH 06/13] Changes requested by review --- source/blender/editors/interface/interface.cc | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/source/blender/editors/interface/interface.cc b/source/blender/editors/interface/interface.cc index 84cde2213b4..4051c1ad5f1 100644 --- a/source/blender/editors/interface/interface.cc +++ b/source/blender/editors/interface/interface.cc @@ -3788,6 +3788,9 @@ static void ui_but_update_ex(uiBut *but, const bool validate) /* if something changed in the button */ double value = UI_BUT_VALUE_UNSET; + /* Use emdash in place of text when in indeterminate state. */ + const char *emdash = "\u2014"; + ui_but_update_select_flag(but, &value); /* only update soft range while not editing */ @@ -3798,7 +3801,9 @@ static void ui_but_update_ex(uiBut *but, const bool validate) } if (but->drawflag & UI_BUT_INDETERMINATE) { + /* Center text. */ but->drawflag &= ~(UI_BUT_TEXT_LEFT | UI_BUT_TEXT_RIGHT); + /* Do not show toggles as selected. */ but->flag &= ~(UI_SELECT); } @@ -3867,7 +3872,7 @@ static void ui_but_update_ex(uiBut *but, const bool validate) } } if (but->drawflag & UI_BUT_INDETERMINATE) { - STRNCPY(but->drawstr, "\u2014"); + STRNCPY(but->drawstr, emdash); } else { STRNCPY(but->drawstr, but->str); @@ -3882,7 +3887,7 @@ static void ui_but_update_ex(uiBut *but, const bool validate) } UI_GET_BUT_VALUE_INIT(but, value); if (but->drawflag & UI_BUT_INDETERMINATE) { - STRNCPY(but->drawstr, "\u2014"); + STRNCPY(but->drawstr, emdash); } else if (ui_but_is_float(but)) { ui_but_build_drawstr_float(but, value); @@ -3908,7 +3913,7 @@ static void ui_but_update_ex(uiBut *but, const bool validate) case UI_BTYPE_SEARCH_MENU: if (!but->editstr) { if (but->drawflag & UI_BUT_INDETERMINATE) { - STRNCPY(but->drawstr, "\u2014"); + STRNCPY(but->drawstr, emdash); } else { char str[UI_MAX_DRAW_STR]; -- 2.30.2 From 1fe0b4456cad10c056881ebf7f7835fd00d1215f Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Mon, 26 Jun 2023 12:02:37 -0700 Subject: [PATCH 07/13] review issues. --- source/blender/editors/interface/interface.cc | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/source/blender/editors/interface/interface.cc b/source/blender/editors/interface/interface.cc index 4051c1ad5f1..6d4906dbeb0 100644 --- a/source/blender/editors/interface/interface.cc +++ b/source/blender/editors/interface/interface.cc @@ -2304,7 +2304,8 @@ int ui_but_is_pushed(uiBut *but) static void ui_but_update_select_flag(uiBut *but, double *value) { - switch (ui_but_is_pushed_ex(but, value)) { + switch (ui_but_is_pushed_ex(but, value) && (!(but->drawflag & UI_BUT_INDETERMINATE))) + { case true: but->flag |= UI_SELECT; break; @@ -3785,11 +3786,15 @@ static void ui_but_build_drawstr_int(uiBut *but, int value) */ static void ui_but_update_ex(uiBut *but, const bool validate) { + if (but->type != UI_BTYPE_LABEL) { + but->drawflag |= UI_BUT_INDETERMINATE; + } + /* if something changed in the button */ double value = UI_BUT_VALUE_UNSET; /* Use emdash in place of text when in indeterminate state. */ - const char *emdash = "\u2014"; + const char *UI_VALUE_INDETERMINATE_CHAR = "\u2014"; ui_but_update_select_flag(but, &value); @@ -3800,13 +3805,6 @@ static void ui_but_update_ex(uiBut *but, const bool validate) } } - if (but->drawflag & UI_BUT_INDETERMINATE) { - /* Center text. */ - but->drawflag &= ~(UI_BUT_TEXT_LEFT | UI_BUT_TEXT_RIGHT); - /* Do not show toggles as selected. */ - but->flag &= ~(UI_SELECT); - } - /* test for min and max, icon sliders, etc */ switch (but->type) { case UI_BTYPE_NUM: @@ -3872,7 +3870,8 @@ static void ui_but_update_ex(uiBut *but, const bool validate) } } if (but->drawflag & UI_BUT_INDETERMINATE) { - STRNCPY(but->drawstr, emdash); + STRNCPY(but->drawstr, UI_VALUE_INDETERMINATE_CHAR); + but->drawflag &= ~(UI_BUT_TEXT_LEFT | UI_BUT_TEXT_RIGHT); } else { STRNCPY(but->drawstr, but->str); @@ -3887,7 +3886,8 @@ static void ui_but_update_ex(uiBut *but, const bool validate) } UI_GET_BUT_VALUE_INIT(but, value); if (but->drawflag & UI_BUT_INDETERMINATE) { - STRNCPY(but->drawstr, emdash); + STRNCPY(but->drawstr, UI_VALUE_INDETERMINATE_CHAR); + but->drawflag &= ~(UI_BUT_TEXT_LEFT | UI_BUT_TEXT_RIGHT); } else if (ui_but_is_float(but)) { ui_but_build_drawstr_float(but, value); @@ -3913,7 +3913,8 @@ static void ui_but_update_ex(uiBut *but, const bool validate) case UI_BTYPE_SEARCH_MENU: if (!but->editstr) { if (but->drawflag & UI_BUT_INDETERMINATE) { - STRNCPY(but->drawstr, emdash); + STRNCPY(but->drawstr, UI_VALUE_INDETERMINATE_CHAR); + but->drawflag &= ~(UI_BUT_TEXT_LEFT | UI_BUT_TEXT_RIGHT); } else { char str[UI_MAX_DRAW_STR]; -- 2.30.2 From c5d5f569e95ac8df214167133036eaf354f05482 Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Mon, 26 Jun 2023 14:32:06 -0700 Subject: [PATCH 08/13] Changes request by review. --- source/blender/editors/interface/interface.cc | 10 ++--- .../editors/interface/interface_intern.hh | 1 + .../editors/interface/interface_widgets.cc | 42 +++++++------------ .../gpu_shader_2D_widget_base_vert.glsl | 10 ++++- 4 files changed, 30 insertions(+), 33 deletions(-) diff --git a/source/blender/editors/interface/interface.cc b/source/blender/editors/interface/interface.cc index 6d4906dbeb0..9ab0f52d10b 100644 --- a/source/blender/editors/interface/interface.cc +++ b/source/blender/editors/interface/interface.cc @@ -2304,7 +2304,7 @@ int ui_but_is_pushed(uiBut *but) static void ui_but_update_select_flag(uiBut *but, double *value) { - switch (ui_but_is_pushed_ex(but, value) && (!(but->drawflag & UI_BUT_INDETERMINATE))) + switch (ui_but_is_pushed_ex(but, value)) { case true: but->flag |= UI_SELECT; @@ -3786,10 +3786,6 @@ static void ui_but_build_drawstr_int(uiBut *but, int value) */ static void ui_but_update_ex(uiBut *but, const bool validate) { - if (but->type != UI_BTYPE_LABEL) { - but->drawflag |= UI_BUT_INDETERMINATE; - } - /* if something changed in the button */ double value = UI_BUT_VALUE_UNSET; @@ -3798,6 +3794,10 @@ static void ui_but_update_ex(uiBut *but, const bool validate) ui_but_update_select_flag(but, &value); + if ((but->drawflag & UI_BUT_INDETERMINATE) && (but->flag & UI_SELECT)) { + but->flag &= ~UI_SELECT; + } + /* only update soft range while not editing */ if (!ui_but_is_editing(but)) { if ((but->rnaprop != nullptr) || (but->poin && (but->pointype & UI_BUT_POIN_TYPES))) { diff --git a/source/blender/editors/interface/interface_intern.hh b/source/blender/editors/interface/interface_intern.hh index b82403ead73..1704db185e5 100644 --- a/source/blender/editors/interface/interface_intern.hh +++ b/source/blender/editors/interface/interface_intern.hh @@ -1111,6 +1111,7 @@ enum { ROUNDBOX_TRIA_MENU, ROUNDBOX_TRIA_CHECK, ROUNDBOX_TRIA_HOLD_ACTION_ARROW, + ROUNDBOX_TRIA_DASH, ROUNDBOX_TRIA_MAX, /* don't use */ }; diff --git a/source/blender/editors/interface/interface_widgets.cc b/source/blender/editors/interface/interface_widgets.cc index ca405e01d30..8f825947493 100644 --- a/source/blender/editors/interface/interface_widgets.cc +++ b/source/blender/editors/interface/interface_widgets.cc @@ -1031,6 +1031,16 @@ static void shape_preset_trias_from_rect_checkmark(uiWidgetTrias *tria, const rc tria->index = g_shape_preset_checkmark_face; } +static void shape_preset_trias_from_rect_dash(uiWidgetTrias *tria, const rcti *rect) +{ + tria->type = ROUNDBOX_TRIA_DASH; + + /* Center position and size. */ + tria->center[0] = rect->xmin + 0.5f * BLI_rcti_size_y(rect); + tria->center[1] = rect->ymin + 0.5f * BLI_rcti_size_y(rect); + tria->size = 0.5f * BLI_rcti_size_y(rect); +} + /** \} */ /* -------------------------------------------------------------------- */ @@ -4157,44 +4167,22 @@ static void widget_optionbut(uiWidgetColors *wcol, if (state->but_drawflag & UI_BUT_INDETERMINATE) { /* The same muted background color regardless of state. */ - wcol->inner[0] = wcol->inner_sel[0]; - wcol->inner[1] = wcol->inner_sel[1]; - wcol->inner[2] = wcol->inner_sel[2]; - wcol->inner[3] = 60; + color_blend_v4_v4v4(wcol->inner, wcol->inner, wcol->inner_sel, 0.75f); } const float rad = widget_radius_from_rcti(&recttemp, wcol); round_box_edges(&wtb, UI_CNR_ALL, &recttemp, rad); /* decoration */ - if (state->but_flag & UI_SELECT && !(state->but_drawflag & UI_BUT_INDETERMINATE)) { + if (state->but_drawflag & UI_BUT_INDETERMINATE) { + shape_preset_trias_from_rect_dash(&wtb.tria1, &recttemp); + } + else if (state->but_flag & UI_SELECT) { shape_preset_trias_from_rect_checkmark(&wtb.tria1, &recttemp); } widgetbase_draw(&wtb, wcol); - if (state->but_drawflag & UI_BUT_INDETERMINATE) { - - /* Flush the widget cache so we can draw on top. */ - GPU_blend(GPU_BLEND_ALPHA); - UI_widgetbase_draw_cache_flush(); - - /* Draw a horizontal line instead of checkmark. */ - const uint pos = GPU_vertformat_attr_add( - immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); - immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); - immUniformColor3ubvAlpha(wcol->text, 192); - - const float extent = (recttemp.ymax - recttemp.ymin); - const float w = extent * 0.6f; - const float h = MAX2(w / 6.0f, U.pixelsize); - const float x = recttemp.xmin + (extent * 0.2f); - const float y = recttemp.ymin + (extent * 0.5f) - (h * 0.5f); - immRectf(pos, x, y, x + w, y + h); - immUnbindProgram(); - GPU_blend(GPU_BLEND_NONE); - } - /* Text space - factor is really just eyeballed. */ const float offset = delta * 0.9; if (text_before_widget) { diff --git a/source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl b/source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl index d6c93df9849..e556b389240 100644 --- a/source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl +++ b/source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl @@ -137,7 +137,7 @@ vec2 do_tria() outRectSize = vec2(0.74, 0.14); outRoundCorners = vec4(0.01); } - else { + else if (triaType == 5.0) { /* ROUNDBOX_TRIA_HOLD_ACTION_ARROW */ /* We use a single triangle to cut the round rect in half. The edge will not be Antialiased. */ pos = tria2 ? vec2(0.0) : arrow_pos[min(vidx, 2)]; /* Only keep 1 triangle. */ @@ -149,6 +149,14 @@ vec2 do_tria() outRectSize = vec2(0.75); outRoundCorners = vec4(0.01); } + else if (triaType == 6.0) { + /* ROUNDBOX_TRIA_DASH */ + pos = point_pos[vidx]; + uvInterp = point_uvs[vidx]; + uvInterp -= vec2(0.2, 0.45); /* Translate */ + outRectSize = vec2(0.6, 0.1); + outRoundCorners = vec4(0.01); + } uvInterp *= abs(size); outRectSize *= abs(size); -- 2.30.2 From 1a63ace6bbd6404761f3a1524090c1dbc87e0a95 Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Thu, 13 Jul 2023 12:18:25 -0700 Subject: [PATCH 09/13] Updated to incorporate changes required by review --- source/blender/editors/include/UI_interface.h | 5 +++ source/blender/editors/interface/interface.cc | 33 +++---------------- .../editors/interface/interface_widgets.cc | 28 ++++++++++++++++ 3 files changed, 38 insertions(+), 28 deletions(-) diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 5195e1bafaa..8022d54a01f 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -86,6 +86,11 @@ typedef struct uiViewItemHandle uiViewItemHandle; #define UI_SEP_CHAR '|' #define UI_SEP_CHAR_S "|" +/** + * Character used when value is indeterminate (multiple, unknown, unset). + */ +#define UI_VALUE_INDETERMINATE_CHAR BLI_STR_UTF8_EM_DASH + /* Separator for text in search menus (right pointing arrow). * keep in sync with `string_search.cc`. */ #define UI_MENU_ARROW_SEP BLI_STR_UTF8_BLACK_RIGHT_POINTING_SMALL_TRIANGLE diff --git a/source/blender/editors/interface/interface.cc b/source/blender/editors/interface/interface.cc index 1da7563a09c..1c314fd602a 100644 --- a/source/blender/editors/interface/interface.cc +++ b/source/blender/editors/interface/interface.cc @@ -3792,15 +3792,8 @@ static void ui_but_update_ex(uiBut *but, const bool validate) /* if something changed in the button */ double value = UI_BUT_VALUE_UNSET; - /* Use emdash in place of text when in indeterminate state. */ - const char *UI_VALUE_INDETERMINATE_CHAR = "\u2014"; - ui_but_update_select_flag(but, &value); - if ((but->drawflag & UI_BUT_INDETERMINATE) && (but->flag & UI_SELECT)) { - but->flag &= ~UI_SELECT; - } - /* only update soft range while not editing */ if (!ui_but_is_editing(but)) { if ((but->rnaprop != nullptr) || (but->poin && (but->pointype & UI_BUT_POIN_TYPES))) { @@ -3872,13 +3865,7 @@ static void ui_but_update_ex(uiBut *but, const bool validate) } } } - if (but->drawflag & UI_BUT_INDETERMINATE) { - STRNCPY(but->drawstr, UI_VALUE_INDETERMINATE_CHAR); - but->drawflag &= ~(UI_BUT_TEXT_LEFT | UI_BUT_TEXT_RIGHT); - } - else { - STRNCPY(but->drawstr, but->str); - } + STRNCPY(but->drawstr, but->str); } break; @@ -3888,11 +3875,7 @@ static void ui_but_update_ex(uiBut *but, const bool validate) break; } UI_GET_BUT_VALUE_INIT(but, value); - if (but->drawflag & UI_BUT_INDETERMINATE) { - STRNCPY(but->drawstr, UI_VALUE_INDETERMINATE_CHAR); - but->drawflag &= ~(UI_BUT_TEXT_LEFT | UI_BUT_TEXT_RIGHT); - } - else if (ui_but_is_float(but)) { + if (ui_but_is_float(but)) { ui_but_build_drawstr_float(but, value); } else { @@ -3915,15 +3898,9 @@ static void ui_but_update_ex(uiBut *but, const bool validate) case UI_BTYPE_TEXT: case UI_BTYPE_SEARCH_MENU: if (!but->editstr) { - if (but->drawflag & UI_BUT_INDETERMINATE) { - STRNCPY(but->drawstr, UI_VALUE_INDETERMINATE_CHAR); - but->drawflag &= ~(UI_BUT_TEXT_LEFT | UI_BUT_TEXT_RIGHT); - } - else { - char str[UI_MAX_DRAW_STR]; - ui_but_string_get(but, str, UI_MAX_DRAW_STR); - SNPRINTF(but->drawstr, "%s%s", but->str, str); - } + char str[UI_MAX_DRAW_STR]; + ui_but_string_get(but, str, UI_MAX_DRAW_STR); + SNPRINTF(but->drawstr, "%s%s", but->str, str); } break; diff --git a/source/blender/editors/interface/interface_widgets.cc b/source/blender/editors/interface/interface_widgets.cc index d756d6eea1d..29f1fcd0652 100644 --- a/source/blender/editors/interface/interface_widgets.cc +++ b/source/blender/editors/interface/interface_widgets.cc @@ -1937,6 +1937,19 @@ static void widget_draw_text(const uiFontStyle *fstyle, } } + /* If not editing and indeterminate, show dash.*/ + if (but->drawflag & UI_BUT_INDETERMINATE && !but->editstr && + ELEM(but->type, + UI_BTYPE_MENU, + UI_BTYPE_NUM, + UI_BTYPE_NUM_SLIDER, + UI_BTYPE_TEXT, + UI_BTYPE_SEARCH_MENU)) + { + STRNCPY(but->drawstr, UI_VALUE_INDETERMINATE_CHAR); + align = UI_STYLE_TEXT_CENTER; + } + /* text button selection, cursor, composite underline */ if (but->editstr && but->pos != -1) { int but_pos_ofs; @@ -5054,6 +5067,21 @@ void ui_draw_but(const bContext *C, ARegion *region, uiStyle *style, uiBut *but, state.but_flag &= ~UI_BUT_OVERRIDDEN; } + if ((state.but_drawflag & UI_BUT_INDETERMINATE)) { + if (state.but_flag & UI_SELECT) { + state.but_flag &= ~UI_SELECT; + } + if (ELEM(but->type, + UI_BTYPE_MENU, + UI_BTYPE_NUM, + UI_BTYPE_NUM_SLIDER, + UI_BTYPE_TEXT, + UI_BTYPE_SEARCH_MENU)) + { + state.but_drawflag &= ~(UI_BUT_TEXT_LEFT | UI_BUT_TEXT_RIGHT); + } + } + const float zoom = 1.0f / but->block->aspect; wt->state(wt, &state, but->emboss); if (wt->custom) { -- 2.30.2 From a0449d37e13460dadd2410926fec02711149db04 Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Thu, 13 Jul 2023 12:22:51 -0700 Subject: [PATCH 10/13] revert unwanted format changes --- source/blender/editors/interface/interface.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/interface/interface.cc b/source/blender/editors/interface/interface.cc index 1c314fd602a..4adba6d2c0c 100644 --- a/source/blender/editors/interface/interface.cc +++ b/source/blender/editors/interface/interface.cc @@ -2307,8 +2307,7 @@ int ui_but_is_pushed(uiBut *but) static void ui_but_update_select_flag(uiBut *but, double *value) { - switch (ui_but_is_pushed_ex(but, value)) - { + switch (ui_but_is_pushed_ex(but, value)) { case true: but->flag |= UI_SELECT; break; @@ -3899,6 +3898,7 @@ static void ui_but_update_ex(uiBut *but, const bool validate) case UI_BTYPE_SEARCH_MENU: if (!but->editstr) { char str[UI_MAX_DRAW_STR]; + ui_but_string_get(but, str, UI_MAX_DRAW_STR); SNPRINTF(but->drawstr, "%s%s", but->str, str); } -- 2.30.2 From 5b42487f591bacff15baae502e16367e79b6629c Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Thu, 13 Jul 2023 12:57:12 -0700 Subject: [PATCH 11/13] removing unneeded section --- .../editors/interface/interface_widgets.cc | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/source/blender/editors/interface/interface_widgets.cc b/source/blender/editors/interface/interface_widgets.cc index 29f1fcd0652..19bd99a81a6 100644 --- a/source/blender/editors/interface/interface_widgets.cc +++ b/source/blender/editors/interface/interface_widgets.cc @@ -5067,19 +5067,8 @@ void ui_draw_but(const bContext *C, ARegion *region, uiStyle *style, uiBut *but, state.but_flag &= ~UI_BUT_OVERRIDDEN; } - if ((state.but_drawflag & UI_BUT_INDETERMINATE)) { - if (state.but_flag & UI_SELECT) { - state.but_flag &= ~UI_SELECT; - } - if (ELEM(but->type, - UI_BTYPE_MENU, - UI_BTYPE_NUM, - UI_BTYPE_NUM_SLIDER, - UI_BTYPE_TEXT, - UI_BTYPE_SEARCH_MENU)) - { - state.but_drawflag &= ~(UI_BUT_TEXT_LEFT | UI_BUT_TEXT_RIGHT); - } + if ((state.but_drawflag & UI_BUT_INDETERMINATE) && (state.but_flag & UI_SELECT)) { + state.but_flag &= ~UI_SELECT; } const float zoom = 1.0f / but->block->aspect; -- 2.30.2 From 9d430d621904cde1f52b8e77dd2be52e4a168cfb Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Thu, 13 Jul 2023 15:58:35 -0700 Subject: [PATCH 12/13] Fix for 3dview side panel nums --- source/blender/editors/interface/interface_widgets.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/blender/editors/interface/interface_widgets.cc b/source/blender/editors/interface/interface_widgets.cc index 19bd99a81a6..29fc81e3234 100644 --- a/source/blender/editors/interface/interface_widgets.cc +++ b/source/blender/editors/interface/interface_widgets.cc @@ -1948,6 +1948,9 @@ static void widget_draw_text(const uiFontStyle *fstyle, { STRNCPY(but->drawstr, UI_VALUE_INDETERMINATE_CHAR); align = UI_STYLE_TEXT_CENTER; + use_right_only = false; + drawstr_right = nullptr; + drawstr_left_len = strlen(but->drawstr); } /* text button selection, cursor, composite underline */ -- 2.30.2 From 836f1eeb063c9b4085e7f7397c7611ad1718d015 Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Fri, 14 Jul 2023 17:38:10 -0700 Subject: [PATCH 13/13] Changes requested by review. --- source/blender/editors/interface/interface_widgets.cc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/source/blender/editors/interface/interface_widgets.cc b/source/blender/editors/interface/interface_widgets.cc index 29fc81e3234..2018a9459f3 100644 --- a/source/blender/editors/interface/interface_widgets.cc +++ b/source/blender/editors/interface/interface_widgets.cc @@ -1882,6 +1882,7 @@ static void widget_draw_text(const uiFontStyle *fstyle, const char *drawstr = but->drawstr; const char *drawstr_right = nullptr; bool use_right_only = false; + const char *indeterminate_str = UI_VALUE_INDETERMINATE_CHAR; #ifdef WITH_INPUT_IME const wmIMEData *ime_data; @@ -1946,11 +1947,9 @@ static void widget_draw_text(const uiFontStyle *fstyle, UI_BTYPE_TEXT, UI_BTYPE_SEARCH_MENU)) { - STRNCPY(but->drawstr, UI_VALUE_INDETERMINATE_CHAR); + drawstr = indeterminate_str; + drawstr_left_len = strlen(drawstr); align = UI_STYLE_TEXT_CENTER; - use_right_only = false; - drawstr_right = nullptr; - drawstr_left_len = strlen(but->drawstr); } /* text button selection, cursor, composite underline */ @@ -5070,7 +5069,7 @@ void ui_draw_but(const bContext *C, ARegion *region, uiStyle *style, uiBut *but, state.but_flag &= ~UI_BUT_OVERRIDDEN; } - if ((state.but_drawflag & UI_BUT_INDETERMINATE) && (state.but_flag & UI_SELECT)) { + if (state.but_drawflag & UI_BUT_INDETERMINATE) { state.but_flag &= ~UI_SELECT; } -- 2.30.2