Commit: ac943796d4daad3b3016bdf070798cb51c1edb08 Author: Hans Goudey Date: Thu Apr 16 17:04:22 2020 -0500 Branches: modifier-panels-ui https://developer.blender.org/rBac943796d4daad3b3016bdf070798cb51c1edb08
Draw list panels with box widget colors and code This solves the transparency and theming issues by reusing the theming from the box widget. This requires a new drawing function in order to use box drawing with an opaque inner color, alpha blended with the region's background color. =================================================================== M source/blender/editors/include/UI_interface.h M source/blender/editors/interface/interface_intern.h M source/blender/editors/interface/interface_panel.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 a907da8e47d..6e93dd30f51 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -240,7 +240,6 @@ enum { #define UI_PANEL_CATEGORY_MARGIN_WIDTH (U.widget_unit * 1.0f) #define UI_LIST_PANEL_MARGIN (U.widget_unit * 0.15f) -#define UI_LIST_PANEL_ROUNDNESS (U.widget_unit * 0.3f) /* but->drawflag - these flags should only affect how the button is drawn. */ /* Note: currently, these flags _are not passed_ to the widget's state() or draw() functions diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h index 6a489b49e20..817fe757e6e 100644 --- a/source/blender/editors/interface/interface_intern.h +++ b/source/blender/editors/interface/interface_intern.h @@ -841,6 +841,7 @@ struct GPUBatch *ui_batch_roundbox_shadow_get(void); void ui_draw_anti_tria_rect(const rctf *rect, char dir, const float color[4]); void ui_draw_menu_back(struct uiStyle *style, uiBlock *block, rcti *rect); +void ui_draw_box_opaque(rcti *rect, int roundboxalign); void ui_draw_popover_back(ARegion *region, struct uiStyle *style, uiBlock *block, rcti *rect); void ui_draw_pie_center(uiBlock *block); const struct uiWidgetColors *ui_tooltip_get_theme(void); diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c index e0e42df9481..aaf60adcd84 100644 --- a/source/blender/editors/interface/interface_panel.c +++ b/source/blender/editors/interface/interface_panel.c @@ -848,7 +848,16 @@ void ui_draw_aligned_panel(uiStyle *style, * can't be dragged. This may be changed in future. */ show_background); const int panel_col = is_subpanel ? TH_PANEL_SUB_BACK : TH_PANEL_BACK; + const bool is_list_panel = (panel->type && panel->type->flag & (PNL_LIST | PNL_LIST_SUBPANEL)); + float list_panel_roundness = 0.0f; + + /* For list panels, use roundness from the theme for box widgets. */ + if (is_list_panel) { + bTheme *btheme = UI_GetTheme(); + uiWidgetColors *wcol = &btheme->tui.wcol_box; + list_panel_roundness = wcol->roundness; + } if (panel->type && (panel->type->flag & PNL_NO_HEADER)) { if (show_background) { @@ -884,16 +893,13 @@ void ui_draw_aligned_panel(uiStyle *style, /* List panels have some roundness and a shaded header color to differentiate them. */ if (is_list_panel) { - /* Round all corners if the panel is closed. */ + int roundbox_corners = (UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT); if (is_closed_y) { - UI_draw_roundbox_corner_set(UI_CNR_ALL); + roundbox_corners |= (UI_CNR_BOTTOM_LEFT | UI_CNR_BOTTOM_RIGHT); } - else { - UI_draw_roundbox_corner_set(UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT); - } - - UI_GetThemeColorShadeAlpha4fv(TH_PANEL_HEADER, -30, 125, color); - UI_draw_roundbox_aa(true, minx, headrect.ymin, maxx, y, UI_LIST_PANEL_ROUNDNESS, color); + /* Increase ymax a bit for even space on the top and bottom of the buttons in the header. */ + rcti box_rect = {minx, maxx, headrect.ymin, y + U.pixelsize}; + ui_draw_box_opaque(&box_rect, roundbox_corners); } else { GPU_blend(true); @@ -992,7 +998,7 @@ void ui_draw_aligned_panel(uiStyle *style, } else if (is_list_panel) { UI_draw_roundbox_corner_set(UI_CNR_ALL); - radius = UI_LIST_PANEL_ROUNDNESS; + radius = list_panel_roundness * U.widget_unit; } else { UI_draw_roundbox_corner_set(UI_CNR_NONE); @@ -1014,12 +1020,25 @@ void ui_draw_aligned_panel(uiStyle *style, GPU_blend(true); if (show_background) { - /* Round the bottom corners as long as this isn't a subpanel between other subpanels. */ + /* Draw list panels and their bottom subpanels with rounding. */ if (is_list_panel && !(is_subpanel && panel->next)) { - UI_draw_roundbox_corner_set(UI_CNR_BOTTOM_RIGHT | UI_CNR_BOTTOM_LEFT); - UI_GetThemeColor4fv(panel_col, color); - UI_draw_roundbox_aa( - true, rect->xmin, rect->ymin, rect->xmax, rect->ymax, UI_LIST_PANEL_ROUNDNESS, color); + /* The subpanel should blend with the panel, so it shouldn't be opaque. */ + if (is_subpanel) { + UI_draw_roundbox_corner_set(UI_CNR_BOTTOM_RIGHT | UI_CNR_BOTTOM_LEFT); + UI_GetThemeColor4fv(panel_col, color); + UI_draw_roundbox_aa(true, + rect->xmin, + rect->ymin, + rect->xmax, + rect->ymax, + list_panel_roundness * U.widget_unit, + color); + } + else { + /* Increase ymax a bit to so the top aligns with the header box rect. */ + rcti box_rect = {rect->xmin, rect->xmax, rect->ymin, rect->ymax + U.pixelsize}; + ui_draw_box_opaque(&box_rect, UI_CNR_BOTTOM_RIGHT | UI_CNR_BOTTOM_LEFT); + } } else { /* panel backdrop */ diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index ca688405e19..af2376276f8 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -4238,7 +4238,7 @@ static void widget_box( copy_v3_v3_uchar(old_col, wcol->inner); /* abuse but->hsv - if it's non-zero, use this color as the box's background */ - if (but->col[3]) { + if (but != NULL && but->col[3]) { wcol->inner[0] = but->col[0]; wcol->inner[1] = but->col[1]; wcol->inner[2] = but->col[2]; @@ -4988,6 +4988,30 @@ void ui_draw_menu_back(uiStyle *UNUSED(style), uiBlock *block, rcti *rect) ui_draw_clip_tri(block, rect, wt); } +/** + * Uses the widget base drawing and colors from from the box widget, but ensures an opaque + * inner color. + */ +void ui_draw_box_opaque(rcti *rect, int roundboxalign) +{ + uiWidgetType *wt = widget_type(UI_WTYPE_BOX); + + /* Alpha blend with the region's background color to force an opaque background. */ + bTheme *btheme = UI_GetTheme(); + uiWidgetColors wcol = btheme->tui.wcol_box; + float background[4]; + UI_GetThemeColor4fv(TH_BACK, background); + float new_inner[4]; + rgba_uchar_to_float(new_inner, wcol.inner); + new_inner[0] = (new_inner[0] * new_inner[3]) + (background[0] * (1.0f - new_inner[3])); + new_inner[1] = (new_inner[1] * new_inner[3]) + (background[1] * (1.0f - new_inner[3])); + new_inner[2] = (new_inner[2] * new_inner[3]) + (background[2] * (1.0f - new_inner[3])); + new_inner[3] = 1.0f; + rgba_float_to_uchar(wcol.inner, new_inner); + + wt->custom(NULL, &wcol, rect, 0, roundboxalign); +} + /** * Similar to 'widget_menu_back', however we can't use the widget preset system * because we need to pass in the original location so we know where to show the arrow. _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs