Fix T83868: Button animation states no longer visible without emboss
This bug was caused by making it so that non-embossed modifier icon buttons could become an operator button and retain their red highlight for disabled modifiers. The icon button needs emboss turned off, but in earlier versions of Blender, `UI_EMBOSS_NONE` would be overridden by animation or red alert states. Instead of abusing "NONE" to mean "none unless there is animation or red alert", this commit adds a new emboss flag for that situation, `UI_EMBOSS_NONE_OR_STATUS`, which uses no emboss unless there is an animation state, or another status. There are only a few situations where this is necessary, so the change isn't too big. Differential Revision: https://developer.blender.org/D9902
This commit is contained in:
		@@ -117,12 +117,13 @@ class MESH_UL_shape_keys(UIList):
 | 
			
		||||
            split = layout.split(factor=0.66, align=False)
 | 
			
		||||
            split.prop(key_block, "name", text="", emboss=False, icon_value=icon)
 | 
			
		||||
            row = split.row(align=True)
 | 
			
		||||
            row.emboss = 'UI_EMBOSS_NONE_OR_STATUS'
 | 
			
		||||
            if key_block.mute or (obj.mode == 'EDIT' and not (obj.use_shape_key_edit_mode and obj.type == 'MESH')):
 | 
			
		||||
                row.active = False
 | 
			
		||||
            if not item.id_data.use_relative:
 | 
			
		||||
                row.prop(key_block, "frame", text="", emboss=False)
 | 
			
		||||
                row.prop(key_block, "frame", text="")
 | 
			
		||||
            elif index > 0:
 | 
			
		||||
                row.prop(key_block, "value", text="", emboss=False)
 | 
			
		||||
                row.prop(key_block, "value", text="")
 | 
			
		||||
            else:
 | 
			
		||||
                row.label(text="")
 | 
			
		||||
            row.prop(key_block, "mute", text="", emboss=False)
 | 
			
		||||
 
 | 
			
		||||
@@ -108,6 +108,11 @@ enum {
 | 
			
		||||
  UI_EMBOSS_NONE = 1,     /* Nothing, only icon and/or text */
 | 
			
		||||
  UI_EMBOSS_PULLDOWN = 2, /* Pulldown menu style */
 | 
			
		||||
  UI_EMBOSS_RADIAL = 3,   /* Pie Menu */
 | 
			
		||||
  /**
 | 
			
		||||
   * The same as #UI_EMBOSS_NONE, unless the the button has
 | 
			
		||||
   * a coloring status like an animation state or red alert.
 | 
			
		||||
   */
 | 
			
		||||
  UI_EMBOSS_NONE_OR_STATUS = 4,
 | 
			
		||||
 | 
			
		||||
  UI_EMBOSS_UNDEFINED = 255, /* For layout engine, use emboss from block. */
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -2915,7 +2915,7 @@ static void draw_constraint_header(uiLayout *layout, Object *ob, bConstraint *co
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    /* enabled */
 | 
			
		||||
    UI_block_emboss_set(block, UI_EMBOSS_NONE);
 | 
			
		||||
    UI_block_emboss_set(block, UI_EMBOSS_NONE_OR_STATUS);
 | 
			
		||||
    uiItemR(layout, &ptr, "mute", 0, "", 0);
 | 
			
		||||
    UI_block_emboss_set(block, UI_EMBOSS);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2520,8 +2520,14 @@ static void widget_active_color(uiWidgetColors *wcol)
 | 
			
		||||
 | 
			
		||||
static const uchar *widget_color_blend_from_flags(const uiWidgetStateColors *wcol_state,
 | 
			
		||||
                                                  int state,
 | 
			
		||||
                                                  int drawflag)
 | 
			
		||||
                                                  int drawflag,
 | 
			
		||||
                                                  const char emboss)
 | 
			
		||||
{
 | 
			
		||||
  /* Explicitly require #UI_EMBOSS_NONE_OR_STATUS for color blending with no emboss. */
 | 
			
		||||
  if (emboss == UI_EMBOSS_NONE) {
 | 
			
		||||
    return NULL;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (drawflag & UI_BUT_ANIMATED_CHANGED) {
 | 
			
		||||
    return wcol_state->inner_changed_sel;
 | 
			
		||||
  }
 | 
			
		||||
@@ -2557,7 +2563,7 @@ static void widget_state(uiWidgetType *wt, int state, int drawflag, char emboss)
 | 
			
		||||
 | 
			
		||||
  wt->wcol = *(wt->wcol_theme);
 | 
			
		||||
 | 
			
		||||
  const uchar *color_blend = widget_color_blend_from_flags(wcol_state, state, drawflag);
 | 
			
		||||
  const uchar *color_blend = widget_color_blend_from_flags(wcol_state, state, drawflag, emboss);
 | 
			
		||||
 | 
			
		||||
  if (state & UI_SELECT) {
 | 
			
		||||
    copy_v4_v4_uchar(wt->wcol.inner, wt->wcol.inner_sel);
 | 
			
		||||
@@ -2626,7 +2632,7 @@ static void widget_state_numslider(uiWidgetType *wt, int state, int drawflag, ch
 | 
			
		||||
  /* call this for option button */
 | 
			
		||||
  widget_state(wt, state, drawflag, emboss);
 | 
			
		||||
 | 
			
		||||
  const uchar *color_blend = widget_color_blend_from_flags(wcol_state, state, drawflag);
 | 
			
		||||
  const uchar *color_blend = widget_color_blend_from_flags(wcol_state, state, drawflag, emboss);
 | 
			
		||||
  if (color_blend != NULL) {
 | 
			
		||||
    /* Set the slider 'item' so that it reflects state settings too.
 | 
			
		||||
     * De-saturate so the color of the slider doesn't conflict with the blend color,
 | 
			
		||||
@@ -4524,8 +4530,9 @@ void ui_draw_but(const bContext *C, struct ARegion *region, uiStyle *style, uiBu
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  else if (but->emboss == UI_EMBOSS_NONE) {
 | 
			
		||||
    /* "nothing" */
 | 
			
		||||
  else if (ELEM(but->emboss, UI_EMBOSS_NONE, UI_EMBOSS_NONE_OR_STATUS)) {
 | 
			
		||||
    /* Use the same widget types for both no emboss types. Later on,
 | 
			
		||||
     * #UI_EMBOSS_NONE_OR_STATUS will blend state colors if they apply. */
 | 
			
		||||
    switch (but->type) {
 | 
			
		||||
      case UI_BTYPE_LABEL:
 | 
			
		||||
        wt = widget_type(UI_WTYPE_ICON_LABEL);
 | 
			
		||||
 
 | 
			
		||||
@@ -346,7 +346,7 @@ static void nla_panel_stripname(const bContext *C, Panel *panel)
 | 
			
		||||
 | 
			
		||||
  uiItemR(row, &strip_ptr, "name", 0, "", ICON_NLA);
 | 
			
		||||
 | 
			
		||||
  UI_block_emboss_set(block, UI_EMBOSS_NONE);
 | 
			
		||||
  UI_block_emboss_set(block, UI_EMBOSS_NONE_OR_STATUS);
 | 
			
		||||
  uiItemR(row, &strip_ptr, "mute", 0, "", ICON_NONE);
 | 
			
		||||
  UI_block_emboss_set(block, UI_EMBOSS);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1996,7 +1996,7 @@ static void outliner_draw_mode_column_toggle(uiBlock *block,
 | 
			
		||||
        "Change the object in the current mode\n"
 | 
			
		||||
        "* Ctrl to add to the current mode");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  UI_block_emboss_set(block, UI_EMBOSS_NONE_OR_STATUS);
 | 
			
		||||
  uiBut *but = uiDefIconBut(block,
 | 
			
		||||
                            UI_BTYPE_ICON_TOGGLE,
 | 
			
		||||
                            0,
 | 
			
		||||
@@ -3646,7 +3646,7 @@ void draw_outliner(const bContext *C)
 | 
			
		||||
  outliner_tree_dimensions(space_outliner, &tree_width, &tree_height);
 | 
			
		||||
 | 
			
		||||
  /* Default to no emboss for outliner UI. */
 | 
			
		||||
  UI_block_emboss_set(block, UI_EMBOSS_NONE);
 | 
			
		||||
  UI_block_emboss_set(block, UI_EMBOSS_NONE_OR_STATUS);
 | 
			
		||||
 | 
			
		||||
  if (space_outliner->outlinevis == SO_DATA_API) {
 | 
			
		||||
    int buttons_start_x = outliner_data_api_buttons_start_x(tree_width);
 | 
			
		||||
@@ -3655,7 +3655,7 @@ void draw_outliner(const bContext *C)
 | 
			
		||||
 | 
			
		||||
    UI_block_emboss_set(block, UI_EMBOSS);
 | 
			
		||||
    outliner_draw_rnabuts(block, region, space_outliner, buttons_start_x, &space_outliner->tree);
 | 
			
		||||
    UI_block_emboss_set(block, UI_EMBOSS_NONE);
 | 
			
		||||
    UI_block_emboss_set(block, UI_EMBOSS_NONE_OR_STATUS);
 | 
			
		||||
  }
 | 
			
		||||
  else if (space_outliner->outlinevis == SO_ID_ORPHANS) {
 | 
			
		||||
    /* draw user toggle columns */
 | 
			
		||||
 
 | 
			
		||||
@@ -1200,6 +1200,11 @@ static void rna_def_ui_layout(BlenderRNA *brna)
 | 
			
		||||
      {UI_EMBOSS_NONE, "NONE", 0, "None", "Draw only text and icons"},
 | 
			
		||||
      {UI_EMBOSS_PULLDOWN, "PULLDOWN_MENU", 0, "Pulldown Menu", "Draw pulldown menu style"},
 | 
			
		||||
      {UI_EMBOSS_RADIAL, "RADIAL_MENU", 0, "Radial Menu", "Draw radial menu style"},
 | 
			
		||||
      {UI_EMBOSS_NONE_OR_STATUS,
 | 
			
		||||
       "UI_EMBOSS_NONE_OR_STATUS",
 | 
			
		||||
       0,
 | 
			
		||||
       "None or Status",
 | 
			
		||||
       "Draw with no emboss unless the button has a coloring status like an animation state"},
 | 
			
		||||
      {0, NULL, 0, NULL, NULL},
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user