src/gui/styles/qcleanlooksstyle.cpp
changeset 0 1918ee327afb
child 3 41300fa6a67c
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the QtGui module of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 #include "qcleanlooksstyle.h"
       
    43 #include "qcleanlooksstyle_p.h"
       
    44 
       
    45 #if !defined(QT_NO_STYLE_CLEANLOOKS) || defined(QT_PLUGIN)
       
    46 
       
    47 #include <private/qstylehelper_p.h>
       
    48 #include "qwindowsstyle_p.h"
       
    49 #include <qcombobox.h>
       
    50 #include <qpushbutton.h>
       
    51 #include <qpainter.h>
       
    52 #include <qdir.h>
       
    53 #include <qhash.h>
       
    54 #include <qstyleoption.h>
       
    55 #include <qapplication.h>
       
    56 #include <qmainwindow.h>
       
    57 #include <qfont.h>
       
    58 #include <qgroupbox.h>
       
    59 #include <qprocess.h>
       
    60 #include <qpixmapcache.h>
       
    61 #include <qdialogbuttonbox.h>
       
    62 #include <qscrollbar.h>
       
    63 #include <qspinbox.h>
       
    64 #include <qslider.h>
       
    65 #include <qsplitter.h>
       
    66 #include <qprogressbar.h>
       
    67 #include <qtoolbar.h>
       
    68 #include <qwizard.h>
       
    69 #include <qlibrary.h>
       
    70 
       
    71 #define CL_MAX(a,b) (a)>(b) ? (a):(b) // ### qMin/qMax does not work for vc6
       
    72 #define CL_MIN(a,b) (a)<(b) ? (a):(b) // remove this when it is working
       
    73 
       
    74 QT_BEGIN_NAMESPACE
       
    75 
       
    76 using namespace QStyleHelper;
       
    77 
       
    78 enum Direction {
       
    79     TopDown,
       
    80     FromLeft,
       
    81     BottomUp,
       
    82     FromRight
       
    83 };
       
    84 
       
    85 // from windows style
       
    86 static const int windowsItemFrame        =  2; // menu item frame width
       
    87 static const int windowsItemHMargin      =  3; // menu item hor text margin
       
    88 static const int windowsItemVMargin      =  8; // menu item ver text margin
       
    89 static const int windowsRightBorder      = 15; // right border on windows
       
    90 
       
    91 /* XPM */
       
    92 static const char * const dock_widget_close_xpm[] = {
       
    93     "11 13 7 1",
       
    94     " 	c None",
       
    95     ".	c #D5CFCB",
       
    96     "+	c #8F8B88",
       
    97     "@	c #6C6A67",
       
    98     "#	c #ABA6A3",
       
    99     "$	c #B5B0AC",
       
   100     "%	c #A4A09D",
       
   101     "           ",
       
   102     " +@@@@@@@+ ",
       
   103     "+#       #+",
       
   104     "@ $@   @$ @",
       
   105     "@ @@@ @@@ @",
       
   106     "@  @@@@@  @",
       
   107     "@   @@@   @",
       
   108     "@  @@@@@  @",
       
   109     "@ @@@ @@@ @",
       
   110     "@ $@   @$ @",
       
   111     "+%       #+",
       
   112     " +@@@@@@@+ ",
       
   113     "           "};
       
   114 
       
   115 static const char * const qt_cleanlooks_arrow_down_xpm[] = {
       
   116     "11 7 2 1",
       
   117     " 	c None",
       
   118     "x	c #000000",
       
   119     "           ",
       
   120     "  x     x  ",
       
   121     " xxx   xxx ",
       
   122     "  xxxxxxx  ",
       
   123     "   xxxxx   ",
       
   124     "    xxx    ",
       
   125     "     x     "};
       
   126 
       
   127 static const char * const qt_cleanlooks_arrow_up_xpm[] = {
       
   128     "11 7 2 1",
       
   129     " 	c None",
       
   130     "x	c #000000",
       
   131     "     x     ",
       
   132     "    xxx    ",
       
   133     "   xxxxx   ",
       
   134     "  xxxxxxx  ",
       
   135     " xxx   xxx ",
       
   136     "  x     x  ",
       
   137     "           "};
       
   138 
       
   139 static const char * const dock_widget_restore_xpm[] = {
       
   140     "11 13 7 1",
       
   141     " 	c None",
       
   142     ".	c #D5CFCB",
       
   143     "+	c #8F8B88",
       
   144     "@	c #6C6A67",
       
   145     "#	c #ABA6A3",
       
   146     "$	c #B5B0AC",
       
   147     "%	c #A4A09D",
       
   148     "           ",
       
   149     " +@@@@@@@+ ",
       
   150     "+#       #+",
       
   151     "@   #@@@# @",
       
   152     "@   @   @ @",
       
   153     "@ #@@@# @ @",
       
   154     "@ @   @ @ @",
       
   155     "@ @   @@@ @",
       
   156     "@ @   @   @",
       
   157     "@ #@@@#   @",
       
   158     "+%       #+",
       
   159     " +@@@@@@@+ ",
       
   160     "           "};
       
   161 
       
   162 static const char * const workspace_minimize[] = {
       
   163     "11 13 7 1",
       
   164     " 	c None",
       
   165     ".	c #D5CFCB",
       
   166     "+	c #8F8B88",
       
   167     "@	c #6C6A67",
       
   168     "#	c #ABA6A3",
       
   169     "$	c #B5B0AC",
       
   170     "%	c #A4A09D",
       
   171     "           ",
       
   172     " +@@@@@@@+ ",
       
   173     "+#       #+",
       
   174     "@         @",
       
   175     "@         @",
       
   176     "@         @",
       
   177     "@ @@@@@@@ @",
       
   178     "@ @@@@@@@ @",
       
   179     "@         @",
       
   180     "@         @",
       
   181     "+%       #+",
       
   182     " +@@@@@@@+ ",
       
   183     "           "};
       
   184 
       
   185 
       
   186 static const char * const qt_titlebar_context_help[] = {
       
   187     "10 10 3 1",
       
   188     "  c None",
       
   189     "# c #000000",
       
   190     "+ c #444444",
       
   191     "  +####+  ",
       
   192     " ###  ### ",
       
   193     " ##    ## ",
       
   194     "     +##+ ",
       
   195     "    +##   ",
       
   196     "    ##    ",
       
   197     "    ##    ",
       
   198     "          ",
       
   199     "    ##    ",
       
   200     "    ##    "};
       
   201 
       
   202 static const char * const qt_cleanlooks_radiobutton[] = {
       
   203     "13 13 9 1",
       
   204     " 	c None",
       
   205     ".	c #ABA094",
       
   206     "+	c #B7ADA0",
       
   207     "@	c #C4BBB2",
       
   208     "#	c #DDD4CD",
       
   209     "$	c #E7E1E0",
       
   210     "%	c #F4EFED",
       
   211     "&	c #FFFAF9",
       
   212     "*	c #FCFEFB",
       
   213     "   #@...@#   ",
       
   214     "  @+@#$$#+@  ",
       
   215     " @+$%%***&@@ ",
       
   216     "#+$%**&&**&+#",
       
   217     "@@$&&******#@",
       
   218     ".#**********.",
       
   219     ".$&******&*&.",
       
   220     ".$*&******&*.",
       
   221     "+#********&#@",
       
   222     "#+*********+#",
       
   223     " @@*******@@ ",
       
   224     "  @+#%*%#+@  ",
       
   225     "   #@...+#   "};
       
   226 
       
   227 static const char * const qt_cleanlooks_radiobutton_checked[] = {
       
   228     "13 13 20 1",
       
   229     " 	c None",
       
   230     ".	c #A8ABAE",
       
   231     "+	c #596066",
       
   232     "@	c #283138",
       
   233     "#	c #A9ACAF",
       
   234     "$	c #A6A9AB",
       
   235     "%	c #6B7378",
       
   236     "&	c #8C9296",
       
   237     "*	c #A2A6AA",
       
   238     "=	c #61696F",
       
   239     "-	c #596065",
       
   240     ";	c #93989C",
       
   241     ">	c #777E83",
       
   242     ",	c #60686E",
       
   243     "'	c #252D33",
       
   244     ")	c #535B62",
       
   245     "!	c #21292E",
       
   246     "~	c #242B31",
       
   247     "{	c #1F262B",
       
   248     "]	c #41484E",
       
   249     "             ",
       
   250     "             ",
       
   251     "             ",
       
   252     "    .+@+#    ",
       
   253     "   $%&*&=#   ",
       
   254     "   -&;>,'+   ",
       
   255     "   @*>,)!@   ",
       
   256     "   +&,)~{+   ",
       
   257     "   #='!{]#   ",
       
   258     "    #+@+#    ",
       
   259     "             ",
       
   260     "             ",
       
   261     "             "};
       
   262 
       
   263 
       
   264 static const char * const qt_scrollbar_button_arrow_left[] = {
       
   265     "4 7 2 1",
       
   266     "   c None",
       
   267     "*  c #BFBFBF",
       
   268     "   *",
       
   269     "  **",
       
   270     " ***",
       
   271     "****",
       
   272     " ***",
       
   273     "  **",
       
   274     "   *"};
       
   275 
       
   276 static const char * const qt_scrollbar_button_arrow_right[] = {
       
   277     "4 7 2 1",
       
   278     "   c None",
       
   279     "*  c #BFBFBF",
       
   280     "*   ",
       
   281     "**  ",
       
   282     "*** ",
       
   283     "****",
       
   284     "*** ",
       
   285     "**  ",
       
   286     "*   "};
       
   287 
       
   288 static const char * const qt_scrollbar_button_arrow_up[] = {
       
   289     "7 4 2 1",
       
   290     "   c None",
       
   291     "*  c #BFBFBF",
       
   292     "   *   ",
       
   293     "  ***  ",
       
   294     " ***** ",
       
   295     "*******"};
       
   296 
       
   297 static const char * const qt_scrollbar_button_arrow_down[] = {
       
   298     "7 4 2 1",
       
   299     "   c None",
       
   300     "*  c #BFBFBF",
       
   301     "*******",
       
   302     " ***** ",
       
   303     "  ***  ",
       
   304     "   *   "};
       
   305 
       
   306 static const char * const qt_spinbox_button_arrow_down[] = {
       
   307     "7 4 2 1",
       
   308     "   c None",
       
   309     "*  c #BFBFBF",
       
   310     "*******",
       
   311     " ***** ",
       
   312     "  ***  ",
       
   313     "   *   "};
       
   314 
       
   315 static const char * const qt_spinbox_button_arrow_up[] = {
       
   316     "7 4 2 1",
       
   317     "   c None",
       
   318     "*  c #BFBFBF",
       
   319     "   *   ",
       
   320     "  ***  ",
       
   321     " ***** ",
       
   322     "*******"};
       
   323 
       
   324 static const char * const qt_scrollbar_button_left[] = {
       
   325     "16 16 6 1",
       
   326     "   c None",
       
   327     ".  c #BFBFBF",
       
   328     "+  c #979797",
       
   329     "#  c #FAFAFA",
       
   330     "<  c #FAFAFA",
       
   331     "*  c #FAFAFA",
       
   332     " .++++++++++++++",
       
   333     ".+#############+",
       
   334     "+#            <+",
       
   335     "+#            <+",
       
   336     "+#            <+",
       
   337     "+#            <+",
       
   338     "+#            <+",
       
   339     "+#            <+",
       
   340     "+#            <+",
       
   341     "+#            <+",
       
   342     "+#            <+",
       
   343     "+#            <+",
       
   344     "+#            <+",
       
   345     "+#            <+",
       
   346     ".+<<<<<<<<<<<<<+",
       
   347     " .++++++++++++++"};
       
   348 
       
   349 static const char * const qt_scrollbar_button_right[] = {
       
   350     "16 16 6 1",
       
   351     "   c None",
       
   352     ".  c #BFBFBF",
       
   353     "+  c #979797",
       
   354     "#  c #FAFAFA",
       
   355     "<  c #FAFAFA",
       
   356     "*  c #FAFAFA",
       
   357     "++++++++++++++. ",
       
   358     "+#############+.",
       
   359     "+#            <+",
       
   360     "+#            <+",
       
   361     "+#            <+",
       
   362     "+#            <+",
       
   363     "+#            <+",
       
   364     "+#            <+",
       
   365     "+#            <+",
       
   366     "+#            <+",
       
   367     "+#            <+",
       
   368     "+#            <+",
       
   369     "+#            <+",
       
   370     "+#            <+",
       
   371     "+<<<<<<<<<<<<<+.",
       
   372     "++++++++++++++. "};
       
   373 
       
   374 static const char * const qt_scrollbar_button_up[] = {
       
   375     "16 16 6 1",
       
   376     "   c None",
       
   377     ".  c #BFBFBF",
       
   378     "+  c #979797",
       
   379     "#  c #FAFAFA",
       
   380     "<  c #FAFAFA",
       
   381     "*  c #FAFAFA",
       
   382     " .++++++++++++. ",
       
   383     ".+############+.",
       
   384     "+#            <+",
       
   385     "+#            <+",
       
   386     "+#            <+",
       
   387     "+#            <+",
       
   388     "+#            <+",
       
   389     "+#            <+",
       
   390     "+#            <+",
       
   391     "+#            <+",
       
   392     "+#            <+",
       
   393     "+#            <+",
       
   394     "+#            <+",
       
   395     "+#            <+",
       
   396     "+<<<<<<<<<<<<<<+",
       
   397     "++++++++++++++++"};
       
   398 
       
   399 static const char * const qt_scrollbar_button_down[] = {
       
   400     "16 16 6 1",
       
   401     "   c None",
       
   402     ".  c #BFBFBF",
       
   403     "+  c #979797",
       
   404     "#  c #FAFAFA",
       
   405     "<  c #FAFAFA",
       
   406     "*  c #FAFAFA",
       
   407     "++++++++++++++++",
       
   408     "+##############+",
       
   409     "+#            <+",
       
   410     "+#            <+",
       
   411     "+#            <+",
       
   412     "+#            <+",
       
   413     "+#            <+",
       
   414     "+#            <+",
       
   415     "+#            <+",
       
   416     "+#            <+",
       
   417     "+#            <+",
       
   418     "+#            <+",
       
   419     "+#            <+",
       
   420     "+#            <+",
       
   421     ".+<<<<<<<<<<<<+.",
       
   422     " .++++++++++++. "};
       
   423 
       
   424 static const char * const qt_cleanlooks_menuitem_checkbox_checked[] = {
       
   425     "8 7 6 1",
       
   426     " 	g None",
       
   427     ".	g #959595",
       
   428     "+	g #676767",
       
   429     "@	g #454545",
       
   430     "#	g #1D1D1D",
       
   431     "0	g #101010",
       
   432     "      ..",
       
   433     "     .+ ",
       
   434     "    .+  ",
       
   435     "0  .@   ",
       
   436     "@#++.   ",
       
   437     "  @#    ",
       
   438     "   .    "};
       
   439 
       
   440 static const char * const qt_cleanlooks_checkbox_checked[] = {
       
   441     "13 13 3 1",
       
   442     " 	c None",
       
   443     ".	c #272D33",
       
   444     "%	c #666666",
       
   445 
       
   446     "             ",
       
   447     "          %  ",
       
   448     "         %.  ",
       
   449     "        %.%  ",
       
   450     "       %..   ",
       
   451     "  %.% %..    ",
       
   452     "  %..%..%    ",
       
   453     "   %...%     ",
       
   454     "    %..%     ",
       
   455     "     %.%     ",
       
   456     "      %      ",
       
   457     "             ",
       
   458     "             "};
       
   459 
       
   460 static void qt_cleanlooks_draw_gradient(QPainter *painter, const QRect &rect, const QColor &gradientStart,
       
   461                                         const QColor &gradientStop, Direction direction = TopDown, QBrush bgBrush = QBrush())
       
   462 {
       
   463         int x = rect.center().x();
       
   464         int y = rect.center().y();
       
   465         QLinearGradient *gradient;
       
   466         switch(direction) {
       
   467             case FromLeft:
       
   468                 gradient = new QLinearGradient(rect.left(), y, rect.right(), y);
       
   469                 break;
       
   470             case FromRight:
       
   471                 gradient = new QLinearGradient(rect.right(), y, rect.left(), y);
       
   472                 break;
       
   473             case BottomUp:
       
   474                 gradient = new QLinearGradient(x, rect.bottom(), x, rect.top());
       
   475                 break;
       
   476             case TopDown:
       
   477             default:
       
   478                 gradient = new QLinearGradient(x, rect.top(), x, rect.bottom());
       
   479                 break;
       
   480         }
       
   481         if (bgBrush.gradient())
       
   482             gradient->setStops(bgBrush.gradient()->stops());
       
   483         else {
       
   484             gradient->setColorAt(0, gradientStart);
       
   485             gradient->setColorAt(1, gradientStop);
       
   486         }
       
   487         painter->fillRect(rect, *gradient);
       
   488         delete gradient;
       
   489 }
       
   490 
       
   491 static void qt_cleanlooks_draw_buttongradient(QPainter *painter, const QRect &rect, const QColor &gradientStart,
       
   492                                                 const QColor &gradientMid, const QColor &gradientStop, Direction direction = TopDown,
       
   493                                                 QBrush bgBrush = QBrush())
       
   494 {
       
   495         int x = rect.center().x();
       
   496         int y = rect.center().y();
       
   497         QLinearGradient *gradient;
       
   498         bool horizontal = false;
       
   499         switch(direction) {
       
   500             case FromLeft:
       
   501                 horizontal = true;
       
   502                 gradient = new QLinearGradient(rect.left(), y, rect.right(), y);
       
   503                 break;
       
   504             case FromRight:
       
   505                 horizontal = true;
       
   506                 gradient = new QLinearGradient(rect.right(), y, rect.left(), y);
       
   507                 break;
       
   508             case BottomUp:
       
   509                 gradient = new QLinearGradient(x, rect.bottom(), x, rect.top());
       
   510                 break;
       
   511             case TopDown:
       
   512             default:
       
   513                 gradient = new QLinearGradient(x, rect.top(), x, rect.bottom());
       
   514                 break;
       
   515         }
       
   516         if (bgBrush.gradient())
       
   517             gradient->setStops(bgBrush.gradient()->stops());
       
   518         else {
       
   519             int size = horizontal ? rect.width() : rect.height() ;
       
   520             if (size > 4) {
       
   521                 float edge = 4.0/(float)size;
       
   522                 gradient->setColorAt(0, gradientStart);
       
   523                 gradient->setColorAt(edge, gradientMid.lighter(104));
       
   524                 gradient->setColorAt(1.0 - edge, gradientMid.darker(100));
       
   525                 gradient->setColorAt(1.0, gradientStop);
       
   526             }
       
   527         }
       
   528         painter->fillRect(rect, *gradient);
       
   529         delete gradient;
       
   530 }
       
   531 
       
   532 static void qt_cleanlooks_draw_mdibutton(QPainter *painter, const QStyleOptionTitleBar *option, const QRect &tmp, bool hover, bool sunken)
       
   533 {
       
   534     QColor dark;
       
   535     dark.setHsv(option->palette.button().color().hue(),
       
   536                 CL_MIN(255, (int)(option->palette.button().color().saturation()*1.9)),
       
   537                 CL_MIN(255, (int)(option->palette.button().color().value()*0.7)));
       
   538 
       
   539     QColor highlight = option->palette.highlight().color();
       
   540 
       
   541     bool active = (option->titleBarState & QStyle::State_Active);
       
   542     QColor titleBarHighlight(255, 255, 255, 60);
       
   543 
       
   544     if (sunken)
       
   545         painter->fillRect(tmp.adjusted(1, 1, -1, -1), option->palette.highlight().color().darker(120));
       
   546     else if (hover)
       
   547         painter->fillRect(tmp.adjusted(1, 1, -1, -1), QColor(255, 255, 255, 20));
       
   548 
       
   549     QColor mdiButtonGradientStartColor;
       
   550     QColor mdiButtonGradientStopColor;
       
   551 
       
   552     mdiButtonGradientStartColor = QColor(0, 0, 0, 40);
       
   553     mdiButtonGradientStopColor = QColor(255, 255, 255, 60);
       
   554 
       
   555     if (sunken)
       
   556         titleBarHighlight = highlight.darker(130);
       
   557 
       
   558     QLinearGradient gradient(tmp.center().x(), tmp.top(), tmp.center().x(), tmp.bottom());
       
   559     gradient.setColorAt(0, mdiButtonGradientStartColor);
       
   560     gradient.setColorAt(1, mdiButtonGradientStopColor);
       
   561     QColor mdiButtonBorderColor(active ? option->palette.highlight().color().darker(180): dark.darker(110));
       
   562 
       
   563     painter->setPen(QPen(mdiButtonBorderColor, 1));
       
   564     const QLine lines[4] = {
       
   565         QLine(tmp.left() + 2, tmp.top(), tmp.right() - 2, tmp.top()),
       
   566         QLine(tmp.left() + 2, tmp.bottom(), tmp.right() - 2, tmp.bottom()),
       
   567         QLine(tmp.left(), tmp.top() + 2, tmp.left(), tmp.bottom() - 2),
       
   568         QLine(tmp.right(), tmp.top() + 2, tmp.right(), tmp.bottom() - 2)
       
   569     };
       
   570     painter->drawLines(lines, 4);
       
   571     const QPoint points[4] = {
       
   572         QPoint(tmp.left() + 1, tmp.top() + 1),
       
   573         QPoint(tmp.right() - 1, tmp.top() + 1),
       
   574         QPoint(tmp.left() + 1, tmp.bottom() - 1),
       
   575         QPoint(tmp.right() - 1, tmp.bottom() - 1)
       
   576     };
       
   577     painter->drawPoints(points, 4);
       
   578 
       
   579     painter->setPen(titleBarHighlight);
       
   580     painter->drawLine(tmp.left() + 2, tmp.top() + 1, tmp.right() - 2, tmp.top() + 1);
       
   581     painter->drawLine(tmp.left() + 1, tmp.top() + 2, tmp.left() + 1, tmp.bottom() - 2);
       
   582 
       
   583     painter->setPen(QPen(gradient, 1));
       
   584     painter->drawLine(tmp.right() + 1, tmp.top() + 2, tmp.right() + 1, tmp.bottom() - 2);
       
   585     painter->drawPoint(tmp.right() , tmp.top() + 1);
       
   586 
       
   587     painter->drawLine(tmp.left() + 2, tmp.bottom() + 1, tmp.right() - 2, tmp.bottom() + 1);
       
   588     painter->drawPoint(tmp.left() + 1, tmp.bottom());
       
   589     painter->drawPoint(tmp.right() - 1, tmp.bottom());
       
   590     painter->drawPoint(tmp.right() , tmp.bottom() - 1);
       
   591 }
       
   592 
       
   593 /*!
       
   594     \class QCleanlooksStyle
       
   595     \brief The QCleanlooksStyle class provides a widget style similar to the
       
   596     Clearlooks style available in GNOME.
       
   597     \since 4.2
       
   598 
       
   599     The Cleanlooks style provides a look and feel for widgets
       
   600     that closely resembles the Clearlooks style, introduced by Richard
       
   601     Stellingwerff and Daniel Borgmann.
       
   602 
       
   603     \sa {Cleanlooks Style Widget Gallery}, QWindowsXPStyle, QMacStyle, QWindowsStyle,
       
   604         QCDEStyle, QMotifStyle, QPlastiqueStyle
       
   605 */
       
   606 
       
   607 /*!
       
   608     Constructs a QCleanlooksStyle object.
       
   609 */
       
   610 QCleanlooksStyle::QCleanlooksStyle() : QWindowsStyle(*new QCleanlooksStylePrivate)
       
   611 {
       
   612     setObjectName(QLatin1String("CleanLooks"));
       
   613 }
       
   614 
       
   615 /*!
       
   616     \internal
       
   617 
       
   618     Constructs a QCleanlooksStyle object.
       
   619 */
       
   620 QCleanlooksStyle::QCleanlooksStyle(QCleanlooksStylePrivate &dd) : QWindowsStyle(dd)
       
   621 {
       
   622 }
       
   623 
       
   624 /*!
       
   625     Destroys the QCleanlooksStyle object.
       
   626 */
       
   627 QCleanlooksStyle::~QCleanlooksStyle()
       
   628 {
       
   629 }
       
   630 
       
   631 /*!
       
   632     \fn void QCleanlooksStyle::drawItemText(QPainter *painter, const QRect &rectangle, int alignment, const QPalette &palette,
       
   633                                     bool enabled, const QString& text, QPalette::ColorRole textRole) const
       
   634 
       
   635     Draws the given \a text in the specified \a rectangle using the
       
   636     provided \a painter and \a palette.
       
   637 
       
   638     Text is drawn using the painter's pen. If an explicit \a textRole
       
   639     is specified, then the text is drawn using the \a palette's color
       
   640     for the specified role.  The \a enabled value indicates whether or
       
   641     not the item is enabled; when reimplementing, this value should
       
   642     influence how the item is drawn.
       
   643 
       
   644     The text is aligned and wrapped according to the specified \a
       
   645     alignment.
       
   646 
       
   647     \sa Qt::Alignment
       
   648 */
       
   649 void QCleanlooksStyle::drawItemText(QPainter *painter, const QRect &rect, int alignment, const QPalette &pal,
       
   650                                     bool enabled, const QString& text, QPalette::ColorRole textRole) const
       
   651 {
       
   652     if (text.isEmpty())
       
   653         return;
       
   654 
       
   655     QPen savedPen = painter->pen();
       
   656     if (textRole != QPalette::NoRole) {
       
   657         painter->setPen(QPen(pal.brush(textRole), savedPen.widthF()));
       
   658     }
       
   659     if (!enabled) {
       
   660         QPen pen = painter->pen();
       
   661         painter->setPen(pen);
       
   662     }
       
   663     painter->drawText(rect, alignment, text);
       
   664     painter->setPen(savedPen);
       
   665 }
       
   666 
       
   667 static QColor mergedColors(const QColor &colorA, const QColor &colorB, int factor = 50)
       
   668 {
       
   669     const int maxFactor = 100;
       
   670     QColor tmp = colorA;
       
   671     tmp.setRed((tmp.red() * factor) / maxFactor + (colorB.red() * (maxFactor - factor)) / maxFactor);
       
   672     tmp.setGreen((tmp.green() * factor) / maxFactor + (colorB.green() * (maxFactor - factor)) / maxFactor);
       
   673     tmp.setBlue((tmp.blue() * factor) / maxFactor + (colorB.blue() * (maxFactor - factor)) / maxFactor);
       
   674     return tmp;
       
   675 }
       
   676 
       
   677 /*!
       
   678     \reimp
       
   679 */
       
   680 void QCleanlooksStyle::drawPrimitive(PrimitiveElement elem,
       
   681                         const QStyleOption *option,
       
   682                         QPainter *painter, const QWidget *widget) const
       
   683 {
       
   684     Q_ASSERT(option);
       
   685     QRect rect = option->rect;
       
   686     int state = option->state;
       
   687     QColor button = option->palette.button().color();
       
   688     QColor buttonShadow = option->palette.button().color().darker(110);
       
   689     QColor buttonShadowAlpha = buttonShadow;
       
   690     buttonShadowAlpha.setAlpha(128);
       
   691     QColor darkOutline;
       
   692     QColor dark;
       
   693     darkOutline.setHsv(button.hue(),
       
   694                 CL_MIN(255, (int)(button.saturation()*3.0)),
       
   695                 CL_MIN(255, (int)(button.value()*0.6)));
       
   696     dark.setHsv(button.hue(),
       
   697                 CL_MIN(255, (int)(button.saturation()*1.9)),
       
   698                 CL_MIN(255, (int)(button.value()*0.7)));
       
   699     QColor tabFrameColor = mergedColors(option->palette.background().color(),
       
   700                                                 dark.lighter(135), 60);
       
   701 
       
   702     switch(elem) {
       
   703 #ifndef QT_NO_TABBAR
       
   704     case PE_FrameTabBarBase:
       
   705         if (const QStyleOptionTabBarBase *tbb
       
   706                 = qstyleoption_cast<const QStyleOptionTabBarBase *>(option)) {
       
   707             painter->save();
       
   708             painter->setPen(QPen(darkOutline.lighter(110), 0));
       
   709             switch (tbb->shape) {
       
   710             case QTabBar::RoundedNorth: {
       
   711                 QRegion region(tbb->rect);
       
   712                 region -= tbb->selectedTabRect;
       
   713                 painter->drawLine(tbb->rect.topLeft(), tbb->rect.topRight());
       
   714                 painter->setClipRegion(region);
       
   715                 painter->setPen(option->palette.light().color());
       
   716                 painter->drawLine(tbb->rect.topLeft() + QPoint(0, 1),
       
   717                                   tbb->rect.topRight()  + QPoint(0, 1));
       
   718             }
       
   719                 break;
       
   720             case QTabBar::RoundedWest:
       
   721                 painter->drawLine(tbb->rect.left(), tbb->rect.top(), tbb->rect.left(), tbb->rect.bottom());
       
   722                 break;
       
   723             case QTabBar::RoundedSouth:
       
   724                 painter->drawLine(tbb->rect.left(), tbb->rect.bottom(),
       
   725                             tbb->rect.right(), tbb->rect.bottom());
       
   726                 break;
       
   727             case QTabBar::RoundedEast:
       
   728                 painter->drawLine(tbb->rect.topRight(), tbb->rect.bottomRight());
       
   729                 break;
       
   730             case QTabBar::TriangularNorth:
       
   731             case QTabBar::TriangularEast:
       
   732             case QTabBar::TriangularWest:
       
   733             case QTabBar::TriangularSouth:
       
   734                 painter->restore();
       
   735                 QWindowsStyle::drawPrimitive(elem, option, painter, widget);
       
   736                 return;
       
   737             }
       
   738             painter->restore();
       
   739         }
       
   740         return;
       
   741 #endif // QT_NO_TABBAR
       
   742     case PE_IndicatorViewItemCheck:
       
   743         {
       
   744             QStyleOptionButton button;
       
   745             button.QStyleOption::operator=(*option);
       
   746             button.state &= ~State_MouseOver;
       
   747             proxy()->drawPrimitive(PE_IndicatorCheckBox, &button, painter, widget);
       
   748         }
       
   749         return;
       
   750     case PE_IndicatorHeaderArrow:
       
   751         if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(option)) {
       
   752             QRect r = header->rect;
       
   753             QImage arrow;
       
   754             if (header->sortIndicator & QStyleOptionHeader::SortUp)
       
   755                 arrow = QImage(qt_cleanlooks_arrow_up_xpm);
       
   756             else if (header->sortIndicator & QStyleOptionHeader::SortDown)
       
   757                 arrow = QImage(qt_cleanlooks_arrow_down_xpm);
       
   758             if (!arrow.isNull()) {
       
   759                 r.setSize(arrow.size());
       
   760                 r.moveCenter(header->rect.center());
       
   761                 arrow.setColor(1, header->palette.foreground().color().rgba());
       
   762                 painter->drawImage(r, arrow);
       
   763             }
       
   764         }
       
   765         break;
       
   766     case PE_IndicatorButtonDropDown:
       
   767         proxy()->drawPrimitive(PE_PanelButtonCommand, option, painter, widget);
       
   768         break;
       
   769     case PE_IndicatorToolBarSeparator:
       
   770         {
       
   771             QRect rect = option->rect;
       
   772             const int margin = 6;
       
   773             if (option->state & State_Horizontal) {
       
   774                 const int offset = rect.width()/2;
       
   775                 painter->setPen(QPen(option->palette.background().color().darker(110)));
       
   776                 painter->drawLine(rect.bottomLeft().x() + offset,
       
   777                             rect.bottomLeft().y() - margin,
       
   778                             rect.topLeft().x() + offset,
       
   779                             rect.topLeft().y() + margin);
       
   780                 painter->setPen(QPen(option->palette.background().color().lighter(110)));
       
   781                 painter->drawLine(rect.bottomLeft().x() + offset + 1,
       
   782                             rect.bottomLeft().y() - margin,
       
   783                             rect.topLeft().x() + offset + 1,
       
   784                             rect.topLeft().y() + margin);
       
   785             } else { //Draw vertical separator
       
   786                 const int offset = rect.height()/2;
       
   787                 painter->setPen(QPen(option->palette.background().color().darker(110)));
       
   788                 painter->drawLine(rect.topLeft().x() + margin ,
       
   789                             rect.topLeft().y() + offset,
       
   790                             rect.topRight().x() - margin,
       
   791                             rect.topRight().y() + offset);
       
   792                 painter->setPen(QPen(option->palette.background().color().lighter(110)));
       
   793                 painter->drawLine(rect.topLeft().x() + margin ,
       
   794                             rect.topLeft().y() + offset + 1,
       
   795                             rect.topRight().x() - margin,
       
   796                             rect.topRight().y() + offset + 1);
       
   797             }
       
   798         }
       
   799         break;
       
   800     case PE_Frame:
       
   801         painter->save();
       
   802         painter->setPen(dark.lighter(108));
       
   803         painter->drawRect(option->rect.adjusted(0, 0, -1, -1));
       
   804         painter->restore();
       
   805         break;
       
   806     case PE_FrameMenu:
       
   807         painter->save();
       
   808         {
       
   809             painter->setPen(QPen(darkOutline, 1));
       
   810             painter->drawRect(option->rect.adjusted(0, 0, -1, -1));
       
   811             QColor frameLight = option->palette.background().color().lighter(160);
       
   812             QColor frameShadow = option->palette.background().color().darker(110);
       
   813 
       
   814             //paint beveleffect
       
   815             QRect frame = option->rect.adjusted(1, 1, -1, -1);
       
   816             painter->setPen(frameLight);
       
   817             painter->drawLine(frame.topLeft(), frame.bottomLeft());
       
   818             painter->drawLine(frame.topLeft(), frame.topRight());
       
   819 
       
   820             painter->setPen(frameShadow);
       
   821             painter->drawLine(frame.topRight(), frame.bottomRight());
       
   822             painter->drawLine(frame.bottomLeft(), frame.bottomRight());
       
   823         }
       
   824         painter->restore();
       
   825         break;
       
   826     case PE_FrameDockWidget:
       
   827 
       
   828         painter->save();
       
   829         {
       
   830             QColor softshadow = option->palette.background().color().darker(120);
       
   831 
       
   832             QRect rect= option->rect;
       
   833             painter->setPen(softshadow);
       
   834             painter->drawRect(option->rect.adjusted(0, 0, -1, -1));
       
   835             painter->setPen(QPen(option->palette.light(), 0));
       
   836             painter->drawLine(QPoint(rect.left() + 1, rect.top() + 1), QPoint(rect.left() + 1, rect.bottom() - 1));
       
   837             painter->setPen(QPen(option->palette.background().color().darker(120), 0));
       
   838             painter->drawLine(QPoint(rect.left() + 1, rect.bottom() - 1), QPoint(rect.right() - 2, rect.bottom() - 1));
       
   839             painter->drawLine(QPoint(rect.right() - 1, rect.top() + 1), QPoint(rect.right() - 1, rect.bottom() - 1));
       
   840 
       
   841         }
       
   842         painter->restore();
       
   843         break;
       
   844     case PE_PanelButtonTool:
       
   845         painter->save();
       
   846         if ((option->state & State_Enabled || option->state & State_On) || !(option->state & State_AutoRaise)) {
       
   847             QRect rect = option->rect;
       
   848             QPen oldPen = painter->pen();
       
   849 
       
   850             if (widget && widget->inherits("QDockWidgetTitleButton")) {
       
   851                    if (option->state & State_MouseOver)
       
   852                        proxy()->drawPrimitive(PE_PanelButtonCommand, option, painter, widget);
       
   853             } else {
       
   854                 proxy()->drawPrimitive(PE_PanelButtonCommand, option, painter, widget);
       
   855             }
       
   856         }
       
   857         painter->restore();
       
   858         break;
       
   859     case PE_IndicatorDockWidgetResizeHandle:
       
   860         {
       
   861             QStyleOption dockWidgetHandle = *option;
       
   862             bool horizontal = option->state & State_Horizontal;
       
   863             if (horizontal)
       
   864                 dockWidgetHandle.state &= ~State_Horizontal;
       
   865             else
       
   866                 dockWidgetHandle.state |= State_Horizontal;
       
   867             proxy()->drawControl(CE_Splitter, &dockWidgetHandle, painter, widget);
       
   868         }
       
   869         break;
       
   870     case PE_FrameWindow:
       
   871         painter->save();
       
   872         {
       
   873             QRect rect= option->rect;
       
   874             painter->setPen(QPen(dark.darker(150), 0));
       
   875             painter->drawRect(option->rect.adjusted(0, 0, -1, -1));
       
   876             painter->setPen(QPen(option->palette.light(), 0));
       
   877             painter->drawLine(QPoint(rect.left() + 1, rect.top() + 1),
       
   878                               QPoint(rect.left() + 1, rect.bottom() - 1));
       
   879             painter->setPen(QPen(option->palette.background().color().darker(120), 0));
       
   880             painter->drawLine(QPoint(rect.left() + 1, rect.bottom() - 1),
       
   881                               QPoint(rect.right() - 2, rect.bottom() - 1));
       
   882             painter->drawLine(QPoint(rect.right() - 1, rect.top() + 1),
       
   883                               QPoint(rect.right() - 1, rect.bottom() - 1));
       
   884         }
       
   885         painter->restore();
       
   886         break;
       
   887 #ifndef QT_NO_LINEDIT
       
   888     case PE_FrameLineEdit:
       
   889         // fall through
       
   890 #endif // QT_NO_LINEEDIT
       
   891 #ifdef QT3_SUPPORT
       
   892         if (widget && widget->inherits("Q3ToolBar")) {
       
   893             proxy()->drawPrimitive(PE_Q3Separator, option, painter, widget);
       
   894             break;
       
   895         }
       
   896 #endif
       
   897         {
       
   898             QPen oldPen = painter->pen();
       
   899             if (option->state & State_Enabled) {
       
   900                 painter->setPen(QPen(option->palette.background(), 0));
       
   901                 painter->drawRect(rect.adjusted(0, 0, 0, 0));
       
   902                 painter->drawRect(rect.adjusted(1, 1, -1, -1));
       
   903             } else {
       
   904                 painter->fillRect(rect, option->palette.background());
       
   905             }
       
   906             QRect r = rect.adjusted(0, 1, 0, -1);
       
   907             painter->setPen(buttonShadowAlpha);
       
   908             painter->drawLine(QPoint(r.left() + 2, r.top() - 1), QPoint(r.right() - 2, r.top() - 1));
       
   909             const QPoint points[8] = {
       
   910                 QPoint(r.right() - 1, r.top()),
       
   911                 QPoint(r.right(), r.top() + 1),
       
   912                 QPoint(r.right() - 1, r.bottom()),
       
   913                 QPoint(r.right(), r.bottom() - 1),
       
   914                 QPoint(r.left() + 1, r.top() ),
       
   915                 QPoint(r.left(), r.top() + 1),
       
   916                 QPoint(r.left() + 1, r.bottom() ),
       
   917                 QPoint(r.left(), r.bottom() - 1)
       
   918             };
       
   919             painter->drawPoints(points, 8);
       
   920             painter->setPen(QPen(option->palette.background().color(), 1));
       
   921             painter->drawLine(QPoint(r.left() + 2, r.top() + 1), QPoint(r.right() - 2, r.top() + 1));
       
   922 
       
   923             if (option->state & State_HasFocus) {
       
   924                 QColor darkoutline = option->palette.highlight().color().darker(150);
       
   925                 QColor innerline = mergedColors(option->palette.highlight().color(), Qt::white);
       
   926                 painter->setPen(QPen(innerline, 0));
       
   927                 painter->drawRect(rect.adjusted(1, 2, -2, -3));
       
   928                 painter->setPen(QPen(darkoutline, 0));
       
   929             }
       
   930             else {
       
   931                 QColor highlight = Qt::white;
       
   932                 highlight.setAlpha(130);
       
   933                 painter->setPen(option->palette.base().color().darker(120));
       
   934                 painter->drawLine(QPoint(r.left() + 1, r.top() + 1),
       
   935                                   QPoint(r.right() - 1, r.top() + 1));
       
   936                 painter->drawLine(QPoint(r.left() + 1, r.top() + 1),
       
   937                                   QPoint(r.left() + 1, r.bottom() - 1));
       
   938                 painter->setPen(option->palette.base().color());
       
   939                 painter->drawLine(QPoint(r.right() - 1, r.top() + 1),
       
   940                                   QPoint(r.right() - 1, r.bottom() - 1));
       
   941                 painter->setPen(highlight);
       
   942                 painter->drawLine(QPoint(r.left() + 1, r.bottom() + 1),
       
   943                                   QPoint(r.right() - 1, r.bottom() + 1));
       
   944                 painter->drawPoint(QPoint(r.left(), r.bottom()));
       
   945                 painter->drawPoint(QPoint(r.right(), r.bottom() ));
       
   946                 painter->setPen(QPen(darkOutline.lighter(115), 1));
       
   947             }
       
   948             painter->drawLine(QPoint(r.left(), r.top() + 2), QPoint(r.left(), r.bottom() - 2));
       
   949             painter->drawLine(QPoint(r.right(), r.top() + 2), QPoint(r.right(), r.bottom() - 2));
       
   950             painter->drawLine(QPoint(r.left() + 2, r.bottom()), QPoint(r.right() - 2, r.bottom()));
       
   951             const QPoint points2[4] = {
       
   952                 QPoint(r.right() - 1, r.bottom() - 1),
       
   953                 QPoint(r.right() - 1, r.top() + 1),
       
   954                 QPoint(r.left() + 1, r.bottom() - 1),
       
   955                 QPoint(r.left() + 1, r.top() + 1)
       
   956             };
       
   957             painter->drawPoints(points2, 4);
       
   958             painter->drawLine(QPoint(r.left() + 2, r.top()), QPoint(r.right() - 2, r.top()));
       
   959             painter->setPen(oldPen);
       
   960         }
       
   961         break;
       
   962     case PE_IndicatorCheckBox:
       
   963         painter->save();
       
   964         if (const QStyleOptionButton *checkbox = qstyleoption_cast<const QStyleOptionButton*>(option)) {
       
   965             QRect checkRect;
       
   966             checkRect.setX(rect.left() );
       
   967             checkRect.setY(rect.top() );
       
   968             checkRect.setWidth(rect.width() - 1);
       
   969             checkRect.setHeight(rect.height() - 1);
       
   970             if (state & State_Sunken)
       
   971                 painter->setBrush(dark.lighter(130));
       
   972             else
       
   973                 painter->setBrush(option->palette.base());
       
   974             painter->setPen(QPen(dark.lighter(110), 0));
       
   975             painter->drawRect(checkRect);
       
   976             if (checkbox->state & (State_On | State_Sunken  | State_NoChange)) {
       
   977                 QImage image(qt_cleanlooks_checkbox_checked);
       
   978                 QColor fillColor = option->palette.text().color();
       
   979                 image.setColor(1, fillColor.rgba()); 
       
   980                 fillColor.setAlpha(100);
       
   981                 image.setColor(2, fillColor.rgba()); 
       
   982                 painter->drawImage(rect, image);
       
   983                 if (checkbox->state & State_NoChange) {
       
   984                     QColor bgc = option->palette.background().color();
       
   985                     bgc.setAlpha(127);
       
   986                     painter->fillRect(checkRect.adjusted(1, 1, -1, -1), bgc);
       
   987                 }
       
   988             }
       
   989         }
       
   990         painter->restore();
       
   991         break;
       
   992     case PE_IndicatorRadioButton:
       
   993         painter->save();
       
   994         {
       
   995             painter->setRenderHint(QPainter::SmoothPixmapTransform);
       
   996             QRect checkRect = rect.adjusted(0, 0, 0, 0);
       
   997             if (state & (State_On )) {
       
   998                 painter->drawImage(rect, QImage(qt_cleanlooks_radiobutton));
       
   999                 painter->drawImage(checkRect, QImage(qt_cleanlooks_radiobutton_checked));
       
  1000             }
       
  1001             else if (state & State_Sunken) {
       
  1002                 painter->drawImage(rect, QImage(qt_cleanlooks_radiobutton));
       
  1003                 QColor bgc = buttonShadow;
       
  1004                 painter->setRenderHint(QPainter::Antialiasing);
       
  1005                 painter->setBrush(bgc);
       
  1006                 painter->setPen(Qt::NoPen);
       
  1007                 painter->drawEllipse(rect.adjusted(1, 1, -1, -1));                }
       
  1008             else {
       
  1009                 painter->drawImage(rect, QImage(qt_cleanlooks_radiobutton));
       
  1010             }
       
  1011         }
       
  1012         painter->restore();
       
  1013     break;
       
  1014     case PE_IndicatorToolBarHandle:
       
  1015         painter->save();
       
  1016         if (option->state & State_Horizontal) {
       
  1017             for (int i = rect.height()/5; i <= 4*(rect.height()/5) ; ++i) {
       
  1018                 int y = rect.topLeft().y() + i + 1;
       
  1019                 int x1 = rect.topLeft().x() + 3;
       
  1020                 int x2 = rect.topRight().x() - 2;
       
  1021 
       
  1022                 if (i % 2 == 0)
       
  1023                     painter->setPen(QPen(option->palette.light(), 0));
       
  1024                 else
       
  1025                     painter->setPen(QPen(dark.lighter(110), 0));
       
  1026                 painter->drawLine(x1, y, x2, y);
       
  1027             }
       
  1028         }
       
  1029         else { //vertical toolbar
       
  1030             for (int i = rect.width()/5; i <= 4*(rect.width()/5) ; ++i) {
       
  1031                 int x = rect.topLeft().x() + i + 1;
       
  1032                 int y1 = rect.topLeft().y() + 3;
       
  1033                 int y2 = rect.topLeft().y() + 5;
       
  1034 
       
  1035                 if (i % 2 == 0)
       
  1036                     painter->setPen(QPen(option->palette.light(), 0));
       
  1037                 else
       
  1038                     painter->setPen(QPen(dark.lighter(110), 0));
       
  1039                 painter->drawLine(x, y1, x, y2);
       
  1040             }
       
  1041         }
       
  1042         painter->restore();
       
  1043         break;
       
  1044     case PE_FrameDefaultButton:
       
  1045         case PE_FrameFocusRect:
       
  1046         if (const QStyleOptionFocusRect *focusFrame = qstyleoption_cast<const QStyleOptionFocusRect *>(option)) {
       
  1047             if (!(focusFrame->state & State_KeyboardFocusChange))
       
  1048                 return;
       
  1049             QRect rect = focusFrame->rect;
       
  1050             painter->save();
       
  1051             painter->setBackgroundMode(Qt::TransparentMode);
       
  1052             painter->setBrush(QBrush(dark.darker(120), Qt::Dense4Pattern));
       
  1053             painter->setBrushOrigin(rect.topLeft());
       
  1054             painter->setPen(Qt::NoPen);
       
  1055             const QRect rects[4] = {
       
  1056                 QRect(rect.left(), rect.top(), rect.width(), 1),    // Top
       
  1057                 QRect(rect.left(), rect.bottom(), rect.width(), 1), // Bottom
       
  1058                 QRect(rect.left(), rect.top(), 1, rect.height()),   // Left
       
  1059                 QRect(rect.right(), rect.top(), 1, rect.height())   // Right
       
  1060             };
       
  1061             painter->drawRects(rects, 4);
       
  1062             painter->restore();
       
  1063         }
       
  1064         break;
       
  1065     case PE_PanelButtonCommand:
       
  1066         {
       
  1067             bool isDefault = false;
       
  1068             bool isFlat = false;
       
  1069             bool isDown = (option->state & State_Sunken) || (option->state & State_On);
       
  1070             QPen oldPen = painter->pen();
       
  1071             QBrush oldBrush = painter->brush();
       
  1072             QRect r;
       
  1073 
       
  1074             if (const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton*>(option)) {
       
  1075                 isDefault = (button->features & QStyleOptionButton::DefaultButton) && (button->state & State_Enabled);
       
  1076                 isFlat = (button->features & QStyleOptionButton::Flat);
       
  1077             }
       
  1078 
       
  1079             if (isFlat && !isDown) {
       
  1080                 if (isDefault) {
       
  1081                     r = option->rect.adjusted(0, 1, 0, -1);
       
  1082                     painter->setPen(QPen(Qt::black, 0));
       
  1083                     const QLine lines[4] = {
       
  1084                         QLine(QPoint(r.left() + 2, r.top()),
       
  1085                               QPoint(r.right() - 2, r.top())),
       
  1086                         QLine(QPoint(r.left(), r.top() + 2),
       
  1087                               QPoint(r.left(), r.bottom() - 2)),
       
  1088                         QLine(QPoint(r.right(), r.top() + 2),
       
  1089                               QPoint(r.right(), r.bottom() - 2)),
       
  1090                         QLine(QPoint(r.left() + 2, r.bottom()),
       
  1091                               QPoint(r.right() - 2, r.bottom()))
       
  1092                     };
       
  1093                     painter->drawLines(lines, 4);
       
  1094                     const QPoint points[4] = {
       
  1095                         QPoint(r.right() - 1, r.bottom() - 1),
       
  1096                         QPoint(r.right() - 1, r.top() + 1),
       
  1097                         QPoint(r.left() + 1, r.bottom() - 1),
       
  1098                         QPoint(r.left() + 1, r.top() + 1)
       
  1099                     };
       
  1100                     painter->drawPoints(points, 4);
       
  1101                     painter->setPen(oldPen);
       
  1102                 }
       
  1103                 return;
       
  1104             }
       
  1105 
       
  1106             BEGIN_STYLE_PIXMAPCACHE(QString::fromLatin1("pushbutton-%1").arg(isDefault))
       
  1107             r = rect.adjusted(0, 1, 0, -1);
       
  1108 
       
  1109             bool isEnabled = (option->state & State_Enabled);
       
  1110 
       
  1111             QColor highlightedGradientStartColor = option->palette.button().color().lighter(107);
       
  1112             QColor highlightedGradientMidColor = option->palette.button().color().lighter(105);
       
  1113             QColor highlightedGradientStopColor = buttonShadow.lighter(107);
       
  1114             QColor gradientStartColor = option->palette.button().color().lighter(108);
       
  1115 
       
  1116             QColor buttonColor = option->palette.button().color();
       
  1117             QColor gradientMidColor = option->palette.button().color();
       
  1118             QColor gradientStopColor;
       
  1119             gradientStopColor.setHsv(buttonColor.hue(),
       
  1120                                      CL_MIN(255, (int)(buttonColor.saturation()*1.9)),
       
  1121                                      CL_MIN(255, (int)(buttonColor.value()*0.96)));
       
  1122 
       
  1123             QRect gradRect = rect.adjusted(1, 2, -1, -2);
       
  1124             // gradient fill
       
  1125             QRect innerBorder = r.adjusted(1, 1, -1, 0);
       
  1126 
       
  1127             if (isDown) {
       
  1128                 QBrush fillColor = gradientStopColor.darker(110);
       
  1129                 if (option->palette.button().gradient())
       
  1130                     fillColor = option->palette.button();
       
  1131                 p->fillRect(gradRect, fillColor);
       
  1132                 p->setPen(gradientStopColor.darker(125));
       
  1133                 p->drawLine(innerBorder.topLeft(), innerBorder.topRight());
       
  1134                 p->drawLine(innerBorder.topLeft(), innerBorder.bottomLeft());
       
  1135             } else {
       
  1136                 if (isEnabled && option->state & State_MouseOver ) {
       
  1137                     qt_cleanlooks_draw_buttongradient(p, gradRect,
       
  1138                                                 highlightedGradientStartColor,
       
  1139                                                 highlightedGradientMidColor,
       
  1140                                                 highlightedGradientStopColor, TopDown, option->palette.button());
       
  1141                 } else {
       
  1142                     qt_cleanlooks_draw_buttongradient(p, gradRect,
       
  1143                                                 gradientStartColor,
       
  1144                                                 gradientMidColor,
       
  1145                                                 gradientStopColor, TopDown, option->palette.button());
       
  1146                 }
       
  1147             }
       
  1148 
       
  1149             bool hasFocus = option->state & State_HasFocus;
       
  1150 
       
  1151             if (!isEnabled)
       
  1152                 p->setPen(QPen(dark.lighter(115)));
       
  1153             else if (isDefault)
       
  1154                 p->setPen(QPen(Qt::black, 1));
       
  1155             else
       
  1156                 p->setPen(QPen(darkOutline, 1));
       
  1157 
       
  1158             p->drawLine(QPoint(r.left(), r.top() + 2),
       
  1159                               QPoint(r.left(), r.bottom() - 2));
       
  1160             p->drawLine(QPoint(r.right(), r.top() + 2),
       
  1161                               QPoint(r.right(), r.bottom() - 2));
       
  1162             p->drawLine(QPoint(r.left() + 2, r.bottom()),
       
  1163                               QPoint(r.right() - 2, r.bottom()));
       
  1164             const QPoint points[4] = {
       
  1165                 QPoint(r.right() - 1, r.bottom() - 1),
       
  1166                 QPoint(r.right() - 1, r.top() + 1),
       
  1167                 QPoint(r.left() + 1, r.bottom() - 1),
       
  1168                 QPoint(r.left() + 1, r.top() + 1)
       
  1169             };
       
  1170             p->drawPoints(points, 4);
       
  1171 
       
  1172             if (!isDefault && !hasFocus && isEnabled)
       
  1173                 p->setPen(QPen(darkOutline.darker(110), 0));
       
  1174 
       
  1175             p->drawLine(QPoint(r.left() + 2, r.top()),
       
  1176                               QPoint(r.right() - 2, r.top()));
       
  1177 
       
  1178             QColor highlight = Qt::white;
       
  1179             highlight.setAlpha(110);
       
  1180             p->setPen(highlight);
       
  1181             p->drawLine(QPoint(r.left() + 1, r.top() + 2),
       
  1182                               QPoint(r.left() + 1, r.bottom() - 2));
       
  1183             p->drawLine(QPoint(r.left() + 3, r.bottom() + 1),
       
  1184                               QPoint(r.right() - 3, r.bottom() + 1));
       
  1185 
       
  1186             QColor topShadow = darkOutline;
       
  1187             topShadow.setAlpha(60);
       
  1188 
       
  1189             p->setPen(topShadow);
       
  1190             const QPoint points2[8] = {
       
  1191                 QPoint(r.right(), r.top() + 1),
       
  1192                 QPoint(r.right() - 1, r.top() ),
       
  1193                 QPoint(r.right(), r.bottom() - 1),
       
  1194                 QPoint(r.right() - 1, r.bottom() ),
       
  1195                 QPoint(r.left() + 1, r.bottom()),
       
  1196                 QPoint(r.left(), r.bottom() - 1),
       
  1197                 QPoint(r.left() + 1, r.top()),
       
  1198                 QPoint(r.left(), r.top() + 1)
       
  1199             };
       
  1200             p->drawPoints(points2, 8);
       
  1201 
       
  1202             topShadow.setAlpha(30);
       
  1203             p->setPen(topShadow);
       
  1204 
       
  1205             p->drawLine(QPoint(r.right() - 1, r.top() + 2),
       
  1206                               QPoint(r.right() - 1, r.bottom() - 2));
       
  1207             p->drawLine(QPoint(r.left() + 2, r.top() - 1),
       
  1208                               QPoint(r.right() - 2, r.top() - 1));
       
  1209 
       
  1210             if (isDefault) {
       
  1211                 r.adjust(-1, -1, 1, 1);
       
  1212                 p->setPen(buttonShadowAlpha.darker(120));
       
  1213                 const QLine lines[4] = {
       
  1214                     QLine(r.topLeft() + QPoint(3, 0), r.topRight() - QPoint(3, 0)),
       
  1215                     QLine(r.bottomLeft() + QPoint(3, 0), r.bottomRight() - QPoint(3, 0)),
       
  1216                     QLine(r.topLeft() + QPoint(0, 3), r.bottomLeft() - QPoint(0, 3)),
       
  1217                     QLine(r.topRight() + QPoint(0, 3), r.bottomRight() - QPoint(0, 3))
       
  1218                 };
       
  1219                 p->drawLines(lines, 4);
       
  1220                 const QPoint points3[8] = {
       
  1221                     r.topRight() + QPoint(-2, 1),
       
  1222                     r.topRight() + QPoint(-1, 2),
       
  1223                     r.bottomRight() + QPoint(-1, -2),
       
  1224                     r.bottomRight() + QPoint(-2, -1),
       
  1225                     r.topLeft() + QPoint(1, 2),
       
  1226                     r.topLeft() + QPoint(2, 1),
       
  1227                     r.bottomLeft() + QPoint(1, -2),
       
  1228                     r.bottomLeft() + QPoint(2, -1)
       
  1229                 };
       
  1230                 p->drawPoints(points3, 8);
       
  1231             }
       
  1232             painter->setPen(oldPen);
       
  1233             painter->setBrush(oldBrush);
       
  1234             END_STYLE_PIXMAPCACHE
       
  1235         }
       
  1236         break;
       
  1237 #ifndef QT_NO_TABBAR
       
  1238         case PE_FrameTabWidget:
       
  1239             painter->save();
       
  1240         {
       
  1241             painter->fillRect(option->rect, tabFrameColor);
       
  1242         }
       
  1243 #ifndef QT_NO_TABWIDGET
       
  1244         if (const QStyleOptionTabWidgetFrame *twf = qstyleoption_cast<const QStyleOptionTabWidgetFrame *>(option)) {
       
  1245             QColor borderColor = darkOutline.lighter(110);
       
  1246             QColor alphaCornerColor = mergedColors(borderColor, option->palette.background().color());
       
  1247             QColor innerShadow = mergedColors(borderColor, option->palette.base().color());
       
  1248 
       
  1249             int borderThickness = proxy()->pixelMetric(PM_TabBarBaseOverlap, twf, widget);
       
  1250             bool reverse = (twf->direction == Qt::RightToLeft);
       
  1251             QRect tabBarRect;
       
  1252 
       
  1253             switch (twf->shape) {
       
  1254             case QTabBar::RoundedNorth:
       
  1255                 if (reverse) {
       
  1256                     tabBarRect = QRect(twf->rect.right() - twf->leftCornerWidgetSize.width()
       
  1257                                        - twf->tabBarSize.width() + 1,
       
  1258                                        twf->rect.top(),
       
  1259                                        twf->tabBarSize.width(), borderThickness);
       
  1260                 } else {
       
  1261                     tabBarRect = QRect(twf->rect.left() + twf->leftCornerWidgetSize.width(),
       
  1262                                        twf->rect.top(),
       
  1263                                        twf->tabBarSize.width(), borderThickness);
       
  1264                 }
       
  1265                 break ;
       
  1266             case QTabBar::RoundedWest:
       
  1267                 tabBarRect = QRect(twf->rect.left(),
       
  1268                                    twf->rect.top() + twf->leftCornerWidgetSize.height(),
       
  1269                                    borderThickness,
       
  1270                                    twf->tabBarSize.height());
       
  1271                 tabBarRect = tabBarRect; //adjust
       
  1272                 break ;
       
  1273             case QTabBar::RoundedEast:
       
  1274                 tabBarRect = QRect(twf->rect.right() - borderThickness + 1,
       
  1275                                    twf->rect.top()  + twf->leftCornerWidgetSize.height(),
       
  1276                                    0,
       
  1277                                    twf->tabBarSize.height());
       
  1278                 break ;
       
  1279             case QTabBar::RoundedSouth:
       
  1280                 if (reverse) {
       
  1281                     tabBarRect = QRect(twf->rect.right() - twf->leftCornerWidgetSize.width() - twf->tabBarSize.width() + 1,
       
  1282                                        twf->rect.bottom() + 1,
       
  1283                                        twf->tabBarSize.width(),
       
  1284                                        borderThickness);
       
  1285                 } else {
       
  1286                     tabBarRect = QRect(twf->rect.left() + twf->leftCornerWidgetSize.width(),
       
  1287                                        twf->rect.bottom() + 1,
       
  1288                                        twf->tabBarSize.width(),
       
  1289                                        borderThickness);
       
  1290                 }
       
  1291                 break;
       
  1292             default:
       
  1293                 break;
       
  1294             }
       
  1295 
       
  1296             QRegion region(twf->rect);
       
  1297             region -= tabBarRect;
       
  1298             painter->setClipRegion(region);
       
  1299 
       
  1300             // Outer border
       
  1301             QLine leftLine = QLine(twf->rect.topLeft() + QPoint(0, 2), twf->rect.bottomLeft() - QPoint(0, 2));
       
  1302             QLine rightLine = QLine(twf->rect.topRight(), twf->rect.bottomRight() - QPoint(0, 2));
       
  1303             QLine bottomLine = QLine(twf->rect.bottomLeft() + QPoint(2, 0), twf->rect.bottomRight() - QPoint(2, 0));
       
  1304             QLine topLine = QLine(twf->rect.topLeft(), twf->rect.topRight());
       
  1305 
       
  1306             painter->setPen(borderColor);
       
  1307             painter->drawLine(topLine);
       
  1308 
       
  1309             // Inner border
       
  1310             QLine innerLeftLine = QLine(leftLine.p1() + QPoint(1, 0), leftLine.p2() + QPoint(1, 0));
       
  1311             QLine innerRightLine = QLine(rightLine.p1() - QPoint(1, -1), rightLine.p2() - QPoint(1, 0));
       
  1312             QLine innerBottomLine = QLine(bottomLine.p1() - QPoint(0, 1), bottomLine.p2() - QPoint(0, 1));
       
  1313             QLine innerTopLine = QLine(topLine.p1() + QPoint(0, 1), topLine.p2() + QPoint(-1, 1));
       
  1314 
       
  1315             // Rounded Corner
       
  1316             QPoint leftBottomOuterCorner = QPoint(innerLeftLine.p2() + QPoint(0, 1));
       
  1317             QPoint leftBottomInnerCorner1 = QPoint(leftLine.p2() + QPoint(0, 1));
       
  1318             QPoint leftBottomInnerCorner2 = QPoint(bottomLine.p1() - QPoint(1, 0));
       
  1319             QPoint rightBottomOuterCorner = QPoint(innerRightLine.p2() + QPoint(0, 1));
       
  1320             QPoint rightBottomInnerCorner1 = QPoint(rightLine.p2() + QPoint(0, 1));
       
  1321             QPoint rightBottomInnerCorner2 = QPoint(bottomLine.p2() + QPoint(1, 0));
       
  1322             QPoint leftTopOuterCorner = QPoint(innerLeftLine.p1() - QPoint(0, 1));
       
  1323             QPoint leftTopInnerCorner1 = QPoint(leftLine.p1() - QPoint(0, 1));
       
  1324             QPoint leftTopInnerCorner2 = QPoint(topLine.p1() - QPoint(1, 0));
       
  1325 
       
  1326             painter->setPen(borderColor);
       
  1327             painter->drawLine(leftLine);
       
  1328             painter->drawLine(rightLine);
       
  1329             painter->drawLine(bottomLine);
       
  1330             painter->drawPoint(leftBottomOuterCorner);
       
  1331             painter->drawPoint(rightBottomOuterCorner);
       
  1332             painter->drawPoint(leftTopOuterCorner);
       
  1333 
       
  1334             painter->setPen(option->palette.light().color());
       
  1335             painter->drawLine(innerLeftLine);
       
  1336             painter->drawLine(innerTopLine);
       
  1337 
       
  1338             painter->setPen(buttonShadowAlpha);
       
  1339             painter->drawLine(innerRightLine);
       
  1340             painter->drawLine(innerBottomLine);
       
  1341 
       
  1342             painter->setPen(alphaCornerColor);
       
  1343             const QPoint points[6] = {
       
  1344                 leftBottomInnerCorner1,
       
  1345                 leftBottomInnerCorner2,
       
  1346                 rightBottomInnerCorner1,
       
  1347                 rightBottomInnerCorner2,
       
  1348                 leftTopInnerCorner1,
       
  1349                 leftTopInnerCorner2
       
  1350             };
       
  1351             painter->drawPoints(points, 6);
       
  1352         }
       
  1353 #endif // QT_NO_TABWIDGET
       
  1354     painter->restore();
       
  1355     break ;
       
  1356 
       
  1357     case PE_FrameStatusBarItem:
       
  1358         break;
       
  1359     case PE_IndicatorTabClose:
       
  1360         {
       
  1361             Q_D(const QCleanlooksStyle);
       
  1362             if (d->tabBarcloseButtonIcon.isNull())
       
  1363                 d->tabBarcloseButtonIcon = standardIcon(SP_DialogCloseButton, option, widget);
       
  1364             if ((option->state & State_Enabled) && (option->state & State_MouseOver))
       
  1365                 proxy()->drawPrimitive(PE_PanelButtonCommand, option, painter, widget);
       
  1366             QPixmap pixmap = d->tabBarcloseButtonIcon.pixmap(QSize(16, 16), QIcon::Normal, QIcon::On);
       
  1367             proxy()->drawItemPixmap(painter, option->rect, Qt::AlignCenter, pixmap);
       
  1368         }
       
  1369         break;
       
  1370 
       
  1371 #endif // QT_NO_TABBAR
       
  1372     default:
       
  1373         QWindowsStyle::drawPrimitive(elem, option, painter, widget);
       
  1374         break;
       
  1375     }
       
  1376 }
       
  1377 
       
  1378 /*!
       
  1379   \reimp
       
  1380 */
       
  1381 void QCleanlooksStyle::drawControl(ControlElement element, const QStyleOption *option, QPainter *painter,
       
  1382                                    const QWidget *widget) const
       
  1383 {
       
  1384     QColor button = option->palette.button().color();
       
  1385     QColor dark;
       
  1386     dark.setHsv(button.hue(),
       
  1387                 CL_MIN(255, (int)(button.saturation()*1.9)),
       
  1388                 CL_MIN(255, (int)(button.value()*0.7)));
       
  1389     QColor darkOutline;
       
  1390     darkOutline.setHsv(button.hue(),
       
  1391                 CL_MIN(255, (int)(button.saturation()*2.0)),
       
  1392                 CL_MIN(255, (int)(button.value()*0.6)));
       
  1393     QRect rect = option->rect;
       
  1394     QColor shadow = mergedColors(option->palette.background().color().darker(120),
       
  1395                                  dark.lighter(130), 60);
       
  1396     QColor tabFrameColor = mergedColors(option->palette.background().color(),
       
  1397                                                 dark.lighter(135), 60);
       
  1398 
       
  1399     QColor highlight = option->palette.highlight().color();
       
  1400     QColor highlightText = option->palette.highlightedText().color();
       
  1401 
       
  1402     switch(element) {
       
  1403      case CE_RadioButton: //fall through
       
  1404      case CE_CheckBox:
       
  1405         if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(option)) {
       
  1406             bool hover = (btn->state & State_MouseOver && btn->state & State_Enabled);
       
  1407             if (hover)
       
  1408                 painter->fillRect(rect, btn->palette.background().color().lighter(104));
       
  1409             QStyleOptionButton copy = *btn;
       
  1410             copy.rect.adjust(2, 0, -2, 0);
       
  1411             QWindowsStyle::drawControl(element, &copy, painter, widget);
       
  1412         }
       
  1413         break;
       
  1414     case CE_Splitter:
       
  1415         painter->save();
       
  1416         {
       
  1417             // hover appearance
       
  1418             QBrush fillColor = option->palette.background().color();
       
  1419             if (option->state & State_MouseOver && option->state & State_Enabled)
       
  1420                 fillColor = fillColor.color().lighter(106);
       
  1421 
       
  1422             painter->fillRect(option->rect, fillColor);
       
  1423 
       
  1424             QColor grooveColor = mergedColors(dark.lighter(110), option->palette.button().color(),40);
       
  1425             QColor gripShadow = grooveColor.darker(110);
       
  1426             QPalette palette = option->palette;
       
  1427             bool vertical = !(option->state & State_Horizontal);
       
  1428             QRect scrollBarSlider = option->rect;
       
  1429             int gripMargin = 4;
       
  1430             //draw grips
       
  1431             if (vertical) {
       
  1432                 for( int i = -20; i< 20 ; i += 2) {
       
  1433                     painter->setPen(QPen(gripShadow, 1));
       
  1434                     painter->drawLine(
       
  1435                         QPoint(scrollBarSlider.center().x() + i ,
       
  1436                                scrollBarSlider.top() + gripMargin),
       
  1437                         QPoint(scrollBarSlider.center().x() + i,
       
  1438                                scrollBarSlider.bottom() - gripMargin));
       
  1439                     painter->setPen(QPen(palette.light(), 1));
       
  1440                     painter->drawLine(
       
  1441                         QPoint(scrollBarSlider.center().x() + i + 1,
       
  1442                                scrollBarSlider.top() + gripMargin  ),
       
  1443                         QPoint(scrollBarSlider.center().x() + i + 1,
       
  1444                                scrollBarSlider.bottom() - gripMargin));
       
  1445                 }
       
  1446             } else {
       
  1447                 for (int i = -20; i < 20 ; i += 2) {
       
  1448                     painter->setPen(QPen(gripShadow, 1));
       
  1449                     painter->drawLine(
       
  1450                         QPoint(scrollBarSlider.left() + gripMargin ,
       
  1451                                scrollBarSlider.center().y()+ i),
       
  1452                         QPoint(scrollBarSlider.right() - gripMargin,
       
  1453                                scrollBarSlider.center().y()+ i));
       
  1454                     painter->setPen(QPen(palette.light(), 1));
       
  1455                     painter->drawLine(
       
  1456                         QPoint(scrollBarSlider.left() + gripMargin,
       
  1457                                scrollBarSlider.center().y() + 1 + i),
       
  1458                         QPoint(scrollBarSlider.right() - gripMargin,
       
  1459                                scrollBarSlider.center().y() + 1 + i));
       
  1460 
       
  1461                 }
       
  1462             }
       
  1463         }
       
  1464         painter->restore();
       
  1465         break;
       
  1466 #ifndef QT_NO_SIZEGRIP
       
  1467     case CE_SizeGrip:
       
  1468         painter->save();
       
  1469         {
       
  1470             int x, y, w, h;
       
  1471             option->rect.getRect(&x, &y, &w, &h);
       
  1472             int sw = qMin(h, w);
       
  1473             if (h > w)
       
  1474                 painter->translate(0, h - w);
       
  1475             else
       
  1476                 painter->translate(w - h, 0);
       
  1477 
       
  1478             int sx = x;
       
  1479             int sy = y;
       
  1480             int s = 4;
       
  1481             if (option->direction == Qt::RightToLeft) {
       
  1482                 sx = x + sw;
       
  1483                 for (int i = 0; i < 4; ++i) {
       
  1484                     painter->setPen(QPen(option->palette.light().color(), 1));
       
  1485                     painter->drawLine(x, sy - 1 , sx + 1, sw);
       
  1486                     painter->setPen(QPen(dark.lighter(120), 1));
       
  1487                     painter->drawLine(x, sy, sx, sw);
       
  1488                     sx -= s;
       
  1489                     sy += s;
       
  1490                 }
       
  1491             } else {
       
  1492                 for (int i = 0; i < 4; ++i) {
       
  1493                     painter->setPen(QPen(option->palette.light().color(), 1));
       
  1494                     painter->drawLine(sx - 1, sw, sw, sy - 1);
       
  1495                     painter->setPen(QPen(dark.lighter(120), 1));
       
  1496                     painter->drawLine(sx, sw, sw, sy);
       
  1497                     sx += s;
       
  1498                     sy += s;
       
  1499                 }
       
  1500             }
       
  1501         }
       
  1502         painter->restore();
       
  1503         break;
       
  1504 #endif // QT_NO_SIZEGRIP
       
  1505 #ifndef QT_NO_TOOLBAR
       
  1506     case CE_ToolBar:
       
  1507         painter->save();
       
  1508         if (const QStyleOptionToolBar *toolbar = qstyleoption_cast<const QStyleOptionToolBar *>(option)) {
       
  1509             QRect rect = option->rect;
       
  1510 
       
  1511             bool paintLeftBorder = true;
       
  1512             bool paintRightBorder = true;
       
  1513             bool paintBottomBorder = true;
       
  1514 
       
  1515             switch (toolbar->toolBarArea) {
       
  1516             case Qt::BottomToolBarArea:
       
  1517                 switch(toolbar->positionOfLine) {
       
  1518                 case QStyleOptionToolBar::Beginning:
       
  1519                 case QStyleOptionToolBar::OnlyOne:
       
  1520                     paintBottomBorder = false;
       
  1521                 default:
       
  1522                     break;
       
  1523                 }
       
  1524             case Qt::TopToolBarArea:
       
  1525                 switch (toolbar->positionWithinLine) {
       
  1526                 case QStyleOptionToolBar::Beginning:
       
  1527                     paintLeftBorder = false;
       
  1528                     break;
       
  1529                 case QStyleOptionToolBar::End:
       
  1530                     paintRightBorder = false;
       
  1531                     break;
       
  1532                 case QStyleOptionToolBar::OnlyOne:
       
  1533                     paintRightBorder = false;
       
  1534                     paintLeftBorder = false;
       
  1535                 default:
       
  1536                     break;
       
  1537                 }
       
  1538                 if (toolbar->direction == Qt::RightToLeft) { //reverse layout changes the order of Beginning/end
       
  1539                     bool tmp = paintLeftBorder;
       
  1540                     paintRightBorder=paintLeftBorder;
       
  1541                     paintLeftBorder=tmp;
       
  1542                 }
       
  1543                 break;
       
  1544             case Qt::RightToolBarArea:
       
  1545                 switch (toolbar->positionOfLine) {
       
  1546                 case QStyleOptionToolBar::Beginning:
       
  1547                 case QStyleOptionToolBar::OnlyOne:
       
  1548                     paintRightBorder = false;
       
  1549                     break;
       
  1550                 default:
       
  1551                     break;
       
  1552                 }
       
  1553                 break;
       
  1554             case Qt::LeftToolBarArea:
       
  1555                 switch (toolbar->positionOfLine) {
       
  1556                 case QStyleOptionToolBar::Beginning:
       
  1557                 case QStyleOptionToolBar::OnlyOne:
       
  1558                     paintLeftBorder = false;
       
  1559                     break;
       
  1560                 default:
       
  1561                     break;
       
  1562                 }
       
  1563                 break;
       
  1564             default:
       
  1565                 break;
       
  1566             }
       
  1567 
       
  1568             QColor light = option->palette.background().color().lighter(110);
       
  1569 
       
  1570             //draw top border
       
  1571             painter->setPen(QPen(light));
       
  1572             painter->drawLine(rect.topLeft().x(),
       
  1573                         rect.topLeft().y(),
       
  1574                         rect.topRight().x(),
       
  1575                         rect.topRight().y());
       
  1576 
       
  1577             if (paintLeftBorder) {
       
  1578                 painter->setPen(QPen(light));
       
  1579                 painter->drawLine(rect.topLeft().x(),
       
  1580                             rect.topLeft().y(),
       
  1581                             rect.bottomLeft().x(),
       
  1582                             rect.bottomLeft().y());
       
  1583             }
       
  1584 
       
  1585             if (paintRightBorder) {
       
  1586                 painter->setPen(QPen(shadow));
       
  1587                 painter->drawLine(rect.topRight().x(),
       
  1588                             rect.topRight().y(),
       
  1589                             rect.bottomRight().x(),
       
  1590                             rect.bottomRight().y());
       
  1591             }
       
  1592 
       
  1593             if (paintBottomBorder) {
       
  1594                 painter->setPen(QPen(shadow));
       
  1595                 painter->drawLine(rect.bottomLeft().x(),
       
  1596                             rect.bottomLeft().y(),
       
  1597                             rect.bottomRight().x(),
       
  1598                             rect.bottomRight().y());
       
  1599             }
       
  1600         }
       
  1601         painter->restore();
       
  1602         break;
       
  1603 #endif // QT_NO_TOOLBAR
       
  1604 #ifndef QT_NO_DOCKWIDGET
       
  1605     case CE_DockWidgetTitle:
       
  1606         painter->save();
       
  1607         if (const QStyleOptionDockWidget *dwOpt = qstyleoption_cast<const QStyleOptionDockWidget *>(option)) {
       
  1608             const QStyleOptionDockWidgetV2 *v2
       
  1609                 = qstyleoption_cast<const QStyleOptionDockWidgetV2*>(dwOpt);
       
  1610             bool verticalTitleBar = v2 == 0 ? false : v2->verticalTitleBar;
       
  1611 
       
  1612             QRect rect = dwOpt->rect;
       
  1613             QRect titleRect = subElementRect(SE_DockWidgetTitleBarText, option, widget);
       
  1614             QRect r = rect.adjusted(0, 0, -1, 0);
       
  1615             if (verticalTitleBar)
       
  1616                 r.adjust(0, 0, 0, -1);
       
  1617             painter->setPen(option->palette.light().color());
       
  1618             painter->drawRect(r.adjusted(1, 1, 1, 1));
       
  1619             painter->setPen(shadow);
       
  1620             painter->drawRect(r);
       
  1621 
       
  1622             if (verticalTitleBar) {
       
  1623                 QRect r = rect;
       
  1624                 QSize s = r.size();
       
  1625                 s.transpose();
       
  1626                 r.setSize(s);
       
  1627 
       
  1628                 titleRect = QRect(r.left() + rect.bottom()
       
  1629                                     - titleRect.bottom(),
       
  1630                                 r.top() + titleRect.left() - rect.left(),
       
  1631                                 titleRect.height(), titleRect.width());
       
  1632 
       
  1633                 painter->translate(r.left(), r.top() + r.width());
       
  1634                 painter->rotate(-90);
       
  1635                 painter->translate(-r.left(), -r.top());
       
  1636 
       
  1637                 rect = r;
       
  1638             }
       
  1639 
       
  1640             if (!dwOpt->title.isEmpty()) {
       
  1641                 QString titleText
       
  1642                     = painter->fontMetrics().elidedText(dwOpt->title,
       
  1643                                             Qt::ElideRight, titleRect.width());
       
  1644                 proxy()->drawItemText(painter,
       
  1645                              titleRect,
       
  1646                              Qt::AlignLeft | Qt::AlignVCenter | Qt::TextShowMnemonic, dwOpt->palette,
       
  1647                              dwOpt->state & State_Enabled, titleText,
       
  1648                              QPalette::WindowText);
       
  1649                 }
       
  1650         }
       
  1651         painter->restore();
       
  1652         break;
       
  1653 #endif // QT_NO_DOCKWIDGET
       
  1654     case CE_HeaderSection:
       
  1655         painter->save();
       
  1656         // Draws the header in tables.
       
  1657         if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(option)) {
       
  1658             QPixmap cache;
       
  1659             QString pixmapName = QStyleHelper::uniqueName(QLatin1String("headersection"), option, option->rect.size());
       
  1660             pixmapName += QString::number(- int(header->position));
       
  1661             pixmapName += QString::number(- int(header->orientation));
       
  1662             QRect r = option->rect;
       
  1663             QColor gradientStopColor;
       
  1664             QColor gradientStartColor = option->palette.button().color();
       
  1665             gradientStopColor.setHsv(gradientStartColor.hue(),
       
  1666                                      CL_MIN(255, (int)(gradientStartColor.saturation()*2)),
       
  1667                                      CL_MIN(255, (int)(gradientStartColor.value()*0.96)));
       
  1668             QLinearGradient gradient(rect.topLeft(), rect.bottomLeft());
       
  1669             if (option->palette.background().gradient()) {
       
  1670                 gradient.setStops(option->palette.background().gradient()->stops());
       
  1671             } else {
       
  1672                 gradient.setColorAt(0, gradientStartColor);
       
  1673                 gradient.setColorAt(0.8, gradientStartColor);
       
  1674                 gradient.setColorAt(1, gradientStopColor);
       
  1675             }
       
  1676             painter->fillRect(r, gradient);
       
  1677 
       
  1678             if (!QPixmapCache::find(pixmapName, cache)) {
       
  1679                 cache = QPixmap(r.size());
       
  1680                 cache.fill(Qt::transparent);
       
  1681                 QRect pixmapRect(0, 0, r.width(), r.height());
       
  1682                 QPainter cachePainter(&cache);
       
  1683                 if (header->orientation == Qt::Vertical) {
       
  1684                     cachePainter.setPen(QPen(dark));
       
  1685                     cachePainter.drawLine(pixmapRect.topRight(), pixmapRect.bottomRight());
       
  1686                     if (header->position != QStyleOptionHeader::End) {
       
  1687                         cachePainter.setPen(QPen(shadow));
       
  1688                         cachePainter.drawLine(pixmapRect.bottomLeft() + QPoint(3, -1), pixmapRect.bottomRight() + QPoint(-3, -1));                                cachePainter.setPen(QPen(option->palette.light().color()));
       
  1689                         cachePainter.drawLine(pixmapRect.bottomLeft() + QPoint(3, 0), pixmapRect.bottomRight() + QPoint(-3, 0));                              }
       
  1690                 } else {
       
  1691                     cachePainter.setPen(QPen(dark));
       
  1692                     cachePainter.drawLine(pixmapRect.bottomLeft(), pixmapRect.bottomRight());
       
  1693                     cachePainter.setPen(QPen(shadow));
       
  1694                     cachePainter.drawLine(pixmapRect.topRight() + QPoint(-1, 3), pixmapRect.bottomRight() + QPoint(-1, -3));                                  cachePainter.setPen(QPen(option->palette.light().color()));
       
  1695                     cachePainter.drawLine(pixmapRect.topRight() + QPoint(0, 3), pixmapRect.bottomRight() + QPoint(0, -3));                                }
       
  1696                 cachePainter.end();
       
  1697                 QPixmapCache::insert(pixmapName, cache);
       
  1698             }
       
  1699             painter->drawPixmap(r.topLeft(), cache);
       
  1700         }
       
  1701         painter->restore();
       
  1702         break;
       
  1703     case CE_ProgressBarGroove:
       
  1704         painter->save();
       
  1705         {
       
  1706             painter->fillRect(rect, option->palette.base());
       
  1707             QColor borderColor = dark.lighter(110);
       
  1708             painter->setPen(QPen(borderColor, 0));
       
  1709             const QLine lines[4] = {
       
  1710                 QLine(QPoint(rect.left() + 1, rect.top()), QPoint(rect.right() - 1, rect.top())),
       
  1711                 QLine(QPoint(rect.left() + 1, rect.bottom()), QPoint(rect.right() - 1, rect.bottom())),
       
  1712                 QLine(QPoint(rect.left(), rect.top() + 1), QPoint(rect.left(), rect.bottom() - 1)),
       
  1713                 QLine(QPoint(rect.right(), rect.top() + 1), QPoint(rect.right(), rect.bottom() - 1))
       
  1714             };
       
  1715             painter->drawLines(lines, 4);
       
  1716             QColor alphaCorner = mergedColors(borderColor, option->palette.background().color());
       
  1717             QColor innerShadow = mergedColors(borderColor, option->palette.base().color());
       
  1718 
       
  1719             //corner smoothing
       
  1720             painter->setPen(alphaCorner);
       
  1721             const QPoint points[4] = {
       
  1722                 rect.topRight(),
       
  1723                 rect.topLeft(),
       
  1724                 rect.bottomRight(),
       
  1725                 rect.bottomLeft()
       
  1726             };
       
  1727             painter->drawPoints(points, 4);
       
  1728 
       
  1729             //inner shadow
       
  1730             painter->setPen(innerShadow);
       
  1731             painter->drawLine(QPoint(rect.left() + 1, rect.top() + 1),
       
  1732                               QPoint(rect.right() - 1, rect.top() + 1));
       
  1733             painter->drawLine(QPoint(rect.left() + 1, rect.top() + 1),
       
  1734                               QPoint(rect.left() + 1, rect.bottom() + 1));
       
  1735 
       
  1736         }
       
  1737         painter->restore();
       
  1738         break;
       
  1739     case CE_ProgressBarContents:
       
  1740         painter->save();
       
  1741         if (const QStyleOptionProgressBar *bar = qstyleoption_cast<const QStyleOptionProgressBar *>(option)) {
       
  1742             QRect rect = bar->rect;
       
  1743             bool vertical = false;
       
  1744             bool inverted = false;
       
  1745             bool indeterminate = (bar->minimum == 0 && bar->maximum == 0);
       
  1746 
       
  1747             // Get extra style options if version 2
       
  1748             if (const QStyleOptionProgressBarV2 *bar2 = qstyleoption_cast<const QStyleOptionProgressBarV2 *>(option)) {
       
  1749                 vertical = (bar2->orientation == Qt::Vertical);
       
  1750                 inverted = bar2->invertedAppearance;
       
  1751             }
       
  1752 
       
  1753             // If the orientation is vertical, we use a transform to rotate
       
  1754             // the progress bar 90 degrees clockwise.  This way we can use the
       
  1755             // same rendering code for both orientations.
       
  1756             if (vertical) {
       
  1757                 rect = QRect(rect.left(), rect.top(), rect.height(), rect.width()); // flip width and height
       
  1758                 QTransform m = QTransform::fromTranslate(rect.height()-1, -1.0);
       
  1759                 m.rotate(90.0);
       
  1760                 painter->setTransform(m, true);
       
  1761             }
       
  1762 
       
  1763             int maxWidth = rect.width() - 4;
       
  1764             int minWidth = 4;
       
  1765             qreal progress = qMax(bar->progress, bar->minimum); // workaround for bug in QProgressBar
       
  1766             int progressBarWidth = (progress - bar->minimum) * qreal(maxWidth) / qMax(qreal(1.0), qreal(bar->maximum) - bar->minimum);
       
  1767             int width = indeterminate ? maxWidth : qMax(minWidth, progressBarWidth);
       
  1768 
       
  1769             bool reverse = (!vertical && (bar->direction == Qt::RightToLeft)) || vertical;
       
  1770             if (inverted)
       
  1771                 reverse = !reverse;
       
  1772 
       
  1773             QRect progressBar;
       
  1774             if (!indeterminate) {
       
  1775                 if (!reverse) {
       
  1776                     progressBar.setRect(rect.left() + 1, rect.top() + 1, width + 1, rect.height() - 3);
       
  1777                 } else {
       
  1778                     progressBar.setRect(rect.right() - 1 - width, rect.top() + 1, width + 1, rect.height() - 3);
       
  1779                 }
       
  1780             } else {
       
  1781                 Q_D(const QCleanlooksStyle);
       
  1782                 int slideWidth = ((rect.width() - 4) * 2) / 3;
       
  1783                 int step = ((d->animateStep * slideWidth) / d->animationFps) % slideWidth;
       
  1784                 if ((((d->animateStep * slideWidth) / d->animationFps) % (2 * slideWidth)) >= slideWidth)
       
  1785                     step = slideWidth - step;
       
  1786                 progressBar.setRect(rect.left() + 1 + step, rect.top() + 1,
       
  1787                                     slideWidth / 2, rect.height() - 3);
       
  1788             }
       
  1789             QColor highlight = option->palette.color(QPalette::Normal, QPalette::Highlight);
       
  1790             painter->setPen(QPen(highlight.darker(140), 0));
       
  1791 
       
  1792             QColor highlightedGradientStartColor = highlight.lighter(100);
       
  1793             QColor highlightedGradientStopColor  = highlight.lighter(130);
       
  1794 
       
  1795             QLinearGradient gradient(rect.topLeft(), QPoint(rect.bottomLeft().x(),
       
  1796                                                             rect.bottomLeft().y()*2));
       
  1797 
       
  1798             gradient.setColorAt(0, highlightedGradientStartColor);
       
  1799             gradient.setColorAt(1, highlightedGradientStopColor);
       
  1800 
       
  1801             painter->setBrush(gradient);
       
  1802             painter->drawRect(progressBar);
       
  1803 
       
  1804             painter->setPen(QPen(highlight.lighter(120), 0));
       
  1805             painter->drawLine(QPoint(progressBar.left() + 1, progressBar.top() + 1),
       
  1806                               QPoint(progressBar.right(), progressBar.top() + 1));
       
  1807             painter->drawLine(QPoint(progressBar.left() + 1, progressBar.top() + 1),
       
  1808                               QPoint(progressBar.left() + 1, progressBar.bottom() - 1));
       
  1809 
       
  1810             painter->setPen(QPen(highlightedGradientStartColor, 7.0));//QPen(option->palette.highlight(), 3));
       
  1811 
       
  1812             painter->save();
       
  1813             painter->setClipRect(progressBar.adjusted(2, 2, -1, -1));
       
  1814             for (int x = progressBar.left() - 32; x < rect.right() ; x+=18) {
       
  1815                 painter->drawLine(x, progressBar.bottom() + 1, x + 23, progressBar.top() - 2);
       
  1816             }
       
  1817             painter->restore();
       
  1818 
       
  1819         }
       
  1820         painter->restore();
       
  1821         break;
       
  1822     case CE_MenuBarItem:
       
  1823         painter->save();
       
  1824         if (const QStyleOptionMenuItem *mbi = qstyleoption_cast<const QStyleOptionMenuItem *>(option))
       
  1825         {
       
  1826             QStyleOptionMenuItem item = *mbi;
       
  1827             item.rect = mbi->rect.adjusted(0, 3, 0, -1);
       
  1828             QColor highlightOutline = highlight.darker(125);
       
  1829             QLinearGradient gradient(rect.topLeft(), QPoint(rect.bottomLeft().x(), rect.bottomLeft().y()*2));
       
  1830 
       
  1831             if (option->palette.button().gradient()) {
       
  1832                 gradient.setStops(option->palette.button().gradient()->stops());
       
  1833             } else {
       
  1834                 gradient.setColorAt(0, option->palette.button().color());
       
  1835                 gradient.setColorAt(1, option->palette.button().color().darker(110));
       
  1836             }
       
  1837             painter->fillRect(rect, gradient);
       
  1838 
       
  1839             QCommonStyle::drawControl(element, &item, painter, widget);
       
  1840 
       
  1841             bool act = mbi->state & State_Selected && mbi->state & State_Sunken;
       
  1842             bool dis = !(mbi->state & State_Enabled);
       
  1843 
       
  1844             QRect r = option->rect;
       
  1845             if (act) {
       
  1846                 qt_cleanlooks_draw_gradient(painter, r.adjusted(1, 1, -1, -1),
       
  1847                                             highlight,
       
  1848                                             highlightOutline, TopDown,
       
  1849                                             option->palette.highlight());
       
  1850 
       
  1851                 painter->setPen(QPen(highlightOutline, 0));
       
  1852                 const QLine lines[4] = {
       
  1853                     QLine(QPoint(r.left(), r.top() + 1), QPoint(r.left(), r.bottom())),
       
  1854                     QLine(QPoint(r.right(), r.top() + 1), QPoint(r.right(), r.bottom())),
       
  1855                     QLine(QPoint(r.left() + 1, r.bottom()), QPoint(r.right() - 1, r.bottom())),
       
  1856                     QLine(QPoint(r.left() + 1, r.top()), QPoint(r.right() - 1, r.top()))
       
  1857                 };
       
  1858                 painter->drawLines(lines, 4);
       
  1859 
       
  1860                 //draw text
       
  1861                 QPalette::ColorRole textRole = dis ? QPalette::Text : QPalette::HighlightedText;
       
  1862                 uint alignment = Qt::AlignCenter | Qt::TextShowMnemonic | Qt::TextDontClip | Qt::TextSingleLine;
       
  1863                 if (!styleHint(SH_UnderlineShortcut, mbi, widget))
       
  1864                     alignment |= Qt::TextHideMnemonic;
       
  1865                 proxy()->drawItemText(painter, item.rect, alignment, mbi->palette, mbi->state & State_Enabled, mbi->text, textRole);
       
  1866             }
       
  1867 
       
  1868         }
       
  1869         painter->restore();
       
  1870         break;
       
  1871     case CE_MenuItem:
       
  1872         painter->save();
       
  1873         // Draws one item in a popup menu.
       
  1874         if (const QStyleOptionMenuItem *menuItem = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) {
       
  1875             QColor highlightOutline = highlight.darker(125);
       
  1876             QColor menuBackground = option->palette.background().color().lighter(104);
       
  1877             QColor borderColor = option->palette.background().color().darker(160);
       
  1878             QColor alphaCornerColor;
       
  1879 
       
  1880             if (widget) {
       
  1881                 // ### backgroundrole/foregroundrole should be part of the style option
       
  1882                 alphaCornerColor = mergedColors(option->palette.color(widget->backgroundRole()), borderColor);
       
  1883             } else {
       
  1884                 alphaCornerColor = mergedColors(option->palette.background().color(), borderColor);
       
  1885             }
       
  1886             QColor alphaTextColor = mergedColors(option->palette.background().color(), option->palette.text().color());
       
  1887             if (menuItem->menuItemType == QStyleOptionMenuItem::Separator) {
       
  1888                 painter->fillRect(menuItem->rect, menuBackground);
       
  1889                 int w = 0;
       
  1890                 if (!menuItem->text.isEmpty()) {
       
  1891                     painter->setFont(menuItem->font);
       
  1892                     proxy()->drawItemText(painter, menuItem->rect.adjusted(5, 0, -5, 0), Qt::AlignLeft | Qt::AlignVCenter,
       
  1893                                  menuItem->palette, menuItem->state & State_Enabled, menuItem->text,
       
  1894                                  QPalette::Text);
       
  1895                     w = menuItem->fontMetrics.width(menuItem->text) + 5;
       
  1896                 }
       
  1897                 painter->setPen(shadow.lighter(106));
       
  1898                 bool reverse = menuItem->direction == Qt::RightToLeft;
       
  1899                 painter->drawLine(menuItem->rect.left() + 5 + (reverse ? 0 : w), menuItem->rect.center().y(),
       
  1900                                   menuItem->rect.right() - 5 - (reverse ? w : 0), menuItem->rect.center().y());
       
  1901                 painter->restore();
       
  1902                 break;
       
  1903             }
       
  1904             bool selected = menuItem->state & State_Selected && menuItem->state & State_Enabled;
       
  1905             if (selected) {
       
  1906                 QRect r = option->rect.adjusted(1, 0, -2, -1);
       
  1907                 qt_cleanlooks_draw_gradient(painter, r, highlight,
       
  1908                                             highlightOutline, TopDown,
       
  1909                                             highlight);
       
  1910                 r = r.adjusted(-1, 0, 1, 0);
       
  1911                 painter->setPen(QPen(highlightOutline, 0));
       
  1912                 const QLine lines[4] = {
       
  1913                     QLine(QPoint(r.left(), r.top() + 1), QPoint(r.left(), r.bottom() - 1)),
       
  1914                     QLine(QPoint(r.right(), r.top() + 1), QPoint(r.right(), r.bottom() - 1)),
       
  1915                     QLine(QPoint(r.left() + 1, r.bottom()), QPoint(r.right() - 1, r.bottom())),
       
  1916                     QLine(QPoint(r.left() + 1, r.top()), QPoint(r.right() - 1, r.top()))
       
  1917                 };
       
  1918                 painter->drawLines(lines, 4);
       
  1919             } else {
       
  1920                 painter->fillRect(option->rect, menuBackground);
       
  1921             }
       
  1922 
       
  1923             bool checkable = menuItem->checkType != QStyleOptionMenuItem::NotCheckable;
       
  1924             bool checked = menuItem->checked;
       
  1925             bool sunken = menuItem->state & State_Sunken;
       
  1926             bool enabled = menuItem->state & State_Enabled;
       
  1927 
       
  1928             bool ignoreCheckMark = false;
       
  1929             int checkcol = qMax(menuItem->maxIconWidth, 20);
       
  1930 
       
  1931 #ifndef QT_NO_COMBOBOX
       
  1932             if (qobject_cast<const QComboBox*>(widget))
       
  1933                 ignoreCheckMark = true; //ignore the checkmarks provided by the QComboMenuDelegate
       
  1934 #endif
       
  1935 
       
  1936             if (!ignoreCheckMark) {
       
  1937                 // Check
       
  1938                 QRect checkRect(option->rect.left() + 7, option->rect.center().y() - 6, 13, 13);
       
  1939                 checkRect = visualRect(menuItem->direction, menuItem->rect, checkRect);
       
  1940                 if (checkable) {
       
  1941                     if (menuItem->checkType & QStyleOptionMenuItem::Exclusive) {
       
  1942                         // Radio button
       
  1943                         if (checked || sunken) {
       
  1944                             painter->setRenderHint(QPainter::Antialiasing);
       
  1945                             painter->setPen(Qt::NoPen);
       
  1946 
       
  1947                             QPalette::ColorRole textRole = !enabled ? QPalette::Text:
       
  1948                                                         selected ? QPalette::HighlightedText : QPalette::ButtonText;
       
  1949                             painter->setBrush(option->palette.brush( option->palette.currentColorGroup(), textRole));
       
  1950                             painter->drawEllipse(checkRect.adjusted(4, 4, -4, -4));
       
  1951                         }
       
  1952                     } else {
       
  1953                         // Check box
       
  1954                         if (menuItem->icon.isNull()) {
       
  1955                             if (checked || sunken) {
       
  1956                                 QImage image(qt_cleanlooks_menuitem_checkbox_checked);
       
  1957                                 if (enabled && (menuItem->state & State_Selected)) {
       
  1958                                     image.setColor(1, 0x55ffffff);
       
  1959                                     image.setColor(2, 0xAAffffff);
       
  1960                                     image.setColor(3, 0xBBffffff);
       
  1961                                     image.setColor(4, 0xFFffffff);
       
  1962                                     image.setColor(5, 0x33ffffff);
       
  1963                                 } else {
       
  1964                                     image.setColor(1, 0x55000000);
       
  1965                                     image.setColor(2, 0xAA000000);
       
  1966                                     image.setColor(3, 0xBB000000);
       
  1967                                     image.setColor(4, 0xFF000000);
       
  1968                                     image.setColor(5, 0x33000000);
       
  1969                                 }
       
  1970                                 painter->drawImage(QPoint(checkRect.center().x() - image.width() / 2,
       
  1971                                                         checkRect.center().y() - image.height() / 2), image);
       
  1972                             }
       
  1973                         }
       
  1974                     }
       
  1975                 }
       
  1976             } else { //ignore checkmark
       
  1977                 if (menuItem->icon.isNull())
       
  1978                     checkcol = 0;
       
  1979                 else
       
  1980                     checkcol = menuItem->maxIconWidth;
       
  1981             }
       
  1982 
       
  1983             // Text and icon, ripped from windows style
       
  1984             bool dis = !(menuItem->state & State_Enabled);
       
  1985             bool act = menuItem->state & State_Selected;
       
  1986             const QStyleOption *opt = option;
       
  1987             const QStyleOptionMenuItem *menuitem = menuItem;
       
  1988 
       
  1989             QPainter *p = painter;
       
  1990             QRect vCheckRect = visualRect(opt->direction, menuitem->rect,
       
  1991                                           QRect(menuitem->rect.x(), menuitem->rect.y(),
       
  1992                                                 checkcol, menuitem->rect.height()));
       
  1993             if (!menuItem->icon.isNull()) {
       
  1994                 QIcon::Mode mode = dis ? QIcon::Disabled : QIcon::Normal;
       
  1995                 if (act && !dis)
       
  1996                     mode = QIcon::Active;
       
  1997                 QPixmap pixmap;
       
  1998 
       
  1999                 int smallIconSize = proxy()->pixelMetric(PM_SmallIconSize, option, widget);
       
  2000                 QSize iconSize(smallIconSize, smallIconSize);
       
  2001 #ifndef QT_NO_COMBOBOX
       
  2002                 if (const QComboBox *combo = qobject_cast<const QComboBox*>(widget))
       
  2003                     iconSize = combo->iconSize();
       
  2004 #endif // QT_NO_COMBOBOX
       
  2005                 if (checked)
       
  2006                     pixmap = menuItem->icon.pixmap(iconSize, mode, QIcon::On);
       
  2007                 else
       
  2008                     pixmap = menuItem->icon.pixmap(iconSize, mode);
       
  2009 
       
  2010                 int pixw = pixmap.width();
       
  2011                 int pixh = pixmap.height();
       
  2012 
       
  2013                 QRect pmr(0, 0, pixw, pixh);
       
  2014                 pmr.moveCenter(vCheckRect.center());
       
  2015                 painter->setPen(menuItem->palette.text().color());
       
  2016                 if (checkable && checked) {
       
  2017                     QStyleOption opt = *option;
       
  2018                     if (act) {
       
  2019                         QColor activeColor = mergedColors(option->palette.background().color(),
       
  2020                                                         option->palette.highlight().color());
       
  2021                         opt.palette.setBrush(QPalette::Button, activeColor);
       
  2022                     }
       
  2023                     opt.state |= State_Sunken;
       
  2024                     opt.rect = vCheckRect;
       
  2025                     proxy()->drawPrimitive(PE_PanelButtonCommand, &opt, painter, widget);
       
  2026                 }
       
  2027                 painter->drawPixmap(pmr.topLeft(), pixmap);
       
  2028             }
       
  2029             if (selected) {
       
  2030                 painter->setPen(menuItem->palette.highlightedText().color());
       
  2031             } else {
       
  2032                 painter->setPen(menuItem->palette.text().color());
       
  2033             }
       
  2034             int x, y, w, h;
       
  2035             menuitem->rect.getRect(&x, &y, &w, &h);
       
  2036             int tab = menuitem->tabWidth;
       
  2037             QColor discol;
       
  2038             if (dis) {
       
  2039                 discol = menuitem->palette.text().color();
       
  2040                 p->setPen(discol);
       
  2041             }
       
  2042             int xm = windowsItemFrame + checkcol + windowsItemHMargin;
       
  2043             int xpos = menuitem->rect.x() + xm;
       
  2044 
       
  2045             QRect textRect(xpos, y + windowsItemVMargin, w - xm - windowsRightBorder - tab + 1, h - 2 * windowsItemVMargin);
       
  2046             QRect vTextRect = visualRect(opt->direction, menuitem->rect, textRect);
       
  2047             QString s = menuitem->text;
       
  2048             if (!s.isEmpty()) {                     // draw text
       
  2049                 p->save();
       
  2050                 int t = s.indexOf(QLatin1Char('\t'));
       
  2051                 int text_flags = Qt::AlignVCenter | Qt::TextShowMnemonic | Qt::TextDontClip | Qt::TextSingleLine;
       
  2052                 if (!styleHint(SH_UnderlineShortcut, menuitem, widget))
       
  2053                     text_flags |= Qt::TextHideMnemonic;
       
  2054                 text_flags |= Qt::AlignLeft;
       
  2055                 if (t >= 0) {
       
  2056                     QRect vShortcutRect = visualRect(opt->direction, menuitem->rect,
       
  2057                                                      QRect(textRect.topRight(), QPoint(menuitem->rect.right(), textRect.bottom())));
       
  2058                     if (dis && !act && proxy()->styleHint(SH_EtchDisabledText, option, widget)) {
       
  2059                         p->setPen(menuitem->palette.light().color());
       
  2060                         p->drawText(vShortcutRect.adjusted(1, 1, 1, 1), text_flags, s.mid(t + 1));
       
  2061                         p->setPen(discol);
       
  2062                     }
       
  2063                     p->drawText(vShortcutRect, text_flags, s.mid(t + 1));
       
  2064                     s = s.left(t);
       
  2065                 }
       
  2066                 QFont font = menuitem->font;
       
  2067                 // font may not have any "hard" flags set. We override
       
  2068                 // the point size so that when it is resolved against the device, this font will win.
       
  2069                 // This is mainly to handle cases where someone sets the font on the window
       
  2070                 // and then the combo inherits it and passes it onward. At that point the resolve mask
       
  2071                 // is very, very weak. This makes it stonger.
       
  2072                 font.setPointSizeF(menuItem->font.pointSizeF());
       
  2073 
       
  2074                 if (menuitem->menuItemType == QStyleOptionMenuItem::DefaultItem)
       
  2075                     font.setBold(true);
       
  2076 
       
  2077                 p->setFont(font);
       
  2078                 if (dis && !act && proxy()->styleHint(SH_EtchDisabledText, option, widget)) {
       
  2079                     p->setPen(menuitem->palette.light().color());
       
  2080                     p->drawText(vTextRect.adjusted(1, 1, 1, 1), text_flags, s.left(t));
       
  2081                     p->setPen(discol);
       
  2082                 }
       
  2083                 p->drawText(vTextRect, text_flags, s.left(t));
       
  2084                 p->restore();
       
  2085             }
       
  2086 
       
  2087             // Arrow
       
  2088             if (menuItem->menuItemType == QStyleOptionMenuItem::SubMenu) {// draw sub menu arrow
       
  2089                 int dim = (menuItem->rect.height() - 4) / 2;
       
  2090                 PrimitiveElement arrow;
       
  2091                 arrow = QApplication::isRightToLeft() ? PE_IndicatorArrowLeft : PE_IndicatorArrowRight;
       
  2092                 int xpos = menuItem->rect.left() + menuItem->rect.width() - 3 - dim;
       
  2093                 QRect  vSubMenuRect = visualRect(option->direction, menuItem->rect,
       
  2094                                                  QRect(xpos, menuItem->rect.top() + menuItem->rect.height() / 2 - dim / 2, dim, dim));
       
  2095                 QStyleOptionMenuItem newMI = *menuItem;
       
  2096                 newMI.rect = vSubMenuRect;
       
  2097                 newMI.state = !enabled ? State_None : State_Enabled;
       
  2098                 if (selected)
       
  2099                     newMI.palette.setColor(QPalette::ButtonText,
       
  2100                                            newMI.palette.highlightedText().color());
       
  2101                 proxy()->drawPrimitive(arrow, &newMI, painter, widget);
       
  2102             }
       
  2103         }
       
  2104         painter->restore();
       
  2105         break;
       
  2106     case CE_MenuHMargin:
       
  2107     case CE_MenuVMargin:
       
  2108         break;
       
  2109     case CE_MenuEmptyArea:
       
  2110         break;
       
  2111     case CE_PushButtonLabel:
       
  2112         if (const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton *>(option)) {
       
  2113             QRect ir = button->rect;
       
  2114             uint tf = Qt::AlignVCenter;
       
  2115             if (styleHint(SH_UnderlineShortcut, button, widget))
       
  2116                 tf |= Qt::TextShowMnemonic;
       
  2117             else
       
  2118                tf |= Qt::TextHideMnemonic;
       
  2119 
       
  2120             if (!button->icon.isNull()) {
       
  2121                 //Center both icon and text
       
  2122                 QPoint point;
       
  2123 
       
  2124                 QIcon::Mode mode = button->state & State_Enabled ? QIcon::Normal
       
  2125                                                               : QIcon::Disabled;
       
  2126                 if (mode == QIcon::Normal && button->state & State_HasFocus)
       
  2127                     mode = QIcon::Active;
       
  2128                 QIcon::State state = QIcon::Off;
       
  2129                 if (button->state & State_On)
       
  2130                     state = QIcon::On;
       
  2131 
       
  2132                 QPixmap pixmap = button->icon.pixmap(button->iconSize, mode, state);
       
  2133                 int w = pixmap.width();
       
  2134                 int h = pixmap.height();
       
  2135 
       
  2136                 if (!button->text.isEmpty())
       
  2137                     w += button->fontMetrics.boundingRect(option->rect, tf, button->text).width() + 2;
       
  2138 
       
  2139                 point = QPoint(ir.x() + ir.width() / 2 - w / 2,
       
  2140                                ir.y() + ir.height() / 2 - h / 2);
       
  2141 
       
  2142                 if (button->direction == Qt::RightToLeft)
       
  2143                     point.rx() += pixmap.width();
       
  2144 
       
  2145                 painter->drawPixmap(visualPos(button->direction, button->rect, point), pixmap);
       
  2146 
       
  2147                 if (button->direction == Qt::RightToLeft)
       
  2148                     ir.translate(-point.x() - 2, 0);
       
  2149                 else
       
  2150                     ir.translate(point.x() + pixmap.width(), 0);
       
  2151 
       
  2152                 // left-align text if there is
       
  2153                 if (!button->text.isEmpty())
       
  2154                     tf |= Qt::AlignLeft;
       
  2155 
       
  2156             } else {
       
  2157                 tf |= Qt::AlignHCenter;
       
  2158             }
       
  2159 
       
  2160             if (button->features & QStyleOptionButton::HasMenu)
       
  2161                 ir = ir.adjusted(0, 0, -pixelMetric(PM_MenuButtonIndicator, button, widget), 0);
       
  2162             proxy()->drawItemText(painter, ir, tf, button->palette, (button->state & State_Enabled),
       
  2163                          button->text, QPalette::ButtonText);
       
  2164         }
       
  2165         break;
       
  2166     case CE_MenuBarEmptyArea:
       
  2167         painter->save();
       
  2168         {
       
  2169             QColor shadow = mergedColors(option->palette.background().color().darker(120),
       
  2170                                  dark.lighter(140), 60);
       
  2171 
       
  2172             QLinearGradient gradient(rect.topLeft(), QPoint(rect.bottomLeft().x(), rect.bottomLeft().y()*2));
       
  2173             gradient.setColorAt(0, option->palette.button().color());
       
  2174             gradient.setColorAt(1, option->palette.button().color().darker(110));
       
  2175             painter->fillRect(rect, gradient);
       
  2176 
       
  2177 #ifndef QT_NO_MAINWINDOW
       
  2178             if (widget && qobject_cast<const QMainWindow *>(widget->parentWidget())) {
       
  2179                 QPen oldPen = painter->pen();
       
  2180                 painter->setPen(QPen(shadow));
       
  2181                 painter->drawLine(option->rect.bottomLeft(), option->rect.bottomRight());
       
  2182             }
       
  2183 #endif // QT_NO_MAINWINDOW
       
  2184         }
       
  2185         painter->restore();
       
  2186         break;
       
  2187 #ifndef QT_NO_TABBAR
       
  2188 	case CE_TabBarTabShape:
       
  2189         painter->save();
       
  2190         if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(option)) {
       
  2191 
       
  2192             bool rtlHorTabs = (tab->direction == Qt::RightToLeft
       
  2193                                && (tab->shape == QTabBar::RoundedNorth
       
  2194                                    || tab->shape == QTabBar::RoundedSouth));
       
  2195             bool selected = tab->state & State_Selected;
       
  2196             bool lastTab = ((!rtlHorTabs && tab->position == QStyleOptionTab::End)
       
  2197                             || (rtlHorTabs
       
  2198                                 && tab->position == QStyleOptionTab::Beginning));
       
  2199             bool onlyTab = tab->position == QStyleOptionTab::OnlyOneTab;
       
  2200             bool leftCornerWidget = (tab->cornerWidgets & QStyleOptionTab::LeftCornerWidget);
       
  2201 
       
  2202             bool atBeginning = ((tab->position == (tab->direction == Qt::LeftToRight ?
       
  2203                                 QStyleOptionTab::Beginning : QStyleOptionTab::End)) || onlyTab);
       
  2204 
       
  2205             bool onlyOne = tab->position == QStyleOptionTab::OnlyOneTab;
       
  2206             bool previousSelected =
       
  2207                 ((!rtlHorTabs
       
  2208                   && tab->selectedPosition == QStyleOptionTab::PreviousIsSelected)
       
  2209                  || (rtlHorTabs
       
  2210                      && tab->selectedPosition == QStyleOptionTab::NextIsSelected));
       
  2211             bool nextSelected =
       
  2212                 ((!rtlHorTabs
       
  2213                   && tab->selectedPosition == QStyleOptionTab::NextIsSelected)
       
  2214                  || (rtlHorTabs
       
  2215                      && tab->selectedPosition
       
  2216                      == QStyleOptionTab::PreviousIsSelected));
       
  2217             int tabBarAlignment = proxy()->styleHint(SH_TabBar_Alignment, tab, widget);
       
  2218             bool leftAligned = (!rtlHorTabs && tabBarAlignment == Qt::AlignLeft)
       
  2219                                || (rtlHorTabs
       
  2220                                    && tabBarAlignment == Qt::AlignRight);
       
  2221 
       
  2222             bool rightAligned = (!rtlHorTabs && tabBarAlignment == Qt::AlignRight)
       
  2223                                 || (rtlHorTabs
       
  2224                                     && tabBarAlignment == Qt::AlignLeft);
       
  2225 
       
  2226             QColor light = tab->palette.light().color();
       
  2227             QColor midlight = tab->palette.midlight().color();
       
  2228 
       
  2229             QColor background = tab->palette.background().color();
       
  2230             int borderThinkness = proxy()->pixelMetric(PM_TabBarBaseOverlap, tab, widget);
       
  2231             if (selected)
       
  2232                 borderThinkness /= 2;
       
  2233             QRect r2(option->rect);
       
  2234             int x1 = r2.left();
       
  2235             int x2 = r2.right();
       
  2236             int y1 = r2.top();
       
  2237             int y2 = r2.bottom();
       
  2238 
       
  2239             QTransform rotMatrix;
       
  2240             bool flip = false;
       
  2241             painter->setPen(shadow);
       
  2242             QColor activeHighlight = option->palette.color(QPalette::Normal, QPalette::Highlight);
       
  2243             switch (tab->shape) {
       
  2244             case QTabBar::RoundedNorth:
       
  2245                 break;
       
  2246             case QTabBar::RoundedSouth:
       
  2247                 rotMatrix.rotate(180);
       
  2248                 rotMatrix.translate(0, -rect.height() + 1);
       
  2249                 rotMatrix.scale(-1, 1);
       
  2250                 painter->setTransform(rotMatrix, true);
       
  2251                 break;
       
  2252             case QTabBar::RoundedWest:
       
  2253                 rotMatrix.rotate(180 + 90);
       
  2254                 rotMatrix.scale(-1, 1);
       
  2255                 flip = true;
       
  2256                 painter->setTransform(rotMatrix, true);
       
  2257                 break;
       
  2258             case QTabBar::RoundedEast:
       
  2259                 rotMatrix.rotate(90);
       
  2260                 rotMatrix.translate(0, - rect.width() + 1);
       
  2261                 flip = true;
       
  2262                 painter->setTransform(rotMatrix, true);
       
  2263                 break;
       
  2264             default:
       
  2265                 painter->restore();
       
  2266                 QWindowsStyle::drawControl(element, tab, painter, widget);
       
  2267                 return;
       
  2268             }
       
  2269 
       
  2270             if (flip) {
       
  2271                 QRect tmp = rect;
       
  2272                 rect = QRect(tmp.y(), tmp.x(), tmp.height(), tmp.width());
       
  2273                 int temp = x1;
       
  2274                 x1 = y1;
       
  2275                 y1 = temp;
       
  2276                 temp = x2;
       
  2277                 x2 = y2;
       
  2278                 y2 = temp;
       
  2279             }
       
  2280 
       
  2281             QLinearGradient gradient(rect.topLeft(), rect.bottomLeft());
       
  2282             if (option->palette.button().gradient()) {
       
  2283                 if (selected)
       
  2284                     gradient.setStops(option->palette.background().gradient()->stops());
       
  2285                 else
       
  2286                     gradient.setStops(option->palette.background().gradient()->stops());
       
  2287             }
       
  2288             else if (selected) {
       
  2289                 gradient.setColorAt(0, option->palette.background().color().lighter(104));
       
  2290                 gradient.setColorAt(1, tabFrameColor);
       
  2291                 painter->fillRect(rect.adjusted(0, 2, 0, -1), gradient);
       
  2292             } else {
       
  2293                 y1 += 2;
       
  2294                 gradient.setColorAt(0, option->palette.background().color());
       
  2295                 gradient.setColorAt(1, dark.lighter(120));
       
  2296                 painter->fillRect(rect.adjusted(0, 2, 0, -2), gradient);
       
  2297             }
       
  2298 
       
  2299             // Delete border
       
  2300             if (selected) {
       
  2301                 painter->setPen(QPen(activeHighlight, 0));
       
  2302                 painter->drawLine(x1 + 1, y1 + 1, x2 - 1, y1 + 1);
       
  2303                 painter->drawLine(x1 , y1 + 2, x2 , y1 + 2);
       
  2304             } else {
       
  2305                 painter->setPen(dark);
       
  2306                 painter->drawLine(x1, y2 - 1, x2 + 2, y2 - 1 );
       
  2307                 if (tab->shape == QTabBar::RoundedNorth || tab->shape == QTabBar::RoundedWest) {
       
  2308                     painter->setPen(light);
       
  2309                     painter->drawLine(x1, y2 , x2, y2 );
       
  2310                 }
       
  2311             }
       
  2312             // Left
       
  2313             if (atBeginning || selected ) {
       
  2314                 painter->setPen(light);
       
  2315                 painter->drawLine(x1 + 1, y1 + 2 + 1, x1 + 1, y2 - ((onlyOne || atBeginning) && selected && leftAligned ? 0 : borderThinkness) - (atBeginning && leftCornerWidget ? 1 : 0));
       
  2316                 painter->drawPoint(x1 + 1, y1 + 1);
       
  2317                 painter->setPen(dark);
       
  2318                 painter->drawLine(x1, y1 + 2, x1, y2 - ((onlyOne || atBeginning)  && leftAligned ? 0 : borderThinkness) - (atBeginning && leftCornerWidget ? 1 : 0));
       
  2319             }
       
  2320             // Top
       
  2321             {
       
  2322                 int beg = x1 + (previousSelected ? 0 : 2);
       
  2323                 int end = x2 - (nextSelected ? 0 : 2);
       
  2324                 painter->setPen(light);
       
  2325 
       
  2326                 if (!selected)painter->drawLine(beg - 2, y1 + 1, end, y1 + 1);
       
  2327 
       
  2328                 if (selected)
       
  2329                     painter->setPen(QPen(activeHighlight.darker(150), 0));
       
  2330                 else
       
  2331                     painter->setPen(darkOutline);
       
  2332                 painter->drawLine(beg, y1 , end, y1);
       
  2333 
       
  2334                 if (atBeginning|| selected) {
       
  2335                     painter->drawPoint(beg - 1, y1 + 1);
       
  2336                 } else if (!atBeginning) {
       
  2337                     painter->drawPoint(beg - 1, y1);
       
  2338                     painter->drawPoint(beg - 2, y1);
       
  2339                     if (!lastTab) {
       
  2340                         painter->setPen(dark.lighter(130));
       
  2341                         painter->drawPoint(end + 1, y1);
       
  2342                         painter->drawPoint(end + 2 , y1);
       
  2343                         painter->drawPoint(end + 2, y1 + 1);
       
  2344                     }
       
  2345                 }
       
  2346             }
       
  2347             // Right
       
  2348             if (lastTab || selected || onlyOne || !nextSelected) {
       
  2349                 painter->setPen(darkOutline);
       
  2350                 painter->drawLine(x2, y1 + 2, x2, y2 - ((onlyOne || lastTab) && selected && rightAligned ? 0 : borderThinkness));
       
  2351                 if (selected)
       
  2352                     painter->setPen(QPen(activeHighlight.darker(150), 0));
       
  2353                 else
       
  2354                     painter->setPen(darkOutline);
       
  2355                 painter->drawPoint(x2 - 1, y1 + 1);
       
  2356 
       
  2357                 if (selected) {
       
  2358                     painter->setPen(background.darker(110));
       
  2359                     painter->drawLine(x2 - 1, y1 + 3, x2 - 1, y2 - ((onlyOne || lastTab) && selected && rightAligned ? 0 : borderThinkness));
       
  2360                 }
       
  2361             }
       
  2362         }
       
  2363         painter->restore();
       
  2364         break;
       
  2365 
       
  2366 #endif // QT_NO_TABBAR
       
  2367     default:
       
  2368         QWindowsStyle::drawControl(element,option,painter,widget);
       
  2369         break;
       
  2370     }
       
  2371 }
       
  2372 
       
  2373 /*!
       
  2374   \reimp
       
  2375 */
       
  2376 QPalette QCleanlooksStyle::standardPalette () const
       
  2377 {
       
  2378     QPalette palette = QWindowsStyle::standardPalette();
       
  2379     palette.setBrush(QPalette::Active, QPalette::Highlight, QColor(98, 140, 178));
       
  2380     palette.setBrush(QPalette::Inactive, QPalette::Highlight, QColor(145, 141, 126));
       
  2381     palette.setBrush(QPalette::Disabled, QPalette::Highlight, QColor(145, 141, 126));
       
  2382 
       
  2383     QColor backGround(239, 235, 231);
       
  2384 
       
  2385     QColor light = backGround.lighter(150);
       
  2386     QColor base = Qt::white;
       
  2387     QColor dark = QColor(170, 156, 143).darker(110);
       
  2388     dark = backGround.darker(150);
       
  2389     QColor darkDisabled = QColor(209, 200, 191).darker(110);
       
  2390 
       
  2391     //### Find the correct disabled text color
       
  2392     palette.setBrush(QPalette::Disabled, QPalette::Text, QColor(190, 190, 190));
       
  2393 
       
  2394     palette.setBrush(QPalette::Window, backGround);
       
  2395     palette.setBrush(QPalette::Mid, backGround.darker(130));
       
  2396     palette.setBrush(QPalette::Light, light);
       
  2397 
       
  2398     palette.setBrush(QPalette::Active, QPalette::Base, base);
       
  2399     palette.setBrush(QPalette::Inactive, QPalette::Base, base);
       
  2400     palette.setBrush(QPalette::Disabled, QPalette::Base, backGround);
       
  2401 
       
  2402     palette.setBrush(QPalette::Midlight, palette.mid().color().lighter(110));
       
  2403 
       
  2404     palette.setBrush(QPalette::All, QPalette::Dark, dark);
       
  2405     palette.setBrush(QPalette::Disabled, QPalette::Dark, darkDisabled);
       
  2406 
       
  2407     QColor button = backGround;
       
  2408 
       
  2409     palette.setBrush(QPalette::Button, button);
       
  2410 
       
  2411     QColor shadow = dark.darker(135);
       
  2412     palette.setBrush(QPalette::Shadow, shadow);
       
  2413     palette.setBrush(QPalette::Disabled, QPalette::Shadow, shadow.lighter(150));
       
  2414     palette.setBrush(QPalette::HighlightedText, QColor(QRgb(0xffffffff)));
       
  2415     return palette;
       
  2416 }
       
  2417 
       
  2418 /*!
       
  2419   \reimp
       
  2420 */
       
  2421 void QCleanlooksStyle::drawComplexControl(ComplexControl control, const QStyleOptionComplex *option,
       
  2422                                          QPainter *painter, const QWidget *widget) const
       
  2423 {
       
  2424     QColor button = option->palette.button().color();
       
  2425     QColor dark;
       
  2426     QColor grooveColor;
       
  2427     QColor darkOutline;
       
  2428     dark.setHsv(button.hue(),
       
  2429                 CL_MIN(255, (int)(button.saturation()*1.9)),
       
  2430                 CL_MIN(255, (int)(button.value()*0.7)));
       
  2431     grooveColor.setHsv(button.hue(),
       
  2432                 CL_MIN(255, (int)(button.saturation()*2.6)),
       
  2433                 CL_MIN(255, (int)(button.value()*0.9)));
       
  2434     darkOutline.setHsv(button.hue(),
       
  2435                 CL_MIN(255, (int)(button.saturation()*3.0)),
       
  2436                 CL_MIN(255, (int)(button.value()*0.6)));
       
  2437 
       
  2438     QColor alphaCornerColor;
       
  2439     if (widget) {
       
  2440         // ### backgroundrole/foregroundrole should be part of the style option
       
  2441         alphaCornerColor = mergedColors(option->palette.color(widget->backgroundRole()), darkOutline);
       
  2442     } else {
       
  2443         alphaCornerColor = mergedColors(option->palette.background().color(), darkOutline);
       
  2444     }
       
  2445     QColor gripShadow = grooveColor.darker(110);
       
  2446     QColor buttonShadow = option->palette.button().color().darker(110);
       
  2447 
       
  2448     QColor gradientStartColor = option->palette.button().color().lighter(108);
       
  2449     QColor gradientStopColor = mergedColors(option->palette.button().color().darker(108), dark.lighter(150), 70);
       
  2450 
       
  2451     QColor highlightedGradientStartColor = option->palette.button().color();
       
  2452     QColor highlightedGradientStopColor = mergedColors(option->palette.button().color(), option->palette.highlight().color(), 85);
       
  2453 
       
  2454     QColor highlightedDarkInnerBorderColor = mergedColors(option->palette.button().color(), option->palette.highlight().color(), 35);
       
  2455     QColor highlightedLightInnerBorderColor = mergedColors(option->palette.button().color(), option->palette.highlight().color(), 58);
       
  2456 
       
  2457     QColor buttonShadowAlpha = option->palette.background().color().darker(105);
       
  2458 
       
  2459     QPalette palette = option->palette;
       
  2460 
       
  2461     switch (control) {
       
  2462 #ifndef QT_NO_SPINBOX
       
  2463     case CC_SpinBox:
       
  2464         if (const QStyleOptionSpinBox *spinBox = qstyleoption_cast<const QStyleOptionSpinBox *>(option)) {
       
  2465             QPixmap cache;
       
  2466             QString pixmapName = QStyleHelper::uniqueName(QLatin1String("spinbox"), spinBox, spinBox->rect.size());
       
  2467             if (!QPixmapCache::find(pixmapName, cache)) {
       
  2468                 cache = QPixmap(spinBox->rect.size());
       
  2469                 cache.fill(Qt::transparent);
       
  2470                 QRect pixmapRect(0, 0, spinBox->rect.width(), spinBox->rect.height());
       
  2471                 QPainter cachePainter(&cache);
       
  2472 
       
  2473                 bool isEnabled = (spinBox->state & State_Enabled);
       
  2474                 //bool focus = isEnabled && (spinBox->state & State_HasFocus);
       
  2475                 bool hover = isEnabled && (spinBox->state & State_MouseOver);
       
  2476                 bool sunken = (spinBox->state & State_Sunken);
       
  2477                 bool upIsActive = (spinBox->activeSubControls == SC_SpinBoxUp);
       
  2478                 bool downIsActive = (spinBox->activeSubControls == SC_SpinBoxDown);
       
  2479 
       
  2480                 QRect rect = pixmapRect;
       
  2481                 QStyleOptionSpinBox spinBoxCopy = *spinBox;
       
  2482                 spinBoxCopy.rect = pixmapRect;
       
  2483                 QRect upRect = proxy()->subControlRect(CC_SpinBox, &spinBoxCopy, SC_SpinBoxUp, widget);
       
  2484                 QRect downRect = proxy()->subControlRect(CC_SpinBox, &spinBoxCopy, SC_SpinBoxDown, widget);
       
  2485 
       
  2486                 int fw = spinBoxCopy.frame ? proxy()->pixelMetric(PM_SpinBoxFrameWidth, &spinBoxCopy, widget) : 0;
       
  2487                 cachePainter.fillRect(rect.adjusted(1, qMax(fw - 1, 0), -1, -fw),
       
  2488                                       option->palette.base());
       
  2489 
       
  2490                 QRect r = rect.adjusted(0, 1, 0, -1);
       
  2491                 if (spinBox->frame) {
       
  2492 
       
  2493                     QColor topShadow = darkOutline;
       
  2494                     topShadow.setAlpha(60);
       
  2495                     cachePainter.setPen(topShadow);
       
  2496 
       
  2497                     // antialias corners
       
  2498                     const QPoint points[8] = {
       
  2499                         QPoint(r.right(), r.top() + 1),
       
  2500                         QPoint(r.right() - 1, r.top() ),
       
  2501                         QPoint(r.right(), r.bottom() - 1),
       
  2502                         QPoint(r.right() - 1, r.bottom() ),
       
  2503                         QPoint(r.left() + 1, r.bottom()),
       
  2504                         QPoint(r.left(), r.bottom() - 1),
       
  2505                         QPoint(r.left() + 1, r.top()),
       
  2506                         QPoint(r.left(), r.top() + 1)
       
  2507                     };
       
  2508                     cachePainter.drawPoints(points, 8);
       
  2509 
       
  2510                     // draw frame
       
  2511                     topShadow.setAlpha(30);
       
  2512                     cachePainter.setPen(topShadow);
       
  2513                     cachePainter.drawLine(QPoint(r.left() + 2, r.top() - 1), QPoint(r.right() - 2, r.top() - 1));
       
  2514 
       
  2515                     cachePainter.setPen(QPen(option->palette.background().color(), 1));
       
  2516                     cachePainter.drawLine(QPoint(r.left() + 2, r.top() + 1), QPoint(r.right() - 2, r.top() + 1));
       
  2517                     QColor highlight = Qt::white;
       
  2518                     highlight.setAlpha(130);
       
  2519                     cachePainter.setPen(option->palette.base().color().darker(120));
       
  2520                     cachePainter.drawLine(QPoint(r.left() + 1, r.top() + 1),
       
  2521                                   QPoint(r.right() - 1, r.top() + 1));
       
  2522                     cachePainter.drawLine(QPoint(r.left() + 1, r.top() + 1),
       
  2523                                   QPoint(r.left() + 1, r.bottom() - 1));
       
  2524                     cachePainter.setPen(option->palette.base().color());
       
  2525                     cachePainter.drawLine(QPoint(r.right() - 1, r.top() + 1),
       
  2526                                   QPoint(r.right() - 1, r.bottom() - 1));
       
  2527                     cachePainter.drawLine(QPoint(r.left() + 1, r.bottom() - 1),
       
  2528                                   QPoint(r.right() - 1, r.bottom() - 1));
       
  2529                     cachePainter.setPen(highlight);
       
  2530                     cachePainter.drawLine(QPoint(r.left() + 3, r.bottom() + 1),
       
  2531                                   QPoint(r.right() - 3, r.bottom() + 1));
       
  2532 
       
  2533                     cachePainter.setPen(QPen(darkOutline, 1));
       
  2534 
       
  2535                     // top and bottom lines
       
  2536                     const QLine lines[4] = {
       
  2537                         QLine(QPoint(r.left() + 2, r.bottom()), QPoint(r.right()- 2, r.bottom())),
       
  2538                         QLine(QPoint(r.left() + 2, r.top()), QPoint(r.right() - 2, r.top())),
       
  2539                         QLine(QPoint(r.right(), r.top() + 2), QPoint(r.right(), r.bottom() - 2)),
       
  2540                         QLine(QPoint(r.left(), r.top() + 2), QPoint(r.left(), r.bottom() - 2))
       
  2541                     };
       
  2542                     cachePainter.drawLines(lines, 4);
       
  2543                 }
       
  2544 
       
  2545                     // gradients
       
  2546                     qt_cleanlooks_draw_gradient(&cachePainter, upRect,
       
  2547                                             gradientStartColor.darker(106),
       
  2548                                             gradientStopColor, TopDown, option->palette.button());
       
  2549                     qt_cleanlooks_draw_gradient(&cachePainter, downRect.adjusted(0, 0, 0, 1),
       
  2550                                             gradientStartColor.darker(106),
       
  2551                                             gradientStopColor, TopDown, option->palette.button());
       
  2552                 if (isEnabled) {
       
  2553                     if(upIsActive) {
       
  2554                         if (sunken) {
       
  2555                             cachePainter.fillRect(upRect.adjusted(1, 0, 0, 0), gradientStopColor.darker(110));
       
  2556                         } else if (hover) {
       
  2557                             qt_cleanlooks_draw_gradient(&cachePainter, upRect.adjusted(1, 0, 0, 0),
       
  2558                                                     gradientStartColor.lighter(110),
       
  2559                                                     gradientStopColor.lighter(110), TopDown, option->palette.button());
       
  2560                         }
       
  2561                     }
       
  2562                     if(downIsActive) {
       
  2563                         if (sunken) {
       
  2564                             cachePainter.fillRect(downRect.adjusted(1, 0, 0, 1), gradientStopColor.darker(110));
       
  2565 
       
  2566                         } else if (hover) {
       
  2567                                 qt_cleanlooks_draw_gradient(&cachePainter, downRect.adjusted(1, 0, 0, 1),
       
  2568                                                         gradientStartColor.lighter(110),
       
  2569                                                         gradientStopColor.lighter(110), TopDown, option->palette.button());
       
  2570                         }
       
  2571                     }
       
  2572                 }
       
  2573 
       
  2574                 if (spinBox->frame) {
       
  2575                     // rounded corners
       
  2576                     const QPoint points[4] = {
       
  2577                         QPoint(r.left() + 1, r.bottom() - 1),
       
  2578                         QPoint(r.left() + 1, r.top() + 1),
       
  2579                         QPoint(r.right() - 1, r.bottom() - 1),
       
  2580                         QPoint(r.right() - 1, r.top() + 1)
       
  2581                     };
       
  2582                     cachePainter.drawPoints(points, 4);
       
  2583 
       
  2584                     if (option->state & State_HasFocus) {
       
  2585                         QColor darkoutline = option->palette.highlight().color().darker(150);
       
  2586                         QColor innerline = mergedColors(option->palette.highlight().color(), Qt::white);
       
  2587                         cachePainter.setPen(QPen(innerline, 0));
       
  2588                         if (spinBox->direction == Qt::LeftToRight) {
       
  2589                             cachePainter.drawRect(rect.adjusted(1, 2, -3 -downRect.width(), -3));
       
  2590                             cachePainter.setPen(QPen(darkoutline, 0));
       
  2591                             const QLine lines[4] = {
       
  2592                                 QLine(QPoint(r.left() + 2, r.bottom()), QPoint(r.right()- downRect.width() - 1, r.bottom())),
       
  2593                                 QLine(QPoint(r.left() + 2, r.top()), QPoint(r.right() - downRect.width() - 1, r.top())),
       
  2594                                 QLine(QPoint(r.right() - downRect.width() - 1, r.top() + 1), QPoint(r.right()- downRect.width() - 1, r.bottom() - 1)),
       
  2595                                 QLine(QPoint(r.left(), r.top() + 2), QPoint(r.left(), r.bottom() - 2))
       
  2596                             };
       
  2597                             cachePainter.drawLines(lines, 4);
       
  2598                             cachePainter.drawPoint(QPoint(r.left() + 1, r.bottom() - 1));
       
  2599                             cachePainter.drawPoint(QPoint(r.left() + 1, r.top() + 1));
       
  2600                             cachePainter.drawLine(QPoint(r.left(), r.top() + 2), QPoint(r.left(), r.bottom() - 2));
       
  2601                         } else {
       
  2602                             cachePainter.drawRect(rect.adjusted(downRect.width() + 2, 2, -2, -3));
       
  2603                             cachePainter.setPen(QPen(darkoutline, 0));
       
  2604                             cachePainter.drawLine(QPoint(r.left() + downRect.width(), r.bottom()), QPoint(r.right()- 2 - 1, r.bottom()));
       
  2605                             cachePainter.drawLine(QPoint(r.left() + downRect.width(), r.top()), QPoint(r.right() - 2 - 1, r.top()));
       
  2606 
       
  2607                             cachePainter.drawLine(QPoint(r.right(), r.top() + 2), QPoint(r.right(), r.bottom() - 2));
       
  2608                             cachePainter.drawPoint(QPoint(r.right() - 1, r.bottom() - 1));
       
  2609                             cachePainter.drawPoint(QPoint(r.right() - 1, r.top() + 1));
       
  2610                             cachePainter.drawLine(QPoint(r.left() + downRect.width() + 1, r.top()),
       
  2611                                                   QPoint(r.left() + downRect.width() + 1, r.bottom()));
       
  2612                         }
       
  2613                     }
       
  2614                 }
       
  2615 
       
  2616                 // outline the up/down buttons
       
  2617                 cachePainter.setPen(darkOutline);
       
  2618                 QColor light = option->palette.light().color().lighter();
       
  2619 
       
  2620                 if (spinBox->direction == Qt::RightToLeft) {
       
  2621                     cachePainter.drawLine(upRect.right(), upRect.top() - 1, upRect.right(), downRect.bottom() + 1);
       
  2622                     cachePainter.setPen(light);
       
  2623                     cachePainter.drawLine(upRect.right() - 1, upRect.top() + 3, upRect.right() - 1, downRect.bottom() );
       
  2624                 } else {
       
  2625                     cachePainter.drawLine(upRect.left(), upRect.top() - 1, upRect.left(), downRect.bottom() + 1);
       
  2626                     cachePainter.setPen(light);
       
  2627                     cachePainter.drawLine(upRect.left() + 1, upRect.top() , upRect.left() + 1, downRect.bottom() );
       
  2628                 }
       
  2629                 if (upIsActive && sunken) {
       
  2630                     cachePainter.setPen(gradientStopColor.darker(130));
       
  2631                     cachePainter.drawLine(upRect.left() + 1, upRect.top(), upRect.left() + 1, upRect.bottom());
       
  2632                     cachePainter.drawLine(upRect.left(), upRect.top() - 1, upRect.right(), upRect.top() - 1);
       
  2633                 } else {
       
  2634                     cachePainter.setPen(light);
       
  2635                     cachePainter.drawLine(upRect.topLeft() + QPoint(1, -1), upRect.topRight() + QPoint(-1, -1));
       
  2636                     cachePainter.setPen(darkOutline);
       
  2637                     cachePainter.drawLine(upRect.bottomLeft(), upRect.bottomRight());
       
  2638                 }
       
  2639                 if (downIsActive && sunken) {
       
  2640                     cachePainter.setPen(gradientStopColor.darker(130));
       
  2641                     cachePainter.drawLine(downRect.left() + 1, downRect.top(), downRect.left() + 1, downRect.bottom() + 1);
       
  2642                     cachePainter.drawLine(downRect.left(), downRect.top(), downRect.right(), downRect.top());
       
  2643                     cachePainter.setPen(gradientStopColor.darker(110));
       
  2644                     cachePainter.drawLine(downRect.left(), downRect.bottom() + 1, downRect.right(), downRect.bottom() + 1);
       
  2645                 } else {
       
  2646                     cachePainter.setPen(light);
       
  2647                     cachePainter.drawLine(downRect.topLeft() + QPoint(2,0), downRect.topRight());
       
  2648                 }
       
  2649 
       
  2650                 if (spinBox->buttonSymbols == QAbstractSpinBox::PlusMinus) {
       
  2651                     int centerX = upRect.center().x();
       
  2652                     int centerY = upRect.center().y();
       
  2653                     cachePainter.setPen(spinBox->palette.foreground().color());
       
  2654 
       
  2655                     // plus/minus
       
  2656                     if (spinBox->activeSubControls == SC_SpinBoxUp && sunken) {
       
  2657                         cachePainter.drawLine(1 + centerX - 2, 1 + centerY, 1 + centerX + 2, 1 + centerY);
       
  2658                         cachePainter.drawLine(1 + centerX, 1 + centerY - 2, 1 + centerX, 1 + centerY + 2);
       
  2659                     } else {
       
  2660                         cachePainter.drawLine(centerX - 2, centerY, centerX + 2, centerY);
       
  2661                         cachePainter.drawLine(centerX, centerY - 2, centerX, centerY + 2);
       
  2662                     }
       
  2663 
       
  2664                     centerX = downRect.center().x();
       
  2665                     centerY = downRect.center().y();
       
  2666                     if (spinBox->activeSubControls == SC_SpinBoxDown && sunken) {
       
  2667                         cachePainter.drawLine(1 + centerX - 2, 1 + centerY, 1 + centerX + 2, 1 + centerY);
       
  2668                     } else {
       
  2669                         cachePainter.drawLine(centerX - 2, centerY, centerX + 2, centerY);
       
  2670                     }
       
  2671                 } else if (spinBox->buttonSymbols == QAbstractSpinBox::UpDownArrows){
       
  2672                     // arrows
       
  2673                     QImage upArrow(qt_spinbox_button_arrow_up);
       
  2674                     upArrow.setColor(1, spinBox->palette.foreground().color().rgba());
       
  2675 
       
  2676                     cachePainter.drawImage(upRect.center().x() - upArrow.width() / 2,
       
  2677                                             upRect.center().y() - upArrow.height() / 2,
       
  2678                                             upArrow);
       
  2679 
       
  2680                     QImage downArrow(qt_spinbox_button_arrow_down);
       
  2681                     downArrow.setColor(1, spinBox->palette.foreground().color().rgba());
       
  2682 
       
  2683                     cachePainter.drawImage(downRect.center().x() - downArrow.width() / 2,
       
  2684                                             downRect.center().y() - downArrow.height() / 2 + 1,
       
  2685                                             downArrow);
       
  2686                 }
       
  2687 
       
  2688                 QColor disabledColor = option->palette.background().color();
       
  2689                 disabledColor.setAlpha(150);
       
  2690                 if (!(spinBox->stepEnabled & QAbstractSpinBox::StepUpEnabled))
       
  2691                     cachePainter.fillRect(upRect.adjusted(1, 0, 0, 0), disabledColor);
       
  2692                 if (!(spinBox->stepEnabled & QAbstractSpinBox::StepDownEnabled)) {
       
  2693                     cachePainter.fillRect(downRect.adjusted(1, 0, 0, 0), disabledColor);
       
  2694                 }
       
  2695                 cachePainter.end();
       
  2696                 QPixmapCache::insert(pixmapName, cache);
       
  2697             }
       
  2698             painter->drawPixmap(spinBox->rect.topLeft(), cache);
       
  2699         }
       
  2700         break;
       
  2701 #endif // QT_NO_SPINBOX
       
  2702     case CC_TitleBar:
       
  2703         painter->save();
       
  2704         if (const QStyleOptionTitleBar *titleBar = qstyleoption_cast<const QStyleOptionTitleBar *>(option)) {
       
  2705             const int buttonMargin = 5;
       
  2706             bool active = (titleBar->titleBarState & State_Active);
       
  2707             QRect fullRect = titleBar->rect;
       
  2708             QPalette palette = option->palette;
       
  2709             QColor highlight = option->palette.highlight().color();
       
  2710 
       
  2711             QColor titleBarFrameBorder(active ? highlight.darker(180): dark.darker(110));
       
  2712             QColor titleBarHighlight(active ? highlight.lighter(120): palette.background().color().lighter(120));
       
  2713             QColor textColor(active ? 0xffffff : 0xff000000);
       
  2714             QColor textAlphaColor(active ? 0xffffff : 0xff000000 );
       
  2715 
       
  2716 #ifdef  QT3_SUPPORT
       
  2717             if (widget && widget->inherits("Q3DockWindowTitleBar")) {
       
  2718                 QStyleOptionDockWidgetV2 dockwidget;
       
  2719                 dockwidget.QStyleOption::operator=(*option);
       
  2720                 proxy()->drawControl(CE_DockWidgetTitle, &dockwidget, painter, widget);
       
  2721             } else
       
  2722 #endif // QT3_SUPPORT
       
  2723             {
       
  2724                 // Fill title bar gradient
       
  2725                 QColor titlebarColor = QColor(active ? highlight: palette.background().color());
       
  2726                 QColor titleBarGradientStop(active ? highlight.darker(150): palette.background().color().darker(120));
       
  2727                 QLinearGradient gradient(option->rect.center().x(), option->rect.top(),
       
  2728                                          option->rect.center().x(), option->rect.bottom());
       
  2729 
       
  2730                 gradient.setColorAt(0, titlebarColor.lighter(114));
       
  2731                 gradient.setColorAt(0.5, titlebarColor.lighter(102));
       
  2732                 gradient.setColorAt(0.51, titlebarColor.darker(104));
       
  2733                 gradient.setColorAt(1, titlebarColor);
       
  2734                 painter->fillRect(option->rect.adjusted(1, 1, -1, 0), gradient);
       
  2735 
       
  2736                 // Frame and rounded corners
       
  2737                 painter->setPen(titleBarFrameBorder);
       
  2738 
       
  2739                 // top outline
       
  2740                 painter->drawLine(fullRect.left() + 5, fullRect.top(), fullRect.right() - 5, fullRect.top());
       
  2741                 painter->drawLine(fullRect.left(), fullRect.top() + 4, fullRect.left(), fullRect.bottom());
       
  2742                 const QPoint points[5] = {
       
  2743                     QPoint(fullRect.left() + 4, fullRect.top() + 1),
       
  2744                     QPoint(fullRect.left() + 3, fullRect.top() + 1),
       
  2745                     QPoint(fullRect.left() + 2, fullRect.top() + 2),
       
  2746                     QPoint(fullRect.left() + 1, fullRect.top() + 3),
       
  2747                     QPoint(fullRect.left() + 1, fullRect.top() + 4)
       
  2748                 };
       
  2749                 painter->drawPoints(points, 5);
       
  2750 
       
  2751                 painter->drawLine(fullRect.right(), fullRect.top() + 4, fullRect.right(), fullRect.bottom());
       
  2752                 const QPoint points2[5] = {
       
  2753                     QPoint(fullRect.right() - 3, fullRect.top() + 1),
       
  2754                     QPoint(fullRect.right() - 4, fullRect.top() + 1),
       
  2755                     QPoint(fullRect.right() - 2, fullRect.top() + 2),
       
  2756                     QPoint(fullRect.right() - 1, fullRect.top() + 3),
       
  2757                     QPoint(fullRect.right() - 1, fullRect.top() + 4)
       
  2758                 };
       
  2759                 painter->drawPoints(points2, 5);
       
  2760 
       
  2761                 // draw bottomline
       
  2762                 painter->drawLine(fullRect.right(), fullRect.bottom(), fullRect.left(), fullRect.bottom());
       
  2763 
       
  2764                 // top highlight
       
  2765                 painter->setPen(titleBarHighlight);
       
  2766                 painter->drawLine(fullRect.left() + 6, fullRect.top() + 1, fullRect.right() - 6, fullRect.top() + 1);
       
  2767             }
       
  2768             // draw title
       
  2769             QRect textRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarLabel, widget);
       
  2770             QFont font = painter->font();
       
  2771             font.setBold(true);
       
  2772             painter->setFont(font);
       
  2773             painter->setPen(active? (titleBar->palette.text().color().lighter(120)) :
       
  2774                                      titleBar->palette.text().color() );
       
  2775             // Note workspace also does elliding but it does not use the correct font
       
  2776             QString title = QFontMetrics(font).elidedText(titleBar->text, Qt::ElideRight, textRect.width() - 14);
       
  2777             painter->drawText(textRect.adjusted(1, 1, 1, 1), title, QTextOption(Qt::AlignHCenter | Qt::AlignVCenter));
       
  2778             painter->setPen(Qt::white);
       
  2779             if (active)
       
  2780                 painter->drawText(textRect, title, QTextOption(Qt::AlignHCenter | Qt::AlignVCenter));
       
  2781             // min button
       
  2782             if ((titleBar->subControls & SC_TitleBarMinButton) && (titleBar->titleBarFlags & Qt::WindowMinimizeButtonHint) &&
       
  2783                 !(titleBar->titleBarState& Qt::WindowMinimized)) {
       
  2784                 QRect minButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarMinButton, widget);
       
  2785                 if (minButtonRect.isValid()) {
       
  2786                     bool hover = (titleBar->activeSubControls & SC_TitleBarMinButton) && (titleBar->state & State_MouseOver);
       
  2787                     bool sunken = (titleBar->activeSubControls & SC_TitleBarMinButton) && (titleBar->state & State_Sunken);
       
  2788                     qt_cleanlooks_draw_mdibutton(painter, titleBar, minButtonRect, hover, sunken);
       
  2789                     QRect minButtonIconRect = minButtonRect.adjusted(buttonMargin ,buttonMargin , -buttonMargin, -buttonMargin);
       
  2790                     painter->setPen(textColor);
       
  2791                     painter->drawLine(minButtonIconRect.center().x() - 2, minButtonIconRect.center().y() + 3,
       
  2792                                     minButtonIconRect.center().x() + 3, minButtonIconRect.center().y() + 3);
       
  2793                     painter->drawLine(minButtonIconRect.center().x() - 2, minButtonIconRect.center().y() + 4,
       
  2794                                     minButtonIconRect.center().x() + 3, minButtonIconRect.center().y() + 4);
       
  2795                     painter->setPen(textAlphaColor);
       
  2796                     painter->drawLine(minButtonIconRect.center().x() - 3, minButtonIconRect.center().y() + 3,
       
  2797                                     minButtonIconRect.center().x() - 3, minButtonIconRect.center().y() + 4);
       
  2798                     painter->drawLine(minButtonIconRect.center().x() + 4, minButtonIconRect.center().y() + 3,
       
  2799                                     minButtonIconRect.center().x() + 4, minButtonIconRect.center().y() + 4);
       
  2800                 }
       
  2801             }
       
  2802             // max button
       
  2803             if ((titleBar->subControls & SC_TitleBarMaxButton) && (titleBar->titleBarFlags & Qt::WindowMaximizeButtonHint) &&
       
  2804                 !(titleBar->titleBarState & Qt::WindowMaximized)) {
       
  2805                 QRect maxButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarMaxButton, widget);
       
  2806                 if (maxButtonRect.isValid()) {
       
  2807                     bool hover = (titleBar->activeSubControls & SC_TitleBarMaxButton) && (titleBar->state & State_MouseOver);
       
  2808                     bool sunken = (titleBar->activeSubControls & SC_TitleBarMaxButton) && (titleBar->state & State_Sunken);
       
  2809                     qt_cleanlooks_draw_mdibutton(painter, titleBar, maxButtonRect, hover, sunken);
       
  2810 
       
  2811                     QRect maxButtonIconRect = maxButtonRect.adjusted(buttonMargin, buttonMargin, -buttonMargin, -buttonMargin);
       
  2812 
       
  2813                     painter->setPen(textColor);
       
  2814                     painter->drawRect(maxButtonIconRect.adjusted(0, 0, -1, -1));
       
  2815                     painter->drawLine(maxButtonIconRect.left() + 1, maxButtonIconRect.top() + 1,
       
  2816                                     maxButtonIconRect.right() - 1, maxButtonIconRect.top() + 1);
       
  2817                     painter->setPen(textAlphaColor);
       
  2818                     const QPoint points[4] = {
       
  2819                         maxButtonIconRect.topLeft(),
       
  2820                         maxButtonIconRect.topRight(),
       
  2821                         maxButtonIconRect.bottomLeft(),
       
  2822                         maxButtonIconRect.bottomRight()
       
  2823                     };
       
  2824                     painter->drawPoints(points, 4);
       
  2825                 }
       
  2826             }
       
  2827 
       
  2828             // close button
       
  2829             if ((titleBar->subControls & SC_TitleBarCloseButton) && (titleBar->titleBarFlags & Qt::WindowSystemMenuHint)) {
       
  2830                 QRect closeButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarCloseButton, widget);
       
  2831                 if (closeButtonRect.isValid()) {
       
  2832                     bool hover = (titleBar->activeSubControls & SC_TitleBarCloseButton) && (titleBar->state & State_MouseOver);
       
  2833                     bool sunken = (titleBar->activeSubControls & SC_TitleBarCloseButton) && (titleBar->state & State_Sunken);
       
  2834                     qt_cleanlooks_draw_mdibutton(painter, titleBar, closeButtonRect, hover, sunken);
       
  2835                     QRect closeIconRect = closeButtonRect.adjusted(buttonMargin, buttonMargin, -buttonMargin, -buttonMargin);
       
  2836                     painter->setPen(textAlphaColor);
       
  2837                     const QLine lines[4] = {
       
  2838                         QLine(closeIconRect.left() + 1, closeIconRect.top(),
       
  2839                               closeIconRect.right(), closeIconRect.bottom() - 1),
       
  2840                         QLine(closeIconRect.left(), closeIconRect.top() + 1,
       
  2841                               closeIconRect.right() - 1, closeIconRect.bottom()),
       
  2842                         QLine(closeIconRect.right() - 1, closeIconRect.top(),
       
  2843                               closeIconRect.left(), closeIconRect.bottom() - 1),
       
  2844                         QLine(closeIconRect.right(), closeIconRect.top() + 1,
       
  2845                               closeIconRect.left() + 1, closeIconRect.bottom())
       
  2846                     };
       
  2847                     painter->drawLines(lines, 4);
       
  2848                     const QPoint points[4] = {
       
  2849                         closeIconRect.topLeft(),
       
  2850                         closeIconRect.topRight(),
       
  2851                         closeIconRect.bottomLeft(),
       
  2852                         closeIconRect.bottomRight()
       
  2853                     };
       
  2854                     painter->drawPoints(points, 4);
       
  2855 
       
  2856                     painter->setPen(textColor);
       
  2857                     painter->drawLine(closeIconRect.left() + 1, closeIconRect.top() + 1,
       
  2858                                     closeIconRect.right() - 1, closeIconRect.bottom() - 1);
       
  2859                     painter->drawLine(closeIconRect.left() + 1, closeIconRect.bottom() - 1,
       
  2860                                     closeIconRect.right() - 1, closeIconRect.top() + 1);
       
  2861                 }
       
  2862             }
       
  2863 
       
  2864             // normalize button
       
  2865             if ((titleBar->subControls & SC_TitleBarNormalButton) &&
       
  2866                (((titleBar->titleBarFlags & Qt::WindowMinimizeButtonHint) &&
       
  2867                (titleBar->titleBarState & Qt::WindowMinimized)) ||
       
  2868                ((titleBar->titleBarFlags & Qt::WindowMaximizeButtonHint) &&
       
  2869                (titleBar->titleBarState & Qt::WindowMaximized)))) {
       
  2870                 QRect normalButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarNormalButton, widget);
       
  2871                 if (normalButtonRect.isValid()) {
       
  2872 
       
  2873                     bool hover = (titleBar->activeSubControls & SC_TitleBarNormalButton) && (titleBar->state & State_MouseOver);
       
  2874                     bool sunken = (titleBar->activeSubControls & SC_TitleBarNormalButton) && (titleBar->state & State_Sunken);
       
  2875                     QRect normalButtonIconRect = normalButtonRect.adjusted(buttonMargin, buttonMargin, -buttonMargin, -buttonMargin);
       
  2876                     qt_cleanlooks_draw_mdibutton(painter, titleBar, normalButtonRect, hover, sunken);
       
  2877 
       
  2878                     QRect frontWindowRect = normalButtonIconRect.adjusted(0, 3, -3, 0);
       
  2879                     painter->setPen(textColor);
       
  2880                     painter->drawRect(frontWindowRect.adjusted(0, 0, -1, -1));
       
  2881                     painter->drawLine(frontWindowRect.left() + 1, frontWindowRect.top() + 1,
       
  2882                                     frontWindowRect.right() - 1, frontWindowRect.top() + 1);
       
  2883                     painter->setPen(textAlphaColor);
       
  2884                     const QPoint points[4] = {
       
  2885                         frontWindowRect.topLeft(),
       
  2886                         frontWindowRect.topRight(),
       
  2887                         frontWindowRect.bottomLeft(),
       
  2888                         frontWindowRect.bottomRight()
       
  2889                     };
       
  2890                     painter->drawPoints(points, 4);
       
  2891 
       
  2892                     QRect backWindowRect = normalButtonIconRect.adjusted(3, 0, 0, -3);
       
  2893                     QRegion clipRegion = backWindowRect;
       
  2894                     clipRegion -= frontWindowRect;
       
  2895                     painter->save();
       
  2896                     painter->setClipRegion(clipRegion);
       
  2897                     painter->setPen(textColor);
       
  2898                     painter->drawRect(backWindowRect.adjusted(0, 0, -1, -1));
       
  2899                     painter->drawLine(backWindowRect.left() + 1, backWindowRect.top() + 1,
       
  2900                                     backWindowRect.right() - 1, backWindowRect.top() + 1);
       
  2901                     painter->setPen(textAlphaColor);
       
  2902                     const QPoint points2[4] = {
       
  2903                         backWindowRect.topLeft(),
       
  2904                         backWindowRect.topRight(),
       
  2905                         backWindowRect.bottomLeft(),
       
  2906                         backWindowRect.bottomRight()
       
  2907                     };
       
  2908                     painter->drawPoints(points2, 4);
       
  2909                     painter->restore();
       
  2910                 }
       
  2911             }
       
  2912 
       
  2913             // context help button
       
  2914             if (titleBar->subControls & SC_TitleBarContextHelpButton
       
  2915                 && (titleBar->titleBarFlags & Qt::WindowContextHelpButtonHint)) {
       
  2916                 QRect contextHelpButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarContextHelpButton, widget);
       
  2917                 if (contextHelpButtonRect.isValid()) {
       
  2918                     bool hover = (titleBar->activeSubControls & SC_TitleBarContextHelpButton) && (titleBar->state & State_MouseOver);
       
  2919                     bool sunken = (titleBar->activeSubControls & SC_TitleBarContextHelpButton) && (titleBar->state & State_Sunken);
       
  2920                     qt_cleanlooks_draw_mdibutton(painter, titleBar, contextHelpButtonRect, hover, sunken);
       
  2921 
       
  2922                     QColor blend;
       
  2923                     QImage image(qt_titlebar_context_help);
       
  2924                     QColor alpha = textColor;
       
  2925                     alpha.setAlpha(128);
       
  2926                     image.setColor(1, textColor.rgba());
       
  2927                     image.setColor(2, alpha.rgba());
       
  2928                     painter->setRenderHint(QPainter::SmoothPixmapTransform);
       
  2929                     painter->drawImage(contextHelpButtonRect.adjusted(4, 4, -4, -4), image);
       
  2930                 }
       
  2931             }
       
  2932 
       
  2933             // shade button
       
  2934             if (titleBar->subControls & SC_TitleBarShadeButton && (titleBar->titleBarFlags & Qt::WindowShadeButtonHint)) {
       
  2935                 QRect shadeButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarShadeButton, widget);
       
  2936                 if (shadeButtonRect.isValid()) {
       
  2937                     bool hover = (titleBar->activeSubControls & SC_TitleBarShadeButton) && (titleBar->state & State_MouseOver);
       
  2938                     bool sunken = (titleBar->activeSubControls & SC_TitleBarShadeButton) && (titleBar->state & State_Sunken);
       
  2939                     qt_cleanlooks_draw_mdibutton(painter, titleBar, shadeButtonRect, hover, sunken);
       
  2940                     QImage image(qt_scrollbar_button_arrow_up);
       
  2941                     image.setColor(1, textColor.rgba());
       
  2942                     painter->drawImage(shadeButtonRect.adjusted(5, 7, -5, -7), image);
       
  2943                 }
       
  2944             }
       
  2945 
       
  2946             // unshade button
       
  2947             if (titleBar->subControls & SC_TitleBarUnshadeButton && (titleBar->titleBarFlags & Qt::WindowShadeButtonHint)) {
       
  2948                 QRect unshadeButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarUnshadeButton, widget);
       
  2949                 if (unshadeButtonRect.isValid()) {
       
  2950                     bool hover = (titleBar->activeSubControls & SC_TitleBarUnshadeButton) && (titleBar->state & State_MouseOver);
       
  2951                     bool sunken = (titleBar->activeSubControls & SC_TitleBarUnshadeButton) && (titleBar->state & State_Sunken);
       
  2952                     qt_cleanlooks_draw_mdibutton(painter, titleBar, unshadeButtonRect, hover, sunken);
       
  2953                     QImage image(qt_scrollbar_button_arrow_down);
       
  2954                     image.setColor(1, textColor.rgba());
       
  2955                     painter->drawImage(unshadeButtonRect.adjusted(5, 7, -5, -7), image);
       
  2956                 }
       
  2957             }
       
  2958 
       
  2959             if ((titleBar->subControls & SC_TitleBarSysMenu) && (titleBar->titleBarFlags & Qt::WindowSystemMenuHint)) {
       
  2960                 QRect iconRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarSysMenu, widget);
       
  2961                 if (iconRect.isValid()) {
       
  2962                     if (!titleBar->icon.isNull()) {
       
  2963                         titleBar->icon.paint(painter, iconRect);
       
  2964                     } else {
       
  2965                         QStyleOption tool(0);
       
  2966                         tool.palette = titleBar->palette;
       
  2967                         QPixmap pm = standardIcon(SP_TitleBarMenuButton, &tool, widget).pixmap(16, 16);
       
  2968                         tool.rect = iconRect;
       
  2969                         painter->save();
       
  2970                         proxy()->drawItemPixmap(painter, iconRect, Qt::AlignCenter, pm);
       
  2971                         painter->restore();
       
  2972                     }
       
  2973                 }
       
  2974             }
       
  2975         }
       
  2976         painter->restore();
       
  2977         break;
       
  2978 #ifndef QT_NO_SCROLLBAR
       
  2979     case CC_ScrollBar:
       
  2980         painter->save();
       
  2981         if (const QStyleOptionSlider *scrollBar = qstyleoption_cast<const QStyleOptionSlider *>(option)) {
       
  2982             bool isEnabled = scrollBar->state & State_Enabled;
       
  2983             bool reverse = scrollBar->direction == Qt::RightToLeft;
       
  2984             bool horizontal = scrollBar->orientation == Qt::Horizontal;
       
  2985             bool sunken = scrollBar->state & State_Sunken;
       
  2986 
       
  2987             painter->fillRect(option->rect, option->palette.background());
       
  2988 
       
  2989             QRect rect = scrollBar->rect;
       
  2990             QRect scrollBarSubLine = proxy()->subControlRect(control, scrollBar, SC_ScrollBarSubLine, widget);
       
  2991             QRect scrollBarAddLine = proxy()->subControlRect(control, scrollBar, SC_ScrollBarAddLine, widget);
       
  2992             QRect scrollBarSlider = proxy()->subControlRect(control, scrollBar, SC_ScrollBarSlider, widget);
       
  2993             QRect grooveRect = proxy()->subControlRect(control, scrollBar, SC_ScrollBarGroove, widget);
       
  2994 
       
  2995             // paint groove
       
  2996             if (scrollBar->subControls & SC_ScrollBarGroove) {
       
  2997                 painter->setBrush(grooveColor);
       
  2998                 painter->setPen(Qt::NoPen);
       
  2999                 if (horizontal) {
       
  3000                     painter->drawRect(grooveRect);
       
  3001                     painter->setPen(darkOutline);
       
  3002                     painter->drawLine(grooveRect.topLeft(), grooveRect.topRight());
       
  3003                     painter->drawLine(grooveRect.bottomLeft(), grooveRect.bottomRight());
       
  3004                 } else {
       
  3005                     painter->drawRect(grooveRect);
       
  3006                     painter->setPen(darkOutline);
       
  3007                     painter->drawLine(grooveRect.topLeft(), grooveRect.bottomLeft());
       
  3008                     painter->drawLine(grooveRect.topRight(), grooveRect.bottomRight());
       
  3009                 }
       
  3010             }
       
  3011             //paint slider
       
  3012             if (scrollBar->subControls & SC_ScrollBarSlider) {
       
  3013                 QRect pixmapRect = scrollBarSlider;
       
  3014                 if (horizontal)
       
  3015                     pixmapRect.adjust(-1, 0, 0, -1);
       
  3016                 else
       
  3017                     pixmapRect.adjust(0, -1, -1, 0);
       
  3018 
       
  3019                 if (isEnabled) {
       
  3020                     QLinearGradient gradient(pixmapRect.center().x(), pixmapRect.top(),
       
  3021                                              pixmapRect.center().x(), pixmapRect.bottom());
       
  3022                     if (!horizontal)
       
  3023                         gradient = QLinearGradient(pixmapRect.left(), pixmapRect.center().y(),
       
  3024                                                    pixmapRect.right(), pixmapRect.center().y());
       
  3025 
       
  3026                     if (option->palette.button().gradient()) {
       
  3027                         gradient.setStops(option->palette.button().gradient()->stops());
       
  3028                     } else {
       
  3029                         if (sunken || (option->state & State_MouseOver &&
       
  3030                             (scrollBar->activeSubControls & SC_ScrollBarSlider))) {
       
  3031                             gradient.setColorAt(0, gradientStartColor.lighter(110));
       
  3032                             gradient.setColorAt(1, gradientStopColor.lighter(110));
       
  3033                         } else {
       
  3034                             gradient.setColorAt(0, gradientStartColor);
       
  3035                             gradient.setColorAt(1, gradientStopColor);
       
  3036                         }
       
  3037                     }
       
  3038                     painter->setPen(QPen(darkOutline, 0));
       
  3039                     painter->setBrush(gradient);
       
  3040                     painter->drawRect(pixmapRect);
       
  3041 
       
  3042 
       
  3043                     //calculate offsets used by highlight and shadow
       
  3044                     int yoffset, xoffset;
       
  3045                     if (option->state & State_Horizontal) {
       
  3046                         xoffset = 0;
       
  3047                         yoffset = 1;
       
  3048                     } else {
       
  3049                         xoffset = 1;
       
  3050                         yoffset = 0;
       
  3051                     }
       
  3052                     //draw slider highlights
       
  3053                     painter->setPen(QPen(gradientStopColor, 0));
       
  3054                     painter->drawLine(scrollBarSlider.left() + xoffset,
       
  3055                                       scrollBarSlider.bottom() - yoffset,
       
  3056                                       scrollBarSlider.right() - xoffset,
       
  3057                                       scrollBarSlider.bottom() - yoffset);
       
  3058                     painter->drawLine(scrollBarSlider.right() - xoffset,
       
  3059                                       scrollBarSlider.top() + yoffset,
       
  3060                                       scrollBarSlider.right() - xoffset,
       
  3061                                       scrollBarSlider.bottom() - yoffset);
       
  3062 
       
  3063                     //draw slider shadow
       
  3064                     painter->setPen(QPen(gradientStartColor, 0));
       
  3065                     painter->drawLine(scrollBarSlider.left() + xoffset,
       
  3066                                       scrollBarSlider.top() + yoffset,
       
  3067                                       scrollBarSlider.right() - xoffset,
       
  3068                                       scrollBarSlider.top() + yoffset);
       
  3069                     painter->drawLine(scrollBarSlider.left() + xoffset,
       
  3070                                       scrollBarSlider.top() + yoffset,
       
  3071                                       scrollBarSlider.left() + xoffset,
       
  3072                                       scrollBarSlider.bottom() - yoffset);
       
  3073                 } else {
       
  3074                     QLinearGradient gradient(pixmapRect.center().x(), pixmapRect.top(),
       
  3075                                              pixmapRect.center().x(), pixmapRect.bottom());
       
  3076                     if (!horizontal) {
       
  3077                         gradient = QLinearGradient(pixmapRect.left(), pixmapRect.center().y(),
       
  3078                                                    pixmapRect.right(), pixmapRect.center().y());
       
  3079                     }
       
  3080                     if (sunken) {
       
  3081                         gradient.setColorAt(0, gradientStartColor.lighter(110));
       
  3082                         gradient.setColorAt(1, gradientStopColor.lighter(110));
       
  3083                     } else {
       
  3084                         gradient.setColorAt(0, gradientStartColor);
       
  3085                         gradient.setColorAt(1, gradientStopColor);
       
  3086                     }
       
  3087                     painter->setPen(darkOutline);
       
  3088                     painter->setBrush(gradient);
       
  3089                     painter->drawRect(pixmapRect);
       
  3090                 }
       
  3091                 int gripMargin = 4;
       
  3092                 //draw grips
       
  3093                 if (horizontal) {
       
  3094                     for (int i = -3; i< 6 ; i += 3) {
       
  3095                         painter->setPen(QPen(gripShadow, 1));
       
  3096                         painter->drawLine(
       
  3097                             QPoint(scrollBarSlider.center().x() + i ,
       
  3098                                    scrollBarSlider.top() + gripMargin),
       
  3099                             QPoint(scrollBarSlider.center().x() + i,
       
  3100                                    scrollBarSlider.bottom() - gripMargin));
       
  3101                         painter->setPen(QPen(palette.light(), 1));
       
  3102                         painter->drawLine(
       
  3103                             QPoint(scrollBarSlider.center().x() + i + 1,
       
  3104                                    scrollBarSlider.top() + gripMargin  ),
       
  3105                             QPoint(scrollBarSlider.center().x() + i + 1,
       
  3106                                    scrollBarSlider.bottom() - gripMargin));
       
  3107                     }
       
  3108                 } else {
       
  3109                     for (int i = -3; i < 6 ; i += 3) {
       
  3110                         painter->setPen(QPen(gripShadow, 1));
       
  3111                         painter->drawLine(
       
  3112                             QPoint(scrollBarSlider.left() + gripMargin ,
       
  3113                                    scrollBarSlider.center().y()+ i),
       
  3114                             QPoint(scrollBarSlider.right() - gripMargin,
       
  3115                                    scrollBarSlider.center().y()+ i));
       
  3116                         painter->setPen(QPen(palette.light(), 1));
       
  3117                         painter->drawLine(
       
  3118                             QPoint(scrollBarSlider.left() + gripMargin,
       
  3119                                    scrollBarSlider.center().y() + 1 + i),
       
  3120                             QPoint(scrollBarSlider.right() - gripMargin,
       
  3121                                    scrollBarSlider.center().y() + 1 + i));
       
  3122                     }
       
  3123                 }
       
  3124             }
       
  3125 
       
  3126             // The SubLine (up/left) buttons
       
  3127             if (scrollBar->subControls & SC_ScrollBarSubLine) {
       
  3128                 //int scrollBarExtent = proxy()->pixelMetric(PM_ScrollBarExtent, option, widget);
       
  3129                 QRect pixmapRect = scrollBarSubLine;
       
  3130                 if (isEnabled ) {
       
  3131                     QRect fillRect = pixmapRect.adjusted(1, 1, -1, -1);
       
  3132                     // Gradients
       
  3133                     if ((scrollBar->activeSubControls & SC_ScrollBarSubLine) && sunken) {
       
  3134                         qt_cleanlooks_draw_gradient(painter,
       
  3135                                                     QRect(fillRect),
       
  3136                                                     gradientStopColor.darker(120),
       
  3137                                                     gradientStopColor.darker(120),
       
  3138                                                     horizontal ? TopDown : FromLeft, option->palette.button());
       
  3139                     } else {
       
  3140                         qt_cleanlooks_draw_gradient(painter,
       
  3141                                                     QRect(fillRect),
       
  3142                                                     gradientStartColor.lighter(105),
       
  3143                                                     gradientStopColor,
       
  3144                                                     horizontal ? TopDown : FromLeft, option->palette.button());
       
  3145                     }
       
  3146                 }
       
  3147                 // Details
       
  3148                 QImage subButton;
       
  3149                 if (horizontal) {
       
  3150                     subButton = QImage(reverse ? qt_scrollbar_button_right : qt_scrollbar_button_left);
       
  3151                 } else {
       
  3152                     subButton = QImage(qt_scrollbar_button_up);
       
  3153                 }
       
  3154                 subButton.setColor(1, alphaCornerColor.rgba());
       
  3155                 subButton.setColor(2, darkOutline.rgba());
       
  3156                 if ((scrollBar->activeSubControls & SC_ScrollBarSubLine) && sunken) {
       
  3157                     subButton.setColor(3, gradientStopColor.darker(140).rgba());
       
  3158                     subButton.setColor(4, gradientStopColor.darker(120).rgba());
       
  3159                 } else {
       
  3160                     subButton.setColor(3, gradientStartColor.lighter(105).rgba());
       
  3161                     subButton.setColor(4, gradientStopColor.rgba());
       
  3162                 }
       
  3163                 subButton.setColor(5, scrollBar->palette.text().color().rgba());
       
  3164                 painter->drawImage(pixmapRect, subButton);
       
  3165 
       
  3166                 // Arrows
       
  3167                 PrimitiveElement arrow;
       
  3168                 if (option->state & State_Horizontal)
       
  3169                     arrow = option->direction == Qt::LeftToRight ? PE_IndicatorArrowLeft: PE_IndicatorArrowRight;
       
  3170                 else
       
  3171                     arrow = PE_IndicatorArrowUp;
       
  3172                 QStyleOption arrowOpt = *option;
       
  3173                 arrowOpt.rect = scrollBarSubLine.adjusted(3, 3, -2, -2);
       
  3174                 proxy()->drawPrimitive(arrow, &arrowOpt, painter, widget);
       
  3175 
       
  3176 
       
  3177                 // The AddLine (down/right) button
       
  3178                 if (scrollBar->subControls & SC_ScrollBarAddLine) {
       
  3179                     QString addLinePixmapName = QStyleHelper::uniqueName(QLatin1String("scrollbar_addline"), option, QSize(16, 16));
       
  3180                     QRect pixmapRect = scrollBarAddLine;
       
  3181                     if (isEnabled) {
       
  3182                         QRect fillRect = pixmapRect.adjusted(1, 1, -1, -1);
       
  3183                         // Gradients
       
  3184                         if ((scrollBar->activeSubControls & SC_ScrollBarAddLine) && sunken) {
       
  3185                             qt_cleanlooks_draw_gradient(painter,
       
  3186                                                         fillRect,
       
  3187                                                         gradientStopColor.darker(120),
       
  3188                                                         gradientStopColor.darker(120),
       
  3189                                                         horizontal ? TopDown: FromLeft, option->palette.button());
       
  3190                         } else {
       
  3191                             qt_cleanlooks_draw_gradient(painter,
       
  3192                                                         fillRect,
       
  3193                                                         gradientStartColor.lighter(105),
       
  3194                                                         gradientStopColor,
       
  3195                                                         horizontal ? TopDown : FromLeft, option->palette.button());
       
  3196                         }
       
  3197                     }
       
  3198                     // Details
       
  3199                     QImage addButton;
       
  3200                     if (horizontal) {
       
  3201                         addButton = QImage(reverse ? qt_scrollbar_button_left : qt_scrollbar_button_right);
       
  3202                     } else {
       
  3203                         addButton = QImage(qt_scrollbar_button_down);
       
  3204                     }
       
  3205                     addButton.setColor(1, alphaCornerColor.rgba());
       
  3206                     addButton.setColor(2, darkOutline.rgba());
       
  3207                     if ((scrollBar->activeSubControls & SC_ScrollBarAddLine) && sunken) {
       
  3208                         addButton.setColor(3, gradientStopColor.darker(140).rgba());
       
  3209                         addButton.setColor(4, gradientStopColor.darker(120).rgba());
       
  3210                     } else {
       
  3211                         addButton.setColor(3, gradientStartColor.lighter(105).rgba());
       
  3212                         addButton.setColor(4, gradientStopColor.rgba());
       
  3213                     }
       
  3214                     addButton.setColor(5, scrollBar->palette.text().color().rgba());
       
  3215                     painter->drawImage(pixmapRect, addButton);
       
  3216 
       
  3217                     PrimitiveElement arrow;
       
  3218                     if (option->state & State_Horizontal)
       
  3219                         arrow = option->direction == Qt::LeftToRight ? PE_IndicatorArrowRight : PE_IndicatorArrowLeft;
       
  3220                     else
       
  3221                         arrow = PE_IndicatorArrowDown;
       
  3222 
       
  3223                     QStyleOption arrowOpt = *option;
       
  3224                     arrowOpt.rect = scrollBarAddLine.adjusted(3, 3, -2, -2);
       
  3225                     proxy()->drawPrimitive(arrow, &arrowOpt, painter, widget);
       
  3226                 }
       
  3227             }
       
  3228         }
       
  3229         painter->restore();
       
  3230         break;;
       
  3231 #endif // QT_NO_SCROLLBAR
       
  3232 #ifndef QT_NO_COMBOBOX
       
  3233     case CC_ComboBox:
       
  3234         painter->save();
       
  3235         if (const QStyleOptionComboBox *comboBox = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
       
  3236             bool sunken = comboBox->state & State_On; // play dead, if combobox has no items
       
  3237             bool isEnabled = (comboBox->state & State_Enabled);
       
  3238             bool focus = isEnabled && (comboBox->state & State_HasFocus);
       
  3239             QPixmap cache;
       
  3240             QString pixmapName = QStyleHelper::uniqueName(QLatin1String("combobox"), option, comboBox->rect.size());
       
  3241             if (sunken)
       
  3242                 pixmapName += QLatin1String("-sunken");
       
  3243             if (comboBox->editable)
       
  3244                 pixmapName += QLatin1String("-editable");
       
  3245             if (isEnabled)
       
  3246                 pixmapName += QLatin1String("-enabled");
       
  3247 
       
  3248             if (!QPixmapCache::find(pixmapName, cache)) {
       
  3249                 cache = QPixmap(comboBox->rect.size());
       
  3250                 cache.fill(Qt::transparent);
       
  3251                 QPainter cachePainter(&cache);
       
  3252                 QRect pixmapRect(0, 0, comboBox->rect.width(), comboBox->rect.height());
       
  3253                 QStyleOptionComboBox comboBoxCopy = *comboBox;
       
  3254                 comboBoxCopy.rect = pixmapRect;
       
  3255 
       
  3256                 QRect rect = pixmapRect;
       
  3257                 QRect downArrowRect = proxy()->subControlRect(CC_ComboBox, &comboBoxCopy,
       
  3258                                                      SC_ComboBoxArrow, widget);
       
  3259                 QRect editRect = proxy()->subControlRect(CC_ComboBox, &comboBoxCopy,
       
  3260                                                      SC_ComboBoxEditField, widget);
       
  3261                 // Draw a push button
       
  3262                 if (comboBox->editable) {
       
  3263                     QStyleOptionFrame  buttonOption;
       
  3264                     buttonOption.QStyleOption::operator=(*comboBox);
       
  3265                     buttonOption.rect = rect;
       
  3266                     buttonOption.state = comboBox->state & (State_Enabled | State_MouseOver);
       
  3267 
       
  3268                     if (sunken) {
       
  3269                         buttonOption.state |= State_Sunken;
       
  3270                         buttonOption.state &= ~State_MouseOver;
       
  3271                     }
       
  3272 
       
  3273                     proxy()->drawPrimitive(PE_PanelButtonCommand, &buttonOption, &cachePainter, widget);
       
  3274 
       
  3275                     //remove shadow from left side of edit field when pressed:
       
  3276                     if (comboBox->direction != Qt::RightToLeft)
       
  3277                         cachePainter.fillRect(editRect.left() - 1, editRect.top() + 1, editRect.left(),
       
  3278                         editRect.bottom() - 3, option->palette.base());
       
  3279 
       
  3280                     cachePainter.setPen(dark.lighter(110));
       
  3281                     if (!sunken) {
       
  3282                         int borderSize = 2;
       
  3283                         if (comboBox->direction == Qt::RightToLeft) {
       
  3284                             cachePainter.drawLine(QPoint(downArrowRect.right() - 1, downArrowRect.top() + borderSize ),
       
  3285                                                   QPoint(downArrowRect.right() - 1, downArrowRect.bottom() - borderSize));
       
  3286                             cachePainter.setPen(option->palette.light().color());
       
  3287                             cachePainter.drawLine(QPoint(downArrowRect.right(), downArrowRect.top() + borderSize),
       
  3288                                                   QPoint(downArrowRect.right(), downArrowRect.bottom() - borderSize));
       
  3289                         } else {
       
  3290                             cachePainter.drawLine(QPoint(downArrowRect.left() , downArrowRect.top() + borderSize),
       
  3291                                                   QPoint(downArrowRect.left() , downArrowRect.bottom() - borderSize));
       
  3292                             cachePainter.setPen(option->palette.light().color());
       
  3293                             cachePainter.drawLine(QPoint(downArrowRect.left() + 1, downArrowRect.top() + borderSize),
       
  3294                                                   QPoint(downArrowRect.left() + 1, downArrowRect.bottom() - borderSize));
       
  3295                         }
       
  3296                     } else {
       
  3297                         if (comboBox->direction == Qt::RightToLeft) {
       
  3298                             cachePainter.drawLine(QPoint(downArrowRect.right(), downArrowRect.top() + 2),
       
  3299                                                   QPoint(downArrowRect.right(), downArrowRect.bottom() - 2));
       
  3300 
       
  3301                         } else {
       
  3302                             cachePainter.drawLine(QPoint(downArrowRect.left(), downArrowRect.top() + 2),
       
  3303                                                   QPoint(downArrowRect.left(), downArrowRect.bottom() - 2));
       
  3304                         }
       
  3305                     }
       
  3306                 } else {
       
  3307                     QStyleOptionButton buttonOption;
       
  3308                     buttonOption.QStyleOption::operator=(*comboBox);
       
  3309                     buttonOption.rect = rect;
       
  3310                     buttonOption.state = comboBox->state & (State_Enabled | State_MouseOver);
       
  3311                     if (sunken) {
       
  3312                         buttonOption.state |= State_Sunken;
       
  3313                         buttonOption.state &= ~State_MouseOver;
       
  3314                     }
       
  3315                     proxy()->drawPrimitive(PE_PanelButtonCommand, &buttonOption, &cachePainter, widget);
       
  3316 
       
  3317                     cachePainter.setPen(buttonShadow.darker(102));
       
  3318                     int borderSize = 4;
       
  3319 
       
  3320                     if (!sunken) {
       
  3321                         if (comboBox->direction == Qt::RightToLeft) {
       
  3322                             cachePainter.drawLine(QPoint(downArrowRect.right() + 1, downArrowRect.top() + borderSize),
       
  3323                                                   QPoint(downArrowRect.right() + 1, downArrowRect.bottom() - borderSize));
       
  3324                             cachePainter.setPen(option->palette.light().color());
       
  3325                             cachePainter.drawLine(QPoint(downArrowRect.right(), downArrowRect.top() + borderSize),
       
  3326                                                   QPoint(downArrowRect.right(), downArrowRect.bottom() - borderSize));
       
  3327                         } else {
       
  3328                             cachePainter.drawLine(QPoint(downArrowRect.left() - 1, downArrowRect.top() + borderSize),
       
  3329                                                   QPoint(downArrowRect.left() - 1, downArrowRect.bottom() - borderSize));
       
  3330                             cachePainter.setPen(option->palette.light().color());
       
  3331                             cachePainter.drawLine(QPoint(downArrowRect.left() , downArrowRect.top() + borderSize),
       
  3332                                                   QPoint(downArrowRect.left() , downArrowRect.bottom() - borderSize));
       
  3333                         }
       
  3334                     } else {
       
  3335                         cachePainter.setPen(dark.lighter(110));
       
  3336                         if (comboBox->direction == Qt::RightToLeft) {
       
  3337                             cachePainter.drawLine(QPoint(downArrowRect.right() + 1, downArrowRect.top() + borderSize),
       
  3338                                                   QPoint(downArrowRect.right() + 1, downArrowRect.bottom() - borderSize));
       
  3339 
       
  3340                         } else {
       
  3341                             cachePainter.drawLine(QPoint(downArrowRect.left() - 1, downArrowRect.top() + borderSize),
       
  3342                                                   QPoint(downArrowRect.left() - 1, downArrowRect.bottom() - borderSize));
       
  3343                         }
       
  3344                     }
       
  3345                 }
       
  3346 
       
  3347 
       
  3348                 if (comboBox->subControls & SC_ComboBoxArrow) {
       
  3349                     if (comboBox->editable) {
       
  3350                         // Draw the down arrow
       
  3351                         QImage downArrow(qt_cleanlooks_arrow_down_xpm);
       
  3352                         downArrow.setColor(1, comboBox->palette.foreground().color().rgba());
       
  3353                         cachePainter.drawImage(downArrowRect.center().x() - downArrow.width() / 2,
       
  3354                                                downArrowRect.center().y() - downArrow.height() / 2 + 1, downArrow);
       
  3355                     } else {
       
  3356                         // Draw the up/down arrow
       
  3357                         QImage upArrow(qt_scrollbar_button_arrow_up);
       
  3358                         upArrow.setColor(1, comboBox->palette.foreground().color().rgba());
       
  3359                         QImage downArrow(qt_scrollbar_button_arrow_down);
       
  3360                         downArrow.setColor(1, comboBox->palette.foreground().color().rgba());
       
  3361                         cachePainter.drawImage(downArrowRect.center().x() - downArrow.width() / 2,
       
  3362                                                downArrowRect.center().y() - upArrow.height() - 1 , upArrow);
       
  3363                         cachePainter.drawImage(downArrowRect.center().x() - downArrow.width() / 2,
       
  3364                                                downArrowRect.center().y()  + 2, downArrow);
       
  3365                     }
       
  3366                 }
       
  3367                 // Draw the focus rect
       
  3368                 if (focus && !comboBox->editable
       
  3369                     && ((option->state & State_KeyboardFocusChange) || styleHint(SH_UnderlineShortcut, option, widget))) {
       
  3370                     QStyleOptionFocusRect focus;
       
  3371                     focus.rect = proxy()->subControlRect(CC_ComboBox, &comboBoxCopy, SC_ComboBoxEditField, widget)
       
  3372                                  .adjusted(0, 2, option->direction == Qt::RightToLeft ? 1 : -1, -2);
       
  3373                     proxy()->drawPrimitive(PE_FrameFocusRect, &focus, &cachePainter, widget);
       
  3374                 }
       
  3375                 cachePainter.end();
       
  3376                 QPixmapCache::insert(pixmapName, cache);
       
  3377             }
       
  3378             painter->drawPixmap(comboBox->rect.topLeft(), cache);
       
  3379         }
       
  3380         painter->restore();
       
  3381         break;
       
  3382 #endif // QT_NO_COMBOBOX
       
  3383 #ifndef QT_NO_GROUPBOX
       
  3384     case CC_GroupBox:
       
  3385         painter->save();
       
  3386         if (const QStyleOptionGroupBox *groupBox = qstyleoption_cast<const QStyleOptionGroupBox *>(option)) {
       
  3387             QRect textRect = proxy()->subControlRect(CC_GroupBox, groupBox, SC_GroupBoxLabel, widget);
       
  3388             QRect checkBoxRect = proxy()->subControlRect(CC_GroupBox, groupBox, SC_GroupBoxCheckBox, widget);
       
  3389             bool flat = groupBox->features & QStyleOptionFrameV2::Flat;
       
  3390 
       
  3391             if(!flat) {
       
  3392                 if (groupBox->subControls & QStyle::SC_GroupBoxFrame) {
       
  3393                     QStyleOptionFrameV2 frame;
       
  3394                     frame.QStyleOption::operator=(*groupBox);
       
  3395                     frame.features = groupBox->features;
       
  3396                     frame.lineWidth = groupBox->lineWidth;
       
  3397                     frame.midLineWidth = groupBox->midLineWidth;
       
  3398                     frame.rect = proxy()->subControlRect(CC_GroupBox, option, SC_GroupBoxFrame, widget);
       
  3399 
       
  3400                     painter->save();
       
  3401                     QRegion region(groupBox->rect);
       
  3402                     bool ltr = groupBox->direction == Qt::LeftToRight;
       
  3403                     region -= checkBoxRect.united(textRect).adjusted(ltr ? -4 : 0, 0, ltr ? 0 : 4, 0);
       
  3404                     if (!groupBox->text.isEmpty() ||  groupBox->subControls & SC_GroupBoxCheckBox)
       
  3405                         painter->setClipRegion(region);
       
  3406                     frame.palette.setBrush(QPalette::Dark, option->palette.mid().color().lighter(110));
       
  3407                     proxy()->drawPrimitive(PE_FrameGroupBox, &frame, painter);
       
  3408                     painter->restore();
       
  3409                 }
       
  3410             }
       
  3411             // Draw title
       
  3412             if ((groupBox->subControls & QStyle::SC_GroupBoxLabel) && !groupBox->text.isEmpty()) {
       
  3413                 if (!groupBox->text.isEmpty()) {
       
  3414                     QColor textColor = groupBox->textColor;
       
  3415                     if (textColor.isValid())
       
  3416                         painter->setPen(textColor);
       
  3417                     int alignment = int(groupBox->textAlignment);
       
  3418                     if (!styleHint(QStyle::SH_UnderlineShortcut, option, widget))
       
  3419                         alignment |= Qt::TextHideMnemonic;
       
  3420                     if (flat) {
       
  3421                         QFont font = painter->font();
       
  3422                         font.setBold(true);
       
  3423                         painter->setFont(font);
       
  3424                         if (groupBox->subControls & SC_GroupBoxCheckBox) {
       
  3425                             textRect.adjust(checkBoxRect.right() + 4, 0, checkBoxRect.right() + 4, 0);
       
  3426                         }
       
  3427                     }
       
  3428                     painter->drawText(textRect, Qt::TextShowMnemonic | Qt::AlignLeft| alignment, groupBox->text);
       
  3429                 }
       
  3430             }
       
  3431             if (groupBox->subControls & SC_GroupBoxCheckBox) {
       
  3432                 QStyleOptionButton box;
       
  3433                 box.QStyleOption::operator=(*groupBox);
       
  3434                 box.rect = checkBoxRect;
       
  3435                 proxy()->drawPrimitive(PE_IndicatorCheckBox, &box, painter, widget);
       
  3436             }
       
  3437         }
       
  3438         painter->restore();
       
  3439         break;
       
  3440 #endif // QT_NO_GROUPBOX
       
  3441 #ifndef QT_NO_SLIDER
       
  3442     case CC_Slider:
       
  3443         if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(option)) {
       
  3444             QRect groove = proxy()->subControlRect(CC_Slider, option, SC_SliderGroove, widget);
       
  3445             QRect handle = proxy()->subControlRect(CC_Slider, option, SC_SliderHandle, widget);
       
  3446             QRect ticks = proxy()->subControlRect(CC_Slider, option, SC_SliderTickmarks, widget);
       
  3447 
       
  3448             bool horizontal = slider->orientation == Qt::Horizontal;
       
  3449             bool ticksAbove = slider->tickPosition & QSlider::TicksAbove;
       
  3450             bool ticksBelow = slider->tickPosition & QSlider::TicksBelow;
       
  3451             QColor activeHighlight = option->palette.color(QPalette::Normal, QPalette::Highlight);
       
  3452             QPixmap cache;
       
  3453 
       
  3454             QBrush oldBrush = painter->brush();
       
  3455             QPen oldPen = painter->pen();
       
  3456 
       
  3457             QColor shadowAlpha(Qt::black);
       
  3458             shadowAlpha.setAlpha(10);
       
  3459             QColor highlightAlpha(Qt::white);
       
  3460             highlightAlpha.setAlpha(80);
       
  3461 
       
  3462             if ((option->subControls & SC_SliderGroove) && groove.isValid()) {
       
  3463                 QString groovePixmapName = QStyleHelper::uniqueName(QLatin1String("slider_groove"), option, groove.size());
       
  3464                 QRect pixmapRect(0, 0, groove.width(), groove.height());
       
  3465 
       
  3466                 // draw background groove
       
  3467                 if (!QPixmapCache::find(groovePixmapName, cache)) {
       
  3468                     cache = QPixmap(pixmapRect.size());
       
  3469                     cache.fill(Qt::transparent);
       
  3470                     QPainter groovePainter(&cache);
       
  3471 
       
  3472                     groovePainter.setPen(shadowAlpha);
       
  3473                     groovePainter.drawLine(1, 0, groove.width(), 0);
       
  3474                     groovePainter.drawLine(0, 0, 0, groove.height() - 1);
       
  3475 
       
  3476                     groovePainter.setPen(highlightAlpha);
       
  3477                     groovePainter.drawLine(1, groove.height() - 1, groove.width() - 1, groove.height() - 1);
       
  3478                     groovePainter.drawLine(groove.width() - 1, 1, groove.width() - 1, groove.height() - 1);
       
  3479                     QLinearGradient gradient;
       
  3480                     if (horizontal) {
       
  3481                         gradient.setStart(pixmapRect.center().x(), pixmapRect.top());
       
  3482                         gradient.setFinalStop(pixmapRect.center().x(), pixmapRect.bottom());
       
  3483                     }
       
  3484                     else {
       
  3485                         gradient.setStart(pixmapRect.left(), pixmapRect.center().y());
       
  3486                         gradient.setFinalStop(pixmapRect.right(), pixmapRect.center().y());
       
  3487                     }
       
  3488                     groovePainter.setPen(QPen(darkOutline.darker(110), 0));
       
  3489                     gradient.setColorAt(0, grooveColor.darker(110));//dark.lighter(120));
       
  3490                     gradient.setColorAt(1, grooveColor.lighter(110));//palette.button().color().darker(115));
       
  3491                     groovePainter.setBrush(gradient);
       
  3492                     groovePainter.drawRect(pixmapRect.adjusted(1, 1, -2, -2));
       
  3493                     groovePainter.end();
       
  3494                     QPixmapCache::insert(groovePixmapName, cache);
       
  3495                 }
       
  3496                 painter->drawPixmap(groove.topLeft(), cache);
       
  3497 
       
  3498                 // draw blue groove highlight
       
  3499                 QRect clipRect;
       
  3500                 groovePixmapName += QLatin1String("_blue");
       
  3501                 if (!QPixmapCache::find(groovePixmapName, cache)) {
       
  3502                     cache = QPixmap(pixmapRect.size());
       
  3503                     cache.fill(Qt::transparent);
       
  3504                     QPainter groovePainter(&cache);
       
  3505                     QLinearGradient gradient;
       
  3506                     if (horizontal) {
       
  3507                         gradient.setStart(pixmapRect.center().x(), pixmapRect.top());
       
  3508                         gradient.setFinalStop(pixmapRect.center().x(), pixmapRect.bottom());
       
  3509                     }
       
  3510                     else {
       
  3511                         gradient.setStart(pixmapRect.left(), pixmapRect.center().y());
       
  3512                         gradient.setFinalStop(pixmapRect.right(), pixmapRect.center().y());
       
  3513                     }
       
  3514                     groovePainter.setPen(QPen(activeHighlight.darker(150), 0));
       
  3515                     gradient.setColorAt(0, activeHighlight.darker(120));
       
  3516                     gradient.setColorAt(1, activeHighlight.lighter(160));
       
  3517                     groovePainter.setBrush(gradient);
       
  3518                     groovePainter.drawRect(pixmapRect.adjusted(1, 1, -2, -2));
       
  3519                     groovePainter.end();
       
  3520                     QPixmapCache::insert(groovePixmapName, cache);
       
  3521                 }
       
  3522                 if (horizontal) {
       
  3523                     if (slider->upsideDown)
       
  3524                         clipRect = QRect(handle.right(), groove.top(), groove.right() - handle.right(), groove.height());
       
  3525                     else
       
  3526                         clipRect = QRect(groove.left(), groove.top(), handle.left(), groove.height());
       
  3527                 } else {
       
  3528                     if (slider->upsideDown)
       
  3529                         clipRect = QRect(groove.left(), handle.bottom(), groove.width(), groove.height() - handle.bottom());
       
  3530                     else
       
  3531                         clipRect = QRect(groove.left(), groove.top(), groove.width(), handle.top() - groove.top());
       
  3532                 }
       
  3533                 painter->save();
       
  3534                 painter->setClipRect(clipRect.adjusted(0, 0, 1, 1));
       
  3535                 painter->drawPixmap(groove.topLeft(), cache);
       
  3536                 painter->restore();
       
  3537             }
       
  3538 
       
  3539             // draw handle
       
  3540             if ((option->subControls & SC_SliderHandle) ) {
       
  3541                 QString handlePixmapName = QStyleHelper::uniqueName(QLatin1String("slider_handle"), option, handle.size());
       
  3542                 if (!QPixmapCache::find(handlePixmapName, cache)) {
       
  3543                     cache = QPixmap(handle.size());
       
  3544                     cache.fill(Qt::transparent);
       
  3545                     QRect pixmapRect(0, 0, handle.width(), handle.height());
       
  3546                     QPainter handlePainter(&cache);
       
  3547 
       
  3548                     QColor highlightedGradientStartColor = option->palette.button().color();
       
  3549                     QColor highlightedGradientStopColor = option->palette.light().color();
       
  3550                     QColor gradientStartColor = mergedColors(option->palette.button().color().lighter(155),
       
  3551                                                              dark.lighter(155), 50);
       
  3552                     QColor gradientStopColor = gradientStartColor.darker(108);
       
  3553                     QRect gradRect = pixmapRect.adjusted(2, 2, -2, -2);
       
  3554 
       
  3555                     QColor gradientBgStartColor = gradientStartColor;
       
  3556                     QColor gradientBgStopColor = gradientStopColor;
       
  3557 
       
  3558                     QColor outline = option->state & State_Enabled ? dark : dark.lighter(130);
       
  3559                     if (option->state & State_Enabled && option->activeSubControls & SC_SliderHandle) {
       
  3560                         gradientBgStartColor = option->palette.highlight().color().lighter(180);
       
  3561                         gradientBgStopColor = option->palette.highlight().color().lighter(110);
       
  3562                         outline = option->palette.highlight().color().darker(130);
       
  3563                     }
       
  3564 
       
  3565                     // gradient fill
       
  3566                     QRect innerBorder = gradRect;
       
  3567                     QRect r = pixmapRect.adjusted(1, 1, -1, -1);
       
  3568 
       
  3569                     qt_cleanlooks_draw_gradient(&handlePainter, gradRect,
       
  3570                                                 gradientBgStartColor,
       
  3571                                                 gradientBgStopColor,
       
  3572                                                 horizontal ? TopDown : FromLeft, option->palette.button());
       
  3573 
       
  3574                     handlePainter.setPen(QPen(outline.darker(110), 1));
       
  3575                     handlePainter.drawLine(QPoint(r.left(), r.top() + 3), QPoint(r.left(), r.bottom() - 3));
       
  3576                     handlePainter.drawLine(QPoint(r.right(), r.top() + 3), QPoint(r.right(), r.bottom() - 3));
       
  3577                     handlePainter.drawLine(QPoint(r.left() + 3, r.bottom()), QPoint(r.right() - 3, r.bottom()));
       
  3578 
       
  3579                     handlePainter.save();
       
  3580                     handlePainter.setRenderHint(QPainter::Antialiasing);
       
  3581                     handlePainter.translate(0.5, 0.5);
       
  3582                     const QLine lines[4] = {
       
  3583                         QLine(QPoint(r.left(), r.bottom() - 2), QPoint(r.left() + 2, r.bottom())),
       
  3584                         QLine(QPoint(r.left(), r.top() + 2), QPoint(r.left() + 2, r.top())),
       
  3585                         QLine(QPoint(r.right(), r.bottom() - 2), QPoint(r.right() - 2, r.bottom())),
       
  3586                         QLine(QPoint(r.right(), r.top() + 2), QPoint(r.right() - 2, r.top()))
       
  3587                     };
       
  3588                     handlePainter.drawLines(lines, 4);
       
  3589                     handlePainter.restore();;
       
  3590                     handlePainter.setPen(QPen(outline.darker(130), 1));
       
  3591                     handlePainter.drawLine(QPoint(r.left() + 3, r.top()), QPoint(r.right() - 3, r.top()));
       
  3592                     QColor cornerAlpha = outline.darker(120);
       
  3593                     cornerAlpha.setAlpha(80);
       
  3594 
       
  3595                     handlePainter.setPen(cornerAlpha);
       
  3596                     if (horizontal) {
       
  3597                         handlePainter.drawLine(QPoint(r.left() + 6, r.top()), QPoint(r.left() + 6, r.bottom()));
       
  3598                         handlePainter.drawLine(QPoint(r.right() - 6, r.top()), QPoint(r.right() - 6, r.bottom()));
       
  3599                     } else {
       
  3600                         handlePainter.drawLine(QPoint(r.left(), r.top() + 6), QPoint(r.right(), r.top() + 6));
       
  3601                         handlePainter.drawLine(QPoint(r.left(), r.bottom() - 6), QPoint(r.right(), r.bottom() - 6));
       
  3602                     }
       
  3603 
       
  3604                     //handle shadow
       
  3605                     handlePainter.setPen(shadowAlpha);
       
  3606                     handlePainter.drawLine(QPoint(r.left() + 2, r.bottom() + 1), QPoint(r.right() - 2, r.bottom() + 1));
       
  3607                     handlePainter.drawLine(QPoint(r.right() + 1, r.bottom() - 3), QPoint(r.right() + 1, r.top() + 4));
       
  3608                     handlePainter.drawLine(QPoint(r.right() - 1, r.bottom()), QPoint(r.right() + 1, r.bottom() - 2));
       
  3609 
       
  3610                     qt_cleanlooks_draw_gradient(&handlePainter, horizontal ?
       
  3611                         gradRect.adjusted(6, 0, -6, 0) : gradRect.adjusted(0, 6, 0, -6),
       
  3612                         gradientStartColor,
       
  3613                         gradientStopColor.darker(106),
       
  3614                         horizontal ? TopDown : FromLeft,
       
  3615                         option->palette.button());
       
  3616 
       
  3617                     //draw grips
       
  3618                     for (int i = -3; i< 6 ; i += 3) {
       
  3619                         for (int j = -3; j< 6 ; j += 3) {
       
  3620                             handlePainter.fillRect(r.center().x() + i, r.center().y() + j, 2, 2, highlightAlpha);
       
  3621                             handlePainter.setPen(gripShadow);
       
  3622                             handlePainter.drawPoint(r.center().x() + i, r.center().y() + j );
       
  3623                         }
       
  3624                     }
       
  3625                     handlePainter.end();
       
  3626                     QPixmapCache::insert(handlePixmapName, cache);
       
  3627                 }
       
  3628 
       
  3629                 painter->drawPixmap(handle.topLeft(), cache);
       
  3630 
       
  3631                 if (slider->state & State_HasFocus) {
       
  3632                     QStyleOptionFocusRect fropt;
       
  3633                     fropt.QStyleOption::operator=(*slider);
       
  3634                     fropt.rect = slider->rect;
       
  3635                     proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, painter, widget);
       
  3636                 }
       
  3637             }
       
  3638             if (option->subControls & SC_SliderTickmarks) {
       
  3639                 painter->setPen(darkOutline);
       
  3640                 int tickSize = proxy()->pixelMetric(PM_SliderTickmarkOffset, option, widget);
       
  3641                 int available = proxy()->pixelMetric(PM_SliderSpaceAvailable, slider, widget);
       
  3642                 int interval = slider->tickInterval;
       
  3643                 if (interval <= 0) {
       
  3644                     interval = slider->singleStep;
       
  3645                     if (QStyle::sliderPositionFromValue(slider->minimum, slider->maximum, interval,
       
  3646                                                         available)
       
  3647                         - QStyle::sliderPositionFromValue(slider->minimum, slider->maximum,
       
  3648                                                         0, available) < 3)
       
  3649                         interval = slider->pageStep;
       
  3650                 }
       
  3651                 if (interval <= 0)
       
  3652                     interval = 1;
       
  3653 
       
  3654                 int v = slider->minimum;
       
  3655                 int len = proxy()->pixelMetric(PM_SliderLength, slider, widget);
       
  3656                 while (v <= slider->maximum + 1) {
       
  3657                     if (v == slider->maximum + 1 && interval == 1)
       
  3658                         break;
       
  3659                     const int v_ = qMin(v, slider->maximum);
       
  3660                     int pos = sliderPositionFromValue(slider->minimum, slider->maximum,
       
  3661                                                     v_, (horizontal
       
  3662                                                         ? slider->rect.width()
       
  3663                                                         : slider->rect.height()) - len,
       
  3664                                                     slider->upsideDown) + len / 2;
       
  3665                     int extra = 2 - ((v_ == slider->minimum || v_ == slider->maximum) ? 1 : 0);
       
  3666 
       
  3667                     if (horizontal) {
       
  3668                         if (ticksAbove) {
       
  3669                             painter->drawLine(pos, slider->rect.top() + extra,
       
  3670                                 pos, slider->rect.top() + tickSize);
       
  3671                         }
       
  3672                         if (ticksBelow) {
       
  3673                             painter->drawLine(pos, slider->rect.bottom() - extra,
       
  3674                                             pos, slider->rect.bottom() - tickSize);
       
  3675                         }
       
  3676                     } else {
       
  3677                         if (ticksAbove) {
       
  3678                             painter->drawLine(slider->rect.left() + extra, pos,
       
  3679                                             slider->rect.left() + tickSize, pos);
       
  3680                         }
       
  3681                         if (ticksBelow) {
       
  3682                             painter->drawLine(slider->rect.right() - extra, pos,
       
  3683                                             slider->rect.right() - tickSize, pos);
       
  3684                         }
       
  3685                     }
       
  3686                     // in the case where maximum is max int
       
  3687                     int nextInterval = v + interval;
       
  3688                     if (nextInterval < v)
       
  3689                         break;
       
  3690                     v = nextInterval;
       
  3691                 }
       
  3692             }
       
  3693             painter->setBrush(oldBrush);
       
  3694             painter->setPen(oldPen);
       
  3695         }
       
  3696         break;
       
  3697 #endif // QT_NO_SLIDER
       
  3698 #ifndef QT_NO_DIAL
       
  3699     case CC_Dial:
       
  3700         if (const QStyleOptionSlider *dial = qstyleoption_cast<const QStyleOptionSlider *>(option))
       
  3701             QStyleHelper::drawDial(dial, painter);
       
  3702         break;
       
  3703 #endif // QT_NO_DIAL
       
  3704         default:
       
  3705             QWindowsStyle::drawComplexControl(control, option, painter, widget);
       
  3706         break;
       
  3707     }
       
  3708 }
       
  3709 
       
  3710 /*!
       
  3711   \reimp
       
  3712 */
       
  3713 int QCleanlooksStyle::pixelMetric(PixelMetric metric, const QStyleOption *option, const QWidget *widget) const
       
  3714 {
       
  3715     int ret = -1;
       
  3716     switch (metric) {
       
  3717     case PM_ButtonDefaultIndicator:
       
  3718         ret = 0;
       
  3719         break;
       
  3720     case PM_ButtonShiftHorizontal:
       
  3721     case PM_ButtonShiftVertical:
       
  3722         ret = 0;
       
  3723         break;
       
  3724     case PM_MessageBoxIconSize:
       
  3725         ret = 48;
       
  3726         break;
       
  3727     case PM_ListViewIconSize:
       
  3728         ret = 24;
       
  3729         break;
       
  3730     case PM_DialogButtonsSeparator:
       
  3731     case PM_SplitterWidth:
       
  3732         ret = 6;
       
  3733         break;
       
  3734     case PM_ScrollBarSliderMin:
       
  3735         ret = 26;
       
  3736         break;
       
  3737     case PM_MenuPanelWidth: //menu framewidth
       
  3738         ret = 2;
       
  3739         break;
       
  3740     case PM_TitleBarHeight:
       
  3741         ret = 24;
       
  3742         break;
       
  3743     case PM_ScrollBarExtent:
       
  3744         ret = 15;
       
  3745         break;
       
  3746     case PM_SliderThickness:
       
  3747         ret = 15;
       
  3748         break;
       
  3749     case PM_SliderLength:
       
  3750         ret = 27;
       
  3751         break;
       
  3752     case PM_DockWidgetTitleMargin:
       
  3753         ret = 1;
       
  3754         break;
       
  3755     case PM_MenuBarVMargin:
       
  3756         ret = 1;
       
  3757         break;
       
  3758     case PM_DefaultFrameWidth:
       
  3759         ret = 2;
       
  3760         break;
       
  3761     case PM_SpinBoxFrameWidth:
       
  3762         ret = 3;
       
  3763         break;
       
  3764     case PM_MenuBarItemSpacing:
       
  3765         ret = 6;
       
  3766     case PM_MenuBarHMargin:
       
  3767         ret = 0;
       
  3768         break;
       
  3769     case PM_ToolBarHandleExtent:
       
  3770         ret = 9;
       
  3771         break;
       
  3772     case PM_ToolBarItemSpacing:
       
  3773         ret = 2;
       
  3774         break;
       
  3775     case PM_ToolBarFrameWidth:
       
  3776         ret = 0;
       
  3777         break;
       
  3778     case PM_ToolBarItemMargin:
       
  3779         ret = 1;
       
  3780         break;
       
  3781     case PM_SmallIconSize:
       
  3782         ret = 16;
       
  3783         break;
       
  3784     case PM_ButtonIconSize:
       
  3785         ret = 24;
       
  3786         break;
       
  3787     case PM_MenuVMargin:
       
  3788     case PM_MenuHMargin:
       
  3789         ret = 0;
       
  3790         break;
       
  3791     case PM_DockWidgetTitleBarButtonMargin:
       
  3792         ret = 4;
       
  3793         break;
       
  3794     case PM_MaximumDragDistance:
       
  3795         return -1;
       
  3796     case PM_TabCloseIndicatorWidth:
       
  3797     case PM_TabCloseIndicatorHeight:
       
  3798         return 20;
       
  3799     default:
       
  3800         break;
       
  3801     }
       
  3802 
       
  3803     return ret != -1 ? ret : QWindowsStyle::pixelMetric(metric, option, widget);
       
  3804 }
       
  3805 
       
  3806 /*!
       
  3807   \reimp
       
  3808 */
       
  3809 QSize QCleanlooksStyle::sizeFromContents(ContentsType type, const QStyleOption *option,
       
  3810                                         const QSize &size, const QWidget *widget) const
       
  3811 {
       
  3812     QSize newSize = QWindowsStyle::sizeFromContents(type, option, size, widget);
       
  3813     switch (type) {
       
  3814     case CT_PushButton:
       
  3815         if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(option)) {
       
  3816             if (!btn->text.isEmpty() && newSize.width() < 80)
       
  3817                 newSize.setWidth(80);
       
  3818             if (!btn->icon.isNull() && btn->iconSize.height() > 16)
       
  3819                 newSize -= QSize(0, 2);
       
  3820         }
       
  3821         if (const QPushButton *button = qobject_cast<const QPushButton *>(widget)) {
       
  3822             if (qobject_cast<const QDialogButtonBox *>(button->parentWidget())) {
       
  3823                 if (newSize.height() < 32)
       
  3824                     newSize.setHeight(32);
       
  3825             }
       
  3826         }
       
  3827         break;
       
  3828     case CT_GroupBox:
       
  3829         // Since we use a bold font we have to recalculate base width
       
  3830         if (const QGroupBox *gb = qobject_cast<const QGroupBox*>(widget)) {
       
  3831             QFont font = gb->font();
       
  3832             font.setBold(true);
       
  3833             QFontMetrics metrics(font);
       
  3834             int baseWidth = metrics.width(gb->title()) + metrics.width(QLatin1Char(' '));
       
  3835             if (gb->isCheckable()) {
       
  3836                 baseWidth += proxy()->pixelMetric(QStyle::PM_IndicatorWidth, option, widget);
       
  3837                 baseWidth += proxy()->pixelMetric(QStyle::PM_CheckBoxLabelSpacing, option, widget);
       
  3838             }
       
  3839             newSize.setWidth(qMax(baseWidth, newSize.width()));
       
  3840         }
       
  3841         newSize += QSize(0, 1);
       
  3842         break;
       
  3843     case CT_RadioButton:
       
  3844     case CT_CheckBox:
       
  3845         newSize += QSize(0, 1);
       
  3846         break;
       
  3847     case CT_ToolButton:
       
  3848 #ifndef QT_NO_TOOLBAR
       
  3849         if (widget && qobject_cast<QToolBar *>(widget->parentWidget()))
       
  3850             newSize += QSize(4, 6);
       
  3851 #endif // QT_NO_TOOLBAR
       
  3852         break;
       
  3853     case CT_SpinBox:
       
  3854         newSize += QSize(0, -2);
       
  3855         break;
       
  3856     case CT_ComboBox:
       
  3857         newSize += QSize(2, 4);
       
  3858         break;
       
  3859     case CT_LineEdit:
       
  3860         newSize += QSize(0, 4);
       
  3861         break;
       
  3862     case CT_MenuBarItem:
       
  3863 	    newSize += QSize(0, 2);
       
  3864 	    break;
       
  3865     case CT_MenuItem:
       
  3866         if (const QStyleOptionMenuItem *menuItem = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) {
       
  3867             if (menuItem->menuItemType == QStyleOptionMenuItem::Separator) {
       
  3868                 if (!menuItem->text.isEmpty()) {
       
  3869                     newSize.setHeight(menuItem->fontMetrics.lineSpacing());
       
  3870                 }
       
  3871             }
       
  3872 #ifndef QT_NO_COMBOBOX
       
  3873             else if (!menuItem->icon.isNull()) {
       
  3874                 if (const QComboBox *combo = qobject_cast<const QComboBox*>(widget)) {
       
  3875                     newSize.setHeight(qMax(combo->iconSize().height() + 2, newSize.height()));
       
  3876                 }
       
  3877             }
       
  3878 #endif // QT_NO_COMBOBOX
       
  3879         }
       
  3880         break;
       
  3881     case CT_SizeGrip:
       
  3882 	    newSize += QSize(4, 4);
       
  3883 	break;
       
  3884     case CT_MdiControls:
       
  3885         if (const QStyleOptionComplex *styleOpt = qstyleoption_cast<const QStyleOptionComplex *>(option)) {
       
  3886             int width = 0;
       
  3887             if (styleOpt->subControls & SC_MdiMinButton)
       
  3888                 width += 19 + 1;
       
  3889             if (styleOpt->subControls & SC_MdiNormalButton)
       
  3890                 width += 19 + 1;
       
  3891             if (styleOpt->subControls & SC_MdiCloseButton)
       
  3892                 width += 19 + 1;
       
  3893             newSize = QSize(width, 19);
       
  3894         } else {
       
  3895             newSize = QSize(60, 19);
       
  3896         }
       
  3897         break;
       
  3898     default:
       
  3899         break;
       
  3900     }
       
  3901     return newSize;
       
  3902 }
       
  3903 
       
  3904 /*!
       
  3905   \reimp
       
  3906 */
       
  3907 void QCleanlooksStyle::polish(QApplication *app)
       
  3908 {
       
  3909     QWindowsStyle::polish(app);
       
  3910 }
       
  3911 
       
  3912 /*!
       
  3913   \reimp
       
  3914 */
       
  3915 void QCleanlooksStyle::polish(QWidget *widget)
       
  3916 {
       
  3917     QWindowsStyle::polish(widget);
       
  3918     if (qobject_cast<QAbstractButton*>(widget)
       
  3919 #ifndef QT_NO_COMBOBOX
       
  3920         || qobject_cast<QComboBox *>(widget)
       
  3921 #endif
       
  3922 #ifndef QT_NO_PROGRESSBAR
       
  3923         || qobject_cast<QProgressBar *>(widget)
       
  3924 #endif
       
  3925 #ifndef QT_NO_SCROLLBAR
       
  3926         || qobject_cast<QScrollBar *>(widget)
       
  3927 #endif
       
  3928 #ifndef QT_NO_SPLITTER
       
  3929         || qobject_cast<QSplitterHandle *>(widget)
       
  3930 #endif
       
  3931         || qobject_cast<QAbstractSlider *>(widget)
       
  3932 #ifndef QT_NO_SPINBOX
       
  3933         || qobject_cast<QAbstractSpinBox *>(widget)
       
  3934 #endif
       
  3935         || (widget->inherits("QWorkspaceChild"))
       
  3936         || (widget->inherits("QDockSeparator"))
       
  3937         || (widget->inherits("QDockWidgetSeparator"))
       
  3938         ) {
       
  3939         widget->setAttribute(Qt::WA_Hover, true);
       
  3940     }
       
  3941 }
       
  3942 
       
  3943 /*!
       
  3944   \reimp
       
  3945 */
       
  3946 void QCleanlooksStyle::polish(QPalette &pal)
       
  3947 {
       
  3948     QWindowsStyle::polish(pal);
       
  3949     //this is a workaround for some themes such as Human, where the contrast
       
  3950     //between text and background is too low.
       
  3951     QColor highlight = pal.highlight().color();
       
  3952     QColor highlightText = pal.highlightedText().color();
       
  3953     if (qAbs(qGray(highlight.rgb()) - qGray(highlightText.rgb())) < 150) {
       
  3954         if (qGray(highlightText.rgb()) < 128)
       
  3955             pal.setBrush(QPalette::Highlight, highlight.lighter(145));
       
  3956     }
       
  3957 }
       
  3958 
       
  3959 /*!
       
  3960   \reimp
       
  3961 */
       
  3962 void QCleanlooksStyle::unpolish(QWidget *widget)
       
  3963 {
       
  3964     QWindowsStyle::unpolish(widget);
       
  3965     if (qobject_cast<QAbstractButton*>(widget)
       
  3966 #ifndef QT_NO_COMBOBOX
       
  3967         || qobject_cast<QComboBox *>(widget)
       
  3968 #endif
       
  3969 #ifndef QT_NO_PROGRESSBAR
       
  3970         || qobject_cast<QProgressBar *>(widget)
       
  3971 #endif
       
  3972 #ifndef QT_NO_SCROLLBAR
       
  3973         || qobject_cast<QScrollBar *>(widget)
       
  3974 #endif
       
  3975 #ifndef QT_NO_SPLITTER
       
  3976         || qobject_cast<QSplitterHandle *>(widget)
       
  3977 #endif
       
  3978         || qobject_cast<QAbstractSlider *>(widget)
       
  3979 #ifndef QT_NO_SPINBOX
       
  3980         || qobject_cast<QAbstractSpinBox *>(widget)
       
  3981 #endif
       
  3982         || (widget->inherits("QWorkspaceChild"))
       
  3983         || (widget->inherits("QDockSeparator"))
       
  3984         || (widget->inherits("QDockWidgetSeparator"))
       
  3985         ) {
       
  3986         widget->setAttribute(Qt::WA_Hover, false);
       
  3987     }
       
  3988 }
       
  3989 
       
  3990 /*!
       
  3991   \reimp
       
  3992 */
       
  3993 void QCleanlooksStyle::unpolish(QApplication *app)
       
  3994 {
       
  3995     QWindowsStyle::unpolish(app);
       
  3996 }
       
  3997 
       
  3998 /*!
       
  3999   \reimp
       
  4000 */
       
  4001 QRect QCleanlooksStyle::subControlRect(ComplexControl control, const QStyleOptionComplex *option,
       
  4002                                        SubControl subControl, const QWidget *widget) const
       
  4003 {
       
  4004     QRect rect = QWindowsStyle::subControlRect(control, option, subControl, widget);
       
  4005 
       
  4006     switch (control) {
       
  4007 #ifndef QT_NO_SLIDER
       
  4008     case CC_Slider:
       
  4009         if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(option)) {
       
  4010             int tickSize = proxy()->pixelMetric(PM_SliderTickmarkOffset, option, widget);
       
  4011             switch (subControl) {
       
  4012             case SC_SliderHandle: {
       
  4013                 if (slider->orientation == Qt::Horizontal) {
       
  4014                     rect.setHeight(pixelMetric(PM_SliderThickness));
       
  4015                     rect.setWidth(pixelMetric(PM_SliderLength));
       
  4016                     int centerY = slider->rect.center().y() - rect.height() / 2;
       
  4017                     if (slider->tickPosition & QSlider::TicksAbove)
       
  4018                         centerY += tickSize;
       
  4019                     if (slider->tickPosition & QSlider::TicksBelow)
       
  4020                         centerY -= tickSize;
       
  4021                     rect.moveTop(centerY);
       
  4022                 } else {
       
  4023                     rect.setWidth(pixelMetric(PM_SliderThickness));
       
  4024                     rect.setHeight(pixelMetric(PM_SliderLength));
       
  4025                     int centerX = slider->rect.center().x() - rect.width() / 2;
       
  4026                     if (slider->tickPosition & QSlider::TicksAbove)
       
  4027                         centerX += tickSize;
       
  4028                     if (slider->tickPosition & QSlider::TicksBelow)
       
  4029                         centerX -= tickSize;
       
  4030                     rect.moveLeft(centerX);
       
  4031                 }
       
  4032             }
       
  4033                 break;
       
  4034             case SC_SliderGroove: {
       
  4035                 QPoint grooveCenter = slider->rect.center();
       
  4036                 if (slider->orientation == Qt::Horizontal) {
       
  4037                     rect.setHeight(7);
       
  4038                     if (slider->tickPosition & QSlider::TicksAbove)
       
  4039                         grooveCenter.ry() += tickSize;
       
  4040                     if (slider->tickPosition & QSlider::TicksBelow)
       
  4041                         grooveCenter.ry() -= tickSize;
       
  4042                 } else {
       
  4043                     rect.setWidth(7);
       
  4044                     if (slider->tickPosition & QSlider::TicksAbove)
       
  4045                         grooveCenter.rx() += tickSize;
       
  4046                     if (slider->tickPosition & QSlider::TicksBelow)
       
  4047                         grooveCenter.rx() -= tickSize;
       
  4048                 }
       
  4049                 rect.moveCenter(grooveCenter);
       
  4050                 break;
       
  4051             }
       
  4052             default:
       
  4053                 break;
       
  4054             }
       
  4055         }
       
  4056         break;
       
  4057 #endif // QT_NO_SLIDER
       
  4058     case CC_ScrollBar:
       
  4059         break;
       
  4060 #ifndef QT_NO_SPINBOX
       
  4061     case CC_SpinBox:
       
  4062         if (const QStyleOptionSpinBox *spinbox = qstyleoption_cast<const QStyleOptionSpinBox *>(option)) {
       
  4063             QSize bs;
       
  4064             int center = spinbox->rect.height() / 2;
       
  4065             int fw = spinbox->frame ? proxy()->pixelMetric(PM_SpinBoxFrameWidth, spinbox, widget) : 0;
       
  4066             int y = fw;
       
  4067             bs.setHeight(qMax(8, spinbox->rect.height()/2 - y));
       
  4068             bs.setWidth(15);
       
  4069             int x, lx, rx;
       
  4070             x = spinbox->rect.width() - y - bs.width() + 2;
       
  4071             lx = fw;
       
  4072             rx = x - fw;
       
  4073             switch (subControl) {
       
  4074             case SC_SpinBoxUp:
       
  4075                 if (spinbox->buttonSymbols == QAbstractSpinBox::NoButtons)
       
  4076                     return QRect();
       
  4077                 rect = QRect(x, fw, bs.width(), center - fw);
       
  4078                 break;
       
  4079             case SC_SpinBoxDown:
       
  4080                 if (spinbox->buttonSymbols == QAbstractSpinBox::NoButtons)
       
  4081                     return QRect();
       
  4082 
       
  4083                 rect = QRect(x, center, bs.width(), spinbox->rect.bottom() - center - fw + 1);
       
  4084                 break;
       
  4085             case SC_SpinBoxEditField:
       
  4086                 if (spinbox->buttonSymbols == QAbstractSpinBox::NoButtons) {
       
  4087                     rect = QRect(lx, fw, spinbox->rect.width() - 2*fw, spinbox->rect.height() - 2*fw);
       
  4088                 } else {
       
  4089                     rect = QRect(lx, fw, rx - qMax(fw - 1, 0), spinbox->rect.height() - 2*fw);
       
  4090                 }
       
  4091                 break;
       
  4092             case SC_SpinBoxFrame:
       
  4093                 rect = spinbox->rect;
       
  4094             default:
       
  4095                 break;
       
  4096             }
       
  4097             rect = visualRect(spinbox->direction, spinbox->rect, rect);
       
  4098         }
       
  4099         break;
       
  4100 #endif // Qt_NO_SPINBOX
       
  4101 #ifndef QT_NO_GROUPBOX
       
  4102     case CC_GroupBox:
       
  4103         if (const QStyleOptionGroupBox *groupBox = qstyleoption_cast<const QStyleOptionGroupBox *>(option)) {
       
  4104             int topMargin = 0;
       
  4105             int topHeight = 0;
       
  4106             int verticalAlignment = proxy()->styleHint(SH_GroupBox_TextLabelVerticalAlignment, groupBox, widget);
       
  4107             bool flat = groupBox->features & QStyleOptionFrameV2::Flat;
       
  4108             if (!groupBox->text.isEmpty()) {
       
  4109                 topHeight = groupBox->fontMetrics.height();
       
  4110                 if (verticalAlignment & Qt::AlignVCenter)
       
  4111                     topMargin = topHeight / 2;
       
  4112                 else if (verticalAlignment & Qt::AlignTop)
       
  4113                     topMargin = topHeight;
       
  4114             }
       
  4115             QRect frameRect = groupBox->rect;
       
  4116             frameRect.setTop(topMargin);
       
  4117             if (subControl == SC_GroupBoxFrame) {
       
  4118                 return rect;
       
  4119             }
       
  4120             else if (subControl == SC_GroupBoxContents) {
       
  4121                 if( flat ) {
       
  4122                     int margin = 0;
       
  4123                     int leftMarginExtension = 16;
       
  4124                     rect = frameRect.adjusted(leftMarginExtension + margin, margin + topHeight, -margin, -margin);
       
  4125                 }
       
  4126                 break;
       
  4127             }
       
  4128             if(flat) {
       
  4129                 if (const QGroupBox *groupBoxWidget = qobject_cast<const QGroupBox *>(widget)) {
       
  4130                     //Prepare metrics for a bold font
       
  4131                     QFont font = widget->font();
       
  4132                     font.setBold(true);
       
  4133                     QFontMetrics fontMetrics(font);
       
  4134 
       
  4135                     QSize textRect = fontMetrics.boundingRect(groupBoxWidget->title()).size() + QSize(2, 2);
       
  4136                     if (subControl == SC_GroupBoxCheckBox) {
       
  4137                         int indicatorWidth = proxy()->pixelMetric(PM_IndicatorWidth, option, widget);
       
  4138                         int indicatorHeight = proxy()->pixelMetric(PM_IndicatorHeight, option, widget);
       
  4139                         rect.setWidth(indicatorWidth);
       
  4140                         rect.setHeight(indicatorHeight);
       
  4141                         rect.moveTop((fontMetrics.height() - indicatorHeight) / 2 + 2);
       
  4142                     } else if (subControl == SC_GroupBoxLabel) {
       
  4143                         rect.setSize(textRect);
       
  4144                     }
       
  4145                 }
       
  4146             }
       
  4147         }
       
  4148         return rect;
       
  4149 #ifndef QT_NO_COMBOBOX
       
  4150     case CC_ComboBox:
       
  4151         switch (subControl) {
       
  4152         case SC_ComboBoxArrow:
       
  4153             rect = visualRect(option->direction, option->rect, rect);
       
  4154             rect.setRect(rect.right() - 18, rect.top() - 2,
       
  4155                          19, rect.height() + 4);
       
  4156             rect = visualRect(option->direction, option->rect, rect);
       
  4157             break;
       
  4158         case SC_ComboBoxEditField: {
       
  4159             int frameWidth = proxy()->pixelMetric(PM_DefaultFrameWidth);
       
  4160             rect = visualRect(option->direction, option->rect, rect);
       
  4161             rect.setRect(option->rect.left() + frameWidth, option->rect.top() + frameWidth,
       
  4162                          option->rect.width() - 19 - 2 * frameWidth,
       
  4163                          option->rect.height() - 2 * frameWidth);
       
  4164             if (const QStyleOptionComboBox *box = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
       
  4165                 if (!box->editable) {
       
  4166                     rect.adjust(2, 0, 0, 0);
       
  4167                     if (box->state & (State_Sunken | State_On))
       
  4168                         rect.translate(1, 1);
       
  4169                 }
       
  4170             }
       
  4171             rect = visualRect(option->direction, option->rect, rect);
       
  4172             break;
       
  4173         }
       
  4174         default:
       
  4175             break;
       
  4176         }
       
  4177         break;
       
  4178 #endif // QT_NO_COMBOBOX
       
  4179 #endif //QT_NO_GROUPBOX
       
  4180         case CC_TitleBar:
       
  4181         if (const QStyleOptionTitleBar *tb = qstyleoption_cast<const QStyleOptionTitleBar *>(option)) {
       
  4182             SubControl sc = subControl;
       
  4183             QRect &ret = rect;
       
  4184             const int indent = 3;
       
  4185             const int controlTopMargin = 3;
       
  4186             const int controlBottomMargin = 3;
       
  4187             const int controlWidthMargin = 2;
       
  4188             const int controlHeight = tb->rect.height() - controlTopMargin - controlBottomMargin ;
       
  4189             const int delta = controlHeight + controlWidthMargin;
       
  4190             int offset = 0;
       
  4191 
       
  4192             bool isMinimized = tb->titleBarState & Qt::WindowMinimized;
       
  4193             bool isMaximized = tb->titleBarState & Qt::WindowMaximized;
       
  4194 
       
  4195             switch (sc) {
       
  4196             case SC_TitleBarLabel:
       
  4197                 if (tb->titleBarFlags & (Qt::WindowTitleHint | Qt::WindowSystemMenuHint)) {
       
  4198                     ret = tb->rect;
       
  4199                     if (tb->titleBarFlags & Qt::WindowSystemMenuHint)
       
  4200                         ret.adjust(delta, 0, -delta, 0);
       
  4201                     if (tb->titleBarFlags & Qt::WindowMinimizeButtonHint)
       
  4202                         ret.adjust(0, 0, -delta, 0);
       
  4203                     if (tb->titleBarFlags & Qt::WindowMaximizeButtonHint)
       
  4204                         ret.adjust(0, 0, -delta, 0);
       
  4205                     if (tb->titleBarFlags & Qt::WindowShadeButtonHint)
       
  4206                         ret.adjust(0, 0, -delta, 0);
       
  4207                     if (tb->titleBarFlags & Qt::WindowContextHelpButtonHint)
       
  4208                         ret.adjust(0, 0, -delta, 0);
       
  4209                 }
       
  4210                 break;
       
  4211             case SC_TitleBarContextHelpButton:
       
  4212                 if (tb->titleBarFlags & Qt::WindowContextHelpButtonHint)
       
  4213                     offset += delta;
       
  4214             case SC_TitleBarMinButton:
       
  4215                 if (!isMinimized && (tb->titleBarFlags & Qt::WindowMinimizeButtonHint))
       
  4216                     offset += delta;
       
  4217                 else if (sc == SC_TitleBarMinButton)
       
  4218                     break;
       
  4219             case SC_TitleBarNormalButton:
       
  4220                 if (isMinimized && (tb->titleBarFlags & Qt::WindowMinimizeButtonHint))
       
  4221                     offset += delta;
       
  4222                 else if (isMaximized && (tb->titleBarFlags & Qt::WindowMaximizeButtonHint))
       
  4223                     offset += delta;
       
  4224                 else if (sc == SC_TitleBarNormalButton)
       
  4225                     break;
       
  4226             case SC_TitleBarMaxButton:
       
  4227                 if (!isMaximized && (tb->titleBarFlags & Qt::WindowMaximizeButtonHint))
       
  4228                     offset += delta;
       
  4229                 else if (sc == SC_TitleBarMaxButton)
       
  4230                     break;
       
  4231             case SC_TitleBarShadeButton:
       
  4232                 if (!isMinimized && (tb->titleBarFlags & Qt::WindowShadeButtonHint))
       
  4233                     offset += delta;
       
  4234                 else if (sc == SC_TitleBarShadeButton)
       
  4235                     break;
       
  4236             case SC_TitleBarUnshadeButton:
       
  4237                 if (isMinimized && (tb->titleBarFlags & Qt::WindowShadeButtonHint))
       
  4238                     offset += delta;
       
  4239                 else if (sc == SC_TitleBarUnshadeButton)
       
  4240                     break;
       
  4241             case SC_TitleBarCloseButton:
       
  4242                 if (tb->titleBarFlags & Qt::WindowSystemMenuHint)
       
  4243                     offset += delta;
       
  4244                 else if (sc == SC_TitleBarCloseButton)
       
  4245                     break;
       
  4246                 ret.setRect(tb->rect.right() - indent - offset, tb->rect.top() + controlTopMargin,
       
  4247                             controlHeight, controlHeight);
       
  4248                 break;
       
  4249             case SC_TitleBarSysMenu:
       
  4250                 if (tb->titleBarFlags & Qt::WindowSystemMenuHint) {
       
  4251                     ret.setRect(tb->rect.left() + controlWidthMargin + indent, tb->rect.top() + controlTopMargin,
       
  4252                                 controlHeight, controlHeight);
       
  4253                 }
       
  4254                 break;
       
  4255             default:
       
  4256                 break;
       
  4257             }
       
  4258             ret = visualRect(tb->direction, tb->rect, ret);
       
  4259         }
       
  4260         break;
       
  4261     default:
       
  4262         break;
       
  4263     }
       
  4264 
       
  4265     return rect;
       
  4266 }
       
  4267 
       
  4268 
       
  4269 /*!
       
  4270   \reimp
       
  4271 */
       
  4272 QRect QCleanlooksStyle::itemPixmapRect(const QRect &r, int flags, const QPixmap &pixmap) const
       
  4273 {
       
  4274     return QWindowsStyle::itemPixmapRect(r, flags, pixmap);
       
  4275 }
       
  4276 
       
  4277 /*!
       
  4278   \reimp
       
  4279 */
       
  4280 void QCleanlooksStyle::drawItemPixmap(QPainter *painter, const QRect &rect,
       
  4281                             int alignment, const QPixmap &pixmap) const
       
  4282 {
       
  4283     QWindowsStyle::drawItemPixmap(painter, rect, alignment, pixmap);
       
  4284 }
       
  4285 
       
  4286 /*!
       
  4287   \reimp
       
  4288 */
       
  4289 QStyle::SubControl QCleanlooksStyle::hitTestComplexControl(ComplexControl cc, const QStyleOptionComplex *opt,
       
  4290                               const QPoint &pt, const QWidget *w) const
       
  4291 {
       
  4292     return QWindowsStyle::hitTestComplexControl(cc, opt, pt, w);
       
  4293 }
       
  4294 
       
  4295 /*!
       
  4296   \reimp
       
  4297 */
       
  4298 QPixmap QCleanlooksStyle::generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap,
       
  4299                                         const QStyleOption *opt) const
       
  4300 {
       
  4301     return QWindowsStyle::generatedIconPixmap(iconMode, pixmap, opt);
       
  4302 }
       
  4303 
       
  4304 /*!
       
  4305   \reimp
       
  4306 */
       
  4307 int QCleanlooksStyle::styleHint(StyleHint hint, const QStyleOption *option, const QWidget *widget,
       
  4308                                QStyleHintReturn *returnData) const
       
  4309 {
       
  4310     int ret = 0;
       
  4311     switch (hint) {
       
  4312     case SH_ScrollBar_MiddleClickAbsolutePosition:
       
  4313         ret = true;
       
  4314         break;
       
  4315     case SH_EtchDisabledText:
       
  4316         ret = 1;
       
  4317         break;
       
  4318     case SH_Menu_AllowActiveAndDisabled:
       
  4319         ret = false;
       
  4320         break;
       
  4321     case SH_MainWindow_SpaceBelowMenuBar:
       
  4322         ret = 0;
       
  4323         break;
       
  4324     case SH_MenuBar_MouseTracking:
       
  4325         ret = 1;
       
  4326         break;
       
  4327     case SH_TitleBar_AutoRaise:
       
  4328         ret = 1;
       
  4329         break;
       
  4330     case SH_TitleBar_NoBorder:
       
  4331         ret = 1;
       
  4332         break;
       
  4333     case SH_ItemView_ShowDecorationSelected:
       
  4334         ret = true;
       
  4335         break;
       
  4336     case SH_Table_GridLineColor:
       
  4337         if (option) {
       
  4338             ret = option->palette.background().color().darker(120).rgb();
       
  4339             break;
       
  4340         }
       
  4341     case SH_ComboBox_Popup:
       
  4342 #ifdef QT3_SUPPORT
       
  4343         if (widget && widget->inherits("Q3ComboBox"))
       
  4344             return 0;
       
  4345 #endif
       
  4346         if (const QStyleOptionComboBox *cmb = qstyleoption_cast<const QStyleOptionComboBox *>(option))
       
  4347             ret = !cmb->editable;
       
  4348         else
       
  4349             ret = 0;
       
  4350         break;
       
  4351     case SH_WindowFrame_Mask:
       
  4352         ret = 1;
       
  4353         if (QStyleHintReturnMask *mask = qstyleoption_cast<QStyleHintReturnMask *>(returnData)) {
       
  4354             //left rounded corner
       
  4355             mask->region = option->rect;
       
  4356             mask->region -= QRect(option->rect.left(), option->rect.top(), 5, 1);
       
  4357             mask->region -= QRect(option->rect.left(), option->rect.top() + 1, 3, 1);
       
  4358             mask->region -= QRect(option->rect.left(), option->rect.top() + 2, 2, 1);
       
  4359             mask->region -= QRect(option->rect.left(), option->rect.top() + 3, 1, 2);
       
  4360 
       
  4361             //right rounded corner
       
  4362             mask->region -= QRect(option->rect.right() - 4, option->rect.top(), 5, 1);
       
  4363             mask->region -= QRect(option->rect.right() - 2, option->rect.top() + 1, 3, 1);
       
  4364             mask->region -= QRect(option->rect.right() - 1, option->rect.top() + 2, 2, 1);
       
  4365             mask->region -= QRect(option->rect.right() , option->rect.top() + 3, 1, 2);
       
  4366         }
       
  4367         break;
       
  4368     case SH_MessageBox_TextInteractionFlags:
       
  4369         ret = Qt::TextSelectableByMouse | Qt::LinksAccessibleByMouse;
       
  4370         break;
       
  4371     case SH_DialogButtonBox_ButtonsHaveIcons:
       
  4372         ret = true;
       
  4373         break;
       
  4374     case SH_MessageBox_CenterButtons:
       
  4375         ret = false;
       
  4376         break;
       
  4377 #ifndef QT_NO_WIZARD
       
  4378     case SH_WizardStyle:
       
  4379         ret = QWizard::ClassicStyle;
       
  4380         break;
       
  4381 #endif
       
  4382     case SH_ItemView_ArrowKeysNavigateIntoChildren:
       
  4383         ret = false;
       
  4384         break;
       
  4385     case SH_Menu_SubMenuPopupDelay:
       
  4386         ret = 225; // default from GtkMenu
       
  4387         break;
       
  4388     default:
       
  4389         ret = QWindowsStyle::styleHint(hint, option, widget, returnData);
       
  4390         break;
       
  4391     }
       
  4392     return ret;
       
  4393 }
       
  4394 
       
  4395 /*! \reimp */
       
  4396 QRect QCleanlooksStyle::subElementRect(SubElement sr, const QStyleOption *opt, const QWidget *w) const
       
  4397 {
       
  4398     QRect r = QWindowsStyle::subElementRect(sr, opt, w);
       
  4399     switch (sr) {
       
  4400     case SE_PushButtonFocusRect:
       
  4401         r.adjust(0, 1, 0, -1);
       
  4402         break;
       
  4403     case SE_DockWidgetTitleBarText: {
       
  4404         const QStyleOptionDockWidgetV2 *v2
       
  4405             = qstyleoption_cast<const QStyleOptionDockWidgetV2*>(opt);
       
  4406         bool verticalTitleBar = v2 == 0 ? false : v2->verticalTitleBar;
       
  4407         if (verticalTitleBar) {
       
  4408             r.adjust(0, 0, 0, -4);
       
  4409         } else {
       
  4410             if (opt->direction == Qt::LeftToRight)
       
  4411                 r.adjust(4, 0, 0, 0);
       
  4412             else
       
  4413                 r.adjust(0, 0, -4, 0);
       
  4414         }
       
  4415 
       
  4416         break;
       
  4417     }
       
  4418     case SE_ProgressBarContents:
       
  4419         r = subElementRect(SE_ProgressBarGroove, opt, w);
       
  4420         break;
       
  4421     default:
       
  4422         break;
       
  4423     }
       
  4424     return r;
       
  4425 }
       
  4426 
       
  4427 /*!
       
  4428     \internal
       
  4429 */
       
  4430 QIcon QCleanlooksStyle::standardIconImplementation(StandardPixmap standardIcon,
       
  4431                                                   const QStyleOption *option,
       
  4432                                                   const QWidget *widget) const
       
  4433 {
       
  4434     return QWindowsStyle::standardIconImplementation(standardIcon, option, widget);
       
  4435 }
       
  4436 
       
  4437 /*!
       
  4438  \reimp
       
  4439  */
       
  4440 QPixmap QCleanlooksStyle::standardPixmap(StandardPixmap standardPixmap, const QStyleOption *opt,
       
  4441                                       const QWidget *widget) const
       
  4442 {
       
  4443     QPixmap pixmap;
       
  4444 
       
  4445 #ifndef QT_NO_IMAGEFORMAT_XPM
       
  4446     switch (standardPixmap) {
       
  4447     case SP_TitleBarNormalButton:
       
  4448         return QPixmap((const char **)dock_widget_restore_xpm);
       
  4449     case SP_TitleBarMinButton:
       
  4450         return QPixmap((const char **)workspace_minimize);
       
  4451     case SP_TitleBarCloseButton:
       
  4452     case SP_DockWidgetCloseButton:
       
  4453         return QPixmap((const char **)dock_widget_close_xpm);
       
  4454 
       
  4455     default:
       
  4456         break;
       
  4457     }
       
  4458 #endif //QT_NO_IMAGEFORMAT_XPM
       
  4459 
       
  4460     return QWindowsStyle::standardPixmap(standardPixmap, opt, widget);
       
  4461 }
       
  4462 
       
  4463 QT_END_NAMESPACE
       
  4464 
       
  4465 #endif // QT_NO_STYLE_CLEANLOOKS || QT_PLUGIN