code cleanup: favor braces when blocks have mixed brace use.
[blender.git] / source / blender / editors / interface / interface_widgets.c
index 6d9df40..78b6d25 100644 (file)
@@ -218,13 +218,16 @@ void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y
        glDisable(GL_BLEND);
 }
 
-void ui_draw_anti_roundbox(int mode, float minx, float miny, float maxx, float maxy, float rad)
+void ui_draw_anti_roundbox(int mode, float minx, float miny, float maxx, float maxy, float rad, bool use_alpha)
 {
        float color[4];
        int j;
        
        glEnable(GL_BLEND);
        glGetFloatv(GL_CURRENT_COLOR, color);
+       if (use_alpha) {
+               color[3] = 0.5f;
+       }
        color[3] *= 0.125f;
        glColor4fv(color);
        
@@ -261,7 +264,7 @@ static int round_box_shadow_edges(float (*vert)[2], const rcti *rect, float rad,
        
        if (2.0f * rad > BLI_rcti_size_y(rect))
                rad = 0.5f * BLI_rcti_size_y(rect);
-       
+
        minx = rect->xmin - step;
        miny = rect->ymin - step;
        maxx = rect->xmax + step;
@@ -346,7 +349,7 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, const rcti *re
                          (roundboxalign & (UI_CNR_TOP_RIGHT | UI_CNR_BOTTOM_RIGHT)) == (UI_CNR_TOP_RIGHT | UI_CNR_BOTTOM_RIGHT)) ? 1 : 2;
 
        minsize = min_ii(BLI_rcti_size_x(rect) * hnum,
-                      BLI_rcti_size_y(rect) * vnum);
+                        BLI_rcti_size_y(rect) * vnum);
        
        if (2.0f * rad > minsize)
                rad = 0.5f * minsize;
@@ -566,19 +569,14 @@ static void widget_trias_draw(uiWidgetTrias *tria)
 
 static void widget_menu_trias(uiWidgetTrias *tria, const rcti *rect)
 {
-       float centx, centy, size, asp;
+       float centx, centy, size;
        int a;
                
        /* center position and size */
-       centx = rect->xmax - 0.5f * BLI_rcti_size_y(rect);
-       centy = rect->ymin + 0.5f * BLI_rcti_size_y(rect);
+       centx = rect->xmax - 0.32f * BLI_rcti_size_y(rect);
+       centy = rect->ymin + 0.50f * BLI_rcti_size_y(rect);
        size = 0.4f * (float)BLI_rcti_size_y(rect);
        
-       /* XXX exception */
-       asp = ((float)BLI_rcti_size_x(rect)) / ((float)BLI_rcti_size_y(rect));
-       if (asp > 1.2f && asp < 2.6f)
-               centx = rect->xmax - 0.4f * (float)BLI_rcti_size_y(rect);
-       
        for (a = 0; a < 6; a++) {
                tria->vec[a][0] = size * menu_tria_vert[a][0] + centx;
                tria->vec[a][1] = size * menu_tria_vert[a][1] + centy;
@@ -651,8 +649,8 @@ static void widget_verts_to_quad_strip_open(uiWidgetBase *wtb, const int totvert
        for (a = 0; a < totvert; a++) {
                quad_strip[a * 2][0] = wtb->outer_v[a][0];
                quad_strip[a * 2][1] = wtb->outer_v[a][1];
-               quad_strip[a * 2 + 1][0] = wtb->inner_v[a][0];
-               quad_strip[a * 2 + 1][1] = wtb->inner_v[a][1];
+               quad_strip[a * 2 + 1][0] = wtb->outer_v[a][0];
+               quad_strip[a * 2 + 1][1] = wtb->outer_v[a][1] - 1.0f;
        }
 }
 
@@ -874,12 +872,8 @@ static void widget_draw_icon(uiBut *but, BIFIconID icon, float alpha, const rcti
        /* this icon doesn't need draw... */
        if (icon == ICON_BLANK1 && (but->flag & UI_ICON_SUBMENU) == 0) return;
        
-       /* XXX remove hack when new icons are made */
-       if ( icon == ICON_LAYER_ACTIVE || icon == ICON_LAYER_USED)
-               height = 1.2f * BLI_rcti_size_y(rect); else
-       /* icons are 80% of height of button (16 pixels inside 20 height) */
-       height = 0.8f * BLI_rcti_size_y(rect);
-       aspect = height / ICON_DEFAULT_HEIGHT;
+       aspect = but->block->aspect / UI_DPI_FAC;
+       height = ICON_DEFAULT_HEIGHT / aspect;
 
        /* calculate blend color */
        if (ELEM4(but->type, TOG, ROW, TOGN, LISTROW)) {
@@ -894,26 +888,28 @@ static void widget_draw_icon(uiBut *but, BIFIconID icon, float alpha, const rcti
        glEnable(GL_BLEND);
        
        if (icon && icon != ICON_BLANK1) {
+               float ofs = 1.0f / aspect;
+               
                if (but->flag & UI_ICON_LEFT) {
                        if (but->type == BUT_TOGDUAL) {
                                if (but->drawstr[0]) {
-                                       xs = rect->xmin - 1.0f * aspect;
+                                       xs = rect->xmin - ofs;
                                }
                                else {
                                        xs = (rect->xmin + rect->xmax - height) / 2.0f;
                                }
                        }
                        else if (but->block->flag & UI_BLOCK_LOOP) {
-                               if (but->type == SEARCH_MENU)
-                                       xs = rect->xmin + 4.0f * aspect;
+                               if (ELEM(but->type, SEARCH_MENU, SEARCH_MENU_UNLINK))
+                                       xs = rect->xmin + 4.0f * ofs;
                                else
-                                       xs = rect->xmin + 1.0f * aspect;
+                                       xs = rect->xmin + ofs;
                        }
                        else if ((but->type == ICONROW) || (but->type == ICONTEXTROW)) {
-                               xs = rect->xmin + 3.0f * aspect;
+                               xs = rect->xmin + 3.0f * ofs;
                        }
                        else {
-                               xs = rect->xmin + 4.0f * aspect;
+                               xs = rect->xmin + 4.0f * ofs;
                        }
                        ys = (rect->ymin + rect->ymax - height) / 2.0f;
                }
@@ -922,20 +918,26 @@ static void widget_draw_icon(uiBut *but, BIFIconID icon, float alpha, const rcti
                        ys = (rect->ymin + rect->ymax - height) / 2.0f;
                }
 
+               /* force positions to integers, for zoom levels near 1. draws icons crisp. */
+               if (aspect > 0.95f && aspect < 1.05f) {
+                       xs = (int)(xs + 0.1f);
+                       ys = (int)(ys + 0.1f);
+               }
+               
                /* to indicate draggable */
                if (but->dragpoin && (but->flag & UI_ACTIVE)) {
                        float rgb[3] = {1.25f, 1.25f, 1.25f};
-                       UI_icon_draw_aspect_color(xs, ys, icon, 1.0f / aspect, rgb);
+                       UI_icon_draw_aspect_color(xs, ys, icon, aspect, rgb);
                }
                else
-                       UI_icon_draw_aspect(xs, ys, icon, 1.0f / aspect, alpha);
+                       UI_icon_draw_aspect(xs, ys, icon, aspect, alpha);
        }
 
        if (ui_but_draw_menu_icon(but)) {
                xs = rect->xmax - UI_DPI_ICON_SIZE - aspect;
                ys = (rect->ymin + rect->ymax - height) / 2.0f;
                
-               UI_icon_draw_aspect(xs, ys, ICON_RIGHTARROW_THIN, 1.0f / aspect, alpha);
+               UI_icon_draw_aspect(xs, ys, ICON_RIGHTARROW_THIN, aspect, alpha);
        }
        
        glDisable(GL_BLEND);
@@ -1284,13 +1286,15 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB
        else if (ELEM4(but->type, NUM, NUMABS, NUMSLI, SLI)) {
                ui_text_clip_right_label(fstyle, but, rect);
        }
-       else if (ELEM(but->type, TEX, SEARCH_MENU)) {
+       else if (ELEM3(but->type, TEX, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
                ui_text_clip_left(fstyle, but, rect);
        }
        else if ((but->block->flag & UI_BLOCK_LOOP) && (but->type == BUT)) {
                ui_text_clip_left(fstyle, but, rect);
        }
-       else but->ofs = 0;
+       else {
+               but->ofs = 0;
+       }
 
        /* check for button text label */
        if (but->type == ICONTEXTROW) {
@@ -1325,11 +1329,21 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB
                        /* icons default draw 0.8f x height */
                        rect->xmin += (int)(0.8f * BLI_rcti_size_y(rect));
 
-                       if (but->editstr || (but->flag & UI_TEXT_LEFT))
-                               rect->xmin += 0.4f * U.widget_unit;
+                       if (but->editstr || (but->flag & UI_TEXT_LEFT)) {
+                               rect->xmin += (UI_TEXT_MARGIN_X * U.widget_unit) / but->block->aspect;
+                       }
+               }
+               else if ((but->flag & UI_TEXT_LEFT)) {
+                       rect->xmin += (UI_TEXT_MARGIN_X * U.widget_unit) / but->block->aspect;
+               }
+               
+               /* unlink icon for this button type */
+               if (but->type == SEARCH_MENU_UNLINK && but->drawstr[0]) {
+                       rcti temp = *rect;
+                       
+                       temp.xmin = temp.xmax - BLI_rcti_size_y(rect);
+                       widget_draw_icon(but, ICON_X, 1.0f, &temp);
                }
-               else if ((but->flag & UI_TEXT_LEFT))
-                       rect->xmin += 0.4f * U.widget_unit;
 
                /* always draw text for textbutton cursor */
                widget_draw_text(fstyle, wcol, but, rect);
@@ -1785,11 +1799,19 @@ static void widget_state_menu_item(uiWidgetType *wt, int state)
 {
        wt->wcol = *(wt->wcol_theme);
        
-       if (state & (UI_BUT_DISABLED | UI_BUT_INACTIVE)) {
-               wt->wcol.text[0] = 0.5f * (wt->wcol.text[0] + wt->wcol.text_sel[0]);
-               wt->wcol.text[1] = 0.5f * (wt->wcol.text[1] + wt->wcol.text_sel[1]);
-               wt->wcol.text[2] = 0.5f * (wt->wcol.text[2] + wt->wcol.text_sel[2]);
+       /* active and disabled (not so common) */
+       if ((state & UI_BUT_DISABLED) && (state & UI_ACTIVE)) {
+               widget_state_blend(wt->wcol.text, wt->wcol.text_sel, 0.5f);
+               /* draw the backdrop at low alpha, helps navigating with keys
+                * when disabled items are active */
+               copy_v4_v4_char(wt->wcol.inner, wt->wcol.inner_sel);
+               wt->wcol.inner[3] = 64;
        }
+       /* regular disabled */
+       else if (state & (UI_BUT_DISABLED | UI_BUT_INACTIVE)) {
+               widget_state_blend(wt->wcol.text, wt->wcol.inner, 0.5f);
+       }
+       /* regular active */
        else if (state & UI_ACTIVE) {
                copy_v4_v4_char(wt->wcol.inner, wt->wcol.inner_sel);
                copy_v3_v3_char(wt->wcol.text, wt->wcol.text_sel);
@@ -1800,13 +1822,19 @@ static void widget_state_menu_item(uiWidgetType *wt, int state)
 /* ************ menu backdrop ************************* */
 
 /* outside of rect, rad to left/bottom/right */
-static void widget_softshadow(const rcti *rect, int roundboxalign, const float radin, const float radout)
+static void widget_softshadow(const rcti *rect, int roundboxalign, const float radin)
 {
+       bTheme *btheme = UI_GetTheme();
        uiWidgetBase wtb;
        rcti rect1 = *rect;
-       float alpha, alphastep;
+       float alphastep;
        int step, totvert;
-       float quad_strip[WIDGET_SIZE_MAX * 2][2];
+       float quad_strip[WIDGET_SIZE_MAX * 2 + 2][2];
+       const float radout = UI_ThemeMenuShadowWidth();
+       
+       /* disabled shadow */
+       if (radout == 0.0f)
+               return;
        
        /* prevent tooltips to not show round shadow */
        if (radout > 0.2f * BLI_rcti_size_y(&rect1))
@@ -1817,24 +1845,22 @@ static void widget_softshadow(const rcti *rect, int roundboxalign, const float r
        /* inner part */
        totvert = round_box_shadow_edges(wtb.inner_v, &rect1, radin, roundboxalign & (UI_CNR_BOTTOM_RIGHT | UI_CNR_BOTTOM_LEFT), 0.0f);
 
-       /* inverse linear shadow alpha */
-       alpha = 0.15f;
-       if (U.pixelsize > 1.0f)
-               alphastep = 0.78f;
-       else
-               alphastep = 0.67f;
+       /* we draw a number of increasing size alpha quad strips */
+       alphastep = 3.0f * btheme->tui.menu_shadow_fac / radout;
        
        glEnableClientState(GL_VERTEX_ARRAY);
 
-       for (step = 1; step <= radout; step++, alpha *= alphastep) {
+       for (step = 1; step <= (int)radout; step++) {
+               float expfac = sqrt(step / radout);
+               
                round_box_shadow_edges(wtb.outer_v, &rect1, radin, UI_CNR_ALL, (float)step);
                
-               glColor4f(0.0f, 0.0f, 0.0f, alpha);
+               glColor4f(0.0f, 0.0f, 0.0f, alphastep * (1.0f - expfac));
 
-               widget_verts_to_quad_strip_open(&wtb, totvert, quad_strip);
+               widget_verts_to_quad_strip(&wtb, totvert, quad_strip);
 
                glVertexPointer(2, GL_FLOAT, 0, quad_strip);
-               glDrawArrays(GL_QUAD_STRIP, 0, totvert * 2);
+               glDrawArrays(GL_QUAD_STRIP, 0, totvert * 2); /* add + 2 for getting a complete soft rect. Now it skips top edge to allow transparent menus */
        }
 
        glDisableClientState(GL_VERTEX_ARRAY);
@@ -1862,7 +1888,7 @@ static void widget_menu_back(uiWidgetColors *wcol, rcti *rect, int flag, int dir
        }
        
        glEnable(GL_BLEND);
-       widget_softshadow(rect, roundboxalign, 0.25f * U.widget_unit, 0.4f * U.widget_unit);
+       widget_softshadow(rect, roundboxalign, 0.25f * U.widget_unit);
        
        round_box_edges(&wtb, roundboxalign, rect, 0.25f * U.widget_unit);
        wtb.emboss = 0;
@@ -1879,12 +1905,12 @@ static void ui_hsv_cursor(float x, float y)
        glTranslatef(x, y, 0.0f);
        
        glColor3f(1.0f, 1.0f, 1.0f);
-       glutil_draw_filled_arc(0.0f, M_PI * 2.0, 3.0f, 8);
+       glutil_draw_filled_arc(0.0f, M_PI * 2.0, 3.0f * U.pixelsize, 8);
        
        glEnable(GL_BLEND);
        glEnable(GL_LINE_SMOOTH);
        glColor3f(0.0f, 0.0f, 0.0f);
-       glutil_draw_lined_arc(0.0f, M_PI * 2.0, 3.0f, 12);
+       glutil_draw_lined_arc(0.0f, M_PI * 2.0, 3.0f * U.pixelsize, 12);
        glDisable(GL_BLEND);
        glDisable(GL_LINE_SMOOTH);
        
@@ -1908,7 +1934,7 @@ void ui_hsvcircle_vals_from_pos(float *val_rad, float *val_dist, const rcti *rec
 
 static void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, const rcti *rect)
 {
-       const int tot = 32;
+       const int tot = 64;
        const float radstep = 2.0f * (float)M_PI / (float)tot;
 
        const float centx = BLI_rcti_cent_x_fl(rect);
@@ -2316,7 +2342,7 @@ void ui_draw_link_bezier(const rcti *rect)
 
                glEnableClientState(GL_VERTEX_ARRAY);
                glVertexPointer(2, GL_FLOAT, 0, coord_array);
-               glDrawArrays(GL_LINE_STRIP, 0, LINK_RESOL);
+               glDrawArrays(GL_LINE_STRIP, 0, LINK_RESOL + 1);
                glDisableClientState(GL_VERTEX_ARRAY);
 
                glDisable(GL_BLEND);
@@ -2588,6 +2614,8 @@ static void widget_swatch(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat
        col[3] = 1.0f;
 
        if (but->rnaprop) {
+               BLI_assert(but->rnaindex == -1);
+
                if (RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA)
                        color_profile = FALSE;
 
@@ -3208,7 +3236,8 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct
                        case TEX:
                                wt = widget_type(UI_WTYPE_NAME);
                                break;
-                               
+                       
+                       case SEARCH_MENU_UNLINK:
                        case SEARCH_MENU:
                                wt = widget_type(UI_WTYPE_NAME);
                                if (but->block->flag & UI_BLOCK_LOOP)
@@ -3408,7 +3437,7 @@ void ui_draw_search_back(uiStyle *UNUSED(style), uiBlock *block, rcti *rect)
        uiWidgetType *wt = widget_type(UI_WTYPE_BOX);
        
        glEnable(GL_BLEND);
-       widget_softshadow(rect, UI_CNR_ALL, 0.25f * U.widget_unit, 0.4f * U.widget_unit);
+       widget_softshadow(rect, UI_CNR_ALL, 0.25f * U.widget_unit);
        glDisable(GL_BLEND);
 
        wt->state(wt, 0);
@@ -3427,7 +3456,7 @@ void ui_draw_menu_item(uiFontStyle *fstyle, rcti *rect, const char *name, int ic
        uiWidgetType *wt = widget_type(UI_WTYPE_MENU_ITEM);
        rcti _rect = *rect;
        char *cpoin;
-       
+
        wt->state(wt, state);
        wt->draw(&wt->wcol, rect, 0, 0);
        
@@ -3462,14 +3491,14 @@ void ui_draw_menu_item(uiFontStyle *fstyle, rcti *rect, const char *name, int ic
        if (iconid) {
                float height, aspect;
                int xs = rect->xmin + 0.2f * UI_UNIT_X;
-               int ys = 1 + (rect->ymin + rect->ymax - UI_DPI_ICON_SIZE) / 2;
+               int ys = rect->ymin + 0.1f * BLI_rcti_size_y(rect);
                
                /* icons are 80% of height of button (16 pixels inside 20 height) */
                height = 0.8f * BLI_rcti_size_y(rect);
                aspect = ICON_DEFAULT_HEIGHT / height;
-
+               
                glEnable(GL_BLEND);
-               UI_icon_draw_aspect(xs, ys, iconid, aspect, 0.5f); /* XXX scale weak get from fstyle? */
+               UI_icon_draw_aspect(xs, ys, iconid, aspect, 1.0f); /* XXX scale weak get from fstyle? */
                glDisable(GL_BLEND);
        }
 }