Draw background on pulldown widgets if the header is transparent.
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Fri, 1 Jun 2018 13:04:51 +0000 (15:04 +0200)
committerPablo Vazquez <venomgfx@gmail.com>
Fri, 1 Jun 2018 13:11:38 +0000 (15:11 +0200)
Since the viewport header now supports transparency, text on pulldowns
can be hard to read if their color matches the viewport content.

Background is drawn using the 'inner' theme color, that was unused until now.

source/blender/editors/include/ED_screen.h
source/blender/editors/interface/interface_widgets.c
source/blender/editors/interface/resources.c
source/blender/editors/screen/area.c

index f2ab731..171fbc6 100644 (file)
@@ -94,6 +94,7 @@ void    ED_region_image_metadata_draw(int x, int y, struct ImBuf *ibuf, const rc
 void    ED_region_grid_draw(struct ARegion *ar, float zoomx, float zoomy);
 float  ED_region_blend_alpha(struct ARegion *ar);
 void   ED_region_visible_rect(struct ARegion *ar, struct rcti *rect);
+bool    ED_region_is_overlap(int spacetype, int regiontype);
 
 int     ED_region_snap_size_test(const struct ARegion *ar);
 bool    ED_region_snap_size_apply(struct ARegion *ar, int snap_flag);
index e4faac5..928ac8c 100644 (file)
@@ -2626,15 +2626,9 @@ static void widget_state_nothing(uiWidgetType *wt, int UNUSED(state))
 }
 
 /* special case, button that calls pulldown */
-static void widget_state_pulldown(uiWidgetType *wt, int state)
+static void widget_state_pulldown(uiWidgetType *wt, int UNUSED(state))
 {
        wt->wcol = *(wt->wcol_theme);
-
-       copy_v4_v4_char(wt->wcol.inner, wt->wcol.inner_sel);
-       copy_v3_v3_char(wt->wcol.outline, wt->wcol.inner);
-
-       if (state & UI_ACTIVE)
-               copy_v3_v3_char(wt->wcol.text, wt->wcol.text_sel);
 }
 
 /* special case, pie menu items */
@@ -3812,10 +3806,23 @@ static void widget_menunodebut(uiWidgetColors *wcol, rcti *rect, int UNUSED(stat
 
 static void widget_pulldownbut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
 {
-       if (state & UI_ACTIVE) {
+       float back[4];
+       UI_GetThemeColor4fv(TH_BACK, back);
+
+       if ((state & UI_ACTIVE) || (back[3] < 1.0f)) {
                uiWidgetBase wtb;
                const float rad = wcol->roundness * U.widget_unit;
 
+               if (state & UI_ACTIVE) {
+                       copy_v4_v4_char(wcol->inner, wcol->inner_sel);
+                       copy_v3_v3_char(wcol->text, wcol->text_sel);
+                       copy_v3_v3_char(wcol->outline, wcol->inner);
+               }
+               else {
+                       wcol->inner[3] *= 1.0f - back[3];
+                       wcol->outline[3] = 0.0f;
+               }
+
                widget_init(&wtb);
 
                /* half rounded */
index 979a216..67165ee 100644 (file)
@@ -56,6 +56,8 @@
 
 #include "BLF_api.h"
 
+#include "ED_screen.h"
+
 #include "UI_interface.h"
 #include "UI_interface_icons.h"
 
@@ -96,6 +98,7 @@ const unsigned char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colo
        static char error[4] = {240, 0, 240, 255};
        static char alert[4] = {240, 60, 60, 255};
        static char headerdesel[4] = {0, 0, 0, 255};
+       static char back[4] = {0, 0, 0, 255};
        static char setting = 0;
        const char *cp = error;
 
@@ -183,6 +186,12 @@ const unsigned char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colo
                                                cp = ts->header;
                                        else
                                                cp = ts->button;
+
+                                               copy_v4_v4_char(back, cp);
+                                               if (!ED_region_is_overlap(spacetype, theme_regionid)) {
+                                                       back[3] = 255;
+                                               }
+                                               cp = back;
                                        break;
                                case TH_LOW_GRAD:
                                        cp = ts->gradients.gradient;
index cd7a090..daaa6a3 100644 (file)
@@ -1005,19 +1005,19 @@ static void region_overlap_fix(ScrArea *sa, ARegion *ar)
 }
 
 /* overlapping regions only in the following restricted cases */
-static bool region_is_overlap(ScrArea *sa, ARegion *ar)
+bool ED_region_is_overlap(int spacetype, int regiontype)
 {
        if (U.uiflag2 & USER_REGION_OVERLAP) {
-               if (ELEM(sa->spacetype, SPACE_VIEW3D, SPACE_SEQ, SPACE_IMAGE)) {
-                       if (ELEM(ar->regiontype, RGN_TYPE_TOOLS, RGN_TYPE_UI, RGN_TYPE_TOOL_PROPS))
+               if (ELEM(spacetype, SPACE_VIEW3D, SPACE_SEQ, SPACE_IMAGE)) {
+                       if (ELEM(regiontype, RGN_TYPE_TOOLS, RGN_TYPE_UI, RGN_TYPE_TOOL_PROPS))
                                return 1;
 
-                       if (ELEM(sa->spacetype, SPACE_VIEW3D, SPACE_IMAGE)) {
-                               if (ar->regiontype == RGN_TYPE_HEADER)
+                       if (ELEM(spacetype, SPACE_VIEW3D, SPACE_IMAGE)) {
+                               if (regiontype == RGN_TYPE_HEADER)
                                        return 1;
                        }
-                       else if (sa->spacetype == SPACE_SEQ) {
-                               if (ar->regiontype == RGN_TYPE_PREVIEW)
+                       else if (spacetype == SPACE_SEQ) {
+                               if (regiontype == RGN_TYPE_PREVIEW)
                                        return 1;
                        }
                }
@@ -1046,7 +1046,7 @@ static void region_rect_recursive(wmWindow *win, ScrArea *sa, ARegion *ar, rcti
        alignment = ar->alignment & ~RGN_SPLIT_PREV;
        
        /* set here, assuming userpref switching forces to call this again */
-       ar->overlap = region_is_overlap(sa, ar);
+       ar->overlap = ED_region_is_overlap(sa->spacetype, ar->regiontype);
 
        /* clear state flags first */
        ar->flag &= ~RGN_FLAG_TOO_SMALL;