Property Search: Differentiate search filtered and inactive buttons

Currently there's no way to know if a button is inactive when it doesn't
match the search results, because they use the same 50% gray level.

This isn't a huge problem, but it could lead to confusion. This commit
uses a subtle solution, a 25% opacity when the button is inactive and
 also filtered by search.

This requires flipping the meaning of the UI_SEARCH_FILTER_MATCHES
flag in the code, and also adding a widget_alpha_factor utility in
the widget code.

Differential Revision: https://developer.blender.org/D8975
This commit is contained in:
Hans Goudey 2020-10-02 13:10:21 -05:00
parent 6f96dd8576
commit 933bf62a61
Notes: blender-bot 2024-03-22 15:57:27 +01:00
Referenced by commit 61f1faac3f, Fix T83868: Disabled or inactive list items are not grayed out
Referenced by issue #83868, UI: disabled items are still drawn in white instead of grayed-out
3 changed files with 46 additions and 50 deletions

View File

@ -81,11 +81,8 @@ enum {
UI_HAS_ICON = (1 << 3),
UI_HIDDEN = (1 << 4),
UI_SELECT_DRAW = (1 << 5), /* Display selected, doesn't impact interaction. */
/**
* The button matches the search filter. When property search is active, this
* is used to determine which items to keep enabled and which to disable.
*/
UI_SEARCH_FILTER_MATCHES = (1 << 12),
/** Property search filter is active and the button does not match. */
UI_SEARCH_FILTER_NO_MATCH = (1 << 12),
/* warn: rest of uiBut->flag in UI_interface.h */
};

View File

@ -5239,26 +5239,19 @@ static bool block_search_filter_tag_buttons(uiBlock *block, const char *search_f
LISTBASE_FOREACH (uiLayoutRoot *, root, &block->layouts) {
LISTBASE_FOREACH (uiButtonGroup *, button_group, &root->button_groups) {
if (button_group_has_search_match(button_group, search_filter)) {
has_result = true;
}
else {
LISTBASE_FOREACH (LinkData *, link, &button_group->buttons) {
uiBut *but = link->data;
but->flag |= UI_SEARCH_FILTER_MATCHES;
but->flag |= UI_SEARCH_FILTER_NO_MATCH;
}
has_result = true;
}
}
}
return has_result;
}
static void block_search_deactivate_buttons(uiBlock *block)
{
LISTBASE_FOREACH (uiBut *, but, &block->buttons) {
if (!(but->flag & UI_SEARCH_FILTER_MATCHES)) {
but->flag |= UI_BUT_INACTIVE;
}
}
}
/**
* Apply property search behavior, setting panel flags and deactivating buttons that don't match.
*
@ -5284,10 +5277,6 @@ bool UI_block_apply_search_filter(uiBlock *block, const char *search_filter)
}
}
if (!panel_label_matches) {
block_search_deactivate_buttons(block);
}
return has_result;
}

View File

@ -1332,6 +1332,22 @@ static void widgetbase_draw(uiWidgetBase *wtb, const uiWidgetColors *wcol)
#define PREVIEW_PAD 4
static float widget_alpha_factor(const int state)
{
if (state & (UI_BUT_INACTIVE | UI_BUT_DISABLED)) {
if (state & UI_SEARCH_FILTER_NO_MATCH) {
return 0.25f;
}
return 0.5f;
}
if (state & UI_SEARCH_FILTER_NO_MATCH) {
return 0.5f;
}
return 1.0f;
}
static void widget_draw_preview(BIFIconID icon, float alpha, const rcti *rect)
{
int w, h, size;
@ -1400,9 +1416,7 @@ static void widget_draw_icon(
}
}
else if (ELEM(but->type, UI_BTYPE_BUT, UI_BTYPE_DECORATOR)) {
if (but->flag & (UI_BUT_DISABLED | UI_BUT_INACTIVE)) {
alpha *= 0.5f;
}
alpha *= widget_alpha_factor(but->flag);
}
GPU_blend(GPU_BLEND_ALPHA);
@ -2477,18 +2491,20 @@ static void widget_draw_text_icon(const uiFontStyle *fstyle,
* \{ */
/* put all widget colors on half alpha, use local storage */
static void ui_widget_color_disabled(uiWidgetType *wt)
static void ui_widget_color_disabled(uiWidgetType *wt, const int state)
{
static uiWidgetColors wcol_theme_s;
wcol_theme_s = *wt->wcol_theme;
wcol_theme_s.outline[3] *= 0.5;
wcol_theme_s.inner[3] *= 0.5;
wcol_theme_s.inner_sel[3] *= 0.5;
wcol_theme_s.item[3] *= 0.5;
wcol_theme_s.text[3] *= 0.5;
wcol_theme_s.text_sel[3] *= 0.5;
const float factor = widget_alpha_factor(state);
wcol_theme_s.outline[3] *= factor;
wcol_theme_s.inner[3] *= factor;
wcol_theme_s.inner_sel[3] *= factor;
wcol_theme_s.item[3] *= factor;
wcol_theme_s.text[3] *= factor;
wcol_theme_s.text_sel[3] *= factor;
wt->wcol_theme = &wcol_theme_s;
}
@ -2533,8 +2549,8 @@ static void widget_state(uiWidgetType *wt, int state, int drawflag)
bTheme *btheme = UI_GetTheme();
wt->wcol_theme = &btheme->tui.wcol_list_item;
if (state & (UI_BUT_DISABLED | UI_BUT_INACTIVE)) {
ui_widget_color_disabled(wt);
if (state & (UI_BUT_DISABLED | UI_BUT_INACTIVE | UI_SEARCH_FILTER_NO_MATCH)) {
ui_widget_color_disabled(wt, state & UI_SEARCH_FILTER_NO_MATCH);
}
}
@ -3829,14 +3845,11 @@ static void widget_swatch(
wcol->shaded = 0;
if (state & (UI_BUT_DISABLED | UI_BUT_INACTIVE)) {
/* Now we reduce alpha of the inner color (i.e. the color shown)
* so that this setting can look grayed out, while retaining
* the checkerboard (for transparent values). This is needed
* here as the effects of ui_widget_color_disabled() are overwritten.
*/
wcol->inner[3] /= 2;
}
/* Now we reduce alpha of the inner color (i.e. the color shown)
* so that this setting can look grayed out, while retaining
* the checkerboard (for transparent values). This is needed
* here as the effects of ui_widget_color_disabled() are overwritten. */
wcol->inner[3] *= widget_alpha_factor(state);
widgetbase_draw_ex(&wtb, wcol, show_alpha_checkers);
if (color_but->is_pallete_color &&
@ -4771,7 +4784,6 @@ void ui_draw_but(const bContext *C, struct ARegion *region, uiStyle *style, uiBu
if (wt) {
// rcti disablerect = *rect; /* rect gets clipped smaller for text */
int roundboxalign, state, drawflag;
bool disabled = false;
roundboxalign = widget_roundbox_set(but, rect);
@ -4801,9 +4813,11 @@ void ui_draw_but(const bContext *C, struct ARegion *region, uiStyle *style, uiBu
}
}
if (state & (UI_BUT_DISABLED | UI_BUT_INACTIVE)) {
if (but->emboss != UI_EMBOSS_PULLDOWN) {
disabled = true;
bool use_alpha_blend = false;
if (but->emboss != UI_EMBOSS_PULLDOWN) {
if (state & (UI_BUT_DISABLED | UI_BUT_INACTIVE | UI_SEARCH_FILTER_NO_MATCH)) {
use_alpha_blend = true;
ui_widget_color_disabled(wt, state);
}
}
@ -4811,10 +4825,6 @@ void ui_draw_but(const bContext *C, struct ARegion *region, uiStyle *style, uiBu
state |= UI_STATE_TEXT_BEFORE_WIDGET;
}
if (disabled) {
ui_widget_color_disabled(wt);
}
#ifdef USE_UI_POPOVER_ONCE
if (but->block->flag & UI_BLOCK_POPOVER_ONCE) {
if ((state & UI_ACTIVE) && ui_but_is_popover_once_compat(but)) {
@ -4831,12 +4841,12 @@ void ui_draw_but(const bContext *C, struct ARegion *region, uiStyle *style, uiBu
wt->draw(&wt->wcol, rect, state, roundboxalign);
}
if (disabled) {
if (use_alpha_blend) {
GPU_blend(GPU_BLEND_ALPHA);
}
wt->text(fstyle, &wt->wcol, but, rect);
if (disabled) {
if (use_alpha_blend) {
GPU_blend(GPU_BLEND_NONE);
}
}