UI: dim icons in inactive tabs, similar to text
This makes the properties editor navigation bar less saturated. Internally the icon theme coloring was refactored a bit to move more towards the button drawing code.
This commit is contained in:
		@@ -56,6 +56,7 @@ void UI_icons_reload_internal_textures(void);
 | 
			
		||||
 | 
			
		||||
int UI_icon_get_width(int icon_id);
 | 
			
		||||
int UI_icon_get_height(int icon_id);
 | 
			
		||||
bool UI_icon_get_theme_color(int icon_id, unsigned char color[4]);
 | 
			
		||||
 | 
			
		||||
void UI_id_icon_render(const struct bContext *C,
 | 
			
		||||
                       struct Scene *scene,
 | 
			
		||||
@@ -74,7 +75,8 @@ void UI_icon_draw_ex(float x,
 | 
			
		||||
                     float aspect,
 | 
			
		||||
                     float alpha,
 | 
			
		||||
                     float desaturate,
 | 
			
		||||
                     const char mono_color[4]);
 | 
			
		||||
                     const char mono_color[4],
 | 
			
		||||
                     const bool mono_border);
 | 
			
		||||
 | 
			
		||||
void UI_icon_draw_desaturate(float x,
 | 
			
		||||
                             float y,
 | 
			
		||||
 
 | 
			
		||||
@@ -384,7 +384,7 @@ void UI_GetThemeColorType3ubv(int colorid, int spacetype, unsigned char col[3]);
 | 
			
		||||
void UI_GetThemeColorType4ubv(int colorid, int spacetype, unsigned char col[4]);
 | 
			
		||||
 | 
			
		||||
// get theme color for coloring monochrome icons
 | 
			
		||||
bool UI_GetIconThemeColor4fv(int colorid, float col[4]);
 | 
			
		||||
bool UI_GetIconThemeColor4ubv(int colorid, unsigned char col[4]);
 | 
			
		||||
 | 
			
		||||
// shade a 3 byte color (same as UI_GetColorPtrBlendShade3ubv with 0.0 factor)
 | 
			
		||||
void UI_GetColorPtrShade3ubv(const unsigned char cp1[3], unsigned char col[3], int offset);
 | 
			
		||||
 
 | 
			
		||||
@@ -1222,6 +1222,17 @@ int UI_icon_get_height(int icon_id)
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool UI_icon_get_theme_color(int icon_id, uchar color[4])
 | 
			
		||||
{
 | 
			
		||||
  Icon *icon = BKE_icon_get(icon_id);
 | 
			
		||||
  if (icon == NULL) {
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  DrawInfo *di = icon_ensure_drawinfo(icon);
 | 
			
		||||
  return UI_GetIconThemeColor4ubv(di->data.texture.theme_color, color);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UI_icons_init()
 | 
			
		||||
{
 | 
			
		||||
#ifndef WITH_HEADLESS
 | 
			
		||||
@@ -1762,7 +1773,8 @@ static void icon_draw_size(float x,
 | 
			
		||||
                           enum eIconSizes size,
 | 
			
		||||
                           int draw_size,
 | 
			
		||||
                           const float desaturate,
 | 
			
		||||
                           const char mono_rgba[4])
 | 
			
		||||
                           const char mono_rgba[4],
 | 
			
		||||
                           const bool mono_border)
 | 
			
		||||
{
 | 
			
		||||
  bTheme *btheme = UI_GetTheme();
 | 
			
		||||
  Icon *icon = NULL;
 | 
			
		||||
@@ -1843,19 +1855,14 @@ static void icon_draw_size(float x,
 | 
			
		||||
                      false);
 | 
			
		||||
  }
 | 
			
		||||
  else if (di->type == ICON_TYPE_MONO_TEXTURE) {
 | 
			
		||||
    /* icon that matches text color, assumed to be white */
 | 
			
		||||
    bool with_border = false;
 | 
			
		||||
    /* Monochrome icon that uses text or theme color. */
 | 
			
		||||
    bool with_border = mono_border && (btheme->tui.icon_border_intensity > 0.0f);
 | 
			
		||||
    float color[4];
 | 
			
		||||
    if (!UI_GetIconThemeColor4fv(di->data.texture.theme_color, color)) {
 | 
			
		||||
      if (mono_rgba) {
 | 
			
		||||
        rgba_uchar_to_float(color, (const uchar *)mono_rgba);
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
        UI_GetThemeColor4fv(TH_TEXT, color);
 | 
			
		||||
      }
 | 
			
		||||
    if (mono_rgba) {
 | 
			
		||||
      rgba_uchar_to_float(color, (const uchar *)mono_rgba);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      with_border = (btheme->tui.icon_border_intensity > 0.0f);
 | 
			
		||||
      UI_GetThemeColor4fv(TH_TEXT, color);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    mul_v4_fl(color, alpha);
 | 
			
		||||
@@ -2233,17 +2240,17 @@ int UI_idcode_icon_get(const int idcode)
 | 
			
		||||
/* draws icon with dpi scale factor */
 | 
			
		||||
void UI_icon_draw(float x, float y, int icon_id)
 | 
			
		||||
{
 | 
			
		||||
  UI_icon_draw_ex(x, y, icon_id, 1.0f / UI_DPI_FAC, 1.0f, 0.0f, NULL);
 | 
			
		||||
  UI_icon_draw_ex(x, y, icon_id, 1.0f / UI_DPI_FAC, 1.0f, 0.0f, NULL, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UI_icon_draw_alpha(float x, float y, int icon_id, float alpha)
 | 
			
		||||
{
 | 
			
		||||
  UI_icon_draw_ex(x, y, icon_id, 1.0f / UI_DPI_FAC, alpha, 0.0f, NULL);
 | 
			
		||||
  UI_icon_draw_ex(x, y, icon_id, 1.0f / UI_DPI_FAC, alpha, 0.0f, NULL, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UI_icon_draw_preview(float x, float y, int icon_id, float aspect, float alpha, int size)
 | 
			
		||||
{
 | 
			
		||||
  icon_draw_size(x, y, icon_id, aspect, alpha, ICON_SIZE_PREVIEW, size, false, NULL);
 | 
			
		||||
  icon_draw_size(x, y, icon_id, aspect, alpha, ICON_SIZE_PREVIEW, size, false, NULL, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UI_icon_draw_ex(float x,
 | 
			
		||||
@@ -2252,8 +2259,18 @@ void UI_icon_draw_ex(float x,
 | 
			
		||||
                     float aspect,
 | 
			
		||||
                     float alpha,
 | 
			
		||||
                     float desaturate,
 | 
			
		||||
                     const char mono_color[4])
 | 
			
		||||
                     const char mono_color[4],
 | 
			
		||||
                     const bool mono_border)
 | 
			
		||||
{
 | 
			
		||||
  int draw_size = get_draw_size(ICON_SIZE_ICON);
 | 
			
		||||
  icon_draw_size(x, y, icon_id, aspect, alpha, ICON_SIZE_ICON, draw_size, desaturate, mono_color);
 | 
			
		||||
  icon_draw_size(x,
 | 
			
		||||
                 y,
 | 
			
		||||
                 icon_id,
 | 
			
		||||
                 aspect,
 | 
			
		||||
                 alpha,
 | 
			
		||||
                 ICON_SIZE_ICON,
 | 
			
		||||
                 draw_size,
 | 
			
		||||
                 desaturate,
 | 
			
		||||
                 mono_color,
 | 
			
		||||
                 mono_border);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -771,7 +771,8 @@ void ui_draw_aligned_panel(uiStyle *style,
 | 
			
		||||
                    (block->aspect / UI_DPI_FAC),
 | 
			
		||||
                    1.0f,
 | 
			
		||||
                    0.0f,
 | 
			
		||||
                    (const char *)col_title);
 | 
			
		||||
                    (const char *)col_title,
 | 
			
		||||
                    false);
 | 
			
		||||
    GPU_blend(false);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1506,20 +1506,27 @@ static void widget_draw_icon(
 | 
			
		||||
      ys = (int)(ys + 0.1f);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Get theme color. */
 | 
			
		||||
    char color[4] = {mono_color[0], mono_color[1], mono_color[2], mono_color[3]};
 | 
			
		||||
    bool has_theme = UI_icon_get_theme_color(icon, (uchar *)color);
 | 
			
		||||
 | 
			
		||||
    /* to indicate draggable */
 | 
			
		||||
    if (but->dragpoin && (but->flag & UI_ACTIVE)) {
 | 
			
		||||
      UI_icon_draw_ex(xs, ys, icon, aspect, 1.25f, 0.0f, mono_color);
 | 
			
		||||
      UI_icon_draw_ex(xs, ys, icon, aspect, 1.25f, 0.0f, color, has_theme);
 | 
			
		||||
    }
 | 
			
		||||
    else if ((but->flag & (UI_ACTIVE | UI_SELECT | UI_SELECT_DRAW))) {
 | 
			
		||||
      UI_icon_draw_ex(xs, ys, icon, aspect, alpha, 0.0f, mono_color);
 | 
			
		||||
      UI_icon_draw_ex(xs, ys, icon, aspect, alpha, 0.0f, color, has_theme);
 | 
			
		||||
    }
 | 
			
		||||
    else if (!UI_but_is_tool(but)) {
 | 
			
		||||
      UI_icon_draw_ex(xs, ys, icon, aspect, alpha, 0.0f, mono_color);
 | 
			
		||||
      if (has_theme) {
 | 
			
		||||
        alpha *= 0.8f;
 | 
			
		||||
      }
 | 
			
		||||
      UI_icon_draw_ex(xs, ys, icon, aspect, alpha, 0.0f, color, has_theme);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      const bTheme *btheme = UI_GetTheme();
 | 
			
		||||
      const float desaturate = 1.0 - btheme->tui.icon_saturation;
 | 
			
		||||
      UI_icon_draw_ex(xs, ys, icon, aspect, alpha, desaturate, mono_color);
 | 
			
		||||
      UI_icon_draw_ex(xs, ys, icon, aspect, alpha, desaturate, color, has_theme);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -1586,7 +1593,8 @@ static void ui_text_clip_right_ex(const uiFontStyle *fstyle,
 | 
			
		||||
  BLI_assert(str[0]);
 | 
			
		||||
 | 
			
		||||
  /* If the trailing ellipsis takes more than 20% of all available width, just cut the string
 | 
			
		||||
   * (as using the ellipsis would remove even more useful chars, and we cannot show much already!).
 | 
			
		||||
   * (as using the ellipsis would remove even more useful chars, and we cannot show much
 | 
			
		||||
   * already!).
 | 
			
		||||
   */
 | 
			
		||||
  if (sep_strwidth / okwidth > 0.2f) {
 | 
			
		||||
    l_end = BLF_width_to_strlen(fstyle->uifont_id, str, max_len, okwidth, &tmp);
 | 
			
		||||
@@ -1701,7 +1709,8 @@ float UI_text_clip_middle_ex(const uiFontStyle *fstyle,
 | 
			
		||||
        /* Corner case, the str already takes all available mem,
 | 
			
		||||
         * and the ellipsis chars would actually add more chars.
 | 
			
		||||
         * Better to just trim one or two letters to the right in this case...
 | 
			
		||||
         * Note: with a single-char ellipsis, this should never happen! But better be safe here...
 | 
			
		||||
         * Note: with a single-char ellipsis, this should never happen! But better be safe
 | 
			
		||||
         * here...
 | 
			
		||||
         */
 | 
			
		||||
        ui_text_clip_right_ex(
 | 
			
		||||
            fstyle, str, max_len, okwidth, sep, sep_len, sep_strwidth, &final_lpart_len);
 | 
			
		||||
@@ -5203,7 +5212,7 @@ void ui_draw_menu_item(
 | 
			
		||||
 | 
			
		||||
    GPU_blend(true);
 | 
			
		||||
    /* XXX scale weak get from fstyle? */
 | 
			
		||||
    UI_icon_draw_ex(xs, ys, iconid, aspect, 1.0f, 0.0f, wt->wcol.text);
 | 
			
		||||
    UI_icon_draw_ex(xs, ys, iconid, aspect, 1.0f, 0.0f, wt->wcol.text, false);
 | 
			
		||||
    GPU_blend(false);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1357,7 +1357,7 @@ void UI_GetThemeColorType4ubv(int colorid, int spacetype, uchar col[4])
 | 
			
		||||
  col[3] = cp[3];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool UI_GetIconThemeColor4fv(int colorid, float col[4])
 | 
			
		||||
bool UI_GetIconThemeColor4ubv(int colorid, uchar col[4])
 | 
			
		||||
{
 | 
			
		||||
  if (colorid == 0) {
 | 
			
		||||
    return false;
 | 
			
		||||
@@ -1371,12 +1371,11 @@ bool UI_GetIconThemeColor4fv(int colorid, float col[4])
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const uchar *cp;
 | 
			
		||||
  cp = UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
 | 
			
		||||
  col[0] = ((float)cp[0]) / 255.0f;
 | 
			
		||||
  col[1] = ((float)cp[1]) / 255.0f;
 | 
			
		||||
  col[2] = ((float)cp[2]) / 255.0f;
 | 
			
		||||
  col[3] = ((float)cp[3]) / 255.0f;
 | 
			
		||||
  const uchar *cp = UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
 | 
			
		||||
  col[0] = cp[0];
 | 
			
		||||
  col[1] = cp[1];
 | 
			
		||||
  col[2] = cp[2];
 | 
			
		||||
  col[3] = cp[3];
 | 
			
		||||
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -203,7 +203,7 @@ static void area_draw_azone_fullscreen(short x1, short y1, short x2, short y2, f
 | 
			
		||||
 | 
			
		||||
  alpha = min_ff(alpha, 0.75f);
 | 
			
		||||
 | 
			
		||||
  UI_icon_draw_ex(x, y, ICON_FULLSCREEN_EXIT, 0.7f / UI_DPI_FAC, 0.0f, alpha, NULL);
 | 
			
		||||
  UI_icon_draw_ex(x, y, ICON_FULLSCREEN_EXIT, 0.7f / UI_DPI_FAC, 0.0f, alpha, NULL, false);
 | 
			
		||||
 | 
			
		||||
  /* debug drawing :
 | 
			
		||||
   * The click_rect is the same as defined in fullscreen_click_rcti_init
 | 
			
		||||
 
 | 
			
		||||
@@ -478,7 +478,7 @@ static void file_draw_preview(uiBlock *block,
 | 
			
		||||
      GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
 | 
			
		||||
 | 
			
		||||
  if (icon) {
 | 
			
		||||
    UI_icon_draw_ex((float)xco, (float)yco, icon, icon_aspect, 1.0f, 0.0f, NULL);
 | 
			
		||||
    UI_icon_draw_ex((float)xco, (float)yco, icon, icon_aspect, 1.0f, 0.0f, NULL, false);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* border */
 | 
			
		||||
 
 | 
			
		||||
@@ -1801,7 +1801,13 @@ static void tselem_draw_icon(uiBlock *block,
 | 
			
		||||
 | 
			
		||||
    /* restrict column clip... it has been coded by simply overdrawing,
 | 
			
		||||
     * doesn't work for buttons */
 | 
			
		||||
    UI_icon_draw_alpha(x, y, data.icon, alpha);
 | 
			
		||||
    char color[4];
 | 
			
		||||
    if (UI_icon_get_theme_color(data.icon, (uchar *)color)) {
 | 
			
		||||
      UI_icon_draw_ex(x, y, data.icon, 1.0f / UI_DPI_FAC, alpha, 0.0f, color, true);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      UI_icon_draw_ex(x, y, data.icon, 1.0f / UI_DPI_FAC, alpha, 0.0f, NULL, false);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    uiDefIconBut(block,
 | 
			
		||||
 
 | 
			
		||||
@@ -442,7 +442,7 @@ void wm_drags_draw(bContext *C, wmWindow *win, rcti *rect)
 | 
			
		||||
        drag_rect_minmax(rect, x, y, x + iconsize, y + iconsize);
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
        UI_icon_draw_ex(x, y, drag->icon, 1.0f / UI_DPI_FAC, 0.8, 0.0f, text_col);
 | 
			
		||||
        UI_icon_draw_ex(x, y, drag->icon, 1.0f / UI_DPI_FAC, 0.8, 0.0f, text_col, false);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user