More button code cleaning and tweaks
authorMatt Ebb <matt@mke3.net>
Sun, 28 Dec 2008 23:14:37 +0000 (23:14 +0000)
committerMatt Ebb <matt@mke3.net>
Sun, 28 Dec 2008 23:14:37 +0000 (23:14 +0000)
* now the rounded and round shaded themes use the same drawing backend
* fixed a problem with menu and number button triangles not accounting for buttons zoom

source/blender/editors/interface/interface_draw.c

index 39e362ef85a3698d5e21e8522610292d123968c9..bcd9a4e9ee78839cbe2d2924146d187546f2405c 100644 (file)
@@ -483,7 +483,7 @@ void uiRoundBox(float minx, float miny, float maxx, float maxy, float rad)
        glDisable( GL_LINE_SMOOTH );
 }
 
-void uiTriangleFakeAA(float x1, float y1, float x2, float y2, float x3, float y3)
+void uiTriangleFakeAA(float x1, float y1, float x2, float y2, float x3, float y3, float asp)
 {
        float color[4];
        float jitter;
@@ -491,11 +491,11 @@ void uiTriangleFakeAA(float x1, float y1, float x2, float y2, float x3, float y3
        
        /* get the colour and divide up the alpha */
        glGetFloatv(GL_CURRENT_COLOR, color);
-       color[3]= 1/(float)passes;
+       color[3]= 1.0/(float)passes;
        glColor4fv(color);
        
        /* set the 'jitter amount' */
-       jitter = 1/(float)passes;
+       jitter = 0.65/(float)passes * asp;
        
        glEnable( GL_BLEND );
        
@@ -504,7 +504,7 @@ void uiTriangleFakeAA(float x1, float y1, float x2, float y2, float x3, float y3
                glBegin(GL_TRIANGLES);
                
                /* 'point' first, then two base vertices */
-               glVertex2f(x1+(i*jitter), y1+(i*jitter));
+               glVertex2f(x1, y1+(i*jitter));
                glVertex2f(x2, y2+(i*jitter));
                glVertex2f(x3, y3+(i*jitter));
                glEnd();
@@ -980,6 +980,48 @@ static void ui_checkmark(float x1, float y1, float x2, float y2)
        glDisable( GL_LINE_SMOOTH );    
 }
 
+static void ui_draw_toggle_checkbox(int flag, int type, int colorid, float x1, float y1, float x2, float y2)
+{
+       if (!(flag & UI_HAS_ICON)) {
+               /* check to see that there's room for the check mark
+               * draw a check mark, or if it's a TOG3, draw a + or - */
+               if (x2 - x1 > 20) {
+                       ui_checkmark_box(colorid, x1, y1, x2, y2);
+                       
+                       /* TOG3 is handled with ui_tog3_invert() 
+                               *  remember to update checkmark drawing there too*/
+                       if((flag & UI_SELECT) && (type != TOG3)) {
+                               UI_ThemeColorShade(colorid, -140);
+
+                               ui_checkmark(x1, y1, x2, y2);
+                       }
+                       /* draw a dot: alternate, for layers etc. */
+               } else if(flag & UI_SELECT) {
+                       uiSetRoundBox(15);
+                       UI_ThemeColorShade(colorid, -60);
+                       
+                       glPushMatrix();
+                       glTranslatef((x1+(x2-x1)/2), (y1+(y2-y1)/2), 0.0);
+                       
+                       /* circle */
+                       glutil_draw_filled_arc(0.0, M_PI*2.0, 2, 16);
+                       
+                       glEnable( GL_LINE_SMOOTH );
+                       glEnable( GL_BLEND );
+                       glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
+                       
+                       /* smooth outline */
+                       glutil_draw_lined_arc(0.0, M_PI*2.0, 2, 16);
+                       
+                       glDisable( GL_BLEND );
+                       glDisable( GL_LINE_SMOOTH );
+                       
+                       glPopMatrix();
+               }
+       }
+}
+
+
 /* small side double arrow for iconrow */
 static void ui_iconrow_arrows(float x1, float y1, float x2, float y2)
 {
@@ -1004,31 +1046,31 @@ static void ui_iconrow_arrows(float x1, float y1, float x2, float y2)
 }
 
 /* side double arrow for menu */
-static void ui_menu_arrows(float x1, float y1, float x2, float y2)
+static void ui_menu_arrows(float x1, float y1, float x2, float y2, float asp)
 {
        /* 'point' first, then two base vertices */
        uiTriangleFakeAA(x2-9, (y2-(y2-y1)/2)+6,
                                        x2-6, (y2-(y2-y1)/2)+2,
-                                       x2-11, (y2-(y2-y1)/2)+2);
+                                       x2-12, (y2-(y2-y1)/2)+2, asp);
        
-       uiTriangleFakeAA(x2-8, (y2-(y2-y1)/2)-6,
+       uiTriangleFakeAA(x2-9, (y2-(y2-y1)/2)-6,
                                        x2-6, (y2-(y2-y1)/2)-2,
-                                       x2-11, (y2-(y2-y1)/2)-2);
+                                       x2-12, (y2-(y2-y1)/2)-2, asp);
 }
 
 /* left/right arrows for number fields */
-static void ui_num_arrows(float x1, float y1, float x2, float y2)
+static void ui_num_arrows(float x1, float y1, float x2, float y2, float asp)
 {
        if( x2-x1 > 25) {       // 25 is a bit arbitrary, but small buttons cant have arrows
 
                /* 'point' first, then two base vertices */
                uiTriangleFakeAA(x1+4, y2-(y2-y1)/2,
                                                x1+9, y2-(y2-y1)/2+3,
-                                               x1+9, y2-(y2-y1)/2-3);
+                                               x1+9, y2-(y2-y1)/2-3, asp);
 
                uiTriangleFakeAA(x2-4, y2-(y2-y1)/2,
                                                x2-9, y2-(y2-y1)/2+3,
-                                               x2-9, y2-(y2-y1)/2-3);
+                                               x2-9, y2-(y2-y1)/2-3, asp);
        }
 }
 
@@ -1148,7 +1190,7 @@ static void ui_roundshaded_button(int type, int colorid, float asp, float x1, fl
                        } else {
                                UI_ThemeColorShade(colorid, -80);
                        }
-                       ui_menu_arrows(x1, y1, x2, y2);
+                       ui_menu_arrows(x1, y1, x2, y2, asp);
                        /* end menu double arrow */
                        break;
        }       
@@ -1214,43 +1256,7 @@ static void ui_roundshaded_flat(int type, int colorid, float asp, float x1, floa
                case TOG:
                case TOGN:
                case TOG3:
-                       if (!(flag & UI_HAS_ICON)) {
-                               /* check to see that there's room for the check mark
-                               * draw a check mark, or if it's a TOG3, draw a + or - */
-                               if (x2 - x1 > 20) {
-                                       ui_checkmark_box(colorid, x1, y1, x2, y2);
-                                       
-                                       /* TOG3 is handled with ui_tog3_invert() 
-                                               *  remember to update checkmark drawing there too*/
-                                       if((flag & UI_SELECT) && (type != TOG3)) {
-                                               UI_ThemeColorShade(colorid, -140);
-       
-                                               ui_checkmark(x1, y1, x2, y2);
-                                       }
-                                       /* draw a dot: alternate, for layers etc. */
-                               } else if(flag & UI_SELECT) {
-                                       uiSetRoundBox(15);
-                                       UI_ThemeColorShade(colorid, -60);
-                                       
-                                       glPushMatrix();
-                                       glTranslatef((x1+(x2-x1)/2), (y1+(y2-y1)/2), 0.0);
-                                       
-                                       /* circle */
-                                       glutil_draw_filled_arc(0.0, M_PI*2.0, 2, 16);
-                                       
-                                       glEnable( GL_LINE_SMOOTH );
-                                       glEnable( GL_BLEND );
-                                       glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
-                                       
-                                       /* smooth outline */
-                                       glutil_draw_lined_arc(0.0, M_PI*2.0, 2, 16);
-                                       
-                                       glDisable( GL_BLEND );
-                                       glDisable( GL_LINE_SMOOTH );
-                                       
-                                       glPopMatrix();
-                               }
-                       }
+                       ui_draw_toggle_checkbox(flag, type, colorid, x1, y1, x2, y2);
                        break;
                case NUM:
                        /* side arrows */
@@ -1262,7 +1268,7 @@ static void ui_roundshaded_flat(int type, int colorid, float asp, float x1, floa
                                else UI_ThemeColorShade(colorid, -20);
                        }
                        
-                       ui_num_arrows(x1, y1, x2, y2);
+                       ui_num_arrows(x1, y1, x2, y2, asp);
                        /* end side arrows */
                        break;
        }       
@@ -1465,7 +1471,7 @@ static void ui_default_button(int type, int colorid, float asp, float x1, float
        
                /* MENU DOUBLE-ARROW  */
                M_DARK;
-               ui_menu_arrows(x1, y1, x2, y2);
+               ui_menu_arrows(x1, y1, x2, y2, asp);
                /* MENU DOUBLE-ARROW */
                break;
        }       
@@ -1628,7 +1634,7 @@ static void ui_default_flat(int type, int colorid, float asp, float x1, float y1
                        else M_LGREY;
                }
                
-               ui_num_arrows(x1, y1, x2, y2);
+               ui_num_arrows(x1, y1, x2, y2, asp);
                /* END SIDE ARROWS */
        }
 }
@@ -1805,7 +1811,7 @@ static void ui_draw_oldskool(int type, int colorid, float asp, float x1, float y
        case NUMABS:
                if(flag & UI_SELECT) UI_ThemeColorShade(colorid, -60);
                else UI_ThemeColorShade(colorid, -30);
-               ui_num_arrows(x1, y1, x2, y2);
+               ui_num_arrows(x1, y1, x2, y2, asp);
                break;
 
        case ICONROW: 
@@ -1824,69 +1830,24 @@ static void ui_draw_oldskool(int type, int colorid, float asp, float x1, float y
                glRectf(x2-17, y1+asp, x2-asp, y2-asp);
 
                UI_ThemeColorShade(colorid, -50);
-               ui_menu_arrows(x1, y1, x2, y2);
+               ui_menu_arrows(x1, y1, x2, y2, asp);
                break;
        }
        
 }
 
-/* *************** BASIC ROUNDED THEME ***************** */
-
-static void round_button(float x1, float y1, float x2, float y2, float asp, 
-                                                int colorid, int round, int menudeco, int curshade)
+static void ui_draw_round(int type, int colorid, float asp, float x1, float y1, float x2, float y2, int flag)
 {
-       float rad;
+       float rad, maxrad=7.0;
+       int align= (flag & UI_BUT_ALIGN), curshade;
        
+       /* rounded corners */
        rad= (y2-y1)/2.0;
-       if(rad>7.0) rad= 7.0;
-       
-       uiSetRoundBox(round);
-       gl_round_box(GL_POLYGON, x1, y1, x2, y2, rad);
-
-       if(menudeco) {
-               uiSetRoundBox(round & ~9);
-               UI_ThemeColorShade(colorid, curshade-20);
-               gl_round_box(GL_POLYGON, x2-menudeco, y1, x2, y2, rad);
-       }
-       
-       /* outline */
-       UI_ThemeColorBlendShade(TH_BUT_OUTLINE, TH_BACK, 0.1, -30);
-       
-       uiSetRoundBox(round);
-       uiRoundRectFakeAA(x1, y1, x2, y2, rad, asp);
-       /* end outline */
-}
-
-/* button in midst of alignment row */
-static void round_button_mid(float x1, float y1, float x2, float y2, float asp, 
-                                                        int colorid, int align, int menudeco, int curshade)
-{
-       glRectf(x1, y1, x2, y2);
-       
-       if(menudeco) {
-               UI_ThemeColorShade(colorid, curshade-20);
-               glRectf(x2-menudeco, y1, x2, y2);
+       if (rad>(x2-x1)/2) rad = (x2-x1)/2;
+       if (maxrad) {
+               if (rad > maxrad) rad = maxrad;
        }
-       
-       UI_ThemeColorBlendShade(colorid, TH_BACK, 0.5, -70);
-       // we draw full outline, its not AA, and it works better button mouse-over hilite
-       
-       // left right
-       fdrawline(x1, y1, x1, y2);
-       fdrawline(x2, y1, x2, y2);
-
-       // top down
-       fdrawline(x1, y2, x2, y2);
-       fdrawline(x1, y1, x2, y1);   
-}
-
-static void ui_draw_round(int type, int colorid, float asp, float x1, float y1, float x2, float y2, int flag)
-{
-       int align= (flag & UI_BUT_ALIGN);
-       int curshade= 0, menudeco= 0;
-       
-       if(type==ICONROW || type==ICONTEXTROW) menudeco= 9;
-       else if((type==MENU || type==BLOCK) && x2-x1>24) menudeco= 16;
+       /* end rounded corners */
        
        /* paper */
        if(flag & UI_SELECT) {
@@ -1900,49 +1861,59 @@ static void ui_draw_round(int type, int colorid, float asp, float x1, float y1,
        
        UI_ThemeColorShade(colorid, curshade);
 
+       /* alignment */
        if(align) {
                switch(align) {
-               case UI_BUT_ALIGN_TOP:
-                       round_button(x1, y1, x2, y2, asp, colorid, 12, menudeco, curshade);
-                       break;
-               case UI_BUT_ALIGN_DOWN:
-                       round_button(x1, y1, x2, y2, asp, colorid, 3, menudeco, curshade);
-                       break;
-               case UI_BUT_ALIGN_LEFT:
-                       round_button(x1, y1, x2, y2, asp, colorid, 6, menudeco, curshade);
-                       break;
-               case UI_BUT_ALIGN_RIGHT:
-                       round_button(x1, y1, x2, y2, asp, colorid, 9, menudeco, curshade);
-                       break;
-                       
-               case UI_BUT_ALIGN_DOWN|UI_BUT_ALIGN_RIGHT:
-                       round_button(x1, y1, x2, y2, asp, colorid, 1, menudeco, curshade);
-                       break;
-               case UI_BUT_ALIGN_DOWN|UI_BUT_ALIGN_LEFT:
-                       round_button(x1, y1, x2, y2, asp, colorid, 2, menudeco, curshade);
-                       break;
-               case UI_BUT_ALIGN_TOP|UI_BUT_ALIGN_RIGHT:
-                       round_button(x1, y1, x2, y2, asp, colorid, 8, menudeco, curshade);
-                       break;
-               case UI_BUT_ALIGN_TOP|UI_BUT_ALIGN_LEFT:
-                       round_button(x1, y1, x2, y2, asp, colorid, 4, menudeco, curshade);
-                       break;
-                       
-               default:
-                       round_button_mid(x1, y1, x2, y2, asp, colorid, align, menudeco, curshade);
-                       break;
+                       case UI_BUT_ALIGN_TOP:
+                               uiSetRoundBox(12);
+                               break;
+                       case UI_BUT_ALIGN_DOWN:
+                               uiSetRoundBox(3);
+                               break;
+                       case UI_BUT_ALIGN_LEFT:
+                               uiSetRoundBox(6);
+                               break;
+                       case UI_BUT_ALIGN_RIGHT:
+                               uiSetRoundBox(9);
+                               break;
+                               
+                       case UI_BUT_ALIGN_DOWN|UI_BUT_ALIGN_RIGHT:
+                               uiSetRoundBox(1);
+                               break;
+                       case UI_BUT_ALIGN_DOWN|UI_BUT_ALIGN_LEFT:
+                               uiSetRoundBox(2);
+                               break;
+                       case UI_BUT_ALIGN_TOP|UI_BUT_ALIGN_RIGHT:
+                               uiSetRoundBox(8);
+                               break;
+                       case UI_BUT_ALIGN_TOP|UI_BUT_ALIGN_LEFT:
+                               uiSetRoundBox(4);
+                               break;
+                               
+                       default:
+                               uiSetRoundBox(0);
+                               break;
                }
        } 
        else {
-               round_button(x1, y1, x2, y2, asp, colorid, 15, menudeco, curshade);
+               uiSetRoundBox(15);
        }
+       /* end alignment */
+       
+       /* draw the base button */
+       round_button_flat(colorid, asp, x1, y1, x2, y2, flag, rad);
 
        /* special type decorations */
        switch(type) {
+       case TOG:
+       case TOGN:
+       case TOG3:
+               ui_draw_toggle_checkbox(flag, type, colorid, x1, y1, x2, y2);
+               break;
        case NUM:
        case NUMABS:
                UI_ThemeColorShade(colorid, curshade-60);
-               ui_num_arrows(x1, y1, x2, y2);
+               ui_num_arrows(x1, y1, x2, y2, asp);
                break;
 
        case ICONROW: 
@@ -1954,7 +1925,7 @@ static void ui_draw_round(int type, int colorid, float asp, float x1, float y1,
        case MENU: 
        case BLOCK: 
                UI_ThemeColorShade(colorid, curshade-60);
-               ui_menu_arrows(x1, y1, x2, y2);
+               ui_menu_arrows(x1, y1, x2, y2, asp);
                break;
        }
 }
@@ -2053,7 +2024,7 @@ static void ui_draw_minimal(int type, int colorid, float asp, float x1, float y1
        case NUMABS:
                if(flag & UI_SELECT) UI_ThemeColorShade(colorid, -60);
                else UI_ThemeColorShade(colorid, -30);
-               ui_num_arrows(x1, y1, x2, y2);
+               ui_num_arrows(x1, y1, x2, y2, asp);
                break;
 
        case ICONROW: 
@@ -2073,7 +2044,7 @@ static void ui_draw_minimal(int type, int colorid, float asp, float x1, float y1
                glRectf(x2-17, y1+asp, x2-asp, y2-asp);
 
                UI_ThemeColorShade(colorid, -50);
-               ui_menu_arrows(x1, y1, x2, y2);
+               ui_menu_arrows(x1, y1, x2, y2, asp);
                break;
        }
        
@@ -3163,7 +3134,7 @@ static void ui_draw_table(int type, int colorid, float asp, float x1, float y1,
        case NUMABS:
                if(flag & UI_SELECT) UI_ThemeColorShade(colorid, -120);
                else UI_ThemeColorShade(colorid, -90);
-               ui_num_arrows(x1, y1, x2, y2);
+               ui_num_arrows(x1, y1, x2, y2, asp);
                break;
 
        case TOG:
@@ -3192,7 +3163,7 @@ static void ui_draw_table(int type, int colorid, float asp, float x1, float y1,
                glRectf(x2-17, y1+asp, x2-asp, y2-asp);
 
                UI_ThemeColorShade(colorid, -50);
-               ui_menu_arrows(x1, y1, x2, y2);
+               ui_menu_arrows(x1, y1, x2, y2, asp);
                break;
        }
 }