diff options
Diffstat (limited to 'src/widgets/styles/qplastiquestyle.cpp')
-rw-r--r-- | src/widgets/styles/qplastiquestyle.cpp | 5843 |
1 files changed, 0 insertions, 5843 deletions
diff --git a/src/widgets/styles/qplastiquestyle.cpp b/src/widgets/styles/qplastiquestyle.cpp deleted file mode 100644 index 449783fb90..0000000000 --- a/src/widgets/styles/qplastiquestyle.cpp +++ /dev/null @@ -1,5843 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qplastiquestyle.h" - -#if !defined(QT_NO_STYLE_PLASTIQUE) || defined(QT_PLUGIN) - -static const bool AnimateBusyProgressBar = true; -static const bool AnimateProgressBar = false; -// #define QPlastique_MaskButtons -static const int ProgressBarFps = 25; -static const int blueFrameWidth = 2; // with of line edit focus frame - -#include "qwindowsstyle_p.h" -#include <qapplication.h> -#include <qbitmap.h> -#include <qabstractitemview.h> -#include <qcheckbox.h> -#include <qcombobox.h> -#include <qdebug.h> -#include <qdialogbuttonbox.h> -#include <qformlayout.h> -#include <qgroupbox.h> -#include <qimage.h> -#include <qlineedit.h> -#include <qmainwindow.h> -#include <qmenu.h> -#include <qmenubar.h> -#include <qpainter.h> -#include <qpaintengine.h> -#include <qpainterpath.h> -#include <qpalette.h> -#include <qpen.h> -#include <qpixmap.h> -#include <qpixmapcache.h> -#include <qprogressbar.h> -#include <qpushbutton.h> -#include <qradiobutton.h> -#include <qscrollbar.h> -#include <qspinbox.h> -#include <qsplitter.h> -#include <qstyleoption.h> -#include <qtextedit.h> -#include <qtoolbar.h> -#include <qtoolbox.h> -#include <qtoolbutton.h> -#include <qprocess.h> -#include <qvarlengtharray.h> -#include <limits.h> -#include <private/qstylehelper_p.h> -#include <qpa/qplatformtheme.h> -#include <private/qguiapplication_p.h> -#include <private/qstyleanimation_p.h> - -QT_BEGIN_NAMESPACE - -// from windows style -static const int windowsItemFrame = 2; // menu item frame width -static const int windowsSepHeight = 2; // separator item height -static const int windowsItemHMargin = 3; // menu item hor text margin -static const int windowsItemVMargin = 2; // menu item ver text margin -static const int windowsArrowHMargin = 6; // arrow horizontal margin -static const int windowsTabSpacing = 12; // space between text and tab -static const int windowsRightBorder = 15; // right border on windows -static const int windowsCheckMarkWidth = 12; // checkmarks width on windows - -static const char * const qt_plastique_slider_verticalhandle[] = { - "15 11 6 1", - " c None", - "+ c #979797", - "@ c #C9C9C9", - "$ c #C1C1C1", - "b c None", - "d c None", - " $++++++++$ ", - "$+bbbbbbbb+$ ", - "+b $$ +$ ", - "+b $@ +$ ", - "+b +$", - "+b d+", - "+b d+$", - "+b $$ d+$ ", - "+b $@ d+$ ", - "$+dddddddd+$ ", - " $++++++++$ "}; - -static const char * const qt_plastique_slider_verticalhandle_left[] = { - "15 11 6 1", - " c None", - "+ c #979797", - "@ c #C9C9C9", - "$ c #C1C1C1", - "b c None", - "d c None", - " $++++++++$ ", - " $+bbbbbbbb+$", - " $+b $$ d+", - " $+b $@ d+", - "$+b d+", - "+b d+", - "$+ d+", - " $+ $$ d+", - " $+ $@ d+", - " $+dddddddd+$", - " $++++++++$ "}; - -static const char * const qt_plastique_slider_horizontalhandle[] = { - "11 15 6 1", - " c None", - "+ c #979797", - "@ c #C9C9C9", - "$ c #C1C1C1", - "b c None", - "d c None", - " $+++++++$ ", - "$+bbbbbbb+$", - "+b d+", - "+b$$ $$d+", - "+b$@ $@d+", - "+b d+", - "+b d+", - "+b d+", - "+b d+", - "+b d+", - "$+ d+$", - " $+ d+$ ", - " $+ d+$ ", - " $+d+$ ", - " $+$ "}; - -static const char * const qt_plastique_slider_horizontalhandle_up[] = { - "11 15 6 1", - " c None", - "+ c #979797", - "@ c #C9C9C9", - "$ c #C1C1C1", - "b c None", - "d c None", - " $+$ ", - " $+b+$ ", - " $+b +$ ", - " $+b +$ ", - "$+b +$", - "+b d+", - "+b d+", - "+b d+", - "+b d+", - "+b d+", - "+b$$ $$d+", - "+b$@ $@d+", - "+b d+", - "$+ddddddd+$", - " $+++++++$ "}; - -static const char * const qt_scrollbar_button_arrow_left[] = { - "4 7 2 1", - " c None", - "* c #BFBFBF", - " *", - " **", - " ***", - "****", - " ***", - " **", - " *"}; - -static const char * const qt_scrollbar_button_arrow_right[] = { - "4 7 2 1", - " c None", - "* c #BFBFBF", - "* ", - "** ", - "*** ", - "****", - "*** ", - "** ", - "* "}; - -static const char * const qt_scrollbar_button_arrow_up[] = { - "7 4 2 1", - " c None", - "* c #BFBFBF", - " * ", - " *** ", - " ***** ", - "*******"}; - -static const char * const qt_scrollbar_button_arrow_down[] = { - "7 4 2 1", - " c None", - "* c #BFBFBF", - "*******", - " ***** ", - " *** ", - " * "}; - -static const char * const qt_scrollbar_button_left[] = { - "16 16 6 1", - " c None", - ". c #BFBFBF", - "+ c #979797", - "# c #FAFAFA", - "< c #FAFAFA", - "* c #FAFAFA", - " .+++++++++++++.", - ".+#############+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - ".+<<<<<<<<<<<<<+", - " .+++++++++++++."}; - -static const char * const qt_scrollbar_button_right[] = { - "16 16 6 1", - " c None", - ". c #BFBFBF", - "+ c #979797", - "# c #FAFAFA", - "< c #FAFAFA", - "* c #FAFAFA", - ".+++++++++++++. ", - "+#############+.", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+<<<<<<<<<<<<<+.", - ".+++++++++++++. "}; - -static const char * const qt_scrollbar_button_up[] = { - "16 16 6 1", - " c None", - ". c #BFBFBF", - "+ c #979797", - "# c #FAFAFA", - "< c #FAFAFA", - "* c #FAFAFA", - " .++++++++++++. ", - ".+############+.", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+<<<<<<<<<<<<<<+", - ".++++++++++++++."}; - -static const char * const qt_scrollbar_button_down[] = { - "16 16 6 1", - " c None", - ". c #BFBFBF", - "+ c #979797", - "# c #FAFAFA", - "< c #FAFAFA", - "* c #FAFAFA", - "++++++++++++++++", - "+##############+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - "+# <+", - ".+<<<<<<<<<<<<+.", - " .++++++++++++. "}; - -static const char * const qt_scrollbar_slider_pattern_vertical[] = { - "10 18 3 1", - " c None", - ". c #BFBFBF", - "+ c #979797", - ".. .. ..", - ".+ .+ .+", - " ", - " ", - ".. .. ..", - ".+ .+ .+", - " ", - " ", - ".. .. ..", - ".+ .+ .+", - " ", - " ", - ".. .. ..", - ".+ .+ .+", - " ", - " ", - ".. .. ..", - ".+ .+ .+"}; - -static const char * const qt_scrollbar_slider_pattern_horizontal[] = { - "18 10 3 1", - " c None", - ". c #BFBFBF", - "+ c #979797", - ".. .. .. .. ..", - ".+ .+ .+ .+ .+", - " ", - " ", - ".. .. .. .. ..", - ".+ .+ .+ .+ .+", - " ", - " ", - ".. .. .. .. ..", - ".+ .+ .+ .+ .+"}; - -static const char * const qt_toolbarhandle[] = { - "6 6 4 1", - " c None", - ". c #C5C5C5", - "+ c #EEEEEE", - "@ c #FAFAFA", - ".. ", - ".+@ ", - " @@ ", - " .. ", - " .+@", - " @@"}; - -static const char * const qt_simple_toolbarhandle[] = { - "3 3 4 1", - " c None", - ". c #C5C5C5", - "+ c #EEEEEE", - "@ c #FAFAFA", - ".. ", - ".+@", - " @@"}; - -static const char * const qt_titlebar_context_help[] = { -"27 27 5 1", -" c None", -". c #0A0C12", -"+ c #1B202D", -"@ c #293144", -"# c #3C435D", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" +@##@+ ", -" .@@@.+@@.. ", -" .##+ +@@+. ", -" .##@ @#@+. ", -" .... +@+.. ", -" .@+@@.. ", -" +#@@+ ", -" .##. ", -" .++. ", -" .++. ", -" +##+ ", -" .@@. ", -" ", -" ", -" ", -" ", -" ", -" ", -" "}; - -static QLinearGradient qMapGradientToRect(const QLinearGradient &gradient, const QRectF &rect) -{ - QLinearGradient tmpGrad(rect.center().x(), rect.top(), - rect.center().x(), rect.bottom()); - tmpGrad.setStops(gradient.stops()); - return tmpGrad; -} - -static QBrush qMapBrushToRect(const QBrush &brush, const QRectF &rect) -{ - if (!brush.gradient()) - return brush; - - // ### Ugly assumption that it's a linear gradient - QBrush tmp(qMapGradientToRect(*static_cast<const QLinearGradient *>(brush.gradient()), rect)); - return tmp; -} - -static void qBrushSetAlphaF(QBrush *brush, qreal alpha) -{ - if (const QGradient *gradient = brush->gradient()) { - // Use the gradient. Call QColor::setAlphaF() on all color stops. - QGradientStops stops = gradient->stops(); - QMutableVectorIterator<QGradientStop> it(stops); - QColor tmpColor; - while (it.hasNext()) { - it.next(); - tmpColor = it.value().second; - tmpColor.setAlphaF(alpha * tmpColor.alphaF()); - it.setValue(QPair<qreal, QColor>(it.value().first, tmpColor)); - } - - switch (gradient->type()) { - case QGradient::RadialGradient: { - QRadialGradient grad = *static_cast<const QRadialGradient *>(gradient); - grad.setStops(stops); - *brush = QBrush(grad); - break; - } - case QGradient::ConicalGradient: { - QConicalGradient grad = *static_cast<const QConicalGradient *>(gradient); - grad.setStops(stops); - *brush = QBrush(grad); - break; - } - default: - qWarning("QPlastiqueStyle::qBrushLight() - unknown gradient type" - " - falling back to QLinearGradient"); - case QGradient::LinearGradient: { - QLinearGradient grad = *static_cast<const QLinearGradient *>(gradient); - grad.setStops(stops); - *brush = QBrush(grad); - break; - } - } - } else if (!brush->texture().isNull()) { - // Modify the texture - ridiculously expensive. - QPixmap texture = brush->texture(); - QPixmap pixmap; - QString name = QLatin1String("qbrushtexture-alpha") - % HexString<qreal>(alpha) - % HexString<qint64>(texture.cacheKey()); - if (!QPixmapCache::find(name, pixmap)) { - QImage image = texture.toImage(); - QRgb *rgb = reinterpret_cast<QRgb *>(image.bits()); - int pixels = image.width() * image.height(); - QColor tmpColor; - while (pixels--) { - tmpColor.setRgb(*rgb); - tmpColor.setAlphaF(alpha * tmpColor.alphaF()); - *rgb++ = tmpColor.rgba(); - } - pixmap = QPixmap::fromImage(image); - QPixmapCache::insert(name, pixmap); - } - brush->setTexture(pixmap); - } else { - // Use the color - QColor tmpColor = brush->color(); - tmpColor.setAlphaF(alpha * tmpColor.alphaF()); - brush->setColor(tmpColor); - } -} - -static QBrush qBrushLight(QBrush brush, int light) -{ - if (const QGradient *gradient = brush.gradient()) { - // Use the gradient. Call QColor::lighter() on all color stops. - QGradientStops stops = gradient->stops(); - QMutableVectorIterator<QGradientStop> it(stops); - while (it.hasNext()) { - it.next(); - it.setValue(QPair<qreal, QColor>(it.value().first, it.value().second.lighter(light))); - } - - switch (gradient->type()) { - case QGradient::RadialGradient: { - QRadialGradient grad = *static_cast<const QRadialGradient *>(gradient); - grad.setStops(stops); - brush = QBrush(grad); - break; - } - case QGradient::ConicalGradient: { - QConicalGradient grad = *static_cast<const QConicalGradient *>(gradient); - grad.setStops(stops); - brush = QBrush(grad); - break; - } - default: - qWarning("QPlastiqueStyle::qBrushLight() - unknown gradient type" - " - falling back to QLinearGradient"); - case QGradient::LinearGradient: { - QLinearGradient grad = *static_cast<const QLinearGradient *>(gradient); - grad.setStops(stops); - brush = QBrush(grad); - break; - } - } - } else if (!brush.texture().isNull()) { - // Modify the texture - ridiculously expensive. - QPixmap texture = brush.texture(); - QPixmap pixmap; - QString name = QLatin1String("qbrushtexture-light") - % HexString<int>(light) - % HexString<qint64>(texture.cacheKey()); - - if (!QPixmapCache::find(name, pixmap)) { - QImage image = texture.toImage(); - QRgb *rgb = reinterpret_cast<QRgb *>(image.bits()); - int pixels = image.width() * image.height(); - QColor tmpColor; - while (pixels--) { - tmpColor.setRgb(*rgb); - *rgb++ = tmpColor.lighter(light).rgba(); - } - pixmap = QPixmap::fromImage(image); - QPixmapCache::insert(name, pixmap); - } - brush.setTexture(pixmap); - } else { - // Use the color - brush.setColor(brush.color().lighter(light)); - } - return brush; -} - -static QBrush qBrushDark(QBrush brush, int dark) -{ - if (const QGradient *gradient = brush.gradient()) { - // Use the gradient. Call QColor::darker() on all color stops. - QGradientStops stops = gradient->stops(); - QMutableVectorIterator<QGradientStop> it(stops); - while (it.hasNext()) { - it.next(); - it.setValue(QPair<qreal, QColor>(it.value().first, it.value().second.darker(dark))); - } - - switch (gradient->type()) { - case QGradient::RadialGradient: { - QRadialGradient grad = *static_cast<const QRadialGradient *>(gradient); - grad.setStops(stops); - brush = QBrush(grad); - break; - } - case QGradient::ConicalGradient: { - QConicalGradient grad = *static_cast<const QConicalGradient *>(gradient); - grad.setStops(stops); - brush = QBrush(grad); - break; - } - default: - qWarning("QPlastiqueStyle::qBrushDark() - unknown gradient type" - " - falling back to QLinearGradient"); - case QGradient::LinearGradient: { - QLinearGradient grad = *static_cast<const QLinearGradient *>(gradient); - grad.setStops(stops); - brush = QBrush(grad); - break; - } - } - } else if (!brush.texture().isNull()) { - // Modify the texture - ridiculously expensive. - QPixmap texture = brush.texture(); - QPixmap pixmap; - QString name = QLatin1String("qbrushtexture-dark") - % HexString<int>(dark) - % HexString<qint64>(texture.cacheKey()); - - if (!QPixmapCache::find(name, pixmap)) { - QImage image = texture.toImage(); - QRgb *rgb = reinterpret_cast<QRgb *>(image.bits()); - int pixels = image.width() * image.height(); - QColor tmpColor; - while (pixels--) { - tmpColor.setRgb(*rgb); - *rgb++ = tmpColor.darker(dark).rgba(); - } - pixmap = QPixmap::fromImage(image); - QPixmapCache::insert(name, pixmap); - } - brush.setTexture(pixmap); - } else { - // Use the color - brush.setColor(brush.color().darker(dark)); - } - return brush; -} - -/* - Draws a rounded frame using the provided brush for 1, and adds 0.5 alpha - for 0. - - 0111111110 - 01 10 - 1 1 - 1 1 - 1 1 - 01 10 - 0111111110 -*/ -static void qt_plastique_draw_frame(QPainter *painter, const QRect &rect, const QStyleOption *option, - QFrame::Shadow shadow = QFrame::Plain) -{ - QPen oldPen = painter->pen(); - QBrush border; - QBrush corner; - QBrush innerTopLeft; - QBrush innerBottomRight; - - if (shadow != QFrame::Plain && (option->state & QStyle::State_HasFocus)) { - border = option->palette.highlight(); - qBrushSetAlphaF(&border, qreal(0.8)); - corner = option->palette.highlight(); - qBrushSetAlphaF(&corner, 0.5); - innerTopLeft = qBrushDark(option->palette.highlight(), 125); - innerBottomRight = option->palette.highlight(); - qBrushSetAlphaF(&innerBottomRight, qreal(0.65)); - } else { - border = option->palette.shadow(); - qBrushSetAlphaF(&border, qreal(0.4)); - corner = option->palette.shadow(); - qBrushSetAlphaF(&corner, 0.25); - innerTopLeft = option->palette.shadow(); - innerBottomRight = option->palette.shadow(); - if (shadow == QFrame::Sunken) { - qBrushSetAlphaF(&innerTopLeft, qreal(0.23)); - qBrushSetAlphaF(&innerBottomRight, qreal(0.075)); - } else { - qBrushSetAlphaF(&innerTopLeft, qreal(0.075)); - qBrushSetAlphaF(&innerBottomRight, qreal(0.23)); - } - } - - QLine lines[4]; - QPoint points[8]; - - // Opaque corner lines - painter->setPen(QPen(border, 0)); - lines[0] = QLine(rect.left() + 2, rect.top(), rect.right() - 2, rect.top()); - lines[1] = QLine(rect.left() + 2, rect.bottom(), rect.right() - 2, rect.bottom()); - lines[2] = QLine(rect.left(), rect.top() + 2, rect.left(), rect.bottom() - 2); - lines[3] = QLine(rect.right(), rect.top() + 2, rect.right(), rect.bottom() - 2); - painter->drawLines(lines, 4); - - // Opaque corner dots - points[0] = QPoint(rect.left() + 1, rect.top() + 1); - points[1] = QPoint(rect.left() + 1, rect.bottom() - 1); - points[2] = QPoint(rect.right() - 1, rect.top() + 1); - points[3] = QPoint(rect.right() - 1, rect.bottom() - 1); - painter->drawPoints(points, 4); - - // Shaded corner dots - painter->setPen(QPen(corner, 0)); - points[0] = QPoint(rect.left(), rect.top() + 1); - points[1] = QPoint(rect.left(), rect.bottom() - 1); - points[2] = QPoint(rect.left() + 1, rect.top()); - points[3] = QPoint(rect.left() + 1, rect.bottom()); - points[4] = QPoint(rect.right(), rect.top() + 1); - points[5] = QPoint(rect.right(), rect.bottom() - 1); - points[6] = QPoint(rect.right() - 1, rect.top()); - points[7] = QPoint(rect.right() - 1, rect.bottom()); - painter->drawPoints(points, 8); - - // Shadows - if (shadow != QFrame::Plain) { - painter->setPen(QPen(innerTopLeft, 0)); - lines[0] = QLine(rect.left() + 2, rect.top() + 1, rect.right() - 2, rect.top() + 1); - lines[1] = QLine(rect.left() + 1, rect.top() + 2, rect.left() + 1, rect.bottom() - 2); - painter->drawLines(lines, 2); - painter->setPen(QPen(innerBottomRight, 0)); - lines[0] = QLine(rect.left() + 2, rect.bottom() - 1, rect.right() - 2, rect.bottom() - 1); - lines[1] = QLine(rect.right() - 1, rect.top() + 2, rect.right() - 1, rect.bottom() - 2); - painter->drawLines(lines, 2); - } - - painter->setPen(oldPen); -} - -static QColor mergedColors(const QColor &colorA, const QColor &colorB, int factor = 50) -{ - const int maxFactor = 100; - QColor tmp = colorA; - tmp.setRed((tmp.red() * factor) / maxFactor + (colorB.red() * (maxFactor - factor)) / maxFactor); - tmp.setGreen((tmp.green() * factor) / maxFactor + (colorB.green() * (maxFactor - factor)) / maxFactor); - tmp.setBlue((tmp.blue() * factor) / maxFactor + (colorB.blue() * (maxFactor - factor)) / maxFactor); - return tmp; -} - -static void qt_plastique_draw_gradient(QPainter *painter, const QRect &rect, const QColor &gradientStart, - const QColor &gradientStop) -{ - QString gradientName = QLatin1String("qplastique-g") - % HexString<int>(rect.width()) - % HexString<int>(rect.height()) - % HexString<QRgb>(gradientStart.rgba()) - % HexString<QRgb>(gradientStop.rgba()); - - QPixmap cache; - QPainter *p = painter; - QRect r = rect; - - bool doPixmapCache = painter->deviceTransform().isIdentity() - && painter->worldMatrix().isIdentity(); - if (doPixmapCache && QPixmapCache::find(gradientName, cache)) { - painter->drawPixmap(rect, cache); - } else { - if (doPixmapCache) { - cache = QPixmap(rect.size()); - cache.fill(Qt::transparent); - p = new QPainter(&cache); - r = QRect(0, 0, rect.width(), rect.height()); - } - - int x = r.center().x(); - QLinearGradient gradient(x, r.top(), x, r.bottom()); - gradient.setColorAt(0, gradientStart); - gradient.setColorAt(1, gradientStop); - p->fillRect(r, gradient); - - if (doPixmapCache) { - p->end(); - delete p; - painter->drawPixmap(rect, cache); - QPixmapCache::insert(gradientName, cache); - } - } -} - -static void qt_plastique_drawFrame(QPainter *painter, const QStyleOption *option, const QWidget *widget) -{ - QRect rect = option->rect; - QPen oldPen = painter->pen(); - - QColor borderColor = option->palette.background().color().darker(178); - QColor gradientStartColor = option->palette.button().color().lighter(104); - QColor gradientStopColor = option->palette.button().color().darker(105); - QColor alphaCornerColor; - if (widget) { - // ### backgroundrole/foregroundrole should be part of the style option - alphaCornerColor = mergedColors(option->palette.color(widget->backgroundRole()), borderColor); - } else { - alphaCornerColor = mergedColors(option->palette.background().color(), borderColor); - } - - QLine lines[4]; - QPoint points[8]; - - // outline / border - painter->setPen(borderColor); - lines[0] = QLine(rect.left() + 2, rect.top(), rect.right() - 2, rect.top()); - lines[1] = QLine(rect.left() + 2, rect.bottom(), rect.right() - 2, rect.bottom()); - lines[2] = QLine(rect.left(), rect.top() + 2, rect.left(), rect.bottom() - 2); - lines[3] = QLine(rect.right(), rect.top() + 2, rect.right(), rect.bottom() - 2); - painter->drawLines(lines, 4); - - points[0] = QPoint(rect.left() + 1, rect.top() + 1); - points[1] = QPoint(rect.right() - 1, rect.top() + 1); - points[2] = QPoint(rect.left() + 1, rect.bottom() - 1); - points[3] = QPoint(rect.right() - 1, rect.bottom() - 1); - painter->drawPoints(points, 4); - - painter->setPen(alphaCornerColor); - - points[0] = QPoint(rect.left() + 1, rect.top()); - points[1] = QPoint(rect.right() - 1, rect.top()); - points[2] = QPoint(rect.left() + 1, rect.bottom()); - points[3] = QPoint(rect.right() - 1, rect.bottom()); - points[4] = QPoint(rect.left(), rect.top() + 1); - points[5] = QPoint(rect.right(), rect.top() + 1); - points[6] = QPoint(rect.left(), rect.bottom() - 1); - points[7] = QPoint(rect.right(), rect.bottom() - 1); - painter->drawPoints(points, 8); - - // inner border - if ((option->state & QStyle::State_Sunken) || (option->state & QStyle::State_On)) - painter->setPen(option->palette.button().color().darker(118)); - else - painter->setPen(gradientStartColor); - - lines[0] = QLine(rect.left() + 2, rect.top() + 1, rect.right() - 2, option->rect.top() + 1); - lines[1] = QLine(rect.left() + 1, rect.top() + 2, rect.left() + 1, option->rect.bottom() - 2); - painter->drawLines(lines, 2); - - if ((option->state & QStyle::State_Sunken) || (option->state & QStyle::State_On)) - painter->setPen(option->palette.button().color().darker(110)); - else - painter->setPen(gradientStopColor.darker(102)); - - lines[0] = QLine(rect.left() + 2, rect.bottom() - 1, rect.right() - 2, rect.bottom() - 1); - lines[1] = QLine(rect.right() - 1, rect.top() + 2, rect.right() - 1, rect.bottom() - 2); - painter->drawLines(lines, 2); - - painter->setPen(oldPen); -} - -static void qt_plastique_drawShadedPanel(QPainter *painter, const QStyleOption *option, bool base, - const QWidget *widget) -{ - QRect rect = option->rect; - QPen oldPen = painter->pen(); - - QColor gradientStartColor = option->palette.button().color().lighter(104); - QColor gradientStopColor = option->palette.button().color().darker(105); - - // gradient fill - if ((option->state & QStyle::State_Enabled) || !(option->state & QStyle::State_AutoRaise)) { - if ((option->state & QStyle::State_Sunken) || (option->state & QStyle::State_On)) { - qt_plastique_draw_gradient(painter, rect.adjusted(1, 1, -1, -1), - option->palette.button().color().darker(114), - option->palette.button().color().darker(106)); - } else { - qt_plastique_draw_gradient(painter, rect.adjusted(1, 1, -1, -1), - base ? option->palette.background().color().lighter(105) : gradientStartColor, - base ? option->palette.background().color().darker(102) : gradientStopColor); - } - } - - qt_plastique_drawFrame(painter, option, widget); - - painter->setPen(oldPen); -} - -static void qt_plastique_draw_mdibutton(QPainter *painter, const QStyleOptionTitleBar *option, const QRect &tmp, bool hover, bool sunken) -{ - if (tmp.isNull()) - return; - bool active = (option->titleBarState & QStyle::State_Active); - - // ### use palette colors instead - QColor mdiButtonGradientStartColor; - QColor mdiButtonGradientStopColor; - if (active) { - mdiButtonGradientStartColor = QColor((hover || sunken) ? 0x7d8bb1 : 0x55689a); - mdiButtonGradientStopColor = QColor((hover || sunken) ? 0x939ebe : 0x7381ab); - } else { - mdiButtonGradientStartColor = QColor((hover || sunken) ? 0x9e9e9e : 0x818181); - mdiButtonGradientStopColor = QColor((hover || sunken) ? 0xababab : 0x929292); - } - - qt_plastique_draw_gradient(painter, tmp.adjusted(1, 1, -1, -1), - mdiButtonGradientStartColor, mdiButtonGradientStopColor); - - QColor mdiButtonBorderColor; - if (active) { - mdiButtonBorderColor = (hover || sunken) ? QColor(0x627097) : QColor(0x324577); - } else { - mdiButtonBorderColor = (hover || sunken) ? QColor(0x838383) : QColor(0x5e5e5e); - } - painter->setPen(QPen(mdiButtonBorderColor, 1)); - - const QLine lines[4] = { - QLine(tmp.left() + 2, tmp.top(), tmp.right() - 2, tmp.top()), - QLine(tmp.left() + 2, tmp.bottom(), tmp.right() - 2, tmp.bottom()), - QLine(tmp.left(), tmp.top() + 2, tmp.left(), tmp.bottom() - 2), - QLine(tmp.right(), tmp.top() + 2, tmp.right(), tmp.bottom() - 2) }; - painter->drawLines(lines, 4); - - const QPoint points[4] = { - QPoint(tmp.left() + 1, tmp.top() + 1), - QPoint(tmp.right() - 1, tmp.top() + 1), - QPoint(tmp.left() + 1, tmp.bottom() - 1), - QPoint(tmp.right() - 1, tmp.bottom() - 1) }; - painter->drawPoints(points, 4); -} - -#ifndef QT_NO_DOCKWIDGET -static QString elliditide(const QString &text, const QFontMetrics &fontMetrics, const QRect &rect, int *textWidth = 0) -{ - // Chop and insert ellide into title if text is too wide - QString title = text; - int width = textWidth ? *textWidth : fontMetrics.width(text); - QString ellipsis = QLatin1String("..."); - if (width > rect.width()) { - QString leftHalf = title.left(title.size() / 2); - QString rightHalf = title.mid(leftHalf.size() + 1); - while (!leftHalf.isEmpty() && !rightHalf.isEmpty()) { - leftHalf.chop(1); - int width = fontMetrics.width(leftHalf + ellipsis + rightHalf); - if (width < rect.width()) { - title = leftHalf + ellipsis + rightHalf; - break; - } - rightHalf.remove(0, 1); - width = fontMetrics.width(leftHalf + ellipsis + rightHalf); - if (width < rect.width()) { - title = leftHalf + ellipsis + rightHalf; - break; - } - } - } - if (textWidth) - *textWidth = width; - return title; -} -#endif - -#if !defined(QT_NO_DOCKWIDGET) || !defined(QT_NO_SPLITTER) -static void qt_plastique_draw_handle(QPainter *painter, const QStyleOption *option, - const QRect &rect, Qt::Orientation orientation, - const QWidget *widget) -{ - QColor borderColor = option->palette.background().color().darker(178); - QColor alphaCornerColor; - if (widget) { - // ### backgroundrole/foregroundrole should be part of the style option - alphaCornerColor = mergedColors(option->palette.color(widget->backgroundRole()), borderColor); - } else { - alphaCornerColor = mergedColors(option->palette.background().color(), borderColor); - } - QImage handle(qt_simple_toolbarhandle); - alphaCornerColor.setAlpha(170); - handle.setColor(1, alphaCornerColor.rgba()); - handle.setColor(2, mergedColors(alphaCornerColor, option->palette.light().color()).rgba()); - handle.setColor(3, option->palette.light().color().rgba()); - - const int spacing = 2; - - if (orientation == Qt::Vertical) { - int nchunks = rect.width() / (handle.width() + spacing); - for (int i = 0; i < nchunks; ++i) - painter->drawImage(QPoint(rect.left() + i * (handle.width() + spacing), rect.top()), handle); - } else { - int nchunks = rect.height() / (handle.height() + spacing); - for (int i = 0; i < nchunks; ++i) - painter->drawImage(QPoint(rect.left(), rect.top() + i * (handle.height() + spacing)), handle); - } -} -#endif - -class QPlastiqueStylePrivate : public QWindowsStylePrivate -{ - Q_DECLARE_PUBLIC(QPlastiqueStyle) -public: - QPlastiqueStylePrivate(); - virtual ~QPlastiqueStylePrivate(); - void drawPartialFrame(QPainter *painter, const QStyleOptionComplex *option, - const QRect &rect, const QWidget *widget) const; -}; - -/*! - \internal - */ -QPlastiqueStylePrivate::QPlastiqueStylePrivate() : - QWindowsStylePrivate() -{ -} - -/*! - \internal - */ -QPlastiqueStylePrivate::~QPlastiqueStylePrivate() -{ -} - -/*! - \class QPlastiqueStyle - \brief The QPlastiqueStyle class provides a widget style similar to the - Plastik style available in KDE. - - \inmodule QtWidgets - - The Plastique style provides a default look and feel for widgets on X11 - that closely resembles the Plastik style, introduced by Sandro Giessl in - KDE 3.2. - - \image qplastiquestyle.png - \sa QWindowsXPStyle, QMacStyle, QWindowsStyle -*/ - -/*! - Constructs a QPlastiqueStyle object. -*/ -QPlastiqueStyle::QPlastiqueStyle() - : QWindowsStyle(*new QPlastiqueStylePrivate) -{ - setObjectName(QLatin1String("Plastique")); -} - -/*! - Destructs the QPlastiqueStyle object. -*/ -QPlastiqueStyle::~QPlastiqueStyle() -{ -} - -/* - Used by spin- and combo box. - Draws a rounded frame around rect but omits the right hand edge -*/ -void QPlastiqueStylePrivate::drawPartialFrame(QPainter *painter, const QStyleOptionComplex *option, - const QRect &rect, const QWidget *widget) const -{ - Q_Q(const QPlastiqueStyle); - bool reverse = option->direction == Qt::RightToLeft; - QStyleOptionFrame frameOpt; -#ifndef QT_NO_LINEEDIT - if (QLineEdit *lineedit = widget->findChild<QLineEdit *>()) - frameOpt.initFrom(lineedit); -#else - Q_UNUSED(widget) -#endif // QT_NO_LINEEDIT - - frameOpt.rect = rect; - painter->save(); - frameOpt.rect.adjust(-blueFrameWidth + (reverse ? 1 : 0), -blueFrameWidth, - blueFrameWidth + (reverse ? 0 : -1), blueFrameWidth); - painter->setClipRect(frameOpt.rect); - frameOpt.rect.adjust(reverse ? -2 : 0, 0, reverse ? 0 : 2, 0); - frameOpt.lineWidth = q->pixelMetric(QStyle::PM_DefaultFrameWidth); - frameOpt.midLineWidth = 0; - frameOpt.state = option->state | QStyle::State_Sunken; - frameOpt.palette = option->palette; - q->drawPrimitive(QStyle::PE_PanelLineEdit, &frameOpt, painter, widget); - painter->restore(); - - // Draw a two pixel highlight on the flat edge - if (option->state & QStyle::State_HasFocus) { - painter->setPen(QPen(option->palette.highlight(), 0)); - QBrush focusBorder = option->palette.highlight(); - qBrushSetAlphaF(&focusBorder, qreal(0.65)); - if (!reverse) { - painter->drawLine(rect.topRight() + QPoint(1, -1), - rect.bottomRight() + QPoint(1, 1)); - painter->setPen(QPen(focusBorder, 0)); - painter->drawLine(rect.topRight(), - rect.bottomRight()); - } - else { - painter->drawLine(rect.topLeft() + QPoint(-1, -1), - rect.bottomLeft() + QPoint(-1, 1)); - painter->setPen(QPen(focusBorder, 0)); - painter->drawLine(rect.topLeft(), - rect.bottomLeft()); - } - } -} - -/*! - \reimp -*/ -void QPlastiqueStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option, - QPainter *painter, const QWidget *widget) const -{ - Q_ASSERT(option); - - QColor borderColor = option->palette.background().color().darker(178); - QColor alphaCornerColor; - if (widget) { - // ### backgroundrole/foregroundrole should be part of the style option - alphaCornerColor = mergedColors(option->palette.color(widget->backgroundRole()), borderColor); - } else { - alphaCornerColor = mergedColors(option->palette.background().color(), borderColor); - } - QColor alphaTextColor = mergedColors(option->palette.background().color(), option->palette.text().color()); - - switch (element) { - case PE_IndicatorButtonDropDown: - proxy()->drawPrimitive(PE_PanelButtonTool, option, painter, widget); - break; - case PE_FrameDefaultButton: { - if (!(option->state & QStyle::State_Enabled)) - break; - painter->setPen(QPen(QColor(0, 0, 0, 127), 0)); - const QLine lines[4] = { - QLine(option->rect.left() + 2, option->rect.top(), - option->rect.right() - 2, option->rect.top()), - QLine(option->rect.left() + 2, option->rect.bottom(), - option->rect.right() - 2, option->rect.bottom()), - QLine(option->rect.left(), option->rect.top() + 2, - option->rect.left(), option->rect.bottom() - 2), - QLine(option->rect.right(), option->rect.top() + 2, - option->rect.right(), option->rect.bottom() - 2) }; - painter->drawLines(lines, 4); - - QPoint points[8]; - points[0] = QPoint(option->rect.left() + 1, option->rect.top() + 1); - points[1] = QPoint(option->rect.right() - 1, option->rect.top() + 1); - points[2] = QPoint(option->rect.left() + 1, option->rect.bottom() - 1); - points[3] = QPoint(option->rect.right() - 1, option->rect.bottom() - 1); - painter->drawPoints(points, 4); - - painter->setPen(QPen(QColor(0, 0, 0, 63), 0)); - points[0] = QPoint(option->rect.left() + 1, option->rect.top()); - points[1] = QPoint(option->rect.right() - 1, option->rect.top()); - points[2] = QPoint(option->rect.left(), option->rect.top() + 1); - points[3] = QPoint(option->rect.right(), option->rect.top() + 1); - points[4] = QPoint(option->rect.left() + 1, option->rect.bottom()); - points[5] = QPoint(option->rect.right() - 1, option->rect.bottom()); - points[6] = QPoint(option->rect.left(), option->rect.bottom() - 1); - points[7] = QPoint(option->rect.right(), option->rect.bottom() - 1); - painter->drawPoints(points, 8); - - break; - } -#ifndef QT_NO_TABWIDGET - case PE_FrameTabWidget: - if (const QStyleOptionTabWidgetFrame *twf = qstyleoption_cast<const QStyleOptionTabWidgetFrame *>(option)) { - if (twf->shape != QTabBar::RoundedNorth && twf->shape != QTabBar::RoundedWest && - twf->shape != QTabBar::RoundedSouth && twf->shape != QTabBar::RoundedEast) { - QWindowsStyle::drawPrimitive(element, option, painter, widget); - break; - } - - int borderThickness = proxy()->pixelMetric(PM_TabBarBaseOverlap, twf, widget); - bool reverse = (twf->direction == Qt::RightToLeft); - - painter->save(); - - // Start by filling the contents of the tab widget frame (which is - // actually a panel). - painter->fillRect(option->rect.adjusted(1, 1, -1, -1), option->palette.window()); - - QRect tabBarRect; - switch (twf->shape) { - case QTabBar::RoundedNorth: - if (reverse) - tabBarRect = QRect(twf->rect.right() - twf->leftCornerWidgetSize.width() - twf->tabBarSize.width() + 1, twf->rect.top(), twf->tabBarSize.width(), borderThickness); - else - tabBarRect = QRect(twf->rect.left() + twf->leftCornerWidgetSize.width(), twf->rect.top(), twf->tabBarSize.width(), borderThickness); - break ; - case QTabBar::RoundedWest: - tabBarRect = QRect(twf->rect.left(), twf->rect.top() + twf->leftCornerWidgetSize.height(), borderThickness, twf->tabBarSize.height()); - break ; - case QTabBar::RoundedEast: - tabBarRect = QRect(twf->rect.right() - borderThickness + 1, twf->rect.top() + twf->leftCornerWidgetSize.height(), - borderThickness, twf->tabBarSize.height()); - break ; - case QTabBar::RoundedSouth: - if (reverse) - tabBarRect = QRect(twf->rect.right() - twf->leftCornerWidgetSize.width() - twf->tabBarSize.width() + 1, - twf->rect.bottom() - borderThickness + 1, twf->tabBarSize.width(), borderThickness); - else - tabBarRect = QRect(twf->rect.left() + twf->leftCornerWidgetSize.width(), - twf->rect.bottom() - borderThickness + 1, twf->tabBarSize.width(), borderThickness); - break ; - default: - break; - } - - QRegion region(twf->rect); - region -= tabBarRect; - painter->setClipRegion(region); - - // Outer border - QLine leftLine = QLine(twf->rect.topLeft() + QPoint(0, 2), twf->rect.bottomLeft() - QPoint(0, 2)); - QLine rightLine = QLine(twf->rect.topRight() + QPoint(0, 2), twf->rect.bottomRight() - QPoint(0, 2)); - QLine bottomLine = QLine(twf->rect.bottomLeft() + QPoint(2, 0), twf->rect.bottomRight() - QPoint(2, 0)); - QLine topLine = QLine(twf->rect.topLeft() + QPoint(2, 0), twf->rect.topRight() - QPoint(2, 0)); - - QBrush border = option->palette.shadow(); - qBrushSetAlphaF(&border, qreal(0.4)); - painter->setPen(QPen(border, 0)); - - QVarLengthArray<QLine, 4> lines; - QVarLengthArray<QPoint, 8> points; - - lines.append(topLine); - - // Inner border - QLine innerLeftLine = QLine(leftLine.p1() + QPoint(1, 0), leftLine.p2() + QPoint(1, 0)); - QLine innerRightLine = QLine(rightLine.p1() - QPoint(1, 0), rightLine.p2() - QPoint(1, 0)); - QLine innerBottomLine = QLine(bottomLine.p1() - QPoint(0, 1), bottomLine.p2() - QPoint(0, 1)); - QLine innerTopLine = QLine(topLine.p1() + QPoint(0, 1), topLine.p2() + QPoint(0, 1)); - - // Rounded Corner - QPoint leftBottomOuterCorner = QPoint(innerLeftLine.p2() + QPoint(0, 1)); - QPoint leftBottomInnerCorner1 = QPoint(leftLine.p2() + QPoint(0, 1)); - QPoint leftBottomInnerCorner2 = QPoint(bottomLine.p1() - QPoint(1, 0)); - QPoint rightBottomOuterCorner = QPoint(innerRightLine.p2() + QPoint(0, 1)); - QPoint rightBottomInnerCorner1 = QPoint(rightLine.p2() + QPoint(0, 1)); - QPoint rightBottomInnerCorner2 = QPoint(bottomLine.p2() + QPoint(1, 0)); - QPoint rightTopOuterCorner = QPoint(innerRightLine.p1() - QPoint(0, 1)); - QPoint rightTopInnerCorner1 = QPoint(rightLine.p1() - QPoint(0, 1)); - QPoint rightTopInnerCorner2 = QPoint(topLine.p2() + QPoint(1, 0)); - QPoint leftTopOuterCorner = QPoint(innerLeftLine.p1() - QPoint(0, 1)); - QPoint leftTopInnerCorner1 = QPoint(leftLine.p1() - QPoint(0, 1)); - QPoint leftTopInnerCorner2 = QPoint(topLine.p1() - QPoint(1, 0)); - - lines.append(leftLine); - lines.append(rightLine); - lines.append(bottomLine); - - painter->drawLines(lines.constData(), lines.size()); - lines.clear(); - - points.append(leftBottomOuterCorner); - points.append(rightBottomOuterCorner); - points.append(rightTopOuterCorner); - points.append(leftTopOuterCorner); - - painter->drawPoints(points.constData(), points.size()); - points.clear(); - - QBrush innerTopLeft = option->palette.shadow(); - qBrushSetAlphaF(&innerTopLeft, qreal(0.075)); - painter->setPen(QPen(innerTopLeft, 0)); - - lines.append(innerLeftLine); - lines.append(innerTopLine); - painter->drawLines(lines.constData(), lines.size()); - lines.clear(); - - QBrush innerBottomRight = option->palette.shadow(); - qBrushSetAlphaF(&innerBottomRight, qreal(0.23)); - painter->setPen(QPen(innerBottomRight, 0)); - lines.append(innerRightLine); - lines.append(innerBottomLine); - painter->drawLines(lines.constData(), lines.size()); - lines.clear(); - - QBrush corner = option->palette.shadow(); - qBrushSetAlphaF(&corner, 0.25); - painter->setPen(QPen(corner, 0)); - points.append(leftBottomInnerCorner1); - points.append(leftBottomInnerCorner2); - points.append(rightBottomInnerCorner1); - points.append(rightBottomInnerCorner2); - points.append(rightTopInnerCorner1); - points.append(rightTopInnerCorner2); - points.append(leftTopInnerCorner1); - points.append(leftTopInnerCorner2); - painter->drawPoints(points.constData(), points.size()); - points.clear(); - - painter->restore(); - } - break ; -#endif // QT_NO_TABWIDGET -#ifndef QT_NO_TABBAR - case PE_FrameTabBarBase: - if (const QStyleOptionTabBarBase *tbb = qstyleoption_cast<const QStyleOptionTabBarBase *>(option)) { - if (tbb->shape != QTabBar::RoundedNorth && tbb->shape != QTabBar::RoundedWest && - tbb->shape != QTabBar::RoundedSouth && tbb->shape != QTabBar::RoundedEast) { - QWindowsStyle::drawPrimitive(element, option, painter, widget); - break; - } - - painter->save(); - - QRegion region(tbb->rect); - region -= tbb->tabBarRect; - painter->setClipRegion(region); - - QLine topLine = QLine(tbb->rect.bottomLeft() - QPoint(0, 1), tbb->rect.bottomRight() - QPoint(0, 1)); - QLine bottomLine = QLine(tbb->rect.bottomLeft(), tbb->rect.bottomRight()); - - QBrush border = option->palette.shadow(); - qBrushSetAlphaF(&border, qreal(0.4)); - QBrush innerTopLeft = option->palette.shadow(); - qBrushSetAlphaF(&innerTopLeft, qreal(0.075)); - QBrush innerBottomRight = option->palette.shadow(); - qBrushSetAlphaF(&innerBottomRight, qreal(0.23)); - QBrush corner = option->palette.shadow(); - qBrushSetAlphaF(&corner, 0.25); - - if (tbb->shape == QTabBar::RoundedSouth) - painter->setPen(QPen(corner, 0)); - else - painter->setPen(QPen(border, 0)); - painter->drawLine(topLine); - - if (tbb->shape != QTabBar::RoundedSouth) - painter->setPen(QPen(innerTopLeft, 0)); - else - painter->setPen(QPen(border, 0)); - painter->drawLine(bottomLine); - - painter->restore(); - } - break ; -#endif // QT_NO_TABBAR -#ifndef QT_NO_GROUPBOX - case PE_FrameGroupBox: - if (const QStyleOptionFrame *frame = qstyleoption_cast<const QStyleOptionFrame *>(option)) { - QStyleOptionFrameV2 frameV2(*frame); - if (frameV2.features & QStyleOptionFrameV2::Flat) { - QPen oldPen = painter->pen(); - painter->setPen(borderColor); - painter->drawLine(frameV2.rect.topLeft(), frameV2.rect.topRight()); - painter->setPen(oldPen); - } else { - frameV2.state &= ~(State_Sunken | State_HasFocus); - proxy()->drawPrimitive(PE_Frame, &frameV2, painter, widget); - } - } - break; -#endif // QT_NO_GROUPBOX - case PE_Frame: { - QFrame::Shadow shadow = QFrame::Plain; - if (option->state & State_Sunken) - shadow = QFrame::Sunken; - else if (option->state & State_Raised) - shadow = QFrame::Raised; - qt_plastique_draw_frame(painter, option->rect, option, shadow); - break; - } -#ifndef QT_NO_LINEEDIT - case PE_FrameLineEdit: - qt_plastique_draw_frame(painter, option->rect, option, QFrame::Sunken); - break; - case PE_PanelLineEdit: - if (const QStyleOptionFrame *lineEdit = qstyleoption_cast<const QStyleOptionFrame *>(option)) { - // Panel of a line edit inside combo box or spin box is drawn in CC_ComboBox and CC_SpinBox - if (widget) { -#ifndef QT_NO_SPINBOX - // Spinbox doesn't need a separate palette for the lineedit - if (qobject_cast<const QAbstractSpinBox *>(widget->parentWidget())) - break; -#endif - } - - painter->save(); - - // Fill the line edit insides - QRect filledRect = lineEdit->rect.adjusted(1, 1, -1, -1); - QBrush baseBrush = qMapBrushToRect(lineEdit->palette.base(), filledRect); - painter->setBrushOrigin(filledRect.topLeft()); - painter->fillRect(filledRect.adjusted(1, 1, -1, -1), baseBrush); - - painter->setPen(QPen(baseBrush, 0)); - const QLine lines[4] = { - QLine(filledRect.left(), filledRect.top() + 1, - filledRect.left(), filledRect.bottom() - 1), - QLine(filledRect.right(), filledRect.top() + 1, - filledRect.right(), filledRect.bottom() - 1), - QLine(filledRect.left() + 1, filledRect.top(), - filledRect.right() - 1, filledRect.top()), - QLine(filledRect.left() + 1, filledRect.bottom(), - filledRect.right() - 1, filledRect.bottom()) }; - painter->drawLines(lines, 4); - - if (lineEdit->lineWidth != 0) - qt_plastique_draw_frame(painter, option->rect, option, QFrame::Sunken); - - painter->restore(); - break; - } -#endif // QT_NO_LINEEDIT - case PE_FrameDockWidget: - case PE_FrameMenu: - case PE_FrameStatusBarItem: { - // Draws the frame around a popup menu. - QPen oldPen = painter->pen(); - painter->setPen(borderColor); - painter->drawRect(option->rect.adjusted(0, 0, -1, -1)); - painter->setPen(alphaCornerColor); - const QPoint points[4] = { - QPoint(option->rect.topLeft()), - QPoint(option->rect.topRight()), - QPoint(option->rect.bottomLeft()), - QPoint(option->rect.bottomRight()) }; - painter->drawPoints(points, 4); - painter->setPen(oldPen); - break; - } -#ifndef QT_NO_MAINWINDOW - case PE_PanelMenuBar: - if ((widget && qobject_cast<const QMainWindow *>(widget->parentWidget())) - ) { - // Draws the light line above and the dark line below menu bars and - // tool bars. - QPen oldPen = painter->pen(); - if (element == PE_PanelMenuBar || (option->state & State_Horizontal)) { - painter->setPen(alphaCornerColor); - painter->drawLine(option->rect.left(), option->rect.bottom(), - option->rect.right(), option->rect.bottom()); - painter->setPen(option->palette.background().color().lighter(104)); - painter->drawLine(option->rect.left(), option->rect.top(), - option->rect.right(), option->rect.top()); - } else { - painter->setPen(option->palette.background().color().lighter(104)); - painter->drawLine(option->rect.left(), option->rect.top(), - option->rect.left(), option->rect.bottom()); - painter->setPen(alphaCornerColor); - painter->drawLine(option->rect.right(), option->rect.top(), - option->rect.right(), option->rect.bottom()); - } - painter->setPen(oldPen); - } - break; -#endif // QT_NO_MAINWINDOW - case PE_IndicatorHeaderArrow: { - bool usedAntialiasing = painter->renderHints() & QPainter::Antialiasing; - if (!usedAntialiasing) - painter->setRenderHint(QPainter::Antialiasing); - QWindowsStyle::drawPrimitive(element, option, painter, widget); - if (!usedAntialiasing) - painter->setRenderHint(QPainter::Antialiasing, false); - break; - } - case PE_PanelButtonTool: - // Draws a tool button (f.ex., in QToolBar and QTabBar) - if ((option->state & State_Enabled || option->state & State_On) || !(option->state & State_AutoRaise)) - qt_plastique_drawShadedPanel(painter, option, true, widget); - break; -#ifndef QT_NO_TOOLBAR - case PE_IndicatorToolBarHandle: { - QPixmap cache; - QRect rect = option->rect; - QString pixmapName = QStyleHelper::uniqueName(QLatin1String("toolbarhandle"), option, rect.size()); - if (!QPixmapCache::find(pixmapName, cache)) { - cache = QPixmap(rect.size()); - cache.fill(Qt::transparent); - QPainter cachePainter(&cache); - QRect cacheRect(QPoint(0, 0), rect.size()); - if (widget) - cachePainter.fillRect(cacheRect, option->palette.brush(widget->backgroundRole())); - else - cachePainter.fillRect(cacheRect, option->palette.background()); - - QImage handle(qt_toolbarhandle); - alphaCornerColor.setAlpha(170); - handle.setColor(1, alphaCornerColor.rgba()); - handle.setColor(2, mergedColors(alphaCornerColor, option->palette.light().color()).rgba()); - handle.setColor(3, option->palette.light().color().rgba()); - - if (option->state & State_Horizontal) { - int nchunks = cacheRect.height() / handle.height(); - int indent = (cacheRect.height() - (nchunks * handle.height())) / 2; - for (int i = 0; i < nchunks; ++i) - cachePainter.drawImage(QPoint(cacheRect.left() + 3, cacheRect.top() + indent + i * handle.height()), - handle); - } else { - int nchunks = cacheRect.width() / handle.width(); - int indent = (cacheRect.width() - (nchunks * handle.width())) / 2; - for (int i = 0; i < nchunks; ++i) - cachePainter.drawImage(QPoint(cacheRect.left() + indent + i * handle.width(), cacheRect.top() + 3), - handle); - } - cachePainter.end(); - QPixmapCache::insert(pixmapName, cache); - } - painter->drawPixmap(rect.topLeft(), cache); - break; - } - case PE_IndicatorToolBarSeparator: { - QPen oldPen = painter->pen(); - painter->setPen(alphaCornerColor); - if (option->state & State_Horizontal) { - painter->drawLine(option->rect.left(), option->rect.top() + 1, option->rect.left(), option->rect.bottom() - 2); - painter->setPen(option->palette.base().color()); - painter->drawLine(option->rect.right(), option->rect.top() + 1, option->rect.right(), option->rect.bottom() - 2); - } else { - painter->drawLine(option->rect.left() + 1, option->rect.top(), option->rect.right() - 2, option->rect.top()); - painter->setPen(option->palette.base().color()); - painter->drawLine(option->rect.left() + 1, option->rect.bottom(), option->rect.right() - 2, option->rect.bottom()); - } - painter->setPen(oldPen); - break; - } -#endif // QT_NO_TOOLBAR - case PE_PanelButtonCommand: - if (const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton *>(option)) { - bool sunken = (button->state & State_Sunken) || (button->state & State_On); - if ((button->features & QStyleOptionButton::Flat) && !sunken) - break; - - bool defaultButton = (button->features & (QStyleOptionButton::DefaultButton - | QStyleOptionButton::AutoDefaultButton)); - - BEGIN_STYLE_PIXMAPCACHE(QString::fromLatin1("pushbutton-%1").arg(defaultButton)) - - QPen oldPen = p->pen(); - bool hover = (button->state & State_Enabled) && (button->state & State_MouseOver); - - // Give the painter a different brush origin for sunken buttons - if (sunken) { - // ### No such function - // p->setPenOrigin(rect.left() + 1, rect.top() + 1); - p->setBrushOrigin(rect.left() + 1, rect.top() + 1); - } - - // Draw border - qt_plastique_draw_frame(p, rect, option); - - // Fill the panel - QRectF fillRect = rect.adjusted(2, 2, -2, -2); - - // Button colors - QBrush alphaCornerBrush = qMapBrushToRect(qBrushDark(option->palette.button(), 165), rect); - qBrushSetAlphaF(&alphaCornerBrush, 0.5); - QBrush buttonGradientBrush; - QBrush leftLineGradientBrush; - QBrush rightLineGradientBrush; - QBrush sunkenButtonGradientBrush; - QBrush sunkenLeftLineGradientBrush; - QBrush sunkenRightLineGradientBrush; - QBrush buttonBrush = qMapBrushToRect(option->palette.button(), rect); - if (buttonBrush.gradient() || !buttonBrush.texture().isNull()) { - buttonGradientBrush = buttonBrush; - sunkenButtonGradientBrush = qBrushDark(buttonBrush, 108); - leftLineGradientBrush = qBrushLight(buttonBrush, 105); - rightLineGradientBrush = qBrushDark(buttonBrush, 105); - sunkenLeftLineGradientBrush = qBrushDark(buttonBrush, 110); - sunkenRightLineGradientBrush = qBrushDark(buttonBrush, 106); - } else { - // Generate gradients - QLinearGradient buttonGradient(rect.topLeft(), rect.bottomLeft()); - if (hover) { - buttonGradient.setColorAt(0.0, mergedColors(option->palette.highlight().color(), - buttonBrush.color().lighter(104), 6)); - buttonGradient.setColorAt(1.0, mergedColors(option->palette.highlight().color(), - buttonBrush.color().darker(110), 6)); - } else { - buttonGradient.setColorAt(0.0, buttonBrush.color().lighter(104)); - buttonGradient.setColorAt(1.0, buttonBrush.color().darker(110)); - } - buttonGradientBrush = QBrush(buttonGradient); - - QLinearGradient buttonGradient2(rect.topLeft(), rect.bottomLeft()); - buttonGradient2.setColorAt(0.0, buttonBrush.color().darker(113)); - buttonGradient2.setColorAt(1.0, buttonBrush.color().darker(103)); - sunkenButtonGradientBrush = QBrush(buttonGradient2); - - QLinearGradient buttonGradient3(rect.topLeft(), rect.bottomLeft()); - buttonGradient3.setColorAt(0.0, buttonBrush.color().lighter(105)); - buttonGradient3.setColorAt(1.0, buttonBrush.color()); - leftLineGradientBrush = QBrush(buttonGradient3); - - QLinearGradient buttonGradient4(rect.topLeft(), rect.bottomLeft()); - buttonGradient4.setColorAt(0.0, buttonBrush.color()); - buttonGradient4.setColorAt(1.0, buttonBrush.color().darker(110)); - rightLineGradientBrush = QBrush(buttonGradient4); - - QLinearGradient buttonGradient5(rect.topLeft(), rect.bottomLeft()); - buttonGradient5.setColorAt(0.0, buttonBrush.color().darker(113)); - buttonGradient5.setColorAt(1.0, buttonBrush.color().darker(107)); - sunkenLeftLineGradientBrush = QBrush(buttonGradient5); - - QLinearGradient buttonGradient6(rect.topLeft(), rect.bottomLeft()); - buttonGradient6.setColorAt(0.0, buttonBrush.color().darker(108)); - buttonGradient6.setColorAt(1.0, buttonBrush.color().darker(103)); - sunkenRightLineGradientBrush = QBrush(buttonGradient6); - } - - // Main fill - p->fillRect(fillRect, - qMapBrushToRect(sunken ? sunkenButtonGradientBrush - : buttonGradientBrush, rect)); - - // Top line - p->setPen(QPen(qBrushLight(qMapBrushToRect(sunken ? sunkenButtonGradientBrush - : buttonGradientBrush, rect), 105), 0)); - p->drawLine(QPointF(rect.left() + 2, rect.top() + 1), - QPointF(rect.right() - 2, rect.top() + 1)); - - // Bottom line - p->setPen(QPen(qBrushDark(qMapBrushToRect(sunken ? sunkenButtonGradientBrush - : buttonGradientBrush, rect), 105), 0)); - p->drawLine(QPointF(rect.left() + 2, rect.bottom() - 1), - QPointF(rect.right() - 2, rect.bottom() - 1)); - - // Left line - p->setPen(QPen(qMapBrushToRect(sunken ? sunkenLeftLineGradientBrush - : leftLineGradientBrush, rect), 1)); - p->drawLine(QPointF(rect.left() + 1, rect.top() + 2), - QPointF(rect.left() + 1, rect.bottom() - 2)); - - // Right line - p->setPen(QPen(qMapBrushToRect(sunken ? sunkenRightLineGradientBrush - : rightLineGradientBrush, rect), 1)); - p->drawLine(QPointF(rect.right() - 1, rect.top() + 2), - QPointF(rect.right() - 1, rect.bottom() - 2)); - - // Hovering - if (hover && !sunken) { - QBrush hover = qMapBrushToRect(option->palette.highlight(), rect); - QBrush hoverOuter = hover; - qBrushSetAlphaF(&hoverOuter, qreal(0.7)); - - QLine lines[2]; - - p->setPen(QPen(hoverOuter, 0)); - lines[0] = QLine(rect.left() + 1, rect.top() + 1, rect.right() - 1, rect.top() + 1); - lines[1] = QLine(rect.left() + 1, rect.bottom() - 1, rect.right() - 1, rect.bottom() - 1); - p->drawLines(lines, 2); - - QBrush hoverInner = hover; - qBrushSetAlphaF(&hoverInner, qreal(0.45)); - p->setPen(QPen(hoverInner, 0)); - lines[0] = QLine(rect.left() + 1, rect.top() + 2, rect.right() - 1, rect.top() + 2); - lines[1] = QLine(rect.left() + 1, rect.bottom() - 2, rect.right() - 1, rect.bottom() - 2); - p->drawLines(lines, 2); - - QBrush hoverSide = hover; - qBrushSetAlphaF(&hoverSide, qreal(0.075)); - p->setPen(QPen(hoverSide, 0)); - lines[0] = QLine(rect.left() + 1, rect.top() + 2, rect.left() + 1, rect.bottom() - 2); - lines[1] = QLine(rect.right() - 1, rect.top() + 2, rect.right() - 1, rect.bottom() - 2); - p->drawLines(lines, 2); - } - - p->setPen(oldPen); - - END_STYLE_PIXMAPCACHE - } - break; - case PE_IndicatorCheckBox: - if (const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton *>(option)) { - BEGIN_STYLE_PIXMAPCACHE(QLatin1String("checkbox")) - - p->save(); - - // Outline - QBrush border = option->palette.shadow(); - qBrushSetAlphaF(&border, qreal(0.4)); - p->setPen(QPen(border, 0)); - const QLine lines[4] = { - QLine(rect.left() + 1, rect.top(), rect.right() - 1, rect.top()), - QLine(rect.left() + 1, rect.bottom(), rect.right() - 1, rect.bottom()), - QLine(rect.left(), rect.top() + 1, rect.left(), rect.bottom() - 1), - QLine(rect.right(), rect.top() + 1, rect.right(), rect.bottom() - 1) }; - p->drawLines(lines, 4); - - QBrush corner = option->palette.shadow(); - qBrushSetAlphaF(&corner, qreal(0.2)); - p->setPen(QPen(corner, 0)); - const QPoint points[4] = { - rect.topLeft(), rect.topRight(), - rect.bottomLeft(), rect.bottomRight() }; - p->drawPoints(points, 4); - - // Fill - QBrush baseBrush = qMapBrushToRect(button->palette.base(), rect); - if (!baseBrush.gradient() && baseBrush.texture().isNull()) { - QLinearGradient gradient(rect.center().x(), rect.top(), rect.center().x(), rect.bottom()); - gradient.setColorAt(0, baseBrush.color()); - gradient.setColorAt(1, baseBrush.color().darker(105)); - baseBrush = gradient; - } - p->fillRect(rect.adjusted(1, 1, -1, -1), baseBrush); - - // Hover - if ((button->state & State_Enabled) && (button->state & State_MouseOver)) { - QBrush pen = qMapBrushToRect(button->palette.highlight(), rect); - qBrushSetAlphaF(&pen, qreal(0.8)); - p->setPen(QPen(pen, 0)); - p->drawRect(rect.adjusted(1, 1, -2, -2)); - qBrushSetAlphaF(&pen, 0.5); - p->setPen(QPen(pen, 0)); - p->drawRect(rect.adjusted(2, 2, -3, -3)); - - qBrushSetAlphaF(&pen, qreal(0.2)); - p->setBrush(pen); - p->drawRect(rect.adjusted(2, 2, -3, -3)); - } - - // Indicator - bool on = button->state & State_On; - bool sunken = button->state & State_Sunken; - bool unchanged = button->state & State_NoChange; - bool enabled = button->state & State_Enabled; - if (on || (enabled && sunken) || unchanged) { - p->setRenderHint(QPainter::Antialiasing); - QBrush pointBrush = qMapBrushToRect(button->palette.text(), rect); - if (sunken) - qBrushSetAlphaF(&pointBrush, qreal(0.5)); - else if (unchanged) - qBrushSetAlphaF(&pointBrush, qreal(0.3)); - p->setPen(QPen(pointBrush, 3)); - const QLine lines[2] = { - QLine(rect.left() + 4, rect.top() + 4, rect.right() - 3, rect.bottom() - 3), - QLine(rect.right() - 3, rect.top() + 4, rect.left() + 4, rect.bottom() - 3) }; - p->drawLines(lines, 2); - } - - p->restore(); - END_STYLE_PIXMAPCACHE - } - break; - case PE_IndicatorRadioButton: - if (const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton *>(option)) { - BEGIN_STYLE_PIXMAPCACHE(QLatin1String("radiobutton")) - - p->save(); - p->setRenderHint(QPainter::Antialiasing); - - // The the filled ellipse - QBrush border = qMapBrushToRect(option->palette.shadow(), rect); - qBrushSetAlphaF(&border, qreal(0.51)); - p->setPen(QPen(border, 0)); - - QBrush baseBrush = qMapBrushToRect(button->palette.base(), rect); - if (!baseBrush.gradient() && baseBrush.texture().isNull()) { - QLinearGradient gradient(rect.center().x(), rect.top(), rect.center().x(), rect.bottom()); - gradient.setColorAt(0, baseBrush.color()); - gradient.setColorAt(1, baseBrush.color().darker(105)); - baseBrush = gradient; - } - p->setBrush(baseBrush); - p->drawEllipse(QRectF(rect).adjusted(1, 1, -1, -1)); - - // Hover - if ((button->state & State_Enabled) && (button->state & State_MouseOver)) { - QBrush pen = qMapBrushToRect(button->palette.highlight(), rect); - qBrushSetAlphaF(&pen, qreal(0.8)); - p->setPen(QPen(pen, 0)); - qBrushSetAlphaF(&pen, qreal(0.2)); - p->setBrush(pen); - p->drawEllipse(QRectF(rect).adjusted(2, 2, -2, -2)); - } - - // Indicator - bool on = button->state & State_On; - bool sunken = button->state & State_Sunken; - bool enabled = button->state & State_Enabled; - if (on || (enabled && sunken)) { - p->setPen(Qt::NoPen); - QBrush pointBrush = qMapBrushToRect(button->palette.text(), rect); - if (sunken) - qBrushSetAlphaF(&pointBrush, 0.5); - p->setBrush(pointBrush); - p->drawEllipse(QRectF(rect).adjusted(3, 3, -3, -3)); - } - - p->restore(); - END_STYLE_PIXMAPCACHE - } - break; -#ifndef QT_NO_DOCKWIDGET - case PE_IndicatorDockWidgetResizeHandle: - if ((option->state & State_Enabled) && (option->state & State_MouseOver)) - painter->fillRect(option->rect, QColor(255, 255, 255, 128)); - if (option->state & State_Horizontal) { - int width = option->rect.width() / 3; - QRect rect(option->rect.center().x() - width / 2, - option->rect.top() + (option->rect.height() / 2) - 1, width, 3); - qt_plastique_draw_handle(painter, option, rect, Qt::Vertical, widget); - } else { - int height = option->rect.height() / 3; - QRect rect(option->rect.left() + (option->rect.width() / 2 - 1), - option->rect.center().y() - height / 2, 3, height); - qt_plastique_draw_handle(painter, option, rect, Qt::Horizontal, widget); - } - break; -#endif // QT_NO_DOCKWIDGET - case PE_IndicatorViewItemCheck: { - QStyleOptionButton button; - button.QStyleOption::operator=(*option); - button.state &= ~State_MouseOver; - proxy()->drawPrimitive(PE_IndicatorCheckBox, &button, painter, widget); - break; - } - case PE_FrameWindow: { - painter->save(); - bool active = (option->state & State_Active); - int titleBarStop = option->rect.top() + proxy()->pixelMetric(PM_TitleBarHeight, option, widget); - - QPalette palette = option->palette; - if (!active) - palette.setCurrentColorGroup(QPalette::Disabled); - - // Frame and rounded corners - painter->setPen(mergedColors(palette.highlight().color(), Qt::black, 50)); - - QLine lines[3]; - QPoint points[4]; - - // bottom border line - lines[0] = QLine(option->rect.left() + 1, option->rect.bottom(), option->rect.right() - 1, option->rect.bottom()); - - // bottom left and right side border lines - lines[1] = QLine(option->rect.left(), titleBarStop, option->rect.left(), option->rect.bottom() - 1); - lines[2] = QLine(option->rect.right(), titleBarStop, option->rect.right(), option->rect.bottom() - 1); - painter->drawLines(lines, 3); - points[0] = QPoint(option->rect.left() + 1, option->rect.bottom() - 1); - points[1] = QPoint(option->rect.right() - 1, option->rect.bottom() - 1); - painter->drawPoints(points, 2); - - - // alpha corners - painter->setPen(mergedColors(palette.highlight().color(), palette.background().color(), 55)); - points[0] = QPoint(option->rect.left() + 2, option->rect.bottom() - 1); - points[1] = QPoint(option->rect.left() + 1, option->rect.bottom() - 2); - points[2] = QPoint(option->rect.right() - 2, option->rect.bottom() - 1); - points[3] = QPoint(option->rect.right() - 1, option->rect.bottom() - 2); - painter->drawPoints(points, 4); - - - // upper and lower left inner - painter->setPen(active ? mergedColors(palette.highlight().color(), palette.background().color()) : palette.background().color().darker(120)); - painter->drawLine(option->rect.left() + 1, titleBarStop, option->rect.left() + 1, option->rect.bottom() - 2); - - - painter->setPen(active ? mergedColors(palette.highlight().color(), palette.background().color(), 57) : palette.background().color().darker(130)); - lines[0] = QLine(option->rect.right() - 1, titleBarStop, option->rect.right() - 1, option->rect.bottom() - 2); - lines[1] = QLine(option->rect.left() + 1, option->rect.bottom() - 1, option->rect.right() - 1, option->rect.bottom() - 1); - painter->drawLines(lines, 2); - - painter->restore(); - } - break; - case PE_IndicatorBranch: { - int mid_h = option->rect.x() + option->rect.width() / 2; - int mid_v = option->rect.y() + option->rect.height() / 2; - int bef_h = mid_h; - int bef_v = mid_v; - int aft_h = mid_h; - int aft_v = mid_v; - QBrush brush(option->palette.dark().color(), Qt::Dense4Pattern); - if (option->state & State_Item) { - if (option->direction == Qt::RightToLeft) - painter->fillRect(option->rect.left(), mid_v, bef_h - option->rect.left(), 1, brush); - else - painter->fillRect(aft_h, mid_v, option->rect.right() - aft_h + 1, 1, brush); - } - if (option->state & State_Sibling) - painter->fillRect(mid_h, aft_v, 1, option->rect.bottom() - aft_v + 1, brush); - if (option->state & (State_Open | State_Children | State_Item | State_Sibling)) - painter->fillRect(mid_h, option->rect.y(), 1, bef_v - option->rect.y(), brush); - - if (option->state & State_Children) { - painter->save(); - QPoint center = option->rect.center(); - // border - QRect fullRect(center.x() - 4, center.y() - 4, 9, 9); - painter->setPen(borderColor); - - const QLine lines[4] = { - QLine(fullRect.left() + 1, fullRect.top(), - fullRect.right() - 1, fullRect.top()), - QLine(fullRect.left() + 1, fullRect.bottom(), - fullRect.right() - 1, fullRect.bottom()), - QLine(fullRect.left(), fullRect.top() + 1, - fullRect.left(), fullRect.bottom() - 1), - QLine(fullRect.right(), fullRect.top() + 1, - fullRect.right(), fullRect.bottom() - 1) }; - painter->drawLines(lines, 4); - - // "antialiased" corners - painter->setPen(alphaCornerColor); - const QPoint points[4] = { - fullRect.topLeft(), - fullRect.topRight(), - fullRect.bottomLeft(), - fullRect.bottomRight() }; - painter->drawPoints(points, 4); - - // fill - QRect adjustedRect = fullRect; - QRect gradientRect(adjustedRect.left() + 1, adjustedRect.top() + 1, - adjustedRect.right() - adjustedRect.left() - 1, - adjustedRect.bottom() - adjustedRect.top() - 1); - if (option->palette.base().style() == Qt::SolidPattern) { - QColor baseGradientStartColor = option->palette.base().color().darker(101); - QColor baseGradientStopColor = option->palette.base().color().darker(106); - qt_plastique_draw_gradient(painter, gradientRect, baseGradientStartColor, baseGradientStopColor); - } else { - painter->fillRect(gradientRect, option->palette.base()); - } - // draw "+" or "-" - painter->setPen(alphaTextColor); - painter->drawLine(center.x() - 2, center.y(), center.x() + 2, center.y()); - if (!(option->state & State_Open)) - painter->drawLine(center.x(), center.y() - 2, center.x(), center.y() + 2); - painter->restore(); - } - } - break; - default: - QWindowsStyle::drawPrimitive(element, option, painter, widget); - break; - } -} - -/*! - \reimp -*/ -void QPlastiqueStyle::drawControl(ControlElement element, const QStyleOption *option, - QPainter *painter, const QWidget *widget) const -{ - QColor borderColor = option->palette.background().color().darker(178); - QColor alphaCornerColor; - if (widget) { - // ### backgroundrole/foregroundrole should be part of the style option - alphaCornerColor = mergedColors(option->palette.color(widget->backgroundRole()), borderColor); - } else { - alphaCornerColor = mergedColors(option->palette.background().color(), borderColor); - } - - QColor gradientStartColor = option->palette.button().color().lighter(104); - QColor gradientStopColor = option->palette.button().color().darker(105); - - QColor highlightedGradientStartColor = option->palette.button().color().lighter(101); - QColor highlightedGradientStopColor = mergedColors(option->palette.button().color(), option->palette.highlight().color(), 85); - - QColor lightShadowGradientStartColor = highlightedGradientStartColor.lighter(105); - QColor lightShadowGradientStopColor = highlightedGradientStopColor.lighter(105); - - QColor highlightedDarkInnerBorderColor = mergedColors(option->palette.button().color(), option->palette.highlight().color(), 35); - QColor highlightedLightInnerBorderColor = mergedColors(option->palette.button().color(), option->palette.highlight().color(), 58); - - QColor alphaInnerColor = mergedColors(highlightedDarkInnerBorderColor, option->palette.base().color()); - - switch (element) { -#ifndef QT_NO_TABBAR - case CE_TabBarTabShape: - if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(option)) { - - if (tab->shape != QTabBar::RoundedNorth && tab->shape != QTabBar::RoundedWest && - tab->shape != QTabBar::RoundedSouth && tab->shape != QTabBar::RoundedEast) { - QWindowsStyle::drawControl(element, option, painter, widget); - break; - } - - painter->save(); - - // Set up some convenience variables - bool disabled = !(tab->state & State_Enabled); - bool onlyTab = tab->position == QStyleOptionTab::OnlyOneTab; - bool selected = tab->state & State_Selected; - bool mouseOver = (tab->state & State_MouseOver) && !selected && !disabled; - bool previousSelected = tab->selectedPosition == QStyleOptionTab::PreviousIsSelected; - bool nextSelected = tab->selectedPosition == QStyleOptionTab::NextIsSelected; - bool leftCornerWidget = (tab->cornerWidgets & QStyleOptionTab::LeftCornerWidget); - bool reverse = (tab->direction == Qt::RightToLeft); - - int lowerTop = selected ? 0 : 3; // to make the selected tab bigger than the rest - bool atEnd = (tab->position == QStyleOptionTab::End) || onlyTab; - bool atBeginning = ((tab->position == QStyleOptionTab::Beginning) || onlyTab) - && !leftCornerWidget; - bool reverseShadow = false; - - int borderThickness = proxy()->pixelMetric(PM_TabBarBaseOverlap, tab, widget); - int marginLeft = 0; - if ((atBeginning && !selected) || (selected && leftCornerWidget && ((tab->position == QStyleOptionTab::Beginning) || onlyTab))) { - marginLeft = 1; - } - - // I've set the names based on the natural coordinate system. Vectors are used to rotate everything - // if the orientation of the tab bare is different than north. - { - // Coordinates of corners of rectangle for transformation - QPoint topLeft; - QPoint topRight; - QPoint bottomLeft; - QPoint bottomRight; - - // Fill with normalized vectors in the direction of the coordinate system - // (down and right should be complement of up and left, or it will look odd) - QPoint vectorUp; - QPoint vectorDown; - QPoint vectorLeft; - QPoint vectorRight; - - QBrush border = option->palette.shadow(); - qBrushSetAlphaF(&border, qreal(0.4)); - QBrush innerTopLeft = option->palette.shadow(); - qBrushSetAlphaF(&innerTopLeft, qreal(0.075)); - QBrush innerBottomRight = option->palette.shadow(); - qBrushSetAlphaF(&innerBottomRight, qreal(0.23)); - QBrush corner = option->palette.shadow(); - qBrushSetAlphaF(&corner, qreal(0.25)); - - QBrush baseColor1; - QBrush baseColor2; - - switch (tab->shape) { - case QTabBar::RoundedNorth: - vectorUp = QPoint(0, -1); - vectorDown = QPoint(0, 1); - - if (reverse) { - vectorLeft = QPoint(1, 0); - vectorRight = QPoint(-1, 0); - reverseShadow = true; - } else { - vectorLeft = QPoint(-1, 0); - vectorRight = QPoint(1, 0); - } - - if (reverse) { - topLeft = tab->rect.topRight(); - topRight = tab->rect.topLeft(); - bottomLeft = tab->rect.bottomRight(); - bottomRight = tab->rect.bottomLeft(); - } else { - topLeft = tab->rect.topLeft(); - topRight = tab->rect.topRight(); - bottomLeft = tab->rect.bottomLeft(); - bottomRight = tab->rect.bottomRight(); - } - - - baseColor1 = border; - baseColor2 = innerTopLeft; - break ; - case QTabBar::RoundedWest: - vectorUp = QPoint(-1, 0); - vectorDown = QPoint(1, 0); - vectorLeft = QPoint(0, -1); - vectorRight = QPoint(0, 1); - - topLeft = tab->rect.topLeft(); - topRight = tab->rect.bottomLeft(); - bottomLeft = tab->rect.topRight(); - bottomRight = tab->rect.bottomRight(); - - baseColor1 = border; - baseColor2 = innerTopLeft; - break ; - case QTabBar::RoundedEast: - vectorUp = QPoint(1, 0); - vectorDown = QPoint(-1, 0); - vectorLeft = QPoint(0, -1); - vectorRight = QPoint(0, 1); - - topLeft = tab->rect.topRight(); - topRight = tab->rect.bottomRight(); - bottomLeft = tab->rect.topLeft(); - bottomRight = tab->rect.bottomLeft(); - - baseColor1 = border; - baseColor2 = innerBottomRight; - break ; - case QTabBar::RoundedSouth: - vectorUp = QPoint(0, 1); - vectorDown = QPoint(0, -1); - - if (reverse) { - vectorLeft = QPoint(1, 0); - vectorRight = QPoint(-1, 0); - reverseShadow = true; - - topLeft = tab->rect.bottomRight(); - topRight = tab->rect.bottomLeft(); - bottomLeft = tab->rect.topRight(); - bottomRight = tab->rect.topLeft(); - } else { - vectorLeft = QPoint(-1, 0); - vectorRight = QPoint(1, 0); - - topLeft = tab->rect.bottomLeft(); - topRight = tab->rect.bottomRight(); - bottomLeft = tab->rect.topLeft(); - bottomRight = tab->rect.topRight(); - } - - baseColor1 = border; - baseColor2 = innerBottomRight; - break ; - default: - break; - } - - // Make the tab smaller when it's at the end, so that we are able to draw the corner - if (atEnd) { - topRight += vectorLeft; - bottomRight += vectorLeft; - } - - { - // Outer border - QLine topLine; - { - QPoint adjustTopLineLeft = (vectorRight * (marginLeft + (previousSelected ? 0 : 1))) + - (vectorDown * lowerTop); - QPoint adjustTopLineRight = (vectorDown * lowerTop); - if (atBeginning || selected) - adjustTopLineLeft += vectorRight; - if (atEnd || selected) - adjustTopLineRight += 2 * vectorLeft; - - topLine = QLine(topLeft + adjustTopLineLeft, topRight + adjustTopLineRight); - } - - QLine leftLine; - { - QPoint adjustLeftLineTop = (vectorRight * marginLeft) + (vectorDown * (lowerTop + 1)); - QPoint adjustLeftLineBottom = (vectorRight * marginLeft) + (vectorUp * borderThickness); - if (atBeginning || selected) - adjustLeftLineTop += vectorDown; // Make place for rounded corner - if (atBeginning && selected) - adjustLeftLineBottom += borderThickness * vectorDown; - else if (selected) - adjustLeftLineBottom += vectorUp; - - leftLine = QLine(topLeft + adjustLeftLineTop, bottomLeft + adjustLeftLineBottom); - } - - QLine rightLine; - { - QPoint adjustRightLineTop = vectorDown * (2 + lowerTop); - QPoint adjustRightLineBottom = vectorUp * borderThickness; - if (selected) - adjustRightLineBottom += vectorUp; - - rightLine = QLine(topRight + adjustRightLineTop, bottomRight + adjustRightLineBottom); - } - - // Background - QPoint startPoint = topLine.p1() + vectorDown + vectorLeft; - if (mouseOver) - startPoint += vectorDown; - QPoint endPoint = rightLine.p2(); - - if (tab->state & State_Enabled) { - QRect fillRect = QRect(startPoint, endPoint).normalized(); - if (fillRect.isValid()) { - if (selected) { - fillRect = QRect(startPoint, endPoint + vectorLeft + vectorDown * 3).normalized(); - painter->fillRect(fillRect, option->palette.window()); - - // Connect to the base - painter->setPen(QPen(option->palette.window(), 0)); - QVarLengthArray<QPoint, 6> points; - points.append(rightLine.p2() + vectorDown); - points.append(rightLine.p2() + vectorDown + vectorDown); - points.append(rightLine.p2() + vectorDown + vectorDown + vectorRight); - if (tab->position != QStyleOptionTab::Beginning) { - points.append(leftLine.p2() + vectorDown); - points.append(leftLine.p2() + vectorDown + vectorDown); - points.append(leftLine.p2() + vectorDown + vectorDown + vectorLeft); - } - painter->drawPoints(points.constData(), points.size()); - } else { - QBrush buttonGradientBrush; - QBrush buttonBrush = qMapBrushToRect(option->palette.button(), fillRect); - if (buttonBrush.gradient() || !buttonBrush.texture().isNull()) { - buttonGradientBrush = buttonBrush; - } else { - // Generate gradients - QLinearGradient buttonGradient(fillRect.topLeft(), fillRect.bottomLeft()); - buttonGradient.setColorAt(0.0, buttonBrush.color().lighter(104)); - buttonGradient.setColorAt(1.0, buttonBrush.color().darker(110)); - buttonGradientBrush = QBrush(buttonGradient); - } - - painter->fillRect(fillRect, buttonGradientBrush); - } - } - } - - QPoint rightCornerDot = topRight + vectorLeft + (lowerTop + 1)*vectorDown; - QPoint leftCornerDot = topLeft + (marginLeft + 1)*vectorRight + (lowerTop + 1)*vectorDown; - QPoint bottomRightConnectToBase = rightLine.p2() + vectorRight + vectorDown; - QPoint bottomLeftConnectToBase = leftLine.p2() + vectorLeft + vectorDown; - - painter->setPen(QPen(border, 0)); - - QVarLengthArray<QLine, 3> lines; - QVarLengthArray<QPoint, 7> points; - - lines.append(topLine); - - if (mouseOver) { - painter->drawLines(lines.constData(), lines.count()); - lines.clear(); - - QLine secondHoverLine = QLine(topLine.p1() + vectorDown * 2 + vectorLeft, topLine.p2() + vectorDown * 2 + vectorRight); - painter->setPen(highlightedLightInnerBorderColor); - painter->drawLine(secondHoverLine); - } - - if (mouseOver) - painter->setPen(QPen(border, 0)); - - if (!previousSelected) - lines.append(leftLine); - if (atEnd || selected) { - lines.append(rightLine); - points.append(rightCornerDot); - } - if (atBeginning || selected) - points.append(leftCornerDot); - if (selected) { - points.append(bottomRightConnectToBase); - points.append(bottomLeftConnectToBase); - } - if (lines.size() > 0) { - painter->drawLines(lines.constData(), lines.size()); - lines.clear(); - } - if (points.size() > 0) { - painter->drawPoints(points.constData(), points.size()); - points.clear(); - } - - // Antialiasing - painter->setPen(QPen(corner, 0)); - if (atBeginning || selected) - points.append(topLine.p1() + vectorLeft); - if (!previousSelected) - points.append(leftLine.p1() + vectorUp); - if (atEnd || selected) { - points.append(topLine.p2() + vectorRight); - points.append(rightLine.p1() + vectorUp); - } - - if (selected) { - points.append(bottomRightConnectToBase + vectorLeft); - if (!atBeginning) { - points.append(bottomLeftConnectToBase + vectorRight); - - if (((tab->position == QStyleOptionTab::Beginning) || onlyTab) && leftCornerWidget) { - // A special case: When the first tab is selected and - // has a left corner widget, it needs to do more work - // to connect to the base - QPoint p1 = bottomLeftConnectToBase + vectorDown; - - points.append(p1); - } - } - } - if (points.size() > 0) { - painter->drawPoints(points.constData(), points.size()); - points.clear(); - } - - // Inner border - QLine innerTopLine = QLine(topLine.p1() + vectorDown, topLine.p2() + vectorDown); - if (!selected) { - QLinearGradient topLineGradient(innerTopLine.p1(),innerTopLine.p2()); - topLineGradient.setColorAt(0, lightShadowGradientStartColor); - topLineGradient.setColorAt(1, lightShadowGradientStopColor); - painter->setPen(QPen(mouseOver ? QBrush(highlightedDarkInnerBorderColor) : QBrush(topLineGradient), 1)); - } else { - painter->setPen(QPen(innerTopLeft, 0)); - } - painter->drawLine(innerTopLine); - - QLine innerLeftLine = QLine(leftLine.p1() + vectorRight + vectorDown, leftLine.p2() + vectorRight); - QLine innerRightLine = QLine(rightLine.p1() + vectorLeft + vectorDown, rightLine.p2() + vectorLeft); - - if (selected) { - innerRightLine = QLine(innerRightLine.p1() + vectorUp, innerRightLine.p2()); - innerLeftLine = QLine(innerLeftLine.p1() + vectorUp, innerLeftLine.p2()); - } - - if (selected || atBeginning) { - QBrush leftLineGradientBrush; - QRect rect = QRect(innerLeftLine.p1(), innerLeftLine.p2()).normalized(); - QBrush buttonBrush = qMapBrushToRect(option->palette.button(), rect); - if (buttonBrush.gradient() || !buttonBrush.texture().isNull()) { - leftLineGradientBrush = qBrushLight(buttonBrush, 105); - } else { - QLinearGradient buttonGradient3(rect.topLeft(), rect.bottomLeft()); - buttonGradient3.setColorAt(0.0, buttonBrush.color().lighter(105)); - buttonGradient3.setColorAt(1.0, buttonBrush.color()); - leftLineGradientBrush = QBrush(buttonGradient3); - } - - if (!selected) - painter->setPen(QPen(leftLineGradientBrush, 0)); - - // Assume the sun is on the same side in Right-To-Left layouts and draw the - // light shadow on the left side always (the right line is on the left side in - // reverse layouts for north and south) - if (reverseShadow) - painter->drawLine(innerRightLine); - else - painter->drawLine(innerLeftLine); - } - - if (atEnd || selected) { - if (!selected) { - QBrush rightLineGradientBrush; - QRect rect = QRect(innerRightLine.p1(), innerRightLine.p2()).normalized(); - QBrush buttonBrush = qMapBrushToRect(option->palette.button(), rect); - if (buttonBrush.gradient() || !buttonBrush.texture().isNull()) { - rightLineGradientBrush = qBrushDark(buttonBrush, 105); - } else { - QLinearGradient buttonGradient4(rect.topLeft(), rect.bottomLeft()); - buttonGradient4.setColorAt(0.0, buttonBrush.color()); - buttonGradient4.setColorAt(1.0, buttonBrush.color().darker(110)); - rightLineGradientBrush = QBrush(buttonGradient4); - } - - painter->setPen(QPen(rightLineGradientBrush, 0)); - } else { - painter->setPen(QPen(innerBottomRight, 0)); - } - - if (reverseShadow) - painter->drawLine(innerLeftLine); - else - painter->drawLine(innerRightLine); - } - - - // Base - QLine baseLine = QLine(bottomLeft + marginLeft * 2 * vectorRight, bottomRight); - { - - QPoint adjustedLeft; - QPoint adjustedRight; - - if (atEnd && !selected) { - baseLine = QLine(baseLine.p1(), baseLine.p2() + vectorRight); - } - - if (nextSelected) { - adjustedRight += vectorLeft; - baseLine = QLine(baseLine.p1(), baseLine.p2() + vectorLeft); - } - if (previousSelected) { - adjustedLeft += vectorRight; - baseLine = QLine(baseLine.p1() + vectorRight, baseLine.p2()); - } - if (atBeginning) - adjustedLeft += vectorRight; - - painter->setPen(QPen(baseColor2, 0)); - if (!selected) - painter->drawLine(baseLine); - - if (atEnd && !selected) - painter->drawPoint(baseLine.p2() + vectorRight); - - if (atBeginning && !selected) - adjustedLeft = vectorRight; - else - adjustedLeft = QPoint(0, 0); - painter->setPen(QPen(baseColor1, 0)); - if (!selected) - painter->drawLine(bottomLeft + vectorUp + adjustedLeft, baseLine.p2() + vectorUp); - - QPoint endPoint = bottomRight + vectorUp; - if (atEnd && !selected) - painter->drawPoint(endPoint); - - // For drawing a lower left "fake" corner on the base when the first tab is unselected - if (atBeginning && !selected) { - painter->drawPoint(baseLine.p1() + vectorLeft); - } - - painter->setPen(QPen(corner, 0)); - if (nextSelected) - painter->drawPoint(endPoint); - else if (selected) - painter->drawPoint(endPoint + vectorRight); - - // For drawing a lower left "fake" corner on the base when the first tab is unselected - if (atBeginning && !selected) { - painter->drawPoint(baseLine.p1() + 2 * vectorLeft); - } - } - } - } - - // Yay we're done - - painter->restore(); - } - break; -#endif // QT_NO_TABBAR - - case CE_ProgressBarGroove: - if (const QStyleOptionProgressBar *bar = qstyleoption_cast<const QStyleOptionProgressBar *>(option)) { - QRect rect = bar->rect; - QPen oldPen = painter->pen(); - - QLine lines[4]; - - // outline - painter->setPen(borderColor); - lines[0] = QLine(rect.left() + 2, rect.top(), rect.right() - 2, rect.top()); - lines[1] = QLine(rect.left() + 2, rect.bottom(), rect.right() - 2, rect.bottom()); - lines[2] = QLine(rect.left(), rect.top() + 2, rect.left(), rect.bottom() - 2); - lines[3] = QLine(rect.right(), rect.top() + 2, rect.right(), rect.bottom() - 2); - painter->drawLines(lines, 4); - - QPoint points[8]; - points[0] = QPoint(rect.left() + 1, rect.top() + 1); - points[1] = QPoint(rect.right() - 1, rect.top() + 1); - points[2] = QPoint(rect.left() + 1, rect.bottom() - 1); - points[3] = QPoint(rect.right() - 1, rect.bottom() - 1); - painter->drawPoints(points, 4); - - // alpha corners - painter->setPen(alphaCornerColor); - points[0] = QPoint(rect.left(), rect.top() + 1); - points[1] = QPoint(rect.left() + 1, rect.top()); - points[2] = QPoint(rect.right(), rect.top() + 1); - points[3] = QPoint(rect.right() - 1, rect.top()); - points[4] = QPoint(rect.left(), rect.bottom() - 1); - points[5] = QPoint(rect.left() + 1, rect.bottom()); - points[6] = QPoint(rect.right(), rect.bottom() - 1); - points[7] = QPoint(rect.right() - 1, rect.bottom()); - painter->drawPoints(points, 8); - - // inner outline, north-west - painter->setPen(gradientStartColor.darker(105)); - lines[0] = QLine(rect.left() + 2, rect.top() + 1, rect.right() - 2, rect.top() + 1); - lines[1] = QLine(rect.left() + 1, rect.top() + 2, rect.left() + 1, rect.bottom() - 2); - painter->drawLines(lines, 2); - - // base of the groove - painter->setPen(QPen()); - painter->fillRect(rect.adjusted(2, 2, -2, -1), QBrush(bar->palette.base().color())); - painter->setPen(bar->palette.base().color()); - painter->drawLine(rect.right() - 1, rect.top() + 2, rect.right() - 1, rect.bottom() - 2); - - painter->setPen(oldPen); - } - break; - case CE_ProgressBarLabel: - if (const QStyleOptionProgressBar *bar = qstyleoption_cast<const QStyleOptionProgressBar *>(option)) { - // The busy indicator doesn't draw a label - if (bar->minimum == 0 && bar->maximum == 0) - return; - - painter->save(); - - QRect rect = bar->rect; - QRect leftRect; - - QFont font; - font.setBold(true); - painter->setFont(font); - painter->setPen(bar->palette.text().color()); - - bool vertical = false; - bool inverted = false; - bool bottomToTop = false; - // Get extra style options if version 2 - if (const QStyleOptionProgressBarV2 *bar2 = qstyleoption_cast<const QStyleOptionProgressBarV2 *>(option)) { - vertical = (bar2->orientation == Qt::Vertical); - inverted = bar2->invertedAppearance; - bottomToTop = bar2->bottomToTop; - } - - if (vertical) { - rect = QRect(rect.left(), rect.top(), rect.height(), rect.width()); // flip width and height - QTransform m; - if (bottomToTop) { - m.translate(0.0, rect.width()); - m.rotate(-90); - } else { - m.translate(rect.height(), 0.0); - m.rotate(90); - } - painter->setTransform(m, true); - } - - int progressIndicatorPos = (bar->progress - qreal(bar->minimum)) / qMax(qreal(1.0), qreal(bar->maximum) - bar->minimum) * rect.width(); - - bool flip = (!vertical && (((bar->direction == Qt::RightToLeft) && !inverted) - || ((bar->direction == Qt::LeftToRight) && inverted))) || (vertical && ((!inverted && !bottomToTop) || (inverted && bottomToTop))); - if (flip) { - int indicatorPos = rect.width() - progressIndicatorPos; - if (indicatorPos >= 0 && indicatorPos <= rect.width()) { - painter->setPen(bar->palette.base().color()); - leftRect = QRect(rect.left(), rect.top(), indicatorPos, rect.height()); - } else if (indicatorPos > rect.width()) { - painter->setPen(bar->palette.text().color()); - } else { - painter->setPen(bar->palette.base().color()); - } - } else { - if (progressIndicatorPos >= 0 && progressIndicatorPos <= rect.width()) { - leftRect = QRect(rect.left(), rect.top(), progressIndicatorPos, rect.height()); - } else if (progressIndicatorPos > rect.width()) { - painter->setPen(bar->palette.base().color()); - } else { - painter->setPen(bar->palette.text().color()); - } - } - - QRegion rightRect = rect; - rightRect = rightRect.subtracted(leftRect); - painter->setClipRegion(rightRect); - painter->drawText(rect, bar->text, QTextOption(Qt::AlignAbsolute | Qt::AlignHCenter | Qt::AlignVCenter)); - if (!leftRect.isNull()) { - painter->setPen(flip ? bar->palette.text().color() : bar->palette.base().color()); - painter->setClipRect(leftRect); - painter->drawText(rect, bar->text, QTextOption(Qt::AlignAbsolute | Qt::AlignHCenter | Qt::AlignVCenter)); - } - - painter->restore(); - } - break; - case CE_ProgressBarContents: - if (const QStyleOptionProgressBar *bar = qstyleoption_cast<const QStyleOptionProgressBar *>(option)) { - Q_D(const QPlastiqueStyle); - QRect rect = bar->rect; - bool vertical = false; - bool inverted = false; - bool indeterminate = (bar->minimum == 0 && bar->maximum == 0); - if (!indeterminate && bar->progress == -1) - break; - - painter->save(); - - // Get extra style options if version 2 - if (const QStyleOptionProgressBarV2 *bar2 = qstyleoption_cast<const QStyleOptionProgressBarV2 *>(option)) { - vertical = (bar2->orientation == Qt::Vertical); - inverted = bar2->invertedAppearance; - } - - // If the orientation is vertical, we use a transform to rotate - // the progress bar 90 degrees clockwise. This way we can use the - // same rendering code for both orientations. - if (vertical) { - rect = QRect(rect.left(), rect.top(), rect.height(), rect.width()); // flip width and height - QTransform m = QTransform::fromTranslate(rect.height()-1, 0); - m.rotate(90.0); - painter->setTransform(m, true); - } - - int maxWidth = rect.width() - 4; - int minWidth = 4; - qint64 progress = qMax<qint64>(bar->progress, bar->minimum); // workaround for bug in QProgressBar - double vc6_workaround = ((progress - qint64(bar->minimum)) / qMax(double(1.0), double(qint64(bar->maximum) - qint64(bar->minimum))) * maxWidth); - int width = indeterminate ? maxWidth : qMax(int(vc6_workaround), minWidth); - bool reverse = (!vertical && (bar->direction == Qt::RightToLeft)) || vertical; - if (inverted) - reverse = !reverse; - - QRect progressBar; - if (!indeterminate) { - if (!reverse) { - progressBar.setRect(rect.left() + 2, rect.top() + 2, width, rect.height() - 4); - } else { - progressBar.setRect(rect.right() - 1 - width, rect.top() + 2, width, rect.height() - 4); - } - d->stopAnimation(option->styleObject); - } else { - int slideWidth = ((rect.width() - 4) * 2) / 3; - int step = 0; - if (QProgressStyleAnimation *animation = qobject_cast<QProgressStyleAnimation*>(d->animation(option->styleObject))) - step = animation->progressStep(slideWidth); - else - d->startAnimation(new QProgressStyleAnimation(d->animationFps, option->styleObject)); - progressBar.setRect(rect.left() + 2 + step, rect.top() + 2, - slideWidth / 2, rect.height() - 4); - } - - // outline - painter->setPen(highlightedDarkInnerBorderColor); - - QVarLengthArray<QLine, 4> lines; - QVarLengthArray<QPoint, 8> points; - if (!reverse) { - if (width == minWidth) { - points.append(QPoint(progressBar.left() + 1, progressBar.top())); - points.append(QPoint(progressBar.left() + 1, progressBar.bottom())); - } else { - if (indeterminate) { - lines.append(QLine(progressBar.left() + 2, progressBar.top(), - progressBar.right() - 2, progressBar.top())); - lines.append(QLine(progressBar.left() + 2, progressBar.bottom(), - progressBar.right() - 2, progressBar.bottom())); - } else { - lines.append(QLine(progressBar.left() + 1, progressBar.top(), - progressBar.right() - 2, progressBar.top())); - lines.append(QLine(progressBar.left() + 1, progressBar.bottom(), - progressBar.right() - 2, progressBar.bottom())); - } - } - - if (indeterminate) { - lines.append(QLine(progressBar.left(), progressBar.top() + 2, - progressBar.left(), progressBar.bottom() - 2)); - } else { - lines.append(QLine(progressBar.left(), progressBar.top() + 1, - progressBar.left(), progressBar.bottom() - 1)); - } - lines.append(QLine(progressBar.right(), progressBar.top() + 2, - progressBar.right(), progressBar.bottom() - 2)); - } else { - if (width == minWidth) { - points.append(QPoint(progressBar.right() - 1, progressBar.top())); - points.append(QPoint(progressBar.right() - 1, progressBar.bottom())); - } else { - if (indeterminate) { - lines.append(QLine(progressBar.right() - 2, progressBar.top(), - progressBar.left() + 2, progressBar.top())); - lines.append(QLine(progressBar.right() - 2, progressBar.bottom(), - progressBar.left() + 2, progressBar.bottom())); - } else { - lines.append(QLine(progressBar.right() - 1, progressBar.top(), - progressBar.left() + 2, progressBar.top())); - lines.append(QLine(progressBar.right() - 1, progressBar.bottom(), - progressBar.left() + 2, progressBar.bottom())); - } - } - if (indeterminate) { - lines.append(QLine(progressBar.right(), progressBar.top() + 2, - progressBar.right(), progressBar.bottom() - 2)); - } else { - lines.append(QLine(progressBar.right(), progressBar.top() + 1, - progressBar.right(), progressBar.bottom() - 1)); - } - lines.append(QLine(progressBar.left(), progressBar.top() + 2, - progressBar.left(), progressBar.bottom() - 2)); - } - - if (points.size() > 0) { - painter->drawPoints(points.constData(), points.size()); - points.clear(); - } - painter->drawLines(lines.constData(), lines.size()); - lines.clear(); - - // alpha corners - painter->setPen(alphaInnerColor); - if (!reverse) { - if (indeterminate) { - points.append(QPoint(progressBar.left() + 1, progressBar.top())); - points.append(QPoint(progressBar.left(), progressBar.top() + 1)); - points.append(QPoint(progressBar.left() + 1, progressBar.bottom())); - points.append(QPoint(progressBar.left(), progressBar.bottom() - 1)); - } else { - points.append(QPoint(progressBar.left(), progressBar.top())); - points.append(QPoint(progressBar.left(), progressBar.bottom())); - } - points.append(QPoint(progressBar.right() - 1, progressBar.top())); - points.append(QPoint(progressBar.right(), progressBar.top() + 1)); - points.append(QPoint(progressBar.right() - 1, progressBar.bottom())); - points.append(QPoint(progressBar.right(), progressBar.bottom() - 1)); - } else { - if (indeterminate) { - points.append(QPoint(progressBar.right() - 1, progressBar.top())); - points.append(QPoint(progressBar.right(), progressBar.top() + 1)); - points.append(QPoint(progressBar.right() - 1, progressBar.bottom())); - points.append(QPoint(progressBar.right(), progressBar.bottom() - 1)); - } else { - points.append(QPoint(progressBar.right(), progressBar.top())); - points.append(QPoint(progressBar.right(), progressBar.bottom())); - } - points.append(QPoint(progressBar.left() + 1, progressBar.top())); - points.append(QPoint(progressBar.left(), progressBar.top() + 1)); - points.append(QPoint(progressBar.left() + 1, progressBar.bottom())); - points.append(QPoint(progressBar.left(), progressBar.bottom() - 1)); - } - - painter->drawPoints(points.constData(), points.size()); - points.clear(); - - // contents - painter->setPen(QPen()); - - QString progressBarName = QStyleHelper::uniqueName(QLatin1String("progressBarContents"), - option, rect.size()); - QPixmap cache; - if (!QPixmapCache::find(progressBarName, cache) && rect.height() > 7) { - QSize size = rect.size(); - cache = QPixmap(QSize(size.width() - 6 + 30, size.height() - 6)); - cache.fill(Qt::white); - QPainter cachePainter(&cache); - QRect pixmapRect(0, 0, cache.width(), cache.height()); - - int leftEdge = 0; - bool flip = false; - while (leftEdge < cache.width() + 1) { - QColor rectColor = option->palette.highlight().color(); - QColor lineColor = option->palette.highlight().color(); - if (flip) { - flip = false; - rectColor = rectColor.lighter(105); - lineColor = lineColor.lighter(105); - } else { - flip = true; - } - - cachePainter.setPen(lineColor); - const QLine cacheLines[2] = { - QLine(pixmapRect.left() + leftEdge - 1, pixmapRect.top(), - pixmapRect.left() + leftEdge + 9, pixmapRect.top()), - QLine(pixmapRect.left() + leftEdge - 1, pixmapRect.bottom(), - pixmapRect.left() + leftEdge + 9, pixmapRect.bottom()) }; - cachePainter.drawLines(cacheLines, 2); - cachePainter.fillRect(QRect(pixmapRect.left() + leftEdge, pixmapRect.top(), - 10, pixmapRect.height()), rectColor); - - leftEdge += 10; - } - - QPixmapCache::insert(progressBarName, cache); - } - painter->setClipRect(progressBar.adjusted(1, 0, -1, -1)); - - if (!vertical) - progressBar.adjust(0, 1, 0, 1); - if (!indeterminate) { - int step = 0; - if (AnimateProgressBar || (indeterminate && AnimateBusyProgressBar)) { - if (QProgressStyleAnimation *animation = qobject_cast<QProgressStyleAnimation*>(d->animation(widget))) - step = animation->animationStep() % 20; - } - if (reverse) - painter->drawPixmap(progressBar.left() - 25 + step, progressBar.top(), cache); - else - painter->drawPixmap(progressBar.left() - 25 - step + width % 20, progressBar.top(), cache); - } else { - painter->drawPixmap(progressBar.left(), progressBar.top(), cache); - } - - painter->restore(); - } - break; - - case CE_HeaderSection: - // Draws the header in tables. - if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(option)) { - QPixmap cache; - QString pixmapName = QStyleHelper::uniqueName(QLatin1String("headersection"), option, option->rect.size()); - pixmapName += QString::number(- int(header->position)); - pixmapName += QString::number(- int(header->orientation)); - - if (!QPixmapCache::find(pixmapName, cache)) { - cache = QPixmap(option->rect.size()); - cache.fill(Qt::white); - QRect pixmapRect(0, 0, option->rect.width(), option->rect.height()); - QPainter cachePainter(&cache); - - bool sunken = (header->state & State_Enabled) && (header->state & State_Sunken); - - QColor headerGradientStart = sunken ? option->palette.background().color().darker(114) : gradientStartColor; - QColor headerGradientStop = sunken ? option->palette.background().color().darker(106) : gradientStopColor; - - QColor lightLine = sunken ? option->palette.background().color().darker(118) : gradientStartColor; - QColor darkLine = sunken ? option->palette.background().color().darker(110) : gradientStopColor.darker(105); - - qt_plastique_draw_gradient(&cachePainter, pixmapRect, - headerGradientStart, headerGradientStop); - - cachePainter.setPen(borderColor); - cachePainter.drawRect(pixmapRect.adjusted(0, 0, -1, -1)); - cachePainter.setPen(alphaCornerColor); - - const QPoint points[4] = { - pixmapRect.topLeft(), pixmapRect.topRight(), - pixmapRect.bottomLeft(), pixmapRect.bottomRight() }; - cachePainter.drawPoints(points, 4); - - QLine lines[2]; - - // inner lines - cachePainter.setPen(lightLine); - lines[0] = QLine(pixmapRect.left() + 2, pixmapRect.top() + 1, - pixmapRect.right() - 2, pixmapRect.top() + 1); - lines[1] = QLine(pixmapRect.left() + 1, pixmapRect.top() + 2, - pixmapRect.left() + 1, pixmapRect.bottom() - 2); - cachePainter.drawLines(lines, 2); - - cachePainter.setPen(darkLine); - lines[0] = QLine(pixmapRect.left() + 2, pixmapRect.bottom() - 1, - pixmapRect.right() - 2, pixmapRect.bottom() - 1); - lines[1] = QLine(pixmapRect.right() - 1, pixmapRect.bottom() - 2, - pixmapRect.right() - 1, pixmapRect.top() + 2); - cachePainter.drawLines(lines, 2); - - cachePainter.end(); - QPixmapCache::insert(pixmapName, cache); - } - painter->drawPixmap(option->rect.topLeft(), cache); - - } - break; -#ifndef QT_NO_MENU - case CE_MenuItem: - // Draws one item in a popup menu. - if (const QStyleOptionMenuItem *menuItem = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) { - painter->save(); - QBrush textBrush; - if (option->palette.resolve() & (1 << QPalette::ButtonText)) - textBrush = option->palette.buttonText(); - else - textBrush = option->palette.windowText(); // KDE uses windowText rather than buttonText for menus - - if (menuItem->menuItemType == QStyleOptionMenuItem::Separator) { - painter->fillRect(menuItem->rect, option->palette.background().color().lighter(103)); - - int w = 0; - if (!menuItem->text.isEmpty()) { - painter->setFont(menuItem->font); - proxy()->drawItemText(painter, menuItem->rect.adjusted(5, 0, -5, 0), Qt::AlignLeft | Qt::AlignVCenter, - menuItem->palette, menuItem->state & State_Enabled, menuItem->text, - QPalette::Text); - w = menuItem->fontMetrics.width(menuItem->text) + 5; - } - - painter->setPen(alphaCornerColor); - bool reverse = menuItem->direction == Qt::RightToLeft; - painter->drawLine(menuItem->rect.left() + 5 + (reverse ? 0 : w), menuItem->rect.center().y(), - menuItem->rect.right() - 5 - (reverse ? w : 0), menuItem->rect.center().y()); - - painter->restore(); - break; - } - - bool selected = menuItem->state & State_Selected; - bool checkable = menuItem->checkType != QStyleOptionMenuItem::NotCheckable; - bool checked = menuItem->checked; - - if (selected) { - qt_plastique_draw_gradient(painter, menuItem->rect, - option->palette.highlight().color().lighter(105), - option->palette.highlight().color().darker(110)); - - painter->setPen(option->palette.highlight().color().lighter(110)); - painter->drawLine(option->rect.topLeft(), option->rect.topRight()); - painter->setPen(option->palette.highlight().color().darker(115)); - painter->drawLine(option->rect.bottomLeft(), option->rect.bottomRight()); - } else { - painter->fillRect(option->rect, option->palette.background().color().lighter(103)); - } - - // Check - QRect checkRect(option->rect.left() + 7, option->rect.center().y() - 6, 13, 13); - checkRect = visualRect(menuItem->direction, menuItem->rect, checkRect); - if (checkable) { - if ((menuItem->checkType & QStyleOptionMenuItem::Exclusive) && menuItem->icon.isNull()) { - QStyleOptionButton button; - button.rect = checkRect; - button.state = menuItem->state; - if (checked) - button.state |= State_On; - button.palette = menuItem->palette; - proxy()->drawPrimitive(PE_IndicatorRadioButton, &button, painter, widget); - } else { - if (menuItem->icon.isNull()) { - QStyleOptionButton button; - button.rect = checkRect; - button.state = menuItem->state; - if (checked) - button.state |= State_On; - button.palette = menuItem->palette; - proxy()->drawPrimitive(PE_IndicatorCheckBox, &button, painter, widget); - } else if (checked) { - int iconSize = qMax(menuItem->maxIconWidth, 20); - QRect sunkenRect(option->rect.left() + 1, - option->rect.top() + (option->rect.height() - iconSize) / 2 + 1, - iconSize, iconSize); - sunkenRect = visualRect(menuItem->direction, menuItem->rect, sunkenRect); - - QStyleOption opt = *option; - opt.state |= State_Sunken; - opt.rect = sunkenRect; - qt_plastique_drawShadedPanel(painter, &opt, false, widget); - } - } - } - - // Text and icon, ripped from windows style - bool dis = !(menuItem->state & State_Enabled); - bool act = menuItem->state & State_Selected; - const QStyleOption *opt = option; - const QStyleOptionMenuItem *menuitem = menuItem; - int checkcol = qMax(menuitem->maxIconWidth, 20); - QPainter *p = painter; - QRect vCheckRect = visualRect(opt->direction, menuitem->rect, - QRect(menuitem->rect.x(), menuitem->rect.y(), - checkcol, menuitem->rect.height())); - if (!menuItem->icon.isNull()) { - QIcon::Mode mode = dis ? QIcon::Disabled : QIcon::Normal; - if (act && !dis) - mode = QIcon::Active; - QPixmap pixmap; - if (checked) - pixmap = menuItem->icon.pixmap(pixelMetric(PM_SmallIconSize, option, widget), mode, QIcon::On); - else - pixmap = menuItem->icon.pixmap(pixelMetric(PM_SmallIconSize, option, widget), mode); - int pixw = pixmap.width(); - int pixh = pixmap.height(); - - QRect pmr(0, 0, pixw, pixh); - pmr.moveCenter(vCheckRect.center()); - painter->setPen(textBrush.color()); - if (checkable && checked) - painter->drawPixmap(QPoint(pmr.left() + 1, pmr.top() + 1), pixmap); - else - painter->drawPixmap(pmr.topLeft(), pixmap); - } - - if (selected) { - painter->setPen(menuItem->palette.highlightedText().color()); - } else { - painter->setPen(textBrush.color()); - } - int x, y, w, h; - menuitem->rect.getRect(&x, &y, &w, &h); - int tab = menuitem->tabWidth; - QColor discol; - if (dis) { - discol = textBrush.color(); - p->setPen(discol); - } - int xm = windowsItemFrame + checkcol + windowsItemHMargin; - int xpos = menuitem->rect.x() + xm; - QRect textRect(xpos, y + windowsItemVMargin, w - xm - windowsRightBorder - tab + 1, h - 2 * windowsItemVMargin); - QRect vTextRect = visualRect(opt->direction, menuitem->rect, textRect); - QString s = menuitem->text; - if (!s.isEmpty()) { // draw text - p->save(); - int t = s.indexOf(QLatin1Char('\t')); - int text_flags = Qt::AlignVCenter | Qt::TextShowMnemonic | Qt::TextDontClip | Qt::TextSingleLine; - if (!styleHint(SH_UnderlineShortcut, menuitem, widget)) - text_flags |= Qt::TextHideMnemonic; - text_flags |= Qt::AlignLeft; - if (t >= 0) { - QRect vShortcutRect = visualRect(opt->direction, menuitem->rect, - QRect(textRect.topRight(), QPoint(menuitem->rect.right(), textRect.bottom()))); - if (dis && !act && styleHint(SH_EtchDisabledText, option, widget)) { - p->setPen(menuitem->palette.light().color()); - p->drawText(vShortcutRect.adjusted(1,1,1,1), text_flags, s.mid(t + 1)); - p->setPen(discol); - } - p->drawText(vShortcutRect, text_flags, s.mid(t + 1)); - s = s.left(t); - } - QFont font = menuitem->font; - if (menuitem->menuItemType == QStyleOptionMenuItem::DefaultItem) - font.setBold(true); - p->setFont(font); - if (dis && !act && styleHint(SH_EtchDisabledText, option, widget)) { - p->setPen(menuitem->palette.light().color()); - p->drawText(vTextRect.adjusted(1,1,1,1), text_flags, s.left(t)); - p->setPen(discol); - } - p->drawText(vTextRect, text_flags, s.left(t)); - p->restore(); - } - - // Arrow - if (menuItem->menuItemType == QStyleOptionMenuItem::SubMenu) {// draw sub menu arrow - int dim = (menuItem->rect.height() - 4) / 2; - PrimitiveElement arrow; - arrow = (opt->direction == Qt::RightToLeft) ? PE_IndicatorArrowLeft : PE_IndicatorArrowRight; - int xpos = menuItem->rect.left() + menuItem->rect.width() - 6 - 2 - dim; - QRect vSubMenuRect = visualRect(option->direction, menuItem->rect, - QRect(xpos, menuItem->rect.top() + menuItem->rect.height() / 2 - dim / 2, dim, dim)); - QStyleOptionMenuItem newMI = *menuItem; - newMI.rect = vSubMenuRect; - newMI.state = option->state & State_Enabled; - if (selected) - newMI.palette.setColor(QPalette::ButtonText, - newMI.palette.highlightedText().color()); - else - newMI.palette.setColor(QPalette::ButtonText, textBrush.color()); - proxy()->drawPrimitive(arrow, &newMI, painter, widget); - } - - painter->restore(); - } - break; -#endif // QT_NO_MENU -#ifndef QT_NO_MENUBAR - case CE_MenuBarItem: - // Draws a menu bar item; File, Edit, Help etc.. - if ((option->state & State_Selected)) { - QPixmap cache; - QString pixmapName = QStyleHelper::uniqueName(QLatin1String("menubaritem"), option, option->rect.size()); - if (!QPixmapCache::find(pixmapName, cache)) { - cache = QPixmap(option->rect.size()); - cache.fill(Qt::white); - QRect pixmapRect(0, 0, option->rect.width(), option->rect.height()); - QPainter cachePainter(&cache); - - QRect rect = pixmapRect; - - // gradient fill - if ((option->state & QStyle::State_Sunken) || (option->state & QStyle::State_On)) { - qt_plastique_draw_gradient(&cachePainter, rect.adjusted(1, 1, -1, -1), - option->palette.button().color().darker(114), - option->palette.button().color().darker(106)); - } else { - qt_plastique_draw_gradient(&cachePainter, rect.adjusted(1, 1, -1, -1), - option->palette.background().color().lighter(105), - option->palette.background().color().darker(102)); - } - - // outer border and corners - cachePainter.setPen(borderColor); - cachePainter.drawRect(rect.adjusted(0, 0, -1, -1)); - cachePainter.setPen(alphaCornerColor); - - const QPoint points[4] = { - rect.topLeft(), - rect.topRight(), - rect.bottomLeft(), - rect.bottomRight() }; - cachePainter.drawPoints(points, 4); - - // inner border - if ((option->state & QStyle::State_Sunken) || (option->state & QStyle::State_On)) - cachePainter.setPen(option->palette.button().color().darker(118)); - else - cachePainter.setPen(gradientStartColor); - - QLine lines[2]; - lines[0] = QLine(rect.left() + 1, rect.top() + 1, rect.right() - 1, rect.top() + 1); - lines[1] = QLine(rect.left() + 1, rect.top() + 2, rect.left() + 1, rect.bottom() - 2); - cachePainter.drawLines(lines, 2); - - if ((option->state & QStyle::State_Sunken) || (option->state & QStyle::State_On)) - cachePainter.setPen(option->palette.button().color().darker(114)); - else - cachePainter.setPen(gradientStopColor.darker(102)); - lines[0] = QLine(rect.left() + 1, rect.bottom() - 1, rect.right() - 1, rect.bottom() - 1); - lines[1] = QLine(rect.right() - 1, rect.top() + 1, rect.right() - 1, rect.bottom() - 2); - cachePainter.drawLines(lines, 2); - cachePainter.end(); - QPixmapCache::insert(pixmapName, cache); - } - painter->drawPixmap(option->rect.topLeft(), cache); - } else { - painter->fillRect(option->rect, option->palette.background()); - } - - if (const QStyleOptionMenuItem *mbi = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) { - QStyleOptionMenuItem newMI = *mbi; - if (!(option->palette.resolve() & (1 << QPalette::ButtonText))) //KDE uses windowText rather than buttonText for menus - newMI.palette.setColor(QPalette::ButtonText, newMI.palette.windowText().color()); - QCommonStyle::drawControl(element, &newMI, painter, widget); - } - break; - -#ifndef QT_NO_MAINWINDOW - case CE_MenuBarEmptyArea: - if (widget && qobject_cast<const QMainWindow *>(widget->parentWidget())) { - painter->fillRect(option->rect, option->palette.window()); - QPen oldPen = painter->pen(); - painter->setPen(QPen(option->palette.dark().color())); - painter->drawLine(option->rect.bottomLeft(), option->rect.bottomRight()); - painter->setPen(oldPen); - } - break; -#endif // QT_NO_MAINWINDOW - -#endif // QT_NO_MENUBAR - -#ifndef QT_NO_TOOLBOX - case CE_ToolBoxTabShape: - if (const QStyleOptionToolBox *toolBox = qstyleoption_cast<const QStyleOptionToolBox *>(option)) { - painter->save(); - - int width = toolBox->rect.width(); - int diag = toolBox->rect.height() - 2; - - // The essential points - QPoint rightMost; - QPoint rightEdge; - QPoint leftEdge; - QPoint leftMost; - QPoint leftOne; - QPoint rightOne; - QPoint upOne(0, -1); - QPoint downOne(0, 1); - - if (toolBox->direction != Qt::RightToLeft) { - rightMost = QPoint(toolBox->rect.right(), toolBox->rect.bottom() - 2); - rightEdge = QPoint(toolBox->rect.right() - width / 10, toolBox->rect.bottom() - 2); - leftEdge = QPoint(toolBox->rect.right() - width / 10 - diag, toolBox->rect.top()); - leftMost = QPoint(toolBox->rect.left(), toolBox->rect.top()); - leftOne = QPoint(-1, 0); - rightOne = QPoint(1, 0); - } else { - rightMost = QPoint(toolBox->rect.left(), toolBox->rect.bottom() - 2); - rightEdge = QPoint(toolBox->rect.left() + width / 10, toolBox->rect.bottom() - 2); - leftEdge = QPoint(toolBox->rect.left() + width / 10 + diag, toolBox->rect.top()); - leftMost = QPoint(toolBox->rect.right(), toolBox->rect.top()); - leftOne = QPoint(1, 0); - rightOne = QPoint(-1, 0); - } - - QLine lines[3]; - - // Draw the outline - painter->setPen(borderColor); - lines[0] = QLine(rightMost, rightEdge); - lines[1] = QLine(rightEdge + leftOne, leftEdge); - lines[2] = QLine(leftEdge + leftOne, leftMost); - painter->drawLines(lines, 3); - painter->setPen(toolBox->palette.base().color()); - lines[0] = QLine(rightMost + downOne, rightEdge + downOne); - lines[1] = QLine(rightEdge + leftOne + downOne, leftEdge + downOne); - lines[2] = QLine(leftEdge + leftOne + downOne, leftMost + downOne); - painter->drawLines(lines, 3); - - painter->restore(); - } - break; -#endif // QT_NO_TOOLBOX -#ifndef QT_NO_SPLITTER - case CE_Splitter: - if ((option->state & State_Enabled) && (option->state & State_MouseOver)) - painter->fillRect(option->rect, QColor(255, 255, 255, 128)); - if (option->state & State_Horizontal) { - int height = option->rect.height() / 3; - QRect rect(option->rect.left() + (option->rect.width() / 2 - 1), - option->rect.center().y() - height / 2, 3, height); - qt_plastique_draw_handle(painter, option, rect, Qt::Horizontal, widget); - } else { - int width = option->rect.width() / 3; - QRect rect(option->rect.center().x() - width / 2, - option->rect.top() + (option->rect.height() / 2) - 1, width, 3); - qt_plastique_draw_handle(painter, option, rect, Qt::Vertical, widget); - } - break; -#endif // QT_NO_SPLITTER -#ifndef QT_NO_DOCKWIDGET - case CE_DockWidgetTitle: - if (const QStyleOptionDockWidget *dockWidget = qstyleoption_cast<const QStyleOptionDockWidget *>(option)) { - painter->save(); - - const QStyleOptionDockWidgetV2 *v2 - = qstyleoption_cast<const QStyleOptionDockWidgetV2*>(dockWidget); - bool verticalTitleBar = v2 == 0 ? false : v2->verticalTitleBar; - - // Find text width and title rect - int textWidth = option->fontMetrics.width(dockWidget->title); - int margin = 4; - QRect titleRect = subElementRect(SE_DockWidgetTitleBarText, option, widget); - QRect rect = dockWidget->rect; - - if (verticalTitleBar) { - QRect r = rect; - QSize s = r.size(); - s.transpose(); - r.setSize(s); - - titleRect = QRect(r.left() + rect.bottom() - - titleRect.bottom(), - r.top() + titleRect.left() - rect.left(), - titleRect.height(), titleRect.width()); - - painter->translate(r.left(), r.top() + r.width()); - painter->rotate(-90); - painter->translate(-r.left(), -r.top()); - - rect = r; - } - - // Chop and insert ellide into title if text is too wide - QString title = elliditide(dockWidget->title, dockWidget->fontMetrics, titleRect, &textWidth); - - // Draw the toolbar handle pattern to the left and right of the text - QImage handle(qt_toolbarhandle); - alphaCornerColor.setAlpha(170); - handle.setColor(1, alphaCornerColor.rgba()); - handle.setColor(2, mergedColors(alphaCornerColor, option->palette.light().color()).rgba()); - handle.setColor(3, option->palette.light().color().rgba()); - - if (title.isEmpty()) { - // Joint handle if there's no title - QRect r; - r.setRect(titleRect.left(), titleRect.top(), titleRect.width(), titleRect.bottom()); - int nchunks = (r.width() / handle.width()) - 1; - int indent = (r.width() - (nchunks * handle.width())) / 2; - for (int i = 0; i < nchunks; ++i) { - painter->drawImage(QPoint(r.left() + indent + i * handle.width(), - r.center().y() - handle.height() / 2), - handle); - } - } else { - // Handle pattern to the left of the title - QRect leftSide(titleRect.left(), titleRect.top(), - titleRect.width() / 2 - textWidth / 2 - margin, titleRect.bottom()); - int nchunks = leftSide.width() / handle.width(); - int indent = (leftSide.width() - (nchunks * handle.width())) / 2; - for (int i = 0; i < nchunks; ++i) { - painter->drawImage(QPoint(leftSide.left() + indent - + i * handle.width(), - leftSide.center().y() - - handle.height() / 2), - handle); - } - - // Handle pattern to the right of the title - QRect rightSide = titleRect.adjusted(titleRect.width() / 2 + textWidth / 2 + margin, 0, 0, 0); - nchunks = rightSide.width() / handle.width(); - indent = (rightSide.width() - (nchunks * handle.width())) / 2; - for (int j = 0; j < nchunks; ++j) { - painter->drawImage(QPoint(rightSide.left() + indent + j * handle.width(), - rightSide.center().y() - handle.height() / 2), - handle); - } - } - - // Draw the text centered - QFont font = painter->font(); - font.setPointSize(QFontInfo(font).pointSize() - 1); - painter->setFont(font); - painter->setPen(dockWidget->palette.windowText().color()); - painter->drawText(titleRect, - int(Qt::AlignHCenter | Qt::AlignVCenter | Qt::TextShowMnemonic), - title); - - painter->restore(); - } - - break; -#endif // QT_NO_DOCKWIDGET -#ifndef QT_NO_TOOLBAR - case CE_ToolBar: - if (const QStyleOptionToolBar *toolBar = qstyleoption_cast<const QStyleOptionToolBar *>(option)) { - // Draws the light line above and the dark line below menu bars and - // tool bars. - QPen oldPen = painter->pen(); - if (toolBar->toolBarArea == Qt::TopToolBarArea) { - if (toolBar->positionOfLine == QStyleOptionToolBar::End - || toolBar->positionOfLine == QStyleOptionToolBar::OnlyOne) { - // The end and onlyone top toolbar lines draw a double - // line at the bottom to blend with the central - // widget. - painter->setPen(option->palette.background().color().lighter(104)); - painter->drawLine(option->rect.bottomLeft(), option->rect.bottomRight()); - painter->setPen(alphaCornerColor); - painter->drawLine(option->rect.left(), option->rect.bottom() - 1, - option->rect.right(), option->rect.bottom() - 1); - } else { - // All others draw a single dark line at the bottom. - painter->setPen(alphaCornerColor); - painter->drawLine(option->rect.bottomLeft(), option->rect.bottomRight()); - } - // All top toolbar lines draw a light line at the top. - painter->setPen(option->palette.background().color().lighter(104)); - painter->drawLine(option->rect.topLeft(), option->rect.topRight()); - } else if (toolBar->toolBarArea == Qt::BottomToolBarArea) { - if (toolBar->positionOfLine == QStyleOptionToolBar::End - || toolBar->positionOfLine == QStyleOptionToolBar::Middle) { - // The end and middle bottom tool bar lines draw a dark - // line at the bottom. - painter->setPen(alphaCornerColor); - painter->drawLine(option->rect.bottomLeft(), option->rect.bottomRight()); - } - if (toolBar->positionOfLine == QStyleOptionToolBar::Beginning - || toolBar->positionOfLine == QStyleOptionToolBar::OnlyOne) { - // The beginning and only one tool bar lines draw a - // double line at the bottom to blend with the - // status bar. - // ### The styleoption could contain whether the - // main window has a menu bar and a status bar, and - // possibly dock widgets. - painter->setPen(alphaCornerColor); - painter->drawLine(option->rect.left(), option->rect.bottom() - 1, - option->rect.right(), option->rect.bottom() - 1); - painter->setPen(option->palette.background().color().lighter(104)); - painter->drawLine(option->rect.bottomLeft(), option->rect.bottomRight()); - } - if (toolBar->positionOfLine == QStyleOptionToolBar::End) { - painter->setPen(alphaCornerColor); - painter->drawLine(option->rect.topLeft(), option->rect.topRight()); - painter->setPen(option->palette.background().color().lighter(104)); - painter->drawLine(option->rect.left(), option->rect.top() + 1, - option->rect.right(), option->rect.top() + 1); - - } else { - // All other bottom toolbars draw a light line at the top. - painter->setPen(option->palette.background().color().lighter(104)); - painter->drawLine(option->rect.topLeft(), option->rect.topRight()); - } - } - if (toolBar->toolBarArea == Qt::LeftToolBarArea) { - if (toolBar->positionOfLine == QStyleOptionToolBar::Middle - || toolBar->positionOfLine == QStyleOptionToolBar::End) { - // The middle and left end toolbar lines draw a light - // line to the left. - painter->setPen(option->palette.background().color().lighter(104)); - painter->drawLine(option->rect.topLeft(), option->rect.bottomLeft()); - } - if (toolBar->positionOfLine == QStyleOptionToolBar::End) { - // All other left toolbar lines draw a dark line to the right - painter->setPen(alphaCornerColor); - painter->drawLine(option->rect.right() - 1, option->rect.top(), - option->rect.right() - 1, option->rect.bottom()); - painter->setPen(option->palette.background().color().lighter(104)); - painter->drawLine(option->rect.topRight(), option->rect.bottomRight()); - } else { - // All other left toolbar lines draw a dark line to the right - painter->setPen(alphaCornerColor); - painter->drawLine(option->rect.topRight(), option->rect.bottomRight()); - } - } else if (toolBar->toolBarArea == Qt::RightToolBarArea) { - if (toolBar->positionOfLine == QStyleOptionToolBar::Middle - || toolBar->positionOfLine == QStyleOptionToolBar::End) { - // Right middle and end toolbar lines draw the dark right line - painter->setPen(alphaCornerColor); - painter->drawLine(option->rect.topRight(), option->rect.bottomRight()); - } - if (toolBar->positionOfLine == QStyleOptionToolBar::End - || toolBar->positionOfLine == QStyleOptionToolBar::OnlyOne) { - // The right end and single toolbar draws the dark - // line on its left edge - painter->setPen(alphaCornerColor); - painter->drawLine(option->rect.topLeft(), option->rect.bottomLeft()); - // And a light line next to it - painter->setPen(option->palette.background().color().lighter(104)); - painter->drawLine(option->rect.left() + 1, option->rect.top(), - option->rect.left() + 1, option->rect.bottom()); - } else { - // Other right toolbars draw a light line on its left edge - painter->setPen(option->palette.background().color().lighter(104)); - painter->drawLine(option->rect.topLeft(), option->rect.bottomLeft()); - } - } - painter->setPen(oldPen); - } - break; -#endif // QT_NO_TOOLBAR -#ifndef QT_NO_SCROLLBAR - case CE_ScrollBarAddLine: - if (const QStyleOptionSlider *scrollBar = qstyleoption_cast<const QStyleOptionSlider *>(option)) { - - bool horizontal = scrollBar->orientation == Qt::Horizontal; - bool reverse = scrollBar->direction == Qt::RightToLeft; - bool sunken = scrollBar->state & State_Sunken; - - QString addLinePixmapName = QStyleHelper::uniqueName(QLatin1String("scrollbar_addline"), option, option->rect.size()); - QPixmap cache; - if (!QPixmapCache::find(addLinePixmapName, cache)) { - cache = QPixmap(option->rect.size()); - cache.fill(Qt::white); - QRect pixmapRect(0, 0, cache.width(), cache.height()); - QPainter addLinePainter(&cache); - addLinePainter.fillRect(pixmapRect, option->palette.background()); - - if (option->state & State_Enabled) { - // Gradient - QLinearGradient gradient(pixmapRect.center().x(), pixmapRect.top() + 2, - pixmapRect.center().x(), pixmapRect.bottom() - 2); - if ((scrollBar->activeSubControls & SC_ScrollBarAddLine) && sunken) { - gradient.setColorAt(0, gradientStopColor); - gradient.setColorAt(1, gradientStopColor); - } else { - gradient.setColorAt(0, gradientStartColor.lighter(105)); - gradient.setColorAt(1, gradientStopColor); - } - addLinePainter.fillRect(pixmapRect.left() + 2, pixmapRect.top() + 2, - pixmapRect.right() - 3, pixmapRect.bottom() - 3, - gradient); - } - - // Details - QImage addButton; - if (horizontal) { - addButton = QImage(reverse ? qt_scrollbar_button_left : qt_scrollbar_button_right); - } else { - addButton = QImage(qt_scrollbar_button_down); - } - addButton.setColor(1, alphaCornerColor.rgba()); - addButton.setColor(2, borderColor.rgba()); - if ((scrollBar->activeSubControls & SC_ScrollBarAddLine) && sunken) { - addButton.setColor(3, gradientStopColor.rgba()); - addButton.setColor(4, gradientStopColor.rgba()); - } else { - addButton.setColor(3, gradientStartColor.lighter(105).rgba()); - addButton.setColor(4, gradientStopColor.rgba()); - } - addButton.setColor(5, scrollBar->palette.text().color().rgba()); - addLinePainter.drawImage(pixmapRect, addButton); - - // Arrow - if (horizontal) { - QImage arrow(reverse ? qt_scrollbar_button_arrow_left : qt_scrollbar_button_arrow_right); - arrow.setColor(1, scrollBar->palette.foreground().color().rgba()); - - if ((scrollBar->activeSubControls & SC_ScrollBarAddLine) && sunken) - addLinePainter.translate(1, 1); - addLinePainter.drawImage(QPoint(pixmapRect.center().x() - 2, pixmapRect.center().y() - 3), arrow); - } else { - QImage arrow(qt_scrollbar_button_arrow_down); - arrow.setColor(1, scrollBar->palette.foreground().color().rgba()); - - if ((scrollBar->activeSubControls & SC_ScrollBarAddLine) && sunken) - addLinePainter.translate(1, 1); - addLinePainter.drawImage(QPoint(pixmapRect.center().x() - 3, pixmapRect.center().y() - 2), arrow); - } - addLinePainter.end(); - QPixmapCache::insert(addLinePixmapName, cache); - } - painter->drawPixmap(option->rect.topLeft(), cache); - } - break; - case CE_ScrollBarSubPage: - case CE_ScrollBarAddPage: - if (const QStyleOptionSlider *scrollBar = qstyleoption_cast<const QStyleOptionSlider *>(option)) { - bool sunken = scrollBar->state & State_Sunken; - bool horizontal = scrollBar->orientation == Qt::Horizontal; - - QString groovePixmapName = QStyleHelper::uniqueName(QLatin1String("scrollbar_groove"), option, option->rect.size()); - if (sunken) - groovePixmapName += QLatin1String("-sunken"); - if (element == CE_ScrollBarAddPage) - groovePixmapName += QLatin1String("-addpage"); - - QPixmap cache; - if (!QPixmapCache::find(groovePixmapName, cache)) { - cache = QPixmap(option->rect.size()); - cache.fill(option->palette.background().color()); - QPainter groovePainter(&cache); - QRect pixmapRect = QRect(0, 0, option->rect.width(), option->rect.height()); - QColor color = scrollBar->palette.base().color().darker(sunken ? 125 : 100); - groovePainter.setBrushOrigin((element == CE_ScrollBarAddPage) ? pixmapRect.width() : 0, - (element == CE_ScrollBarAddPage) ? pixmapRect.height() : 0); - groovePainter.fillRect(pixmapRect, QBrush(color, Qt::Dense4Pattern)); - - QColor edgeColor = scrollBar->palette.base().color().darker(125); - if (horizontal) { - groovePainter.setBrushOrigin((element == CE_ScrollBarAddPage) ? pixmapRect.width() : 1, 0); - groovePainter.fillRect(QRect(pixmapRect.topLeft(), QSize(pixmapRect.width(), 1)), - QBrush(edgeColor, Qt::Dense4Pattern)); - groovePainter.fillRect(QRect(pixmapRect.bottomLeft(), QSize(pixmapRect.width(), 1)), - QBrush(edgeColor, Qt::Dense4Pattern)); - } else { - groovePainter.setBrushOrigin(0, (element == CE_ScrollBarAddPage) ? pixmapRect.height() : 1); - groovePainter.fillRect(QRect(pixmapRect.topLeft(), QSize(1, pixmapRect.height())), - QBrush(edgeColor, Qt::Dense4Pattern)); - groovePainter.fillRect(QRect(pixmapRect.topRight(), QSize(1, pixmapRect.height())), - QBrush(edgeColor, Qt::Dense4Pattern)); - } - - groovePainter.end(); - QPixmapCache::insert(groovePixmapName, cache); - } - painter->drawPixmap(option->rect.topLeft(), cache); - } - break; - case CE_ScrollBarSubLine: - if (const QStyleOptionSlider *scrollBar = qstyleoption_cast<const QStyleOptionSlider *>(option)) { - QRect scrollBarSubLine = scrollBar->rect; - - bool horizontal = scrollBar->orientation == Qt::Horizontal; - bool isEnabled = scrollBar->state & State_Enabled; - bool reverse = scrollBar->direction == Qt::RightToLeft; - bool sunken = scrollBar->state & State_Sunken; - - // The SubLine (up/left) buttons - QRect button1; - QRect button2; - int scrollBarExtent = proxy()->pixelMetric(PM_ScrollBarExtent, option, widget); - if (horizontal) { - button1.setRect(scrollBarSubLine.left(), scrollBarSubLine.top(), scrollBarExtent, scrollBarSubLine.height()); - button2.setRect(scrollBarSubLine.right() - (scrollBarExtent - 1), scrollBarSubLine.top(), scrollBarExtent, scrollBarSubLine.height()); - } else { - button1.setRect(scrollBarSubLine.left(), scrollBarSubLine.top(), scrollBarSubLine.width(), scrollBarExtent); - button2.setRect(scrollBarSubLine.left(), scrollBarSubLine.bottom() - (scrollBarExtent - 1), scrollBarSubLine.width(), scrollBarExtent); - } - - QString subLinePixmapName = QStyleHelper::uniqueName(QLatin1String("scrollbar_subline"), option, button1.size()); - QPixmap cache; - if (!QPixmapCache::find(subLinePixmapName, cache)) { - cache = QPixmap(button1.size()); - cache.fill(Qt::white); - QRect pixmapRect(0, 0, cache.width(), cache.height()); - QPainter subLinePainter(&cache); - subLinePainter.fillRect(pixmapRect, option->palette.background()); - - if (isEnabled) { - // Gradients - if ((scrollBar->activeSubControls & SC_ScrollBarSubLine) && sunken) { - qt_plastique_draw_gradient(&subLinePainter, - QRect(pixmapRect.left() + 2, pixmapRect.top() + 2, - pixmapRect.right() - 3, pixmapRect.bottom() - 3), - gradientStopColor, - gradientStopColor); - } else { - qt_plastique_draw_gradient(&subLinePainter, - QRect(pixmapRect.left() + 2, pixmapRect.top() + 2, - pixmapRect.right() - 3, pixmapRect.bottom() - 3), - gradientStartColor.lighter(105), - gradientStopColor); - } - } - - // Details - QImage subButton; - if (horizontal) { - subButton = QImage(reverse ? qt_scrollbar_button_right : qt_scrollbar_button_left); - } else { - subButton = QImage(qt_scrollbar_button_up); - } - subButton.setColor(1, alphaCornerColor.rgba()); - subButton.setColor(2, borderColor.rgba()); - if ((scrollBar->activeSubControls & SC_ScrollBarSubLine) && sunken) { - subButton.setColor(3, gradientStopColor.rgba()); - subButton.setColor(4, gradientStopColor.rgba()); - } else { - subButton.setColor(3, gradientStartColor.lighter(105).rgba()); - subButton.setColor(4, gradientStopColor.rgba()); - } - subButton.setColor(5, scrollBar->palette.text().color().rgba()); - subLinePainter.drawImage(pixmapRect, subButton); - - // Arrows - if (horizontal) { - QImage arrow(reverse ? qt_scrollbar_button_arrow_right : qt_scrollbar_button_arrow_left); - arrow.setColor(1, scrollBar->palette.foreground().color().rgba()); - - if ((scrollBar->activeSubControls & SC_ScrollBarSubLine) && sunken) - subLinePainter.translate(1, 1); - subLinePainter.drawImage(QPoint(pixmapRect.center().x() - 2, pixmapRect.center().y() - 3), arrow); - } else { - QImage arrow(qt_scrollbar_button_arrow_up); - arrow.setColor(1, scrollBar->palette.foreground().color().rgba()); - - if ((scrollBar->activeSubControls & SC_ScrollBarSubLine) && sunken) - subLinePainter.translate(1, 1); - subLinePainter.drawImage(QPoint(pixmapRect.center().x() - 3, pixmapRect.center().y() - 2), arrow); - } - subLinePainter.end(); - QPixmapCache::insert(subLinePixmapName, cache); - } - painter->drawPixmap(button1.topLeft(), cache); - painter->drawPixmap(button2.topLeft(), cache); - } - break; - case CE_ScrollBarSlider: - if (const QStyleOptionSlider *scrollBar = qstyleoption_cast<const QStyleOptionSlider *>(option)) { - bool horizontal = scrollBar->orientation == Qt::Horizontal; - bool isEnabled = scrollBar->state & State_Enabled; - - // The slider - if (option->rect.isValid()) { - QString sliderPixmapName = QStyleHelper::uniqueName(QLatin1String("scrollbar_slider"), option, option->rect.size()); - if (horizontal) - sliderPixmapName += QLatin1String("-horizontal"); - - QPixmap cache; - if (!QPixmapCache::find(sliderPixmapName, cache)) { - cache = QPixmap(option->rect.size()); - cache.fill(Qt::white); - QRect pixmapRect(0, 0, cache.width(), cache.height()); - QPainter sliderPainter(&cache); - bool sunken = (scrollBar->state & State_Sunken); - - if (isEnabled) { - QLinearGradient gradient(pixmapRect.left(), pixmapRect.center().y(), - pixmapRect.right(), pixmapRect.center().y()); - if (horizontal) - gradient = QLinearGradient(pixmapRect.center().x(), pixmapRect.top(), - pixmapRect.center().x(), pixmapRect.bottom()); - - if (sunken) { - gradient.setColorAt(0, gradientStartColor.lighter(110)); - gradient.setColorAt(1, gradientStopColor.lighter(105)); - } else { - gradient.setColorAt(0, gradientStartColor.lighter(105)); - gradient.setColorAt(1, gradientStopColor); - } - sliderPainter.fillRect(pixmapRect.adjusted(2, 2, -2, -2), gradient); - } else { - sliderPainter.fillRect(pixmapRect.adjusted(2, 2, -2, -2), option->palette.background()); - } - - sliderPainter.setPen(borderColor); - sliderPainter.drawRect(pixmapRect.adjusted(0, 0, -1, -1)); - sliderPainter.setPen(alphaCornerColor); - QPoint points[4] = { - QPoint(pixmapRect.left(), pixmapRect.top()), - QPoint(pixmapRect.left(), pixmapRect.bottom()), - QPoint(pixmapRect.right(), pixmapRect.top()), - QPoint(pixmapRect.right(), pixmapRect.bottom()) }; - sliderPainter.drawPoints(points, 4); - - QLine lines[2]; - sliderPainter.setPen(sunken ? gradientStartColor.lighter(110) : gradientStartColor.lighter(105)); - lines[0] = QLine(pixmapRect.left() + 1, pixmapRect.top() + 1, - pixmapRect.right() - 1, pixmapRect.top() + 1); - lines[1] = QLine(pixmapRect.left() + 1, pixmapRect.top() + 2, - pixmapRect.left() + 1, pixmapRect.bottom() - 2); - sliderPainter.drawLines(lines, 2); - - sliderPainter.setPen(sunken ? gradientStopColor.lighter(105) : gradientStopColor); - lines[0] = QLine(pixmapRect.left() + 1, pixmapRect.bottom() - 1, - pixmapRect.right() - 1, pixmapRect.bottom() - 1); - lines[1] = QLine(pixmapRect.right() - 1, pixmapRect.top() + 2, - pixmapRect.right() - 1, pixmapRect.bottom() - 1); - sliderPainter.drawLines(lines, 2); - - int sliderMinLength = proxy()->pixelMetric(PM_ScrollBarSliderMin, scrollBar, widget); - if ((horizontal && scrollBar->rect.width() > sliderMinLength) - || (!horizontal && scrollBar->rect.height() > sliderMinLength)) { - QImage pattern(horizontal ? qt_scrollbar_slider_pattern_horizontal - : qt_scrollbar_slider_pattern_vertical); - pattern.setColor(1, alphaCornerColor.rgba()); - pattern.setColor(2, (sunken ? gradientStartColor.lighter(110) : gradientStartColor.lighter(105)).rgba()); - - if (horizontal) { - sliderPainter.drawImage(pixmapRect.center().x() - pattern.width() / 2 + 1, - pixmapRect.center().y() - 4, - pattern); - } else { - sliderPainter.drawImage(pixmapRect.center().x() - 4, - pixmapRect.center().y() - pattern.height() / 2 + 1, - pattern); - } - } - sliderPainter.end(); - // insert the slider into the cache - QPixmapCache::insert(sliderPixmapName, cache); - } - painter->drawPixmap(option->rect.topLeft(), cache); - } - } - break; -#endif -#ifndef QT_NO_COMBOBOX - case CE_ComboBoxLabel: - if (const QStyleOptionComboBox *comboBox = qstyleoption_cast<const QStyleOptionComboBox *>(option)) { - painter->save(); - if (!comboBox->editable) { - // Plastique's non-editable combo box is drawn as a button, so - // we need the label to be drawn using ButtonText where it - // would usually use Text. - painter->setPen(QPen(comboBox->palette.buttonText(), 0)); - QWindowsStyle::drawControl(element, option, painter, widget); - } else if (!comboBox->currentIcon.isNull()) { - { - QRect editRect = proxy()->subControlRect(CC_ComboBox, comboBox, SC_ComboBoxEditField, widget); - if (comboBox->direction == Qt::RightToLeft) - editRect.adjust(0, 2, -2, -2); - else - editRect.adjust(2, 2, 0, -2); - painter->save(); - painter->setClipRect(editRect); - if (!comboBox->currentIcon.isNull()) { - QIcon::Mode mode = comboBox->state & State_Enabled ? QIcon::Normal - : QIcon::Disabled; - QPixmap pixmap = comboBox->currentIcon.pixmap(comboBox->iconSize, mode); - QRect iconRect(editRect); - iconRect.setWidth(comboBox->iconSize.width() + 5); - iconRect = alignedRect(comboBox->direction, - Qt::AlignLeft | Qt::AlignVCenter, - iconRect.size(), editRect); - painter->fillRect(iconRect, option->palette.brush(QPalette::Base)); - proxy()->drawItemPixmap(painter, iconRect, Qt::AlignCenter, pixmap); - } - painter->restore(); - } - } else { - QWindowsStyle::drawControl(element, option, painter, widget); - } - - painter->restore(); - } - break; -#endif - default: - QWindowsStyle::drawControl(element, option, painter, widget); - break; - } -} - -/*! - \reimp -*/ -void QPlastiqueStyle::drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, - QPainter *painter, const QWidget *widget) const -{ - QColor borderColor = option->palette.background().color().darker(178); - QColor alphaCornerColor; - if (widget) { - // ### backgroundrole/foregroundrole should be part of the style option - alphaCornerColor = mergedColors(option->palette.color(widget->backgroundRole()), borderColor); - } else { - alphaCornerColor = mergedColors(option->palette.background().color(), borderColor); - } - QColor gradientStartColor = option->palette.button().color().lighter(104); - QColor gradientStopColor = option->palette.button().color().darker(105); - - switch (control) { -#ifndef QT_NO_SLIDER - case CC_Slider: - if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(option)) { - QRect grooveRegion = proxy()->subControlRect(CC_Slider, option, SC_SliderGroove, widget); - QRect handle = proxy()->subControlRect(CC_Slider, option, SC_SliderHandle, widget); - bool horizontal = slider->orientation == Qt::Horizontal; - bool ticksAbove = slider->tickPosition & QSlider::TicksAbove; - bool ticksBelow = slider->tickPosition & QSlider::TicksBelow; - - QRect groove; - //The clickable region is 5 px wider than the visible groove for improved usability - if (grooveRegion.isValid()) - groove = horizontal ? grooveRegion.adjusted(0, 5, 0, -5) : grooveRegion.adjusted(5, 0, -5, 0); - - - QPixmap cache; - - if ((option->subControls & SC_SliderGroove) && groove.isValid()) { - BEGIN_STYLE_PIXMAPCACHE(QString::fromLatin1("slider_groove-%0-%1").arg(ticksAbove).arg(ticksBelow)) - p->fillRect(groove, option->palette.background()); - - rect = groove; - rect.moveTo(groove.left() - option->rect.left(), groove.top() - option->rect.top()); - - // draw groove - if (horizontal) { - p->setPen(borderColor); - const QLine lines[4] = { - QLine(rect.left() + 1, rect.top(), - rect.right() - 1, rect.top()), - QLine(rect.left() + 1, rect.bottom(), - rect.right() - 1, rect.bottom()), - QLine(rect.left(), rect.top() + 1, - rect.left(), rect.bottom() - 1), - QLine(rect.right(), rect.top() + 1, - rect.right(), rect.bottom() - 1) }; - p->drawLines(lines, 4); - - p->setPen(alphaCornerColor); - const QPoint points[4] = { - QPoint(rect.left(), rect.top()), - QPoint(rect.left(), rect.bottom()), - QPoint(rect.right(), rect.top()), - QPoint(rect.right(), rect.bottom()) }; - p->drawPoints(points, 4); - } else { - p->setPen(borderColor); - const QLine lines[4] = { - QLine(rect.left() + 1, rect.top(), - rect.right() - 1, rect.top()), - QLine(rect.left() + 1, rect.bottom(), - rect.right() - 1, rect.bottom()), - QLine(rect.left(), rect.top() + 1, - rect.left(), rect.bottom() - 1), - QLine(rect.right(), rect.top() + 1, - rect.right(), rect.bottom() - 1) }; - p->drawLines(lines, 4); - - p->setPen(alphaCornerColor); - const QPoint points[4] = { - QPoint(rect.left(), rect.top()), - QPoint(rect.right(), rect.top()), - QPoint(rect.left(), rect.bottom()), - QPoint(rect.right(), rect.bottom()) }; - p->drawPoints(points, 4); - } - END_STYLE_PIXMAPCACHE - } - - if ((option->subControls & SC_SliderHandle) && handle.isValid()) { - QString handlePixmapName = QStyleHelper::uniqueName(QLatin1String("slider_handle"), option, handle.size()); - if (ticksAbove && !ticksBelow) - handlePixmapName += QLatin1String("-flipped"); - if ((option->activeSubControls & SC_SliderHandle) && (option->state & State_Sunken)) - handlePixmapName += QLatin1String("-sunken"); - - if (!QPixmapCache::find(handlePixmapName, cache)) { - cache = QPixmap(handle.size()); - cache.fill(Qt::transparent); - QRect pixmapRect(0, 0, handle.width(), handle.height()); - QPainter handlePainter(&cache); - - // draw handle - if (horizontal) { - QPainterPath path; - if (ticksAbove && !ticksBelow) { - path.moveTo(QPoint(pixmapRect.right(), pixmapRect.bottom())); - path.lineTo(QPoint(pixmapRect.right(), pixmapRect.bottom() - 10)); - path.lineTo(QPoint(pixmapRect.right() - 5, pixmapRect.bottom() - 14)); - path.lineTo(QPoint(pixmapRect.left() + 1, pixmapRect.bottom() - 10)); - path.lineTo(QPoint(pixmapRect.left() + 1, pixmapRect.bottom())); - path.lineTo(QPoint(pixmapRect.right(), pixmapRect.bottom())); - } else { - path.moveTo(QPoint(pixmapRect.right(), pixmapRect.top() + 1)); - path.lineTo(QPoint(pixmapRect.right(), pixmapRect.top() + 10)); - path.lineTo(QPoint(pixmapRect.right() - 5, pixmapRect.top() + 14)); - path.lineTo(QPoint(pixmapRect.left() + 1, pixmapRect.top() + 10)); - path.lineTo(QPoint(pixmapRect.left() + 1, pixmapRect.top() + 1)); - path.lineTo(QPoint(pixmapRect.right(), pixmapRect.top() + 1)); - } - if (slider->state & State_Enabled) { - QLinearGradient gradient(pixmapRect.center().x(), pixmapRect.top(), - pixmapRect.center().x(), pixmapRect.bottom()); - if ((option->activeSubControls & SC_SliderHandle) && (option->state & State_Sunken)) { - gradient.setColorAt(0, gradientStartColor.lighter(110)); - gradient.setColorAt(1, gradientStopColor.lighter(110)); - } else { - gradient.setColorAt(0, gradientStartColor); - gradient.setColorAt(1, gradientStopColor); - } - handlePainter.fillPath(path, gradient); - } else { - handlePainter.fillPath(path, slider->palette.background()); - } - } else { - QPainterPath path; - if (ticksAbove && !ticksBelow) { - path.moveTo(QPoint(pixmapRect.right(), pixmapRect.top() + 1)); - path.lineTo(QPoint(pixmapRect.right() - 10, pixmapRect.top() + 1)); - path.lineTo(QPoint(pixmapRect.right() - 14, pixmapRect.top() + 5)); - path.lineTo(QPoint(pixmapRect.right() - 10, pixmapRect.bottom())); - path.lineTo(QPoint(pixmapRect.right(), pixmapRect.bottom())); - path.lineTo(QPoint(pixmapRect.right(), pixmapRect.top() + 1)); - } else { - path.moveTo(QPoint(pixmapRect.left() + 1, pixmapRect.top() + 1)); - path.lineTo(QPoint(pixmapRect.left() + 10, pixmapRect.top() + 1)); - path.lineTo(QPoint(pixmapRect.left() + 14, pixmapRect.top() + 5)); - path.lineTo(QPoint(pixmapRect.left() + 10, pixmapRect.bottom())); - path.lineTo(QPoint(pixmapRect.left() + 1, pixmapRect.bottom())); - path.lineTo(QPoint(pixmapRect.left() + 1, pixmapRect.top() + 1)); - } - if (slider->state & State_Enabled) { - QLinearGradient gradient(pixmapRect.center().x(), pixmapRect.top(), - pixmapRect.center().x(), pixmapRect.bottom()); - gradient.setColorAt(0, gradientStartColor); - gradient.setColorAt(1, gradientStopColor); - handlePainter.fillPath(path, gradient); - } else { - handlePainter.fillPath(path, slider->palette.background()); - } - } - - QImage image; - if (horizontal) { - image = QImage((ticksAbove && !ticksBelow) ? qt_plastique_slider_horizontalhandle_up : qt_plastique_slider_horizontalhandle); - } else { - image = QImage((ticksAbove && !ticksBelow) ? qt_plastique_slider_verticalhandle_left : qt_plastique_slider_verticalhandle); - } - - image.setColor(1, borderColor.rgba()); - image.setColor(2, gradientStartColor.rgba()); - image.setColor(3, alphaCornerColor.rgba()); - if (option->state & State_Enabled) { - image.setColor(4, 0x80ffffff); - image.setColor(5, 0x25000000); - } - handlePainter.drawImage(pixmapRect, image); - handlePainter.end(); - QPixmapCache::insert(handlePixmapName, cache); - } - - painter->drawPixmap(handle.topLeft(), cache); - - if (slider->state & State_HasFocus) { - QStyleOptionFocusRect fropt; - fropt.QStyleOption::operator=(*slider); - fropt.rect = subElementRect(SE_SliderFocusRect, slider, widget); - proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, painter, widget); - } - } - - if (option->subControls & SC_SliderTickmarks) { - QPen oldPen = painter->pen(); - painter->setPen(borderColor); - int tickSize = proxy()->pixelMetric(PM_SliderTickmarkOffset, option, widget); - int available = proxy()->pixelMetric(PM_SliderSpaceAvailable, slider, widget); - int interval = slider->tickInterval; - if (interval <= 0) { - interval = slider->singleStep; - if (QStyle::sliderPositionFromValue(slider->minimum, slider->maximum, interval, - available) - - QStyle::sliderPositionFromValue(slider->minimum, slider->maximum, - 0, available) < 3) - interval = slider->pageStep; - } - if (interval <= 0) - interval = 1; - - int v = slider->minimum; - int len = proxy()->pixelMetric(PM_SliderLength, slider, widget); - QVarLengthArray<QLine, 32> lines; - while (v <= slider->maximum + 1) { - if (v == slider->maximum + 1 && interval == 1) - break; - const int v_ = qMin(v, slider->maximum); - int pos = sliderPositionFromValue(slider->minimum, slider->maximum, - v_, (horizontal - ? slider->rect.width() - : slider->rect.height()) - len, - slider->upsideDown) + len / 2; - - int extra = 2 - ((v_ == slider->minimum || v_ == slider->maximum) ? 1 : 0); - - if (horizontal) { - if (ticksAbove) { - lines.append(QLine(pos, slider->rect.top() + extra, - pos, slider->rect.top() + tickSize)); - } - if (ticksBelow) { - lines.append(QLine(pos, slider->rect.bottom() - extra, - pos, slider->rect.bottom() - tickSize)); - } - } else { - if (ticksAbove) { - lines.append(QLine(slider->rect.left() + extra, pos, - slider->rect.left() + tickSize, pos)); - } - if (ticksBelow) { - lines.append(QLine(slider->rect.right() - extra, pos, - slider->rect.right() - tickSize, pos)); - } - } - - // in the case where maximum is max int - int nextInterval = v + interval; - if (nextInterval < v) - break; - v = nextInterval; - } - painter->drawLines(lines.constData(), lines.size()); - painter->setPen(oldPen); - } - } - break; -#endif // QT_NO_SLIDER -#ifndef QT_NO_SPINBOX - case CC_SpinBox: - if (const QStyleOptionSpinBox *spinBox = qstyleoption_cast<const QStyleOptionSpinBox *>(option)) { - painter->save(); - bool upSunken = (spinBox->activeSubControls & SC_SpinBoxUp) && (spinBox->state & (State_Sunken | State_On)); - bool downSunken = (spinBox->activeSubControls & SC_SpinBoxDown) && (spinBox->state & (State_Sunken | State_On)); - bool reverse = (spinBox->direction == Qt::RightToLeft); - - // Rects - QRect upRect = proxy()->subControlRect(CC_SpinBox, option, SC_SpinBoxUp, widget); - QRect downRect = proxy()->subControlRect(CC_SpinBox, option, SC_SpinBoxDown, widget); - QRect buttonRect = upRect | downRect; - - // Brushes - QBrush corner = qMapBrushToRect(option->palette.shadow(), buttonRect); - qBrushSetAlphaF(&corner, qreal(0.25)); - QBrush border = qMapBrushToRect(option->palette.shadow(), buttonRect); - qBrushSetAlphaF(&border, qreal(0.4)); - - QVarLengthArray<QPoint, 4> points; - - Q_D(const QPlastiqueStyle); - if (spinBox->buttonSymbols == QAbstractSpinBox::NoButtons) { - QRect filledRect = option->rect.adjusted(1, 1, -1, -1); - QBrush baseBrush = qMapBrushToRect(option->palette.base(), filledRect); - painter->setBrushOrigin(filledRect.topLeft()); - painter->fillRect(filledRect.adjusted(1, 1, -1, -1), baseBrush); - qt_plastique_draw_frame(painter, option->rect, option, QFrame::Sunken); - } else { - d->drawPartialFrame(painter, - option, - proxy()->subControlRect(CC_SpinBox, spinBox, SC_SpinBoxEditField, widget), - widget); - } - // Paint buttons - if (spinBox->buttonSymbols == QAbstractSpinBox::NoButtons) { - painter->restore(); - break; - } - // Button outlines - painter->setPen(QPen(border, 0)); - if (!reverse) - painter->drawLine(buttonRect.topLeft() + QPoint(0, 1), buttonRect.bottomLeft() + QPoint(0, -1)); - else - painter->drawLine(buttonRect.topRight() + QPoint(0, -1), buttonRect.bottomRight() + QPoint(0, 1)); - - if (!reverse) { - const QLine lines[4] = { - QLine(upRect.left(), upRect.top(), upRect.right() - 2, upRect.top()), - QLine(upRect.left() + 1, upRect.bottom(), upRect.right() - 1, upRect.bottom()), - QLine(downRect.left(), downRect.bottom(), downRect.right() - 2, downRect.bottom()), - QLine(buttonRect.right(), buttonRect.top() + 2, buttonRect.right(), buttonRect.bottom() - 2) }; - painter->drawLines(lines, 4); - - points.append(QPoint(upRect.right() - 1, upRect.top() + 1)); - points.append(QPoint(downRect.right() - 1, downRect.bottom() - 1)); - painter->drawPoints(points.constData(), points.size()); - points.clear(); - painter->setPen(QPen(corner, 0)); - points.append(QPoint(upRect.right() - 1, upRect.top())); - points.append(QPoint(upRect.right(), upRect.top() + 1)); - points.append(QPoint(upRect.right(), downRect.bottom() - 1)); - points.append(QPoint(upRect.right() - 1, downRect.bottom())); - } else { - const QLine lines[4] = { - QLine(upRect.right(), upRect.top(), upRect.left() + 2, upRect.top()), - QLine(upRect.right() - 1, upRect.bottom(), upRect.left() + 1, upRect.bottom()), - QLine(downRect.right(), downRect.bottom(), downRect.left() + 2, downRect.bottom()), - QLine(buttonRect.left(), buttonRect.top() + 2, buttonRect.left(), buttonRect.bottom() - 2) }; - painter->drawLines(lines, 4); - - points.append(QPoint(upRect.left() + 1, upRect.top() + 1)); - points.append(QPoint(downRect.left() + 1, downRect.bottom() - 1)); - painter->drawPoints(points.constData(), points.size()); - points.clear(); - painter->setPen(QPen(corner, 0)); - points.append(QPoint(upRect.left() + 1, upRect.top())); - points.append(QPoint(upRect.left(), upRect.top() + 1)); - points.append(QPoint(upRect.left(), downRect.bottom() - 1)); - points.append(QPoint(upRect.left() + 1, downRect.bottom())); - } - painter->drawPoints(points.constData(), points.size()); - points.clear(); - - // Button colors - QBrush buttonGradientBrush; - QBrush leftLineGradientBrush; - QBrush rightLineGradientBrush; - QBrush sunkenButtonGradientBrush; - QBrush sunkenLeftLineGradientBrush; - QBrush sunkenRightLineGradientBrush; - QBrush buttonBrush = qMapBrushToRect(option->palette.button(), buttonRect); - if (buttonBrush.gradient() || !buttonBrush.texture().isNull()) { - buttonGradientBrush = buttonBrush; - sunkenButtonGradientBrush = qBrushDark(buttonBrush, 108); - leftLineGradientBrush = qBrushLight(buttonBrush, 105); - rightLineGradientBrush = qBrushDark(buttonBrush, 105); - sunkenLeftLineGradientBrush = qBrushDark(buttonBrush, 110); - sunkenRightLineGradientBrush = qBrushDark(buttonBrush, 106); - } else { - // Generate gradients - QLinearGradient buttonGradient(buttonRect.topLeft(), buttonRect.bottomLeft()); - buttonGradient.setColorAt(0.0, buttonBrush.color().lighter(104)); - buttonGradient.setColorAt(1.0, buttonBrush.color().darker(110)); - buttonGradientBrush = QBrush(buttonGradient); - - QLinearGradient buttonGradient2(buttonRect.topLeft(), buttonRect.bottomLeft()); - buttonGradient2.setColorAt(0.0, buttonBrush.color().darker(113)); - buttonGradient2.setColorAt(1.0, buttonBrush.color().darker(103)); - sunkenButtonGradientBrush = QBrush(buttonGradient2); - - QLinearGradient buttonGradient3(buttonRect.topLeft(), buttonRect.bottomLeft()); - buttonGradient3.setColorAt(0.0, buttonBrush.color().lighter(105)); - buttonGradient3.setColorAt(1.0, buttonBrush.color()); - leftLineGradientBrush = QBrush(buttonGradient3); - - QLinearGradient buttonGradient4(buttonRect.topLeft(), buttonRect.bottomLeft()); - buttonGradient4.setColorAt(0.0, buttonBrush.color()); - buttonGradient4.setColorAt(1.0, buttonBrush.color().darker(110)); - rightLineGradientBrush = QBrush(buttonGradient4); - - QLinearGradient buttonGradient5(buttonRect.topLeft(), buttonRect.bottomLeft()); - buttonGradient5.setColorAt(0.0, buttonBrush.color().darker(113)); - buttonGradient5.setColorAt(1.0, buttonBrush.color().darker(107)); - sunkenLeftLineGradientBrush = QBrush(buttonGradient5); - - QLinearGradient buttonGradient6(buttonRect.topLeft(), buttonRect.bottomLeft()); - buttonGradient6.setColorAt(0.0, buttonBrush.color().darker(108)); - buttonGradient6.setColorAt(1.0, buttonBrush.color().darker(103)); - sunkenRightLineGradientBrush = QBrush(buttonGradient6); - } - - // Main fill - painter->fillRect(upRect.adjusted(2, 2, -2, -2), - qMapBrushToRect(upSunken ? sunkenButtonGradientBrush - : buttonGradientBrush, upRect)); - painter->fillRect(downRect.adjusted(2, 2, -2, -2), - qMapBrushToRect(downSunken ? sunkenButtonGradientBrush - : buttonGradientBrush, downRect)); - - // Top line - painter->setPen(QPen(qBrushLight(qMapBrushToRect(upSunken ? sunkenButtonGradientBrush - : buttonGradientBrush, upRect), 105), 0)); - if (!reverse) { - painter->drawLine(upRect.left() + 1, upRect.top() + 1, - upRect.right() - 2, upRect.top() + 1); - } else { - painter->drawLine(upRect.right() - 1, upRect.top() + 1, - upRect.left() + 2, upRect.top() + 1); - } - painter->setPen(QPen(qBrushLight(qMapBrushToRect(downSunken ? sunkenButtonGradientBrush - : buttonGradientBrush, downRect), 105), 0)); - if (!reverse) { - painter->drawLine(downRect.left() + 1, downRect.top() + 1, - downRect.right() - 1, downRect.top() + 1); - } else { - painter->drawLine(downRect.right() - 1, downRect.top() + 1, - downRect.left() + 1, downRect.top() + 1); - } - - // Left line - painter->setPen(QPen(qMapBrushToRect(upSunken ? sunkenLeftLineGradientBrush - : leftLineGradientBrush, upRect), 1)); - if (!reverse) { - painter->drawLine(upRect.left() + 1, upRect.top() + 2, - upRect.left() + 1, upRect.bottom() - 1); - } else { - painter->drawLine(upRect.left() + 1, upRect.top() + 2, - upRect.left() + 1, upRect.bottom() - 1); - } - painter->setPen(QPen(qMapBrushToRect(downSunken ? sunkenLeftLineGradientBrush - : leftLineGradientBrush, downRect), 1)); - if (!reverse) { - painter->drawLine(downRect.left() + 1, downRect.top() + 2, - downRect.left() + 1, downRect.bottom() - 1); - } else { - painter->drawLine(downRect.left() + 1, downRect.top() + 1, - downRect.left() + 1, downRect.bottom() - 2); - } - - // Bottom line - painter->setPen(QPen(qBrushDark(qMapBrushToRect(upSunken ? sunkenButtonGradientBrush - : buttonGradientBrush, upRect), 105), 0)); - if (!reverse) { - painter->drawLine(upRect.left() + 2, upRect.bottom() - 1, - upRect.right() - 1, upRect.bottom() - 1); - } else { - painter->drawLine(upRect.right() - 2, upRect.bottom() - 1, - upRect.left() + 1, upRect.bottom() - 1); - } - painter->setPen(QPen(qBrushDark(qMapBrushToRect(downSunken ? sunkenButtonGradientBrush - : buttonGradientBrush, downRect), 105), 0)); - if (!reverse) { - painter->drawLine(downRect.left() + 2, downRect.bottom() - 1, - downRect.right() - 2, downRect.bottom() - 1); - } else { - painter->drawLine(downRect.right() - 2, downRect.bottom() - 1, - downRect.left() + 2, downRect.bottom() - 1); - } - - // Right line - painter->setPen(QPen(qMapBrushToRect(upSunken ? sunkenRightLineGradientBrush - : rightLineGradientBrush, upRect), 1)); - if (!reverse) { - painter->drawLine(upRect.right() - 1, upRect.top() + 2, - upRect.right() - 1, upRect.bottom() - 1); - } else { - painter->drawLine(upRect.right() - 1, upRect.top() + 2, - upRect.right() - 1, upRect.bottom() - 1); - } - painter->setPen(QPen(qMapBrushToRect(downSunken ? sunkenRightLineGradientBrush - : rightLineGradientBrush, downRect), 1)); - if (!reverse) { - painter->drawLine(downRect.right() - 1, downRect.top() + 1, - downRect.right() - 1, downRect.bottom() - 2); - } else { - painter->drawLine(downRect.right() - 1, downRect.top() + 2, - downRect.right() - 1, downRect.bottom() - 1); - } - - QBrush indicatorBrush = qMapBrushToRect(option->palette.buttonText(), buttonRect); - painter->setPen(QPen(indicatorBrush, 0)); - if (spinBox->buttonSymbols == QAbstractSpinBox::PlusMinus) { - QPoint center; - if (spinBox->subControls & SC_SpinBoxUp) { - // ....... - // ...X... - // ...X... - // .XXXXX. - // ...X... - // ...X... - // ....... - center = upRect.center(); - if (upSunken) { - ++center.rx(); - ++center.ry(); - } - painter->drawLine(center.x(), center.y() - 2, center.x(), center.y() + 2); - painter->drawLine(center.x() - 2, center.y(), center.x() + 2, center.y()); - } - if (spinBox->subControls & SC_SpinBoxDown) { - // ....... - // ....... - // ....... - // .XXXXX. - // ....... - // ....... - // ....... - center = downRect.center(); - if (downSunken) { - ++center.rx(); - ++center.ry(); - } - painter->drawLine(center.x() - 2, center.y(), center.x() + 2, center.y()); - } - } else { - int offset; - int centerX; - if (spinBox->subControls & SC_SpinBoxUp) { - // ........... - // .....X..... - // ....XXX.... - // ...XXXXX... - // ..XXXXXXX.. - // ........... - offset = upSunken ? 1 : 0; - QRect upArrowRect(upRect.center().x() - 3 + offset, upRect.center().y() - 2 + offset, 7, 4); - centerX = upArrowRect.center().x(); - painter->drawPoint(centerX, upArrowRect.top()); - const QLine lines[3] = { - QLine(centerX - 1, upArrowRect.top() + 1, centerX + 1, upArrowRect.top() + 1), - QLine(centerX - 2, upArrowRect.top() + 2, centerX + 2, upArrowRect.top() + 2), - QLine(centerX - 3, upArrowRect.top() + 3, centerX + 3, upArrowRect.top() + 3) }; - painter->drawLines(lines, 3); - } - if (spinBox->subControls & SC_SpinBoxDown) { - // ........... - // ..XXXXXXX.. - // ...XXXXX... - // ....XXX.... - // .....X..... - // ........... - offset = downSunken ? 1 : 0; - QRect downArrowRect(downRect.center().x() - 3 + offset, downRect.center().y() - 2 + offset + 1, 7, 4); - centerX = downArrowRect.center().x(); - const QLine lines[3] = { - QLine(centerX - 3, downArrowRect.top(), centerX + 3, downArrowRect.top()), - QLine(centerX - 2, downArrowRect.top() + 1, centerX + 2, downArrowRect.top() + 1), - QLine(centerX - 1, downArrowRect.top() + 2, centerX + 1, downArrowRect.top() + 2) }; - painter->drawLines(lines, 3); - painter->drawPoint(centerX, downArrowRect.top() + 3); - } - } - painter->restore(); - } - break; -#endif // QT_NO_SPINBOX -#ifndef QT_NO_COMBOBOX - case CC_ComboBox: - if (const QStyleOptionComboBox *comboBox = qstyleoption_cast<const QStyleOptionComboBox *>(option)) { - bool sunken = comboBox->state & State_On; // play dead if combobox has no items - bool reverse = comboBox->direction == Qt::RightToLeft; - int menuButtonWidth = 16; - int xoffset = sunken ? (reverse ? -1 : 1) : 0; - int yoffset = sunken ? 1 : 0; - QRect rect = comboBox->rect; - QPen oldPen = painter->pen(); - - // Fill - if (comboBox->editable) { - // Button colors - QBrush alphaCornerBrush = qBrushDark(option->palette.button(), 165); - qBrushSetAlphaF(&alphaCornerBrush, 0.5); - QBrush buttonGradientBrush; - QBrush leftLineGradientBrush; - QBrush rightLineGradientBrush; - QBrush sunkenButtonGradientBrush; - QBrush sunkenLeftLineGradientBrush; - QBrush sunkenRightLineGradientBrush; - QBrush button = option->palette.button(); - if (button.gradient() || !button.texture().isNull()) { - buttonGradientBrush = button; - sunkenButtonGradientBrush = qBrushDark(button, 108); - leftLineGradientBrush = qBrushLight(button, 105); - rightLineGradientBrush = qBrushDark(button, 105); - sunkenLeftLineGradientBrush = qBrushDark(button, 110); - sunkenRightLineGradientBrush = qBrushDark(button, 106); - } else { - // Generate gradients - QLinearGradient buttonGradient(option->rect.topLeft(), option->rect.bottomLeft()); - buttonGradient.setColorAt(0.0, button.color().lighter(104)); - buttonGradient.setColorAt(1.0, button.color().darker(110)); - buttonGradientBrush = QBrush(buttonGradient); - - QLinearGradient buttonGradient2(option->rect.topLeft(), option->rect.bottomLeft()); - buttonGradient2.setColorAt(0.0, button.color().darker(113)); - buttonGradient2.setColorAt(1.0, button.color().darker(103)); - sunkenButtonGradientBrush = QBrush(buttonGradient2); - - QLinearGradient buttonGradient3(option->rect.topLeft(), option->rect.bottomLeft()); - buttonGradient3.setColorAt(0.0, button.color().lighter(105)); - buttonGradient3.setColorAt(1.0, button.color()); - leftLineGradientBrush = QBrush(buttonGradient3); - - QLinearGradient buttonGradient4(option->rect.topLeft(), option->rect.bottomLeft()); - buttonGradient4.setColorAt(0.0, button.color()); - buttonGradient4.setColorAt(1.0, button.color().darker(110)); - rightLineGradientBrush = QBrush(buttonGradient4); - - QLinearGradient buttonGradient5(option->rect.topLeft(), option->rect.bottomLeft()); - buttonGradient5.setColorAt(0.0, button.color().darker(113)); - buttonGradient5.setColorAt(1.0, button.color().darker(107)); - sunkenLeftLineGradientBrush = QBrush(buttonGradient5); - - QLinearGradient buttonGradient6(option->rect.topLeft(), option->rect.bottomLeft()); - buttonGradient6.setColorAt(0.0, button.color().darker(108)); - buttonGradient6.setColorAt(1.0, button.color().darker(103)); - sunkenRightLineGradientBrush = QBrush(buttonGradient6); - } - - // ComboBox starts with a lineedit in place already. - QRect buttonRect; - if (!reverse) { - buttonRect.setRect(rect.right() - menuButtonWidth, rect.top(), menuButtonWidth + 1, rect.height()); - } else { - buttonRect.setRect(rect.left(), rect.top(), menuButtonWidth + 1, rect.height()); - } - - Q_D(const QPlastiqueStyle); - d->drawPartialFrame(painter, - option, - proxy()->subControlRect(CC_ComboBox, option, SC_ComboBoxEditField, widget), - widget); - - QBrush border = qMapBrushToRect(option->palette.shadow(), buttonRect); - qBrushSetAlphaF(&border, qreal(0.4)); - painter->setPen(QPen(border, 0)); - if (!reverse) - painter->drawLine(buttonRect.topLeft() + QPoint(0, 1), buttonRect.bottomLeft() + QPoint(0, -1)); - else - painter->drawLine(buttonRect.topRight() + QPoint(0, -1), buttonRect.bottomRight() + QPoint(0, 1)); - - // Outline the button border - if (!reverse) { - const QLine lines[3] = { - QLine(buttonRect.left(), buttonRect.top(), - buttonRect.right() - 2, buttonRect.top()), - QLine(buttonRect.right(), buttonRect.top() + 2, - buttonRect.right(), buttonRect.bottom() - 2), - QLine(buttonRect.left(), buttonRect.bottom(), - buttonRect.right() - 2, buttonRect.bottom()) }; - painter->drawLines(lines, 3); - { - const QPoint points[2] = { - QPoint(buttonRect.right() - 1, buttonRect.top() + 1), - QPoint(buttonRect.right() - 1, buttonRect.bottom() - 1) }; - painter->drawPoints(points, 2); - } - - QBrush corner = qMapBrushToRect(option->palette.shadow(), buttonRect); - qBrushSetAlphaF(&corner, qreal(0.16)); - painter->setPen(QPen(corner, 0)); - { - const QPoint points[4] = { - QPoint(buttonRect.right() - 1, buttonRect.top()), - QPoint(buttonRect.right() - 1, buttonRect.bottom()), - QPoint(buttonRect.right(), buttonRect.top() + 1), - QPoint(buttonRect.right(), buttonRect.bottom() - 1) }; - painter->drawPoints(points, 4); - } - } else { - const QLine lines[3] = { - QLine(buttonRect.right(), buttonRect.top(), - buttonRect.left() + 2, buttonRect.top()), - QLine(buttonRect.left(), buttonRect.top() + 2, - buttonRect.left(), buttonRect.bottom() - 2), - QLine(buttonRect.right(), buttonRect.bottom(), - buttonRect.left() + 2, buttonRect.bottom()) }; - painter->drawLines(lines, 3); - { - const QPoint points[2] = { - QPoint(buttonRect.left() + 1, buttonRect.top() + 1), - QPoint(buttonRect.left() + 1, buttonRect.bottom() - 1) }; - painter->drawPoints(points, 2); - } - - QBrush corner = qMapBrushToRect(option->palette.shadow(), buttonRect); - qBrushSetAlphaF(&corner, qreal(0.16)); - painter->setPen(QPen(corner, 0)); - { - const QPoint points[4] = { - QPoint(buttonRect.left() + 1, buttonRect.top()), - QPoint(buttonRect.left() + 1, buttonRect.bottom()), - QPoint(buttonRect.left(), buttonRect.top() + 1), - QPoint(buttonRect.left(), buttonRect.bottom() - 1) }; - painter->drawPoints(points, 4); - } - } - - QRect fillRect = buttonRect.adjusted(2, 2, -2, -2); - // Main fill - painter->fillRect(fillRect, - qMapBrushToRect(sunken ? sunkenButtonGradientBrush - : buttonGradientBrush, option->rect)); - - // Top line - painter->setPen(QPen(qBrushLight(qMapBrushToRect(sunken ? sunkenButtonGradientBrush - : buttonGradientBrush, option->rect), 105), 0)); - if (!reverse) { - painter->drawLine(QPointF(buttonRect.left() + 1, buttonRect.top() + 1), - QPointF(buttonRect.right() - 2, buttonRect.top() + 1)); - } else { - painter->drawLine(QPointF(buttonRect.right() - 1, buttonRect.top() + 1), - QPointF(buttonRect.left() + 2, buttonRect.top() + 1)); - } - - // Bottom line - painter->setPen(QPen(qBrushDark(qMapBrushToRect(sunken ? sunkenButtonGradientBrush - : buttonGradientBrush, option->rect), 105), 0)); - if (!reverse) { - painter->drawLine(QPointF(buttonRect.left() + 1, buttonRect.bottom() - 1), - QPointF(buttonRect.right() - 2, buttonRect.bottom() - 1)); - } else { - painter->drawLine(QPointF(buttonRect.right() - 1, buttonRect.bottom() - 1), - QPointF(buttonRect.left() + 2, buttonRect.bottom() - 1)); - } - - // Left line - painter->setPen(QPen(qMapBrushToRect(sunken ? sunkenLeftLineGradientBrush - : leftLineGradientBrush, option->rect), 1)); - if (!reverse) { - painter->drawLine(QPointF(buttonRect.left() + 1, buttonRect.top() + 2), - QPointF(buttonRect.left() + 1, buttonRect.bottom() - 2)); - } else { - painter->drawLine(QPointF(buttonRect.left() + 1, buttonRect.top() + 2), - QPointF(buttonRect.left() + 1, buttonRect.bottom() - 2)); - } - - // Right line - painter->setPen(QPen(qMapBrushToRect(sunken ? sunkenRightLineGradientBrush - : rightLineGradientBrush, option->rect), 1)); - if (!reverse) { - painter->drawLine(QPointF(buttonRect.right() - 1, buttonRect.top() + 2), - QPointF(buttonRect.right() - 1, buttonRect.bottom() - 2)); - } else { - painter->drawLine(QPointF(buttonRect.right() - 1, buttonRect.top() + 2), - QPointF(buttonRect.right() - 1, buttonRect.bottom() - 2)); - } - } else { - // Start with a standard panel button fill - QStyleOptionButton buttonOption; - buttonOption.QStyleOption::operator=(*comboBox); - if (!sunken) { - buttonOption.state &= ~State_Sunken; - } - proxy()->drawPrimitive(PE_PanelButtonCommand, &buttonOption, painter, widget); - - // Draw the menu button separator line - QBrush border = qMapBrushToRect(option->palette.shadow(), rect); - qBrushSetAlphaF(&border, qreal(0.35)); - painter->setPen(QPen(border, 0)); - if (!reverse) { - painter->drawLine(rect.right() - menuButtonWidth + xoffset, rect.top() + 1, - rect.right() - menuButtonWidth + xoffset, rect.bottom() - 1); - } else { - painter->drawLine(rect.left() + menuButtonWidth + xoffset, rect.top() + 1, - rect.left() + menuButtonWidth + xoffset, rect.bottom() - 1); - } - } - - // Draw the little arrow - if (comboBox->subControls & SC_ComboBoxArrow) { - int left = !reverse ? rect.right() - menuButtonWidth : rect.left(); - int right = !reverse ? rect.right() : rect.left() + menuButtonWidth; - QRect arrowRect((left + right) / 2 - 3 + xoffset, - rect.center().y() - 1 + yoffset, 7, 4); - painter->setPen(QPen(qMapBrushToRect(option->palette.buttonText(), rect), 0)); - const QLine lines[3] = { - QLine(arrowRect.topLeft(), arrowRect.topRight()), - QLine(arrowRect.left() + 1, arrowRect.top() + 1, - arrowRect.right() - 1, arrowRect.top() + 1), - QLine(arrowRect.left() + 2, arrowRect.top() + 2, - arrowRect.right() - 2, arrowRect.top() + 2) }; - painter->drawLines(lines, 3); - painter->drawPoint(arrowRect.center().x(), arrowRect.bottom()); - } - - // Draw the focus rect - if ((option->state & State_HasFocus) && !comboBox->editable - && ((option->state & State_KeyboardFocusChange) || styleHint(SH_UnderlineShortcut, option, widget))) { - QStyleOptionFocusRect focus; - focus.rect = proxy()->subControlRect(CC_ComboBox, option, SC_ComboBoxEditField, widget) - .adjusted(-2, 0, 2, 0); - proxy()->drawPrimitive(PE_FrameFocusRect, &focus, painter, widget); - } - - painter->setPen(oldPen); - } - break; -#endif // QT_NO_COMBOBOX - case CC_TitleBar: - if (const QStyleOptionTitleBar *titleBar = qstyleoption_cast<const QStyleOptionTitleBar *>(option)) { - painter->save(); - bool active = (titleBar->titleBarState & State_Active); - QRect fullRect = titleBar->rect; - - // ### use palette colors instead - QColor titleBarGradientStart(active ? 0x3b508a : 0x6e6e6e); - QColor titleBarGradientStop(active ? 0x5d6e9e : 0x818181); - QColor titleBarFrameBorder(0x393939); - QColor titleBarAlphaCorner(active ? 0x4b5e7f : 0x6a6a6a); - QColor titleBarInnerTopLine(active ? 0x8e98ba : 0xa4a4a4); - QColor titleBarInnerInnerTopLine(active ? 0x57699b : 0x808080); - QColor leftCorner(active ? 0x6f7ea8 : 0x8e8e8e); - QColor rightCorner(active ? 0x44537d : 0x676767); - QColor textColor(active ? 0x282e40 : 0x282e40); - QColor textAlphaColor(active ? 0x3f4862 : 0x3f4862); - - - { - // Fill title bar gradient - qt_plastique_draw_gradient(painter, option->rect.adjusted(1, 1, -1, 0), - titleBarGradientStart, - titleBarGradientStop); - - // Frame and rounded corners - painter->setPen(titleBarFrameBorder); - - // top border line - { - const QLine lines[3] = { - QLine(fullRect.left() + 2, fullRect.top(), fullRect.right() - 2, fullRect.top()), - QLine(fullRect.left(), fullRect.top() + 2, fullRect.left(), fullRect.bottom()), - QLine(fullRect.right(), fullRect.top() + 2, fullRect.right(), fullRect.bottom()) }; - painter->drawLines(lines, 3); - const QPoint points[2] = { - QPoint(fullRect.left() + 1, fullRect.top() + 1), - QPoint(fullRect.right() - 1, fullRect.top() + 1) }; - painter->drawPoints(points, 2); - } - - // alpha corners - painter->setPen(titleBarAlphaCorner); - { - const QPoint points[4] = { - QPoint(fullRect.left() + 2, fullRect.top() + 1), - QPoint(fullRect.left() + 1, fullRect.top() + 2), - QPoint(fullRect.right() - 2, fullRect.top() + 1), - QPoint(fullRect.right() - 1, fullRect.top() + 2) }; - painter->drawPoints(points, 4); - } - - // inner top line - painter->setPen(titleBarInnerTopLine); - painter->drawLine(fullRect.left() + 3, fullRect.top() + 1, fullRect.right() - 3, fullRect.top() + 1); - - // inner inner top line - painter->setPen(titleBarInnerInnerTopLine); - painter->drawLine(fullRect.left() + 2, fullRect.top() + 2, fullRect.right() - 2, fullRect.top() + 2); - - // left and right inner - painter->setPen(leftCorner); - painter->drawLine(fullRect.left() + 1, fullRect.top() + 3, fullRect.left() + 1, fullRect.bottom()); - painter->setPen(rightCorner); - painter->drawLine(fullRect.right() - 1, fullRect.top() + 3, fullRect.right() - 1, fullRect.bottom()); - - if (titleBar->titleBarState & Qt::WindowMinimized) { - painter->setPen(titleBarFrameBorder); - painter->drawLine(fullRect.left() + 2, fullRect.bottom(), fullRect.right() - 2, fullRect.bottom()); - { - const QPoint points[2] = { - QPoint(fullRect.left() + 1, fullRect.bottom() - 1), - QPoint(fullRect.right() - 1, fullRect.bottom() - 1) }; - painter->drawPoints(points, 2); - } - painter->setPen(rightCorner); - painter->drawLine(fullRect.left() + 2, fullRect.bottom() - 1, fullRect.right() - 2, fullRect.bottom() - 1); - painter->setPen(titleBarAlphaCorner); - { - const QPoint points[4] = { - QPoint(fullRect.left() + 1, fullRect.bottom() - 2), - QPoint(fullRect.left() + 2, fullRect.bottom() - 1), - QPoint(fullRect.right() - 1, fullRect.bottom() - 2), - QPoint(fullRect.right() - 2, fullRect.bottom() - 1) }; - painter->drawPoints(points, 4); - } - } - // draw title - QRect textRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarLabel, widget); - - QFont font = painter->font(); - font.setBold(true); - painter->setFont(font); - painter->setPen(titleBar->palette.text().color()); - - // Attempt to align left if there is not enough room for the title - // text. Otherwise, align center. QWorkspace does elliding for us, - // and it doesn't know about the bold title, so we need to work - // around some of the width mismatches. - bool tooWide = (QFontMetrics(font).width(titleBar->text) > textRect.width()); - QTextOption option((tooWide ? Qt::AlignLeft : Qt::AlignHCenter) | Qt::AlignVCenter); - option.setWrapMode(QTextOption::NoWrap); - - painter->drawText(textRect.adjusted(1, 1, 1, 1), titleBar->text, option); - painter->setPen(titleBar->palette.highlightedText().color()); - painter->drawText(textRect, titleBar->text, option); - } - - // min button - if ((titleBar->subControls & SC_TitleBarMinButton) - && (titleBar->titleBarFlags & Qt::WindowMinimizeButtonHint) - && !(titleBar->titleBarState & Qt::WindowMinimized)) { - bool hover = (titleBar->activeSubControls & SC_TitleBarMinButton) && (titleBar->state & State_MouseOver); - bool sunken = (titleBar->activeSubControls & SC_TitleBarMinButton) && (titleBar->state & State_Sunken); - - QRect minButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarMinButton, widget); - qt_plastique_draw_mdibutton(painter, titleBar, minButtonRect, hover, sunken); - - int xoffset = minButtonRect.width() / 3; - int yoffset = minButtonRect.height() / 3; - - QRect minButtonIconRect(minButtonRect.left() + xoffset, minButtonRect.top() + yoffset, - minButtonRect.width() - xoffset * 2, minButtonRect.height() - yoffset * 2); - - painter->setPen(textColor); - { - const QLine lines[2] = { - QLine(minButtonIconRect.center().x() - 2, - minButtonIconRect.center().y() + 3, - minButtonIconRect.center().x() + 3, - minButtonIconRect.center().y() + 3), - QLine(minButtonIconRect.center().x() - 2, - minButtonIconRect.center().y() + 4, - minButtonIconRect.center().x() + 3, - minButtonIconRect.center().y() + 4) }; - painter->drawLines(lines, 2); - } - painter->setPen(textAlphaColor); - { - const QLine lines[2] = { - QLine(minButtonIconRect.center().x() - 3, - minButtonIconRect.center().y() + 3, - minButtonIconRect.center().x() - 3, - minButtonIconRect.center().y() + 4), - QLine(minButtonIconRect.center().x() + 4, - minButtonIconRect.center().y() + 3, - minButtonIconRect.center().x() + 4, - minButtonIconRect.center().y() + 4) }; - painter->drawLines(lines, 2); - } - } - - // max button - if ((titleBar->subControls & SC_TitleBarMaxButton) - && (titleBar->titleBarFlags & Qt::WindowMaximizeButtonHint) - && !(titleBar->titleBarState & Qt::WindowMaximized)) { - bool hover = (titleBar->activeSubControls & SC_TitleBarMaxButton) && (titleBar->state & State_MouseOver); - bool sunken = (titleBar->activeSubControls & SC_TitleBarMaxButton) && (titleBar->state & State_Sunken); - - QRect maxButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarMaxButton, widget); - qt_plastique_draw_mdibutton(painter, titleBar, maxButtonRect, hover, sunken); - - int xoffset = maxButtonRect.width() / 3; - int yoffset = maxButtonRect.height() / 3; - - QRect maxButtonIconRect(maxButtonRect.left() + xoffset, maxButtonRect.top() + yoffset, - maxButtonRect.width() - xoffset * 2, maxButtonRect.height() - yoffset * 2); - - painter->setPen(textColor); - painter->drawRect(maxButtonIconRect.adjusted(0, 0, -1, -1)); - painter->drawLine(maxButtonIconRect.left() + 1, maxButtonIconRect.top() + 1, - maxButtonIconRect.right() - 1, maxButtonIconRect.top() + 1); - painter->setPen(textAlphaColor); - const QPoint points[4] = { - maxButtonIconRect.topLeft(), maxButtonIconRect.topRight(), - maxButtonIconRect.bottomLeft(), maxButtonIconRect.bottomRight() }; - painter->drawPoints(points, 4); - } - - // close button - if (titleBar->subControls & SC_TitleBarCloseButton && titleBar->titleBarFlags & Qt::WindowSystemMenuHint) { - bool hover = (titleBar->activeSubControls & SC_TitleBarCloseButton) && (titleBar->state & State_MouseOver); - bool sunken = (titleBar->activeSubControls & SC_TitleBarCloseButton) && (titleBar->state & State_Sunken); - - QRect closeButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarCloseButton, widget); - qt_plastique_draw_mdibutton(painter, titleBar, closeButtonRect, hover, sunken); - - int xoffset = closeButtonRect.width() / 3; - int yoffset = closeButtonRect.height() / 3; - - QRect closeIconRect(closeButtonRect.left() + xoffset, closeButtonRect.top() + yoffset, - closeButtonRect.width() - xoffset * 2, closeButtonRect.height() - yoffset * 2); - - painter->setPen(textAlphaColor); - { - const QLine lines[4] = { - QLine(closeIconRect.left() + 1, closeIconRect.top(), - closeIconRect.right(), closeIconRect.bottom() - 1), - QLine(closeIconRect.left(), closeIconRect.top() + 1, - closeIconRect.right() - 1, closeIconRect.bottom()), - QLine(closeIconRect.right() - 1, closeIconRect.top(), - closeIconRect.left(), closeIconRect.bottom() - 1), - QLine(closeIconRect.right(), closeIconRect.top() + 1, - closeIconRect.left() + 1, closeIconRect.bottom()) }; - painter->drawLines(lines, 4); - const QPoint points[4] = { - closeIconRect.topLeft(), closeIconRect.topRight(), - closeIconRect.bottomLeft(), closeIconRect.bottomRight() }; - painter->drawPoints(points, 4); - } - painter->setPen(textColor); - { - const QLine lines[2] = { - QLine(closeIconRect.left() + 1, closeIconRect.top() + 1, - closeIconRect.right() - 1, closeIconRect.bottom() - 1), - QLine(closeIconRect.left() + 1, closeIconRect.bottom() - 1, - closeIconRect.right() - 1, closeIconRect.top() + 1) }; - painter->drawLines(lines, 2); - } - } - - // normalize button - if ((titleBar->subControls & SC_TitleBarNormalButton) && - (((titleBar->titleBarFlags & Qt::WindowMinimizeButtonHint) && - (titleBar->titleBarState & Qt::WindowMinimized)) || - ((titleBar->titleBarFlags & Qt::WindowMaximizeButtonHint) && - (titleBar->titleBarState & Qt::WindowMaximized)))) { - bool hover = (titleBar->activeSubControls & SC_TitleBarNormalButton) && (titleBar->state & State_MouseOver); - bool sunken = (titleBar->activeSubControls & SC_TitleBarNormalButton) && (titleBar->state & State_Sunken); - - QRect normalButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarNormalButton, widget); - qt_plastique_draw_mdibutton(painter, titleBar, normalButtonRect, hover, sunken); - int xoffset = int(normalButtonRect.width() / 3.5); - int yoffset = int(normalButtonRect.height() / 3.5); - - QRect normalButtonIconRect(normalButtonRect.left() + xoffset, normalButtonRect.top() + yoffset, - normalButtonRect.width() - xoffset * 2, normalButtonRect.height() - yoffset * 2); - - QRect frontWindowRect = normalButtonIconRect.adjusted(0, 3, -3, 0); - painter->setPen(textColor); - painter->drawRect(frontWindowRect.adjusted(0, 0, -1, -1)); - painter->drawLine(frontWindowRect.left() + 1, frontWindowRect.top() + 1, - frontWindowRect.right() - 1, frontWindowRect.top() + 1); - painter->setPen(textAlphaColor); - { - const QPoint points[4] = { - frontWindowRect.topLeft(), frontWindowRect.topRight(), - frontWindowRect.bottomLeft(), frontWindowRect.bottomRight() }; - painter->drawPoints(points, 4); - } - - QRect backWindowRect = normalButtonIconRect.adjusted(3, 0, 0, -3); - QRegion clipRegion = backWindowRect; - clipRegion -= frontWindowRect; - painter->save(); - painter->setClipRegion(clipRegion); - painter->setPen(textColor); - painter->drawRect(backWindowRect.adjusted(0, 0, -1, -1)); - painter->drawLine(backWindowRect.left() + 1, backWindowRect.top() + 1, - backWindowRect.right() - 1, backWindowRect.top() + 1); - painter->setPen(textAlphaColor); - { - const QPoint points[4] = { - backWindowRect.topLeft(), backWindowRect.topRight(), - backWindowRect.bottomLeft(), backWindowRect.bottomRight() }; - painter->drawPoints(points, 4); - } - painter->restore(); - } - - // context help button - if (titleBar->subControls & SC_TitleBarContextHelpButton - && (titleBar->titleBarFlags & Qt::WindowContextHelpButtonHint)) { - bool hover = (titleBar->activeSubControls & SC_TitleBarContextHelpButton) && (titleBar->state & State_MouseOver); - bool sunken = (titleBar->activeSubControls & SC_TitleBarContextHelpButton) && (titleBar->state & State_Sunken); - - QRect contextHelpButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarContextHelpButton, widget); - - qt_plastique_draw_mdibutton(painter, titleBar, contextHelpButtonRect, hover, sunken); - - QColor blend; - // ### Use palette colors - if (active) { - blend = mergedColors(QColor(hover ? 0x7d8bb1 : 0x55689a), - QColor(hover ? 0x939ebe : 0x7381ab)); - } else { - blend = mergedColors(QColor(hover ? 0x9e9e9e : 0x818181), - QColor(hover ? 0xababab : 0x929292)); - } - QImage image(qt_titlebar_context_help); - image.setColor(4, textColor.rgba()); - image.setColor(3, mergedColors(blend, textColor, 30).rgba()); - image.setColor(2, mergedColors(blend, textColor, 70).rgba()); - image.setColor(1, mergedColors(blend, textColor, 90).rgba()); - - painter->drawImage(contextHelpButtonRect, image); - } - - // shade button - if (titleBar->subControls & SC_TitleBarShadeButton) { - bool hover = (titleBar->activeSubControls & SC_TitleBarShadeButton) && (titleBar->state & State_MouseOver); - bool sunken = (titleBar->activeSubControls & SC_TitleBarShadeButton) && (titleBar->state & State_Sunken); - - QRect shadeButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarShadeButton, widget); - qt_plastique_draw_mdibutton(painter, titleBar, shadeButtonRect, hover, sunken); - - int xoffset = shadeButtonRect.width() / 3; - int yoffset = shadeButtonRect.height() / 3; - - QRect shadeButtonIconRect(shadeButtonRect.left() + xoffset, shadeButtonRect.top() + yoffset, - shadeButtonRect.width() - xoffset * 2, shadeButtonRect.height() - yoffset * 2); - - QPainterPath path(shadeButtonIconRect.bottomLeft()); - path.lineTo(shadeButtonIconRect.center().x(), shadeButtonIconRect.bottom() - shadeButtonIconRect.height() / 2); - path.lineTo(shadeButtonIconRect.bottomRight()); - path.lineTo(shadeButtonIconRect.bottomLeft()); - - painter->setPen(textAlphaColor); - painter->setBrush(textColor); - painter->drawPath(path); - } - - // unshade button - if (titleBar->subControls & SC_TitleBarUnshadeButton) { - bool hover = (titleBar->activeSubControls & SC_TitleBarUnshadeButton) && (titleBar->state & State_MouseOver); - bool sunken = (titleBar->activeSubControls & SC_TitleBarUnshadeButton) && (titleBar->state & State_Sunken); - - QRect unshadeButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarUnshadeButton, widget); - qt_plastique_draw_mdibutton(painter, titleBar, unshadeButtonRect, hover, sunken); - - int xoffset = unshadeButtonRect.width() / 3; - int yoffset = unshadeButtonRect.height() / 3; - - QRect unshadeButtonIconRect(unshadeButtonRect.left() + xoffset, unshadeButtonRect.top() + yoffset, - unshadeButtonRect.width() - xoffset * 2, unshadeButtonRect.height() - yoffset * 2); - - int midY = unshadeButtonIconRect.bottom() - unshadeButtonIconRect.height() / 2; - QPainterPath path(QPoint(unshadeButtonIconRect.left(), midY)); - path.lineTo(unshadeButtonIconRect.right(), midY); - path.lineTo(unshadeButtonIconRect.center().x(), unshadeButtonIconRect.bottom()); - path.lineTo(unshadeButtonIconRect.left(), midY); - - painter->setPen(textAlphaColor); - painter->setBrush(textColor); - painter->drawPath(path); - } - - // from qwindowsstyle.cpp - if ((titleBar->subControls & SC_TitleBarSysMenu) && (titleBar->titleBarFlags & Qt::WindowSystemMenuHint)) { - bool hover = (titleBar->activeSubControls & SC_TitleBarSysMenu) && (titleBar->state & State_MouseOver); - bool sunken = (titleBar->activeSubControls & SC_TitleBarSysMenu) && (titleBar->state & State_Sunken); - - QRect iconRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarSysMenu, widget); - if (hover) - qt_plastique_draw_mdibutton(painter, titleBar, iconRect, hover, sunken); - - if (!titleBar->icon.isNull()) { - titleBar->icon.paint(painter, iconRect); - } else { - QStyleOption tool(0); - tool.palette = titleBar->palette; - QPixmap pm = standardPixmap(SP_TitleBarMenuButton, &tool, widget); - tool.rect = iconRect; - painter->save(); - proxy()->drawItemPixmap(painter, iconRect, Qt::AlignCenter, pm); - painter->restore(); - } - } - painter->restore(); - } - break; -#ifndef QT_NO_DIAL - case CC_Dial: - if (const QStyleOptionSlider *dial = qstyleoption_cast<const QStyleOptionSlider *>(option)) - QStyleHelper::drawDial(dial, painter); - break; -#endif // QT_NO_DIAL - default: - QWindowsStyle::drawComplexControl(control, option, painter, widget); - break; - } -} - -/*! - \reimp -*/ -QSize QPlastiqueStyle::sizeFromContents(ContentsType type, const QStyleOption *option, - const QSize &size, const QWidget *widget) const -{ - QSize newSize = QWindowsStyle::sizeFromContents(type, option, size, widget); - - switch (type) { - case CT_RadioButton: - ++newSize.rheight(); - ++newSize.rwidth(); - break; -#ifndef QT_NO_SLIDER - case CT_Slider: - if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(option)) { - int tickSize = proxy()->pixelMetric(PM_SliderTickmarkOffset, option, widget); - if (slider->tickPosition & QSlider::TicksBelow) { - if (slider->orientation == Qt::Horizontal) - newSize.rheight() += tickSize; - else - newSize.rwidth() += tickSize; - } - if (slider->tickPosition & QSlider::TicksAbove) { - if (slider->orientation == Qt::Horizontal) - newSize.rheight() += tickSize; - else - newSize.rwidth() += tickSize; - } - } - break; -#endif // QT_NO_SLIDER -#ifndef QT_NO_SCROLLBAR - case CT_ScrollBar: - if (const QStyleOptionSlider *scrollBar = qstyleoption_cast<const QStyleOptionSlider *>(option)) { - int scrollBarExtent = proxy()->pixelMetric(PM_ScrollBarExtent, option, widget); - int scrollBarSliderMinimum = proxy()->pixelMetric(PM_ScrollBarSliderMin, option, widget); - if (scrollBar->orientation == Qt::Horizontal) { - newSize = QSize(scrollBarExtent * 3 + scrollBarSliderMinimum, scrollBarExtent); - } else { - newSize = QSize(scrollBarExtent, scrollBarExtent * 3 + scrollBarSliderMinimum); - } - } - break; -#endif // QT_NO_SCROLLBAR -#ifndef QT_NO_SPINBOX - case CT_SpinBox: - // Make sure the size is odd - newSize.setHeight(sizeFromContents(CT_LineEdit, option, size, widget).height()); - newSize.rheight() -= ((1 - newSize.rheight()) & 1); - break; -#endif -#ifndef QT_NO_TOOLBUTTON - case CT_ToolButton: - newSize.rheight() += 3; - newSize.rwidth() += 3; - break; -#endif -#ifndef QT_NO_COMBOBOX - case CT_ComboBox: - newSize = sizeFromContents(CT_PushButton, option, size, widget); - newSize.rwidth() += 30; // Make room for drop-down indicator - newSize.rheight() += 4; - break; -#endif - case CT_MenuItem: - if (const QStyleOptionMenuItem *menuItem = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) { - if (menuItem->menuItemType == QStyleOptionMenuItem::Separator) - newSize.setHeight(menuItem->text.isEmpty() ? 2 : menuItem->fontMetrics.height()); - } - break; - case CT_MenuBarItem: - newSize.setHeight(newSize.height()); - break; - default: - break; - } - - return newSize; -} - -/*! - \reimp -*/ -QRect QPlastiqueStyle::subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget) const -{ - QRect rect; - switch (element) { - case SE_RadioButtonIndicator: - rect = visualRect(option->direction, option->rect, - QWindowsStyle::subElementRect(element, option, widget)).adjusted(0, 0, 1, 1); - break; - case SE_ProgressBarLabel: - case SE_ProgressBarContents: - case SE_ProgressBarGroove: - return option->rect; - default: - return QWindowsStyle::subElementRect(element, option, widget); - } - - return visualRect(option->direction, option->rect, rect); -} - -/*! - \reimp -*/ -QRect QPlastiqueStyle::subControlRect(ComplexControl control, const QStyleOptionComplex *option, - SubControl subControl, const QWidget *widget) const -{ - QRect rect = QWindowsStyle::subControlRect(control, option, subControl, widget); - - switch (control) { -#ifndef QT_NO_SLIDER - case CC_Slider: - if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(option)) { - int tickSize = proxy()->pixelMetric(PM_SliderTickmarkOffset, option, widget); - - switch (subControl) { - case SC_SliderHandle: - if (slider->orientation == Qt::Horizontal) { - rect.setWidth(11); - rect.setHeight(15); - int centerY = slider->rect.center().y() - rect.height() / 2; - if (slider->tickPosition & QSlider::TicksAbove) - centerY += tickSize; - if (slider->tickPosition & QSlider::TicksBelow) - centerY -= tickSize; - rect.moveTop(centerY); - } else { - rect.setWidth(15); - rect.setHeight(11); - int centerX = slider->rect.center().x() - rect.width() / 2; - if (slider->tickPosition & QSlider::TicksAbove) - centerX += tickSize; - if (slider->tickPosition & QSlider::TicksBelow) - centerX -= tickSize; - rect.moveLeft(centerX); - } - break; - case SC_SliderGroove: { - QPoint grooveCenter = slider->rect.center(); - if (slider->orientation == Qt::Horizontal) { - rect.setHeight(14); - --grooveCenter.ry(); - if (slider->tickPosition & QSlider::TicksAbove) - grooveCenter.ry() += tickSize; - if (slider->tickPosition & QSlider::TicksBelow) - grooveCenter.ry() -= tickSize; - } else { - rect.setWidth(14); - --grooveCenter.rx(); - if (slider->tickPosition & QSlider::TicksAbove) - grooveCenter.rx() += tickSize; - if (slider->tickPosition & QSlider::TicksBelow) - grooveCenter.rx() -= tickSize; - } - rect.moveCenter(grooveCenter); - break; - } - default: - break; - } - } - break; -#endif // QT_NO_SLIDER -#ifndef QT_NO_SCROLLBAR - case CC_ScrollBar: - if (const QStyleOptionSlider *scrollBar = qstyleoption_cast<const QStyleOptionSlider *>(option)) { - int scrollBarExtent = proxy()->pixelMetric(PM_ScrollBarExtent, scrollBar, widget); - int sliderMaxLength = ((scrollBar->orientation == Qt::Horizontal) ? - scrollBar->rect.width() : scrollBar->rect.height()) - (scrollBarExtent * 3); - int sliderMinLength = proxy()->pixelMetric(PM_ScrollBarSliderMin, scrollBar, widget); - int sliderLength; - - // calculate slider length - if (scrollBar->maximum != scrollBar->minimum) { - uint valueRange = scrollBar->maximum - scrollBar->minimum; - sliderLength = (scrollBar->pageStep * sliderMaxLength) / (valueRange + scrollBar->pageStep); - - if (sliderLength < sliderMinLength || valueRange > INT_MAX / 2) - sliderLength = sliderMinLength; - if (sliderLength > sliderMaxLength) - sliderLength = sliderMaxLength; - } else { - sliderLength = sliderMaxLength; - } - - int sliderStart = scrollBarExtent + sliderPositionFromValue(scrollBar->minimum, - scrollBar->maximum, - scrollBar->sliderPosition, - sliderMaxLength - sliderLength, - scrollBar->upsideDown); - - QRect scrollBarRect = scrollBar->rect; - - switch (subControl) { - case SC_ScrollBarSubLine: // top/left button - if (scrollBar->orientation == Qt::Horizontal) { - rect.setRect(scrollBarRect.left(), scrollBarRect.top(), scrollBarRect.width() - scrollBarExtent, scrollBarRect.height()); - } else { - rect.setRect(scrollBarRect.left(), scrollBarRect.top(), scrollBarRect.width(), scrollBarRect.height() - scrollBarExtent); - } - break; - case SC_ScrollBarAddLine: // bottom/right button - if (scrollBar->orientation == Qt::Horizontal) { - rect.setRect(scrollBarRect.right() - (scrollBarExtent - 1), scrollBarRect.top(), scrollBarExtent, scrollBarRect.height()); - } else { - rect.setRect(scrollBarRect.left(), scrollBarRect.bottom() - (scrollBarExtent - 1), scrollBarRect.width(), scrollBarExtent); - } - break; - case SC_ScrollBarSubPage: - if (scrollBar->orientation == Qt::Horizontal) { - rect.setRect(scrollBarRect.left() + scrollBarExtent, scrollBarRect.top(), - sliderStart - (scrollBarRect.left() + scrollBarExtent), scrollBarRect.height()); - } else { - rect.setRect(scrollBarRect.left(), scrollBarRect.top() + scrollBarExtent, - scrollBarRect.width(), sliderStart - (scrollBarRect.left() + scrollBarExtent)); - } - break; - case SC_ScrollBarAddPage: - if (scrollBar->orientation == Qt::Horizontal) - rect.setRect(sliderStart + sliderLength, 0, - sliderMaxLength - sliderStart - sliderLength + scrollBarExtent, scrollBarRect.height()); - else - rect.setRect(0, sliderStart + sliderLength, - scrollBarRect.width(), sliderMaxLength - sliderStart - sliderLength + scrollBarExtent); - break; - case SC_ScrollBarGroove: - if (scrollBar->orientation == Qt::Horizontal) { - rect = scrollBarRect.adjusted(scrollBarExtent, 0, -2 * scrollBarExtent, 0); - } else { - rect = scrollBarRect.adjusted(0, scrollBarExtent, 0, -2 * scrollBarExtent); - } - break; - case SC_ScrollBarSlider: - if (scrollBar->orientation == Qt::Horizontal) { - rect.setRect(sliderStart, 0, sliderLength, scrollBarRect.height()); - } else { - rect.setRect(0, sliderStart, scrollBarRect.width(), sliderLength); - } - break; - default: - break; - } - rect = visualRect(scrollBar->direction, scrollBarRect, rect); - } - break; -#endif // QT_NO_SCROLLBAR -#ifndef QT_NO_SPINBOX - case CC_SpinBox: - if (const QStyleOptionSpinBox *spinBox = qstyleoption_cast<const QStyleOptionSpinBox *>(option)) { - int center = spinBox->rect.height() / 2; - switch (subControl) { - case SC_SpinBoxUp: - if (spinBox->buttonSymbols == QAbstractSpinBox::NoButtons) - return QRect(); - rect = visualRect(spinBox->direction, spinBox->rect, rect); - rect.setRect(spinBox->rect.right() - 16, spinBox->rect.top(), 17, center + 1); - rect = visualRect(spinBox->direction, spinBox->rect, rect); - break; - case SC_SpinBoxDown: - if (spinBox->buttonSymbols == QAbstractSpinBox::NoButtons) - return QRect(); - rect = visualRect(spinBox->direction, spinBox->rect, rect); - rect.setRect(spinBox->rect.right() - 16, spinBox->rect.top() + center, 17, spinBox->rect.height() - center); - rect = visualRect(spinBox->direction, spinBox->rect, rect); - break; - case SC_SpinBoxEditField: - if (spinBox->buttonSymbols != QAbstractSpinBox::NoButtons) { - rect = spinBox->rect.adjusted(0, 0, -16, 0); - } else { - rect = spinBox->rect; - } - rect.adjust(blueFrameWidth, blueFrameWidth, -blueFrameWidth, -blueFrameWidth); - rect = visualRect(spinBox->direction, spinBox->rect, rect); - break; - default: - break; - } - } - break; -#endif // QT_NO_SPINBOX -#ifndef QT_NO_COMBOBOX - case CC_ComboBox: - switch (subControl) { - case SC_ComboBoxArrow: - rect = visualRect(option->direction, option->rect, rect); - rect.setRect(rect.right() - 17, rect.top() - 2, - 19, rect.height() + 4); - rect = visualRect(option->direction, option->rect, rect); - break; - case SC_ComboBoxEditField: { - if (const QStyleOptionComboBox *box = qstyleoption_cast<const QStyleOptionComboBox *>(option)) { - int frameWidth = proxy()->pixelMetric(PM_DefaultFrameWidth); - rect = visualRect(option->direction, option->rect, rect); - - if (box->editable) { - rect = box->rect.adjusted(blueFrameWidth, blueFrameWidth, -blueFrameWidth, -blueFrameWidth); - rect.setRight(rect.right() - 16); // Overlaps the combobox button by 2 pixels - } else { - rect.setRect(option->rect.left() + frameWidth, option->rect.top() + frameWidth, - option->rect.width() - 16 - 2 * frameWidth, - option->rect.height() - 2 * frameWidth); - rect.setLeft(rect.left() + 2); - rect.setRight(rect.right() - 2); - if (box->state & (State_Sunken | State_On)) - rect.translate(1, 1); - } - rect = visualRect(option->direction, option->rect, rect); - } - break; - } - default: - break; - } - break; -#endif // QT_NO_COMBOBOX - case CC_TitleBar: - if (const QStyleOptionTitleBar *tb = qstyleoption_cast<const QStyleOptionTitleBar *>(option)) { - SubControl sc = subControl; - QRect &ret = rect; - const int indent = 3; - const int controlTopMargin = 4; - const int controlBottomMargin = 3; - const int controlWidthMargin = 1; - const int controlHeight = tb->rect.height() - controlTopMargin - controlBottomMargin; - const int delta = controlHeight + controlWidthMargin; - int offset = 0; - - bool isMinimized = tb->titleBarState & Qt::WindowMinimized; - bool isMaximized = tb->titleBarState & Qt::WindowMaximized; - - switch (sc) { - case SC_TitleBarLabel: - if (tb->titleBarFlags & (Qt::WindowTitleHint | Qt::WindowSystemMenuHint)) { - ret = tb->rect; - if (tb->titleBarFlags & Qt::WindowSystemMenuHint) - ret.adjust(delta, 0, -delta, 0); - if (tb->titleBarFlags & Qt::WindowMinimizeButtonHint) - ret.adjust(0, 0, -delta, 0); - if (tb->titleBarFlags & Qt::WindowMaximizeButtonHint) - ret.adjust(0, 0, -delta, 0); - if (tb->titleBarFlags & Qt::WindowShadeButtonHint) - ret.adjust(0, 0, -delta, 0); - if (tb->titleBarFlags & Qt::WindowContextHelpButtonHint) - ret.adjust(0, 0, -delta, 0); - ret.adjusted(indent, 0, -indent, 0); - } - break; - case SC_TitleBarContextHelpButton: - if (tb->titleBarFlags & Qt::WindowContextHelpButtonHint) - offset += delta; - case SC_TitleBarMinButton: - if (!isMinimized && (tb->titleBarFlags & Qt::WindowMinimizeButtonHint)) - offset += delta; - else if (sc == SC_TitleBarMinButton) - break; - case SC_TitleBarNormalButton: - if (isMinimized && (tb->titleBarFlags & Qt::WindowMinimizeButtonHint)) - offset += delta; - else if (isMaximized && (tb->titleBarFlags & Qt::WindowMaximizeButtonHint)) - offset += delta; - else if (sc == SC_TitleBarNormalButton) - break; - case SC_TitleBarMaxButton: - if (!isMaximized && (tb->titleBarFlags & Qt::WindowMaximizeButtonHint)) - offset += delta; - else if (sc == SC_TitleBarMaxButton) - break; - case SC_TitleBarShadeButton: - if (!isMinimized && (tb->titleBarFlags & Qt::WindowShadeButtonHint)) - offset += delta; - else if (sc == SC_TitleBarShadeButton) - break; - case SC_TitleBarUnshadeButton: - if (isMinimized && (tb->titleBarFlags & Qt::WindowShadeButtonHint)) - offset += delta; - else if (sc == SC_TitleBarUnshadeButton) - break; - case SC_TitleBarCloseButton: - if (tb->titleBarFlags & Qt::WindowSystemMenuHint) - offset += delta; - else if (sc == SC_TitleBarCloseButton) - break; - ret.setRect(tb->rect.right() - indent - offset, tb->rect.top() + controlTopMargin, - controlHeight, controlHeight); - break; - case SC_TitleBarSysMenu: - if (tb->titleBarFlags & Qt::WindowSystemMenuHint) { - ret.setRect(tb->rect.left() + controlWidthMargin + indent, tb->rect.top() + controlTopMargin, - controlHeight, controlHeight); - } - break; - default: - break; - } - ret = visualRect(tb->direction, tb->rect, ret); - } - break; - default: - break; - } - - return rect; -} - -/*! - \reimp -*/ -int QPlastiqueStyle::styleHint(StyleHint hint, const QStyleOption *option, const QWidget *widget, - QStyleHintReturn *returnData) const -{ - int ret = 0; - switch (hint) { - case SH_WindowFrame_Mask: - ret = 1; - if (QStyleHintReturnMask *mask = qstyleoption_cast<QStyleHintReturnMask *>(returnData)) { - mask->region = option->rect; - mask->region -= QRect(option->rect.left(), option->rect.top(), 2, 1); - mask->region -= QRect(option->rect.right() - 1, option->rect.top(), 2, 1); - mask->region -= QRect(option->rect.left(), option->rect.top() + 1, 1, 1); - mask->region -= QRect(option->rect.right(), option->rect.top() + 1, 1, 1); - - const QStyleOptionTitleBar *titleBar = qstyleoption_cast<const QStyleOptionTitleBar *>(option); - if (titleBar && (titleBar->titleBarState & Qt::WindowMinimized)) { - mask->region -= QRect(option->rect.left(), option->rect.bottom(), 2, 1); - mask->region -= QRect(option->rect.right() - 1, option->rect.bottom(), 2, 1); - mask->region -= QRect(option->rect.left(), option->rect.bottom() - 1, 1, 1); - mask->region -= QRect(option->rect.right(), option->rect.bottom() - 1, 1, 1); - } else { - mask->region -= QRect(option->rect.bottomLeft(), QSize(1, 1)); - mask->region -= QRect(option->rect.bottomRight(), QSize(1, 1)); - } - } - break; - case SH_TitleBar_NoBorder: - ret = 1; - break; - case SH_TitleBar_AutoRaise: - ret = 1; - break; - case SH_ItemView_ShowDecorationSelected: - ret = true; - break; - case SH_ToolBox_SelectedPageTitleBold: - case SH_ScrollBar_MiddleClickAbsolutePosition: - ret = true; - break; - case SH_MainWindow_SpaceBelowMenuBar: - ret = 0; - break; - case SH_FormLayoutWrapPolicy: - ret = QFormLayout::DontWrapRows; - break; - case SH_FormLayoutFieldGrowthPolicy: - ret = QFormLayout::ExpandingFieldsGrow; - break; - case SH_FormLayoutFormAlignment: - ret = Qt::AlignLeft | Qt::AlignTop; - break; - case SH_FormLayoutLabelAlignment: - ret = Qt::AlignRight; - break; - case SH_MessageBox_TextInteractionFlags: - ret = Qt::TextSelectableByMouse | Qt::LinksAccessibleByMouse; - break; - case SH_LineEdit_PasswordCharacter: - ret = QCommonStyle::styleHint(hint, option, widget, returnData); - break; - case SH_ItemView_ArrowKeysNavigateIntoChildren: - ret = true; - break; - case SH_Menu_SubMenuPopupDelay: - ret = 96; // from Plastik - break; - case SH_DialogButtonBox_ButtonsHaveIcons: - if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) - ret = theme->themeHint(QPlatformTheme::DialogButtonBoxButtonsHaveIcons).toBool(); - else - ret = true; - break; -#ifndef Q_OS_WIN - case SH_Menu_AllowActiveAndDisabled: - ret = false; - break; -#endif - default: - ret = QWindowsStyle::styleHint(hint, option, widget, returnData); - break; - } - return ret; -} - -/*! - \reimp -*/ -QStyle::SubControl QPlastiqueStyle::hitTestComplexControl(ComplexControl control, const QStyleOptionComplex *option, - const QPoint &pos, const QWidget *widget) const -{ - SubControl ret = SC_None; - switch (control) { -#ifndef QT_NO_SCROLLBAR - case CC_ScrollBar: - if (const QStyleOptionSlider *scrollBar = qstyleoption_cast<const QStyleOptionSlider *>(option)) { - QRect slider = proxy()->subControlRect(control, scrollBar, SC_ScrollBarSlider, widget); - if (slider.contains(pos)) { - ret = SC_ScrollBarSlider; - break; - } - - QRect scrollBarAddLine = proxy()->subControlRect(control, scrollBar, SC_ScrollBarAddLine, widget); - if (scrollBarAddLine.contains(pos)) { - ret = SC_ScrollBarAddLine; - break; - } - - QRect scrollBarSubPage = proxy()->subControlRect(control, scrollBar, SC_ScrollBarSubPage, widget); - if (scrollBarSubPage.contains(pos)) { - ret = SC_ScrollBarSubPage; - break; - } - - QRect scrollBarAddPage = proxy()->subControlRect(control, scrollBar, SC_ScrollBarAddPage, widget); - if (scrollBarAddPage.contains(pos)) { - ret = SC_ScrollBarAddPage; - break; - } - - QRect scrollBarSubLine = proxy()->subControlRect(control, scrollBar, SC_ScrollBarSubLine, widget); - if (scrollBarSubLine.contains(pos)) { - ret = SC_ScrollBarSubLine; - break; - } - } - break; -#endif // QT_NO_SCROLLBAR - default: - break; - } - - return ret != SC_None ? ret : QWindowsStyle::hitTestComplexControl(control, option, pos, widget); -} - -/*! - \reimp -*/ -int QPlastiqueStyle::pixelMetric(PixelMetric metric, const QStyleOption *option, const QWidget *widget) const -{ - int ret = -1; - switch (metric) { - case PM_MenuVMargin: - case PM_MenuHMargin: - ret = 0; - break; - case PM_ButtonShiftHorizontal: - case PM_ButtonShiftVertical: - ret = 1; - break; - case PM_ButtonDefaultIndicator: - ret = 0; - break; -#ifndef QT_NO_SLIDER - case PM_SliderThickness: - ret = 15; - break; - case PM_SliderLength: - case PM_SliderControlThickness: - ret = 11; - break; - case PM_SliderTickmarkOffset: - ret = 5; - break; - case PM_SliderSpaceAvailable: - if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(option)) { - int size = 15; - if (slider->tickPosition & QSlider::TicksBelow) - ++size; - if (slider->tickPosition & QSlider::TicksAbove) - ++size; - ret = size; - break; - } -#endif // QT_NO_SLIDER - case PM_ScrollBarExtent: - ret = 16; - break; - case PM_ScrollBarSliderMin: - ret = 26; - break; - case PM_ProgressBarChunkWidth: - ret = 1; - break; - case PM_MenuBarItemSpacing: - ret = 3; - break; - case PM_MenuBarVMargin: - ret = 2; - break; - case PM_MenuBarHMargin: - ret = 0; - break; - case PM_MenuBarPanelWidth: - ret = 1; - break; - case PM_ToolBarHandleExtent: - ret = 9; - break; - case PM_ToolBarSeparatorExtent: - ret = 2; - break; - case PM_ToolBarItemSpacing: - ret = 1; - break; - case PM_ToolBarItemMargin: - ret = 1; - break; - case PM_ToolBarFrameWidth: - ret = 2; - break; - case PM_SplitterWidth: - ret = 6; - break; - case PM_DockWidgetSeparatorExtent: - ret = 6; - break; - case PM_DockWidgetHandleExtent: - ret = 20; - break; - case PM_DefaultFrameWidth: -#ifndef QT_NO_MENU - if (qobject_cast<const QMenu *>(widget)) { - ret = 1; - break; - } -#endif - ret = 2; - break; - case PM_MdiSubWindowFrameWidth: - ret = 4; - break; - case PM_TitleBarHeight: - ret = qMax(widget ? widget->fontMetrics().height() : - (option ? option->fontMetrics.height() : 0), 30); - break; - case PM_MaximumDragDistance: - return -1; - case PM_DockWidgetTitleMargin: - return 2; - case PM_LayoutHorizontalSpacing: - case PM_LayoutVerticalSpacing: - return -1; // rely on layoutHorizontalSpacing() - case PM_LayoutLeftMargin: - case PM_LayoutTopMargin: - case PM_LayoutRightMargin: - case PM_LayoutBottomMargin: - { - bool isWindow = false; - if (option) { - isWindow = (option->state & State_Window); - } else if (widget) { - isWindow = widget->isWindow(); - } - - if (isWindow) { - ret = 11; - } else { - ret = 9; - } - } - default: - break; - } - - return ret != -1 ? ret : QWindowsStyle::pixelMetric(metric, option, widget); -} - -/*! - \reimp -*/ -QPalette QPlastiqueStyle::standardPalette() const -{ - QPalette palette; - - palette.setBrush(QPalette::Disabled, QPalette::WindowText, QColor(QRgb(0xff808080))); - palette.setBrush(QPalette::Disabled, QPalette::Button, QColor(QRgb(0xffdddfe4))); - palette.setBrush(QPalette::Disabled, QPalette::Light, QColor(QRgb(0xffffffff))); - palette.setBrush(QPalette::Disabled, QPalette::Midlight, QColor(QRgb(0xffffffff))); - palette.setBrush(QPalette::Disabled, QPalette::Dark, QColor(QRgb(0xff555555))); - palette.setBrush(QPalette::Disabled, QPalette::Mid, QColor(QRgb(0xffc7c7c7))); - palette.setBrush(QPalette::Disabled, QPalette::Text, QColor(QRgb(0xffc7c7c7))); - palette.setBrush(QPalette::Disabled, QPalette::BrightText, QColor(QRgb(0xffffffff))); - palette.setBrush(QPalette::Disabled, QPalette::ButtonText, QColor(QRgb(0xff808080))); - palette.setBrush(QPalette::Disabled, QPalette::Base, QColor(QRgb(0xffefefef))); - palette.setBrush(QPalette::Disabled, QPalette::AlternateBase, palette.color(QPalette::Disabled, QPalette::Base).darker(110)); - palette.setBrush(QPalette::Disabled, QPalette::Window, QColor(QRgb(0xffefefef))); - palette.setBrush(QPalette::Disabled, QPalette::Shadow, QColor(QRgb(0xff000000))); - palette.setBrush(QPalette::Disabled, QPalette::Highlight, QColor(QRgb(0xff567594))); - palette.setBrush(QPalette::Disabled, QPalette::HighlightedText, QColor(QRgb(0xffffffff))); - palette.setBrush(QPalette::Disabled, QPalette::Link, QColor(QRgb(0xff0000ee))); - palette.setBrush(QPalette::Disabled, QPalette::LinkVisited, QColor(QRgb(0xff52188b))); - palette.setBrush(QPalette::Active, QPalette::WindowText, QColor(QRgb(0xff000000))); - palette.setBrush(QPalette::Active, QPalette::Button, QColor(QRgb(0xffdddfe4))); - palette.setBrush(QPalette::Active, QPalette::Light, QColor(QRgb(0xffffffff))); - palette.setBrush(QPalette::Active, QPalette::Midlight, QColor(QRgb(0xffffffff))); - palette.setBrush(QPalette::Active, QPalette::Dark, QColor(QRgb(0xff555555))); - palette.setBrush(QPalette::Active, QPalette::Mid, QColor(QRgb(0xffc7c7c7))); - palette.setBrush(QPalette::Active, QPalette::Text, QColor(QRgb(0xff000000))); - palette.setBrush(QPalette::Active, QPalette::BrightText, QColor(QRgb(0xffffffff))); - palette.setBrush(QPalette::Active, QPalette::ButtonText, QColor(QRgb(0xff000000))); - palette.setBrush(QPalette::Active, QPalette::Base, QColor(QRgb(0xffffffff))); - palette.setBrush(QPalette::Active, QPalette::AlternateBase, palette.color(QPalette::Active, QPalette::Base).darker(110)); - palette.setBrush(QPalette::Active, QPalette::Window, QColor(QRgb(0xffefefef))); - palette.setBrush(QPalette::Active, QPalette::Shadow, QColor(QRgb(0xff000000))); - palette.setBrush(QPalette::Active, QPalette::Highlight, QColor(QRgb(0xff678db2))); - palette.setBrush(QPalette::Active, QPalette::HighlightedText, QColor(QRgb(0xffffffff))); - palette.setBrush(QPalette::Active, QPalette::Link, QColor(QRgb(0xff0000ee))); - palette.setBrush(QPalette::Active, QPalette::LinkVisited, QColor(QRgb(0xff52188b))); - palette.setBrush(QPalette::Inactive, QPalette::WindowText, QColor(QRgb(0xff000000))); - palette.setBrush(QPalette::Inactive, QPalette::Button, QColor(QRgb(0xffdddfe4))); - palette.setBrush(QPalette::Inactive, QPalette::Light, QColor(QRgb(0xffffffff))); - palette.setBrush(QPalette::Inactive, QPalette::Midlight, QColor(QRgb(0xffffffff))); - palette.setBrush(QPalette::Inactive, QPalette::Dark, QColor(QRgb(0xff555555))); - palette.setBrush(QPalette::Inactive, QPalette::Mid, QColor(QRgb(0xffc7c7c7))); - palette.setBrush(QPalette::Inactive, QPalette::Text, QColor(QRgb(0xff000000))); - palette.setBrush(QPalette::Inactive, QPalette::BrightText, QColor(QRgb(0xffffffff))); - palette.setBrush(QPalette::Inactive, QPalette::ButtonText, QColor(QRgb(0xff000000))); - palette.setBrush(QPalette::Inactive, QPalette::Base, QColor(QRgb(0xffffffff))); - palette.setBrush(QPalette::Inactive, QPalette::AlternateBase, palette.color(QPalette::Inactive, QPalette::Base).darker(110)); - palette.setBrush(QPalette::Inactive, QPalette::Window, QColor(QRgb(0xffefefef))); - palette.setBrush(QPalette::Inactive, QPalette::Shadow, QColor(QRgb(0xff000000))); - palette.setBrush(QPalette::Inactive, QPalette::Highlight, QColor(QRgb(0xff678db2))); - palette.setBrush(QPalette::Inactive, QPalette::HighlightedText, QColor(QRgb(0xffffffff))); - palette.setBrush(QPalette::Inactive, QPalette::Link, QColor(QRgb(0xff0000ee))); - palette.setBrush(QPalette::Inactive, QPalette::LinkVisited, QColor(QRgb(0xff52188b))); - return palette; -} - -/*! - \reimp -*/ -void QPlastiqueStyle::polish(QWidget *widget) -{ - if (qobject_cast<QPushButton *>(widget) -#ifndef QT_NO_COMBOBOX - || qobject_cast<QComboBox *>(widget) -#endif -#ifndef QT_NO_SPINBOX - || qobject_cast<QAbstractSpinBox *>(widget) -#endif - || qobject_cast<QCheckBox *>(widget) -#ifndef QT_NO_GROUPBOX - || qobject_cast<QGroupBox *>(widget) -#endif - || qobject_cast<QRadioButton *>(widget) -#ifndef QT_NO_SPLITTER - || qobject_cast<QSplitterHandle *>(widget) -#endif -#ifndef QT_NO_TABBAR - || qobject_cast<QTabBar *>(widget) -#endif - ) { - widget->setAttribute(Qt::WA_Hover); - } - - if (widget->inherits("QDockSeparator") - || widget->inherits("QDockWidgetSeparator")) { - widget->setAttribute(Qt::WA_Hover); - } - - if (false // to simplify the #ifdefs -#ifndef QT_NO_MENUBAR - || qobject_cast<QMenuBar *>(widget) -#endif -#ifndef QT_NO_TOOLBAR - || qobject_cast<QToolBar *>(widget) - || (widget && qobject_cast<QToolBar *>(widget->parent())) -#endif - ) { - widget->setBackgroundRole(QPalette::Window); - } - -#if defined QPlastique_MaskButtons - if (qobject_cast<QPushButton *>(widget) || qobject_cast<QToolButton *>(widget)) - widget->installEventFilter(this); -#endif -} - -/*! - \reimp -*/ -void QPlastiqueStyle::unpolish(QWidget *widget) -{ - if (qobject_cast<QPushButton *>(widget) -#ifndef QT_NO_COMBOBOX - || qobject_cast<QComboBox *>(widget) -#endif -#ifndef QT_NO_SPINBOX - || qobject_cast<QAbstractSpinBox *>(widget) -#endif - || qobject_cast<QCheckBox *>(widget) -#ifndef QT_NO_GROUPBOX - || qobject_cast<QGroupBox *>(widget) -#endif -#ifndef QT_NO_SPLITTER - || qobject_cast<QSplitterHandle *>(widget) -#endif -#ifndef QT_NO_TABBAR - || qobject_cast<QTabBar *>(widget) -#endif - || qobject_cast<QRadioButton *>(widget)) { - widget->setAttribute(Qt::WA_Hover, false); - } - - if (widget->inherits("QDockSeparator") - || widget->inherits("QDockWidgetSeparator")) { - widget->setAttribute(Qt::WA_Hover, false); - } - - if (false // to simplify the #ifdefs -#ifndef QT_NO_MENUBAR - || qobject_cast<QMenuBar *>(widget) -#endif -#ifndef QT_NO_TOOLBOX - || qobject_cast<QToolBox *>(widget) -#endif -#ifndef QT_NO_TOOLBAR - || qobject_cast<QToolBar *>(widget) - || (widget && qobject_cast<QToolBar *>(widget->parent())) -#endif - ) { - widget->setBackgroundRole(QPalette::Button); - } - -#if defined QPlastique_MaskButtons - if (qobject_cast<QPushButton *>(widget) || qobject_cast<QToolButton *>(widget)) - widget->removeEventFilter(this); -#endif -} - -/*! - \reimp -*/ -void QPlastiqueStyle::polish(QApplication *app) -{ - QWindowsStyle::polish(app); -} - -/*! - \reimp -*/ -void QPlastiqueStyle::polish(QPalette &pal) -{ - QWindowsStyle::polish(pal); -#ifdef Q_WS_MAC - pal.setBrush(QPalette::Shadow, Qt::black); -#endif -} - -/*! - \reimp -*/ -void QPlastiqueStyle::unpolish(QApplication *app) -{ - QWindowsStyle::unpolish(app); -} - -/*! - \reimp -*/ -QIcon QPlastiqueStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption *option, - const QWidget *widget) const -{ - return QWindowsStyle::standardIcon(standardIcon, option, widget); -} - -/*! - \reimp -*/ -QPixmap QPlastiqueStyle::standardPixmap(StandardPixmap standardPixmap, const QStyleOption *opt, - const QWidget *widget) const -{ - return QWindowsStyle::standardPixmap(standardPixmap, opt, widget); -} - -// this works as long as we have at most 16 different control types -#define CT1(c) CT2(c, c) -#define CT2(c1, c2) (((uint)c1 << 16) | (uint)c2) - -/*! - \reimp -*/ -int QPlastiqueStyle::layoutSpacing(QSizePolicy::ControlType control1, - QSizePolicy::ControlType control2, - Qt::Orientation orientation, - const QStyleOption * /* option */, - const QWidget * /* widget */) const -{ - const int ButtonMask = QSizePolicy::ButtonBox | QSizePolicy::PushButton; - - if (control2 == QSizePolicy::ButtonBox) - return 11; - - if ((control1 | control2) & ButtonMask) - return (orientation == Qt::Horizontal) ? 10 : 9; - - switch (CT2(control1, control2)) { - case CT1(QSizePolicy::Label): - case CT2(QSizePolicy::Label, QSizePolicy::DefaultType): - case CT2(QSizePolicy::Label, QSizePolicy::CheckBox): - case CT2(QSizePolicy::Label, QSizePolicy::ComboBox): - case CT2(QSizePolicy::Label, QSizePolicy::LineEdit): - case CT2(QSizePolicy::Label, QSizePolicy::RadioButton): - case CT2(QSizePolicy::Label, QSizePolicy::Slider): - case CT2(QSizePolicy::Label, QSizePolicy::SpinBox): - case CT2(QSizePolicy::Label, QSizePolicy::ToolButton): - return 5; - case CT2(QSizePolicy::CheckBox, QSizePolicy::RadioButton): - case CT2(QSizePolicy::RadioButton, QSizePolicy::CheckBox): - case CT1(QSizePolicy::CheckBox): - if (orientation == Qt::Vertical) - return 2; - case CT1(QSizePolicy::RadioButton): - if (orientation == Qt::Vertical) - return 1; - } - - if (orientation == Qt::Horizontal - && (control2 & (QSizePolicy::CheckBox | QSizePolicy::RadioButton))) - return 8; - - if ((control1 | control2) & (QSizePolicy::Frame - | QSizePolicy::GroupBox - | QSizePolicy::TabWidget)) { - return 11; - } - - if ((control1 | control2) & (QSizePolicy::Line | QSizePolicy::Slider - | QSizePolicy::LineEdit | QSizePolicy::ComboBox - | QSizePolicy::SpinBox)) - return 7; - - return 6; -} - -/*! - \reimp -*/ -bool QPlastiqueStyle::eventFilter(QObject *watched, QEvent *event) -{ -#if defined QPlastique_MaskButtons - switch (event->type()) { - case QEvent::Resize: - if (qobject_cast<QPushButton *>(watched) || qobject_cast<QToolButton *>(watched)) { - QWidget *widget = qobject_cast<QWidget *>(watched); - QRect rect = widget->rect(); - QRegion region(rect); - region -= QRect(rect.left(), rect.top(), 2, 1); - region -= QRect(rect.left(), rect.top() + 1, 1, 1); - region -= QRect(rect.left(), rect.bottom(), 2, 1); - region -= QRect(rect.left(), rect.bottom() - 1, 1, 1); - region -= QRect(rect.right() - 1, rect.top(), 2, 1); - region -= QRect(rect.right(), rect.top() + 1, 1, 1); - region -= QRect(rect.right() - 1, rect.bottom(), 2, 1); - region -= QRect(rect.right(), rect.bottom() - 1, 1, 1); - widget->setMask(region); - } - break; - default: - break; - } -#endif - - return QWindowsStyle::eventFilter(watched, event); -} - -QT_END_NAMESPACE - -#endif // !defined(QT_NO_STYLE_PLASTIQUE) || defined(QT_PLUGIN) |