aboutsummaryrefslogtreecommitdiffstats
path: root/src/quicknativestyle/qstyle/qquickcommonstyle.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/quicknativestyle/qstyle/qquickcommonstyle.cpp')
-rw-r--r--src/quicknativestyle/qstyle/qquickcommonstyle.cpp6082
1 files changed, 0 insertions, 6082 deletions
diff --git a/src/quicknativestyle/qstyle/qquickcommonstyle.cpp b/src/quicknativestyle/qstyle/qquickcommonstyle.cpp
deleted file mode 100644
index c5797009..00000000
--- a/src/quicknativestyle/qstyle/qquickcommonstyle.cpp
+++ /dev/null
@@ -1,6082 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** 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 The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/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 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickcommonstyle.h"
-#include "qquickcommonstyle_p.h"
-#include "qquickcommonstylepixmaps_p.h"
-
-#include "qquickstyleoption.h"
-#include "qquickdrawutil.h"
-#include "qquickstylehelper_p.h"
-
-#include <QtGui/QWindow>
-#include <qfile.h>
-#include <private/qguiapplication_p.h>
-#include <qpa/qplatformtheme.h>
-#include <qbitmap.h>
-#include <qcache.h>
-#include <qmath.h>
-#include <qpainter.h>
-#include <qpaintengine.h>
-#include <qpainterpath.h>
-#include <private/qmath_p.h>
-#include <qdebug.h>
-#include <qtextformat.h>
-#include <qfileinfo.h>
-#include <qdir.h>
-#include <qsettings.h>
-#include <qvariant.h>
-#include <qpixmapcache.h>
-#include <qmatrix4x4.h>
-
-#include <limits.h>
-
-#include <private/qtextengine_p.h>
-#include <QtGui/private/qhexstring_p.h>
-
-QT_BEGIN_NAMESPACE
-
-static inline qreal dpr(const QWindow *w)
-{
- return w != nullptr ? w->devicePixelRatio() : qApp->devicePixelRatio();
-}
-
-/*!
- \class QCommonStyle
- \brief The QCommonStyle class encapsulates the common Look and Feel of a GUI.
-
- \ingroup appearance
- \inmodule QtWidgets
-
- This abstract class implements some of the widget's look and feel
- that is common to all GUI styles provided and shipped as part of
- Qt.
-
- Since QCommonStyle inherits QStyle, all of its functions are fully documented
- in the QStyle documentation.
- \omit
- , although the
- extra functions that QCommonStyle provides, e.g.
- drawComplexControl(), drawControl(), drawPrimitive(),
- hitTestComplexControl(), subControlRect(), sizeFromContents(), and
- subElementRect() are documented here.
- \endomit
-
- \sa QStyle, QProxyStyle
-*/
-
-namespace QQC2 {
-
-QCommonStyle::QCommonStyle()
- : QStyle(*new QCommonStylePrivate)
-{ }
-
-QCommonStyle::QCommonStyle(QCommonStylePrivate &dd)
- : QStyle(dd)
-{ }
-
-QCommonStyle::~QCommonStyle()
-{ }
-
-void QCommonStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, QPainter *p) const
-{
- Q_D(const QCommonStyle);
- switch (pe) {
- case PE_FrameButtonBevel:
- case PE_FrameButtonTool:
- qDrawShadeRect(p, opt->rect, opt->palette,
- opt->state & (State_Sunken | State_On), 1, 0);
- break;
- case PE_PanelButtonCommand:
- case PE_PanelButtonBevel:
- case PE_PanelButtonTool:
- case PE_IndicatorButtonDropDown:
- qDrawShadePanel(p, opt->rect, opt->palette,
- opt->state & (State_Sunken | State_On), 1,
- &opt->palette.brush(QPalette::Button));
- break;
- case PE_IndicatorItemViewItemCheck:
- proxy()->drawPrimitive(PE_IndicatorCheckBox, opt, p);
- break;
- case PE_IndicatorCheckBox:
- if (opt->state & State_NoChange) {
- p->setPen(opt->palette.windowText().color());
- p->fillRect(opt->rect, opt->palette.brush(QPalette::Button));
- p->drawRect(opt->rect);
- p->drawLine(opt->rect.topLeft(), opt->rect.bottomRight());
- } else {
- qDrawShadePanel(p, opt->rect.x(), opt->rect.y(), opt->rect.width(), opt->rect.height(),
- opt->palette, opt->state & (State_Sunken | State_On), 1,
- &opt->palette.brush(QPalette::Button));
- }
- break;
- case PE_IndicatorRadioButton: {
- QRect ir = opt->rect;
- p->setPen(opt->palette.dark().color());
- p->drawArc(opt->rect, 0, 5760);
- if (opt->state & (State_Sunken | State_On)) {
- ir.adjust(2, 2, -2, -2);
- p->setBrush(opt->palette.windowText());
- p->drawEllipse(ir);
- }
- break; }
- case PE_FrameFocusRect:
- if (const QStyleOptionFocusRect *fropt = qstyleoption_cast<const QStyleOptionFocusRect *>(opt)) {
- QColor bg = fropt->backgroundColor;
- QPen oldPen = p->pen();
- if (bg.isValid()) {
- int h, s, v;
- bg.getHsv(&h, &s, &v);
- if (v >= 128)
- p->setPen(Qt::black);
- else
- p->setPen(Qt::white);
- } else {
- p->setPen(opt->palette.windowText().color());
- }
- QRect focusRect = opt->rect.adjusted(1, 1, -1, -1);
- p->drawRect(focusRect.adjusted(0, 0, -1, -1)); //draw pen inclusive
- p->setPen(oldPen);
- }
- break;
- case PE_IndicatorMenuCheckMark: {
- const int markW = opt->rect.width() > 7 ? 7 : opt->rect.width();
- const int markH = markW;
- int posX = opt->rect.x() + (opt->rect.width() - markW)/2 + 1;
- int posY = opt->rect.y() + (opt->rect.height() - markH)/2;
-
- QVector<QLineF> a;
- a.reserve(markH);
-
- int i, xx, yy;
- xx = posX;
- yy = 3 + posY;
- for (i = 0; i < markW/2; ++i) {
- a << QLineF(xx, yy, xx, yy + 2);
- ++xx;
- ++yy;
- }
- yy -= 2;
- for (; i < markH; ++i) {
- a << QLineF(xx, yy, xx, yy + 2);
- ++xx;
- --yy;
- }
- if (!(opt->state & State_Enabled) && !(opt->state & State_On)) {
- p->save();
- p->translate(1, 1);
- p->setPen(opt->palette.light().color());
- p->drawLines(a);
- p->restore();
- }
- p->setPen((opt->state & State_On) ? opt->palette.highlightedText().color() : opt->palette.text().color());
- p->drawLines(a);
- break; }
- case PE_Frame:
- case PE_FrameMenu:
- if (const QStyleOptionFrame *frame = qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
- if (pe == PE_FrameMenu || (frame->state & State_Sunken) || (frame->state & State_Raised)) {
- qDrawShadePanel(p, frame->rect, frame->palette, frame->state & State_Sunken,
- frame->lineWidth);
- } else {
- qDrawPlainRect(p, frame->rect, frame->palette.windowText().color(), frame->lineWidth);
- }
- }
- break;
- case PE_PanelMenuBar:
- if (const QStyleOptionFrame *frame = qstyleoption_cast<const QStyleOptionFrame *>(opt)){
- qDrawShadePanel(p, frame->rect, frame->palette, false, frame->lineWidth,
- &frame->palette.brush(QPalette::Button));
-
- }
- else if (const QStyleOptionToolBar *frame = qstyleoption_cast<const QStyleOptionToolBar *>(opt)){
- qDrawShadePanel(p, frame->rect, frame->palette, false, frame->lineWidth,
- &frame->palette.brush(QPalette::Button));
- }
-
- break;
- case PE_PanelMenu:
- break;
- case PE_PanelToolBar:
- break;
- case PE_IndicatorProgressChunk:
- {
- p->fillRect(opt->rect.x(), opt->rect.y() + 3, opt->rect.width() -2, opt->rect.height() - 6,
- opt->palette.brush(QPalette::Highlight));
- }
- break;
- case PE_IndicatorBranch: {
- static const int decoration_size = 9;
- int mid_h = opt->rect.x() + opt->rect.width() / 2;
- int mid_v = opt->rect.y() + opt->rect.height() / 2;
- int bef_h = mid_h;
- int bef_v = mid_v;
- int aft_h = mid_h;
- int aft_v = mid_v;
- if (opt->state & State_Children) {
- int delta = decoration_size / 2;
- bef_h -= delta;
- bef_v -= delta;
- aft_h += delta;
- aft_v += delta;
- p->drawLine(bef_h + 2, bef_v + 4, bef_h + 6, bef_v + 4);
- if (!(opt->state & State_Open))
- p->drawLine(bef_h + 4, bef_v + 2, bef_h + 4, bef_v + 6);
- QPen oldPen = p->pen();
- p->setPen(opt->palette.dark().color());
- p->drawRect(bef_h, bef_v, decoration_size - 1, decoration_size - 1);
- p->setPen(oldPen);
- }
- QBrush brush(opt->palette.dark().color(), Qt::Dense4Pattern);
- if (opt->state & State_Item) {
- if (opt->direction == Qt::RightToLeft)
- p->fillRect(opt->rect.left(), mid_v, bef_h - opt->rect.left(), 1, brush);
- else
- p->fillRect(aft_h, mid_v, opt->rect.right() - aft_h + 1, 1, brush);
- }
- if (opt->state & State_Sibling)
- p->fillRect(mid_h, aft_v, 1, opt->rect.bottom() - aft_v + 1, brush);
- if (opt->state & (State_Open | State_Children | State_Item | State_Sibling))
- p->fillRect(mid_h, opt->rect.y(), 1, bef_v - opt->rect.y(), brush);
- break; }
- case PE_FrameStatusBarItem:
- qDrawShadeRect(p, opt->rect, opt->palette, true, 1, 0, nullptr);
- break;
- case PE_IndicatorHeaderArrow:
- if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(opt)) {
- QPen oldPen = p->pen();
- if (header->sortIndicator & QStyleOptionHeader::SortUp) {
- p->setPen(QPen(opt->palette.light(), 0));
- p->drawLine(opt->rect.x() + opt->rect.width(), opt->rect.y(),
- opt->rect.x() + opt->rect.width() / 2, opt->rect.y() + opt->rect.height());
- p->setPen(QPen(opt->palette.dark(), 0));
- const QPoint points[] = {
- QPoint(opt->rect.x() + opt->rect.width() / 2, opt->rect.y() + opt->rect.height()),
- QPoint(opt->rect.x(), opt->rect.y()),
- QPoint(opt->rect.x() + opt->rect.width(), opt->rect.y()),
- };
- p->drawPolyline(points, sizeof points / sizeof *points);
- } else if (header->sortIndicator & QStyleOptionHeader::SortDown) {
- p->setPen(QPen(opt->palette.light(), 0));
- const QPoint points[] = {
- QPoint(opt->rect.x(), opt->rect.y() + opt->rect.height()),
- QPoint(opt->rect.x() + opt->rect.width(), opt->rect.y() + opt->rect.height()),
- QPoint(opt->rect.x() + opt->rect.width() / 2, opt->rect.y()),
- };
- p->drawPolyline(points, sizeof points / sizeof *points);
- p->setPen(QPen(opt->palette.dark(), 0));
- p->drawLine(opt->rect.x(), opt->rect.y() + opt->rect.height(),
- opt->rect.x() + opt->rect.width() / 2, opt->rect.y());
- }
- p->setPen(oldPen);
- }
- break;
- case PE_FrameTabBarBase:
- if (const QStyleOptionTabBarBase *tbb
- = qstyleoption_cast<const QStyleOptionTabBarBase *>(opt)) {
- p->save();
- switch (tbb->shape) {
- case QStyleOptionTab::RoundedNorth:
- case QStyleOptionTab::TriangularNorth:
- p->setPen(QPen(tbb->palette.light(), 0));
- p->drawLine(tbb->rect.topLeft(), tbb->rect.topRight());
- break;
- case QStyleOptionTab::RoundedWest:
- case QStyleOptionTab::TriangularWest:
- p->setPen(QPen(tbb->palette.light(), 0));
- p->drawLine(tbb->rect.topLeft(), tbb->rect.bottomLeft());
- break;
- case QStyleOptionTab::RoundedSouth:
- case QStyleOptionTab::TriangularSouth:
- p->setPen(QPen(tbb->palette.shadow(), 0));
- p->drawLine(tbb->rect.left(), tbb->rect.bottom(),
- tbb->rect.right(), tbb->rect.bottom());
- p->setPen(QPen(tbb->palette.dark(), 0));
- p->drawLine(tbb->rect.left(), tbb->rect.bottom() - 1,
- tbb->rect.right() - 1, tbb->rect.bottom() - 1);
- break;
- case QStyleOptionTab::RoundedEast:
- case QStyleOptionTab::TriangularEast:
- p->setPen(QPen(tbb->palette.dark(), 0));
- p->drawLine(tbb->rect.topRight(), tbb->rect.bottomRight());
- break;
- }
- p->restore();
- }
- break;
- case PE_IndicatorTabClose: {
- if (d->tabBarcloseButtonIcon.isNull()) {
- d->tabBarcloseButtonIcon.addPixmap(QPixmap(
- QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-closetab-16.png")),
- QIcon::Normal, QIcon::Off);
- d->tabBarcloseButtonIcon.addPixmap(QPixmap(
- QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-closetab-down-16.png")),
- QIcon::Normal, QIcon::On);
- d->tabBarcloseButtonIcon.addPixmap(QPixmap(
- QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-closetab-hover-16.png")),
- QIcon::Active, QIcon::Off);
- }
-
- int size = proxy()->pixelMetric(QStyle::PM_SmallIconSize);
- QIcon::Mode mode = opt->state & State_Enabled ?
- (opt->state & State_Raised ? QIcon::Active : QIcon::Normal)
- : QIcon::Disabled;
- if (!(opt->state & State_Raised)
- && !(opt->state & State_Sunken)
- && !(opt->state & QStyle::State_Selected))
- mode = QIcon::Disabled;
-
- QIcon::State state = opt->state & State_Sunken ? QIcon::On : QIcon::Off;
- QPixmap pixmap = d->tabBarcloseButtonIcon.pixmap(QSize(size, size), dpr(opt->window), mode, state);
- proxy()->drawItemPixmap(p, opt->rect, Qt::AlignCenter, pixmap);
- break;
- }
- case PE_FrameTabWidget:
- case PE_FrameWindow:
- qDrawWinPanel(p, opt->rect, opt->palette, false, nullptr);
- break;
- case PE_FrameLineEdit:
- proxy()->drawPrimitive(PE_Frame, opt, p);
- break;
- case PE_FrameGroupBox:
- if (const QStyleOptionFrame *frame = qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
- if (frame->features & QStyleOptionFrame::Flat) {
- QRect fr = frame->rect;
- QPoint p1(fr.x(), fr.y() + 1);
- QPoint p2(fr.x() + fr.width(), p1.y());
- qDrawShadeLine(p, p1, p2, frame->palette, true,
- frame->lineWidth, frame->midLineWidth);
- } else {
- qDrawShadeRect(p, frame->rect.x(), frame->rect.y(), frame->rect.width(),
- frame->rect.height(), frame->palette, true,
- frame->lineWidth, frame->midLineWidth);
- }
- }
- break;
- case PE_FrameDockWidget:
- if (const QStyleOptionFrame *frame = qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
- int lw = frame->lineWidth;
- if (lw <= 0)
- lw = proxy()->pixelMetric(PM_DockWidgetFrameWidth);
-
- qDrawShadePanel(p, frame->rect, frame->palette, false, lw);
- }
- break;
- case PE_IndicatorToolBarHandle:
- p->save();
- p->translate(opt->rect.x(), opt->rect.y());
- if (opt->state & State_Horizontal) {
- int x = opt->rect.width() / 3;
- if (opt->direction == Qt::RightToLeft)
- x -= 2;
- if (opt->rect.height() > 4) {
- qDrawShadePanel(p, x, 2, 3, opt->rect.height() - 4,
- opt->palette, false, 1, nullptr);
- qDrawShadePanel(p, x+3, 2, 3, opt->rect.height() - 4,
- opt->palette, false, 1, nullptr);
- }
- } else {
- if (opt->rect.width() > 4) {
- int y = opt->rect.height() / 3;
- qDrawShadePanel(p, 2, y, opt->rect.width() - 4, 3,
- opt->palette, false, 1, nullptr);
- qDrawShadePanel(p, 2, y+3, opt->rect.width() - 4, 3,
- opt->palette, false, 1, nullptr);
- }
- }
- p->restore();
- break;
- case PE_IndicatorToolBarSeparator:
- {
- QPoint p1, p2;
- if (opt->state & State_Horizontal) {
- p1 = QPoint(opt->rect.width()/2, 0);
- p2 = QPoint(p1.x(), opt->rect.height());
- } else {
- p1 = QPoint(0, opt->rect.height()/2);
- p2 = QPoint(opt->rect.width(), p1.y());
- }
- qDrawShadeLine(p, p1, p2, opt->palette, 1, 1, 0);
- break;
- }
- case PE_IndicatorSpinPlus:
- case PE_IndicatorSpinMinus: {
- QRect r = opt->rect;
- int fw = proxy()->pixelMetric(PM_DefaultFrameWidth, opt);
- QRect br = r.adjusted(fw, fw, -fw, -fw);
-
- int offset = (opt->state & State_Sunken) ? 1 : 0;
- int step = (br.width() + 4) / 5;
- p->fillRect(br.x() + offset, br.y() + offset +br.height() / 2 - step / 2,
- br.width(), step,
- opt->palette.buttonText());
- if (pe == PE_IndicatorSpinPlus)
- p->fillRect(br.x() + br.width() / 2 - step / 2 + offset, br.y() + offset,
- step, br.height(),
- opt->palette.buttonText());
-
- break; }
- case PE_IndicatorSpinUp:
- case PE_IndicatorSpinDown: {
- QRect r = opt->rect;
- int fw = proxy()->pixelMetric(PM_DefaultFrameWidth, opt);
- // QRect br = r.adjusted(fw, fw, -fw, -fw);
- int x = r.x(), y = r.y(), w = r.width(), h = r.height();
- int sw = w-4;
- if (sw < 3)
- break;
- else if (!(sw & 1))
- sw--;
- sw -= (sw / 7) * 2; // Empty border
- int sh = sw/2 + 2; // Must have empty row at foot of arrow
-
- int sx = x + w / 2 - sw / 2;
- int sy = y + h / 2 - sh / 2;
-
- if (pe == PE_IndicatorSpinUp && fw)
- --sy;
-
- int bsx = 0;
- int bsy = 0;
- if (opt->state & State_Sunken) {
- bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal);
- bsy = proxy()->pixelMetric(PM_ButtonShiftVertical);
- }
- p->save();
- p->translate(sx + bsx, sy + bsy);
- p->setPen(opt->palette.buttonText().color());
- p->setBrush(opt->palette.buttonText());
- if (pe == PE_IndicatorSpinDown) {
- const QPoint points[] = { QPoint(0, 1), QPoint(sw-1, 1), QPoint(sh-2, sh-1) };
- p->drawPolygon(points, sizeof points / sizeof *points);
- } else {
- const QPoint points[] = { QPoint(0, sh-1), QPoint(sw-1, sh-1), QPoint(sh-2, 1) };
- p->drawPolygon(points, sizeof points / sizeof *points);
- }
- p->restore();
- break; }
- case PE_PanelTipLabel: {
- const QBrush brush(opt->palette.toolTipBase());
- qDrawPlainRect(p, opt->rect, opt->palette.toolTipText().color(), 1, &brush);
- break;
- }
- case PE_IndicatorTabTear:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) {
- bool rtl = tab->direction == Qt::RightToLeft;
- const bool horizontal = tab->rect.height() > tab->rect.width();
- const int margin = 4;
- QPainterPath path;
-
- if (horizontal) {
- QRect rect = tab->rect.adjusted(rtl ? margin : 0, 0, rtl ? 1 : -margin, 0);
- rect.setTop(rect.top() + ((tab->state & State_Selected) ? 1 : 3));
- rect.setBottom(rect.bottom() - ((tab->state & State_Selected) ? 0 : 2));
-
- path.moveTo(QPoint(rtl ? rect.right() : rect.left(), rect.top()));
- int count = 4;
- for (int jags = 1; jags <= count; ++jags, rtl = !rtl)
- path.lineTo(QPoint(rtl ? rect.left() : rect.right(), rect.top() + jags * rect.height()/count));
- } else {
- QRect rect = tab->rect.adjusted(0, 0, 0, -margin);
- rect.setLeft(rect.left() + ((tab->state & State_Selected) ? 1 : 3));
- rect.setRight(rect.right() - ((tab->state & State_Selected) ? 0 : 2));
-
- path.moveTo(QPoint(rect.left(), rect.top()));
- int count = 4;
- for (int jags = 1; jags <= count; ++jags, rtl = !rtl)
- path.lineTo(QPoint(rect.left() + jags * rect.width()/count, rtl ? rect.top() : rect.bottom()));
- }
-
- p->setPen(QPen(tab->palette.dark(), qreal(.8)));
- p->setBrush(tab->palette.window());
- p->setRenderHint(QPainter::Antialiasing);
- p->drawPath(path);
- }
- break;
- case PE_PanelLineEdit:
- if (const QStyleOptionFrame *panel = qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
- p->fillRect(panel->rect.adjusted(panel->lineWidth, panel->lineWidth, -panel->lineWidth, -panel->lineWidth),
- panel->palette.brush(QPalette::Base));
-
- if (panel->lineWidth > 0)
- proxy()->drawPrimitive(PE_FrameLineEdit, panel, p);
- }
- break;
- case PE_IndicatorColumnViewArrow: {
- if (const QStyleOptionViewItem *viewOpt = qstyleoption_cast<const QStyleOptionViewItem *>(opt)) {
- bool reverse = (viewOpt->direction == Qt::RightToLeft);
- p->save();
- QPainterPath path;
- int x = viewOpt->rect.x() + 1;
- int offset = (viewOpt->rect.height() / 3);
- int height = (viewOpt->rect.height()) - offset * 2;
- if (height % 2 == 1)
- --height;
- int x2 = x + height - 1;
- if (reverse) {
- x = viewOpt->rect.x() + viewOpt->rect.width() - 1;
- x2 = x - height + 1;
- }
- path.moveTo(x, viewOpt->rect.y() + offset);
- path.lineTo(x, viewOpt->rect.y() + offset + height);
- path.lineTo(x2, viewOpt->rect.y() + offset+height/2);
- path.closeSubpath();
- if (viewOpt->state & QStyle::State_Selected ) {
- if (viewOpt->showDecorationSelected) {
- QColor color = viewOpt->palette.color(QPalette::Active, QPalette::HighlightedText);
- p->setPen(color);
- p->setBrush(color);
- } else {
- QColor color = viewOpt->palette.color(QPalette::Active, QPalette::WindowText);
- p->setPen(color);
- p->setBrush(color);
- }
-
- } else {
- QColor color = viewOpt->palette.color(QPalette::Active, QPalette::Mid);
- p->setPen(color);
- p->setBrush(color);
- }
- p->drawPath(path);
-
- // draw the vertical and top triangle line
- if (!(viewOpt->state & QStyle::State_Selected)) {
- QPainterPath lines;
- lines.moveTo(x, viewOpt->rect.y() + offset);
- lines.lineTo(x, viewOpt->rect.y() + offset + height);
- lines.moveTo(x, viewOpt->rect.y() + offset);
- lines.lineTo(x2, viewOpt->rect.y() + offset+height/2);
- QColor color = viewOpt->palette.color(QPalette::Active, QPalette::Dark);
- p->setPen(color);
- p->drawPath(lines);
- }
- p->restore();
- }
- break; }
- case PE_IndicatorItemViewItemDrop: {
- QRect rect = opt->rect;
- if (opt->rect.height() == 0)
- p->drawLine(rect.topLeft(), rect.topRight());
- else
- p->drawRect(rect);
- break; }
- case PE_PanelItemViewRow:
- if (const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>(opt)) {
- QPalette::ColorGroup cg = vopt->state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled;
- if (cg == QPalette::Normal && !(vopt->state & QStyle::State_Active))
- cg = QPalette::Inactive;
-
- if ((vopt->state & QStyle::State_Selected) && proxy()->styleHint(QStyle::SH_ItemView_ShowDecorationSelected, opt))
- p->fillRect(vopt->rect, vopt->palette.brush(cg, QPalette::Highlight));
- else if (vopt->features & QStyleOptionViewItem::Alternate)
- p->fillRect(vopt->rect, vopt->palette.brush(cg, QPalette::AlternateBase));
- }
- break;
- case PE_PanelItemViewItem:
- if (const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>(opt)) {
- QPalette::ColorGroup cg = vopt->state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled;
- if (cg == QPalette::Normal && !(vopt->state & QStyle::State_Active))
- cg = QPalette::Inactive;
-
- if (vopt->showDecorationSelected && (vopt->state & QStyle::State_Selected)) {
- p->fillRect(vopt->rect, vopt->palette.brush(cg, QPalette::Highlight));
- } else {
- if (vopt->backgroundBrush.style() != Qt::NoBrush) {
- QPointF oldBO = p->brushOrigin();
- p->setBrushOrigin(vopt->rect.topLeft());
- p->fillRect(vopt->rect, vopt->backgroundBrush);
- p->setBrushOrigin(oldBO);
- }
-
- if (vopt->state & QStyle::State_Selected) {
- QRect textRect = subElementRect(QStyle::SE_ItemViewItemText, opt);
- p->fillRect(textRect, vopt->palette.brush(cg, QPalette::Highlight));
- }
- }
- }
- break;
- case PE_PanelScrollAreaCorner: {
- const QBrush brush(opt->palette.brush(QPalette::Window));
- p->fillRect(opt->rect, brush);
- } break;
- case PE_IndicatorArrowUp:
- case PE_IndicatorArrowDown:
- case PE_IndicatorArrowRight:
- case PE_IndicatorArrowLeft:
- {
- if (opt->rect.width() <= 1 || opt->rect.height() <= 1)
- break;
- QRect r = opt->rect;
- int size = qMin(r.height(), r.width());
- QPixmap pixmap;
- QString pixmapName = QStyleHelper::uniqueName(QLatin1String("$qt_ia-")
- % QLatin1String(metaObject()->className()), opt, QSize(size, size))
- % HexString<uint>(pe);
- if (!QPixmapCache::find(pixmapName, &pixmap)) {
- qreal pixelRatio = p->device()->devicePixelRatioF();
- int border = qRound(pixelRatio*(size/5));
- int sqsize = qRound(pixelRatio*(2*(size/2)));
- QImage image(sqsize, sqsize, QImage::Format_ARGB32_Premultiplied);
- image.fill(0);
- QPainter imagePainter(&image);
-
- QPolygon a;
- switch (pe) {
- case PE_IndicatorArrowUp:
- a.setPoints(3, border, sqsize/2, sqsize/2, border, sqsize - border, sqsize/2);
- break;
- case PE_IndicatorArrowDown:
- a.setPoints(3, border, sqsize/2, sqsize/2, sqsize - border, sqsize - border, sqsize/2);
- break;
- case PE_IndicatorArrowRight:
- a.setPoints(3, sqsize - border, sqsize/2, sqsize/2, border, sqsize/2, sqsize - border);
- break;
- case PE_IndicatorArrowLeft:
- a.setPoints(3, border, sqsize/2, sqsize/2, border, sqsize/2, sqsize - border);
- break;
- default:
- break;
- }
-
- int bsx = 0;
- int bsy = 0;
-
- if (opt->state & State_Sunken) {
- bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal, opt);
- bsy = proxy()->pixelMetric(PM_ButtonShiftVertical, opt);
- }
-
- QRect bounds = a.boundingRect();
- int sx = sqsize / 2 - bounds.center().x() - 1;
- int sy = sqsize / 2 - bounds.center().y() - 1;
- imagePainter.translate(sx + bsx, sy + bsy);
- imagePainter.setPen(opt->palette.buttonText().color());
- imagePainter.setBrush(opt->palette.buttonText());
-
- if (!(opt->state & State_Enabled)) {
- imagePainter.translate(1, 1);
- imagePainter.setBrush(opt->palette.light().color());
- imagePainter.setPen(opt->palette.light().color());
- imagePainter.drawPolygon(a);
- imagePainter.translate(-1, -1);
- imagePainter.setBrush(opt->palette.mid().color());
- imagePainter.setPen(opt->palette.mid().color());
- }
-
- imagePainter.drawPolygon(a);
- imagePainter.end();
- pixmap = QPixmap::fromImage(image);
- pixmap.setDevicePixelRatio(pixelRatio);
- QPixmapCache::insert(pixmapName, pixmap);
- }
- int xOffset = r.x() + (r.width() - size)/2;
- int yOffset = r.y() + (r.height() - size)/2;
- p->drawPixmap(xOffset, yOffset, pixmap);
- }
- break;
- default:
- break;
- }
-}
-
-static void drawArrow(const QStyle *style, const QStyleOptionToolButton *toolbutton,
- const QRect &rect, QPainter *painter)
-{
- QStyle::PrimitiveElement pe;
- switch (toolbutton->arrowType) {
- case Qt::LeftArrow:
- pe = QStyle::PE_IndicatorArrowLeft;
- break;
- case Qt::RightArrow:
- pe = QStyle::PE_IndicatorArrowRight;
- break;
- case Qt::UpArrow:
- pe = QStyle::PE_IndicatorArrowUp;
- break;
- case Qt::DownArrow:
- pe = QStyle::PE_IndicatorArrowDown;
- break;
- default:
- return;
- }
- QStyleOption arrowOpt = *toolbutton;
- arrowOpt.rect = rect;
- style->drawPrimitive(pe, &arrowOpt, painter);
-}
-
-static QSizeF viewItemTextLayout(QTextLayout &textLayout, int lineWidth, int maxHeight = -1, int *lastVisibleLine = nullptr)
-{
- if (lastVisibleLine)
- *lastVisibleLine = -1;
- qreal height = 0;
- qreal widthUsed = 0;
- textLayout.beginLayout();
- int i = 0;
- while (true) {
- QTextLine line = textLayout.createLine();
- if (!line.isValid())
- break;
- line.setLineWidth(lineWidth);
- line.setPosition(QPointF(0, height));
- height += line.height();
- widthUsed = qMax(widthUsed, line.naturalTextWidth());
- // we assume that the height of the next line is the same as the current one
- if (maxHeight > 0 && lastVisibleLine && height + line.height() > maxHeight) {
- const QTextLine nextLine = textLayout.createLine();
- *lastVisibleLine = nextLine.isValid() ? i : -1;
- break;
- }
- ++i;
- }
- textLayout.endLayout();
- return QSizeF(widthUsed, height);
-}
-
-QString QCommonStylePrivate::calculateElidedText(const QString &text, const QTextOption &textOption,
- const QFont &font, const QRect &textRect, const Qt::Alignment valign,
- Qt::TextElideMode textElideMode, int flags,
- bool lastVisibleLineShouldBeElided, QPointF *paintStartPosition) const
-{
- QTextLayout textLayout(text, font);
- textLayout.setTextOption(textOption);
-
- // In AlignVCenter mode when more than one line is displayed and the height only allows
- // some of the lines it makes no sense to display those. From a users perspective it makes
- // more sense to see the start of the text instead something inbetween.
- const bool vAlignmentOptimization = paintStartPosition && valign.testFlag(Qt::AlignVCenter);
-
- int lastVisibleLine = -1;
- viewItemTextLayout(textLayout, textRect.width(), vAlignmentOptimization ? textRect.height() : -1, &lastVisibleLine);
-
- const QRectF boundingRect = textLayout.boundingRect();
- // don't care about LTR/RTL here, only need the height
- const QRect layoutRect = QStyle::alignedRect(Qt::LayoutDirectionAuto, valign,
- boundingRect.size().toSize(), textRect);
-
- if (paintStartPosition)
- *paintStartPosition = QPointF(textRect.x(), layoutRect.top());
-
- QString ret;
- qreal height = 0;
- const int lineCount = textLayout.lineCount();
- for (int i = 0; i < lineCount; ++i) {
- const QTextLine line = textLayout.lineAt(i);
- height += line.height();
-
- // above visible rect
- if (height + layoutRect.top() <= textRect.top()) {
- if (paintStartPosition)
- paintStartPosition->ry() += line.height();
- continue;
- }
-
- const int start = line.textStart();
- const int length = line.textLength();
- const bool drawElided = line.naturalTextWidth() > textRect.width();
- bool elideLastVisibleLine = lastVisibleLine == i;
- if (!drawElided && i + 1 < lineCount && lastVisibleLineShouldBeElided) {
- const QTextLine nextLine = textLayout.lineAt(i + 1);
- const int nextHeight = height + nextLine.height() / 2;
- // elide when less than the next half line is visible
- if (nextHeight + layoutRect.top() > textRect.height() + textRect.top())
- elideLastVisibleLine = true;
- }
-
- QString text = textLayout.text().mid(start, length);
- if (drawElided || elideLastVisibleLine) {
- if (elideLastVisibleLine) {
- if (text.endsWith(QChar::LineSeparator))
- text.chop(1);
- text += QChar(0x2026);
- }
- const QStackTextEngine engine(text, font);
- ret += engine.elidedText(textElideMode, textRect.width(), flags);
-
- // no newline for the last line (last visible or real)
- // sometimes drawElided is true but no eliding is done so the text ends
- // with QChar::LineSeparator - don't add another one. This happened with
- // arabic text in the testcase for QTBUG-72805
- if (i < lineCount - 1 &&
- !ret.endsWith(QChar::LineSeparator))
- ret += QChar::LineSeparator;
- } else {
- ret += text;
- }
-
- // below visible text, can stop
- if ((height + layoutRect.top() >= textRect.bottom()) ||
- (lastVisibleLine >= 0 && lastVisibleLine == i))
- break;
- }
- return ret;
-}
-
-QSize QCommonStylePrivate::viewItemSize(const QStyleOptionViewItem *option, int role) const
-{
- switch (role) {
- case Qt::CheckStateRole:
- if (option->features & QStyleOptionViewItem::HasCheckIndicator)
- return QSize(proxyStyle->pixelMetric(QStyle::PM_IndicatorWidth, option),
- proxyStyle->pixelMetric(QStyle::PM_IndicatorHeight, option));
- break;
- case Qt::DisplayRole:
- if (option->features & QStyleOptionViewItem::HasDisplay) {
- QTextOption textOption;
- textOption.setWrapMode(QTextOption::WordWrap);
- QTextLayout textLayout(option->text, option->font);
- textLayout.setTextOption(textOption);
- const bool wrapText = option->features & QStyleOptionViewItem::WrapText;
- const int textMargin = proxyStyle->pixelMetric(QStyle::PM_FocusFrameHMargin, option) + 1;
- QRect bounds = option->rect;
- switch (option->decorationPosition) {
- case QStyleOptionViewItem::Left:
- case QStyleOptionViewItem::Right: {
- if (wrapText && bounds.isValid()) {
- int width = bounds.width() - 2 * textMargin;
- if (option->features & QStyleOptionViewItem::HasDecoration)
- width -= option->decorationSize.width() + 2 * textMargin;
- bounds.setWidth(width);
- } else
- bounds.setWidth(QFIXED_MAX);
- break;
- }
- case QStyleOptionViewItem::Top:
- case QStyleOptionViewItem::Bottom:
- if (wrapText)
- bounds.setWidth(bounds.isValid() ? bounds.width() - 2 * textMargin : option->decorationSize.width());
- else
- bounds.setWidth(QFIXED_MAX);
- break;
- default:
- break;
- }
-
- if (wrapText && option->features & QStyleOptionViewItem::HasCheckIndicator)
- bounds.setWidth(bounds.width() - proxyStyle->pixelMetric(QStyle::PM_IndicatorWidth) - 2 * textMargin);
-
- const int lineWidth = bounds.width();
- const QSizeF size = viewItemTextLayout(textLayout, lineWidth);
- return QSize(qCeil(size.width()) + 2 * textMargin, qCeil(size.height()));
- }
- break;
- case Qt::DecorationRole:
- if (option->features & QStyleOptionViewItem::HasDecoration) {
- return option->decorationSize;
- }
- break;
- default:
- break;
- }
-
- return QSize(0, 0);
-}
-
-void QCommonStylePrivate::viewItemDrawText(QPainter *p, const QStyleOptionViewItem *option, const QRect &rect) const
-{
- const int textMargin = proxyStyle->pixelMetric(QStyle::PM_FocusFrameHMargin, nullptr) + 1;
-
- QRect textRect = rect.adjusted(textMargin, 0, -textMargin, 0); // remove width padding
- const bool wrapText = option->features & QStyleOptionViewItem::WrapText;
- QTextOption textOption;
- textOption.setWrapMode(wrapText ? QTextOption::WordWrap : QTextOption::ManualWrap);
- textOption.setTextDirection(option->direction);
- textOption.setAlignment(QStyle::visualAlignment(option->direction, option->displayAlignment));
-
- QPointF paintPosition;
- const QString newText = calculateElidedText(option->text, textOption,
- option->font, textRect, option->displayAlignment,
- option->textElideMode, 0,
- true, &paintPosition);
-
- QTextLayout textLayout(newText, option->font);
- textLayout.setTextOption(textOption);
- viewItemTextLayout(textLayout, textRect.width());
- textLayout.draw(p, paintPosition);
-}
-
-/*! \internal
- compute the position for the different component of an item (pixmap, text, checkbox)
-
- Set sizehint to false to layout the elements inside opt->rect. Set sizehint to true to ignore
- opt->rect and return rectangles in infinite space
-
- Code duplicated in QItemDelegate::doLayout
-*/
-void QCommonStylePrivate::viewItemLayout(const QStyleOptionViewItem *opt, QRect *checkRect,
- QRect *pixmapRect, QRect *textRect, bool sizehint) const
-{
- Q_ASSERT(checkRect && pixmapRect && textRect);
- *pixmapRect = QRect(QPoint(0, 0), viewItemSize(opt, Qt::DecorationRole));
- *textRect = QRect(QPoint(0, 0), viewItemSize(opt, Qt::DisplayRole));
- *checkRect = QRect(QPoint(0, 0), viewItemSize(opt, Qt::CheckStateRole));
-
- const bool hasCheck = checkRect->isValid();
- const bool hasPixmap = pixmapRect->isValid();
- const bool hasText = textRect->isValid();
- const bool hasMargin = (hasText | hasPixmap | hasCheck);
- const int frameHMargin = hasMargin ?
- proxyStyle->pixelMetric(QStyle::PM_FocusFrameHMargin, opt) + 1 : 0;
- const int textMargin = hasText ? frameHMargin : 0;
- const int pixmapMargin = hasPixmap ? frameHMargin : 0;
- const int checkMargin = hasCheck ? frameHMargin : 0;
- const int x = opt->rect.left();
- const int y = opt->rect.top();
- int w, h;
-
- if (textRect->height() == 0 && (!hasPixmap || !sizehint)) {
- //if there is no text, we still want to have a decent height for the item sizeHint and the editor size
- textRect->setHeight(opt->fontMetrics.height());
- }
-
- QSize pm(0, 0);
- if (hasPixmap) {
- pm = pixmapRect->size();
- pm.rwidth() += 2 * pixmapMargin;
- }
- if (sizehint) {
- h = qMax(checkRect->height(), qMax(textRect->height(), pm.height()));
- if (opt->decorationPosition == QStyleOptionViewItem::Left
- || opt->decorationPosition == QStyleOptionViewItem::Right) {
- w = textRect->width() + pm.width();
- } else {
- w = qMax(textRect->width(), pm.width());
- }
- } else {
- w = opt->rect.width();
- h = opt->rect.height();
- }
-
- int cw = 0;
- QRect check;
- if (hasCheck) {
- cw = checkRect->width() + 2 * checkMargin;
- if (sizehint) w += cw;
- if (opt->direction == Qt::RightToLeft) {
- check.setRect(x + w - cw, y, cw, h);
- } else {
- check.setRect(x, y, cw, h);
- }
- }
-
- QRect display;
- QRect decoration;
- switch (opt->decorationPosition) {
- case QStyleOptionViewItem::Top: {
- if (hasPixmap)
- pm.setHeight(pm.height() + pixmapMargin); // add space
- h = sizehint ? textRect->height() : h - pm.height();
-
- if (opt->direction == Qt::RightToLeft) {
- decoration.setRect(x, y, w - cw, pm.height());
- display.setRect(x, y + pm.height(), w - cw, h);
- } else {
- decoration.setRect(x + cw, y, w - cw, pm.height());
- display.setRect(x + cw, y + pm.height(), w - cw, h);
- }
- break; }
- case QStyleOptionViewItem::Bottom: {
- if (hasText)
- textRect->setHeight(textRect->height() + textMargin); // add space
- h = sizehint ? textRect->height() + pm.height() : h;
-
- if (opt->direction == Qt::RightToLeft) {
- display.setRect(x, y, w - cw, textRect->height());
- decoration.setRect(x, y + textRect->height(), w - cw, h - textRect->height());
- } else {
- display.setRect(x + cw, y, w - cw, textRect->height());
- decoration.setRect(x + cw, y + textRect->height(), w - cw, h - textRect->height());
- }
- break; }
- case QStyleOptionViewItem::Left: {
- if (opt->direction == Qt::LeftToRight) {
- decoration.setRect(x + cw, y, pm.width(), h);
- display.setRect(decoration.right() + 1, y, w - pm.width() - cw, h);
- } else {
- display.setRect(x, y, w - pm.width() - cw, h);
- decoration.setRect(display.right() + 1, y, pm.width(), h);
- }
- break; }
- case QStyleOptionViewItem::Right: {
- if (opt->direction == Qt::LeftToRight) {
- display.setRect(x + cw, y, w - pm.width() - cw, h);
- decoration.setRect(display.right() + 1, y, pm.width(), h);
- } else {
- decoration.setRect(x, y, pm.width(), h);
- display.setRect(decoration.right() + 1, y, w - pm.width() - cw, h);
- }
- break; }
- default:
- qWarning("doLayout: decoration position is invalid");
- decoration = *pixmapRect;
- break;
- }
-
- if (!sizehint) { // we only need to do the internal layout if we are going to paint
- *checkRect = QStyle::alignedRect(opt->direction, Qt::AlignCenter,
- checkRect->size(), check);
- *pixmapRect = QStyle::alignedRect(opt->direction, opt->decorationAlignment,
- pixmapRect->size(), decoration);
- // the text takes up all available space, unless the decoration is not shown as selected
- if (opt->showDecorationSelected)
- *textRect = display;
- else
- *textRect = QStyle::alignedRect(opt->direction, opt->displayAlignment,
- textRect->size().boundedTo(display.size()), display);
- } else {
- *checkRect = check;
- *pixmapRect = decoration;
- *textRect = display;
- }
-}
-
-QString QCommonStylePrivate::toolButtonElideText(const QStyleOptionToolButton *option,
- const QRect &textRect, int flags) const
-{
- if (option->fontMetrics.horizontalAdvance(option->text) <= textRect.width())
- return option->text;
-
- QString text = option->text;
- text.replace(QLatin1Char('\n'), QChar::LineSeparator);
- QTextOption textOption;
- textOption.setWrapMode(QTextOption::ManualWrap);
- textOption.setTextDirection(option->direction);
-
- return calculateElidedText(text, textOption,
- option->font, textRect, Qt::AlignTop,
- Qt::ElideMiddle, flags,
- false, nullptr);
-}
-
-/*! \internal
- Compute the textRect and the pixmapRect from the opt rect
-
- Uses the same computation than in QTabBar::tabSizeHint
- */
-void QCommonStylePrivate::tabLayout(const QStyleOptionTab *opt, QRect *textRect, QRect *iconRect) const
-{
- Q_ASSERT(textRect);
- Q_ASSERT(iconRect);
- QRect tr = opt->rect;
- bool verticalTabs = opt->shape == QStyleOptionTab::RoundedEast
- || opt->shape == QStyleOptionTab::RoundedWest
- || opt->shape == QStyleOptionTab::TriangularEast
- || opt->shape == QStyleOptionTab::TriangularWest;
- if (verticalTabs)
- tr.setRect(0, 0, tr.height(), tr.width()); // 0, 0 as we will have a translate transform
-
- int verticalShift = proxyStyle->pixelMetric(QStyle::PM_TabBarTabShiftVertical, opt);
- int horizontalShift = proxyStyle->pixelMetric(QStyle::PM_TabBarTabShiftHorizontal, opt);
- int hpadding = proxyStyle->pixelMetric(QStyle::PM_TabBarTabHSpace, opt) / 2;
- int vpadding = proxyStyle->pixelMetric(QStyle::PM_TabBarTabVSpace, opt) / 2;
- if (opt->shape == QStyleOptionTab::RoundedSouth || opt->shape == QStyleOptionTab::TriangularSouth)
- verticalShift = -verticalShift;
- tr.adjust(hpadding, verticalShift - vpadding, horizontalShift - hpadding, vpadding);
- bool selected = opt->state & QStyle::State_Selected;
- if (selected) {
- tr.setTop(tr.top() - verticalShift);
- tr.setRight(tr.right() - horizontalShift);
- }
-
- // left widget
- if (!opt->leftButtonSize.isEmpty()) {
- tr.setLeft(tr.left() + 4 +
- (verticalTabs ? opt->leftButtonSize.height() : opt->leftButtonSize.width()));
- }
- // right widget
- if (!opt->rightButtonSize.isEmpty()) {
- tr.setRight(tr.right() - 4 -
- (verticalTabs ? opt->rightButtonSize.height() : opt->rightButtonSize.width()));
- }
-
- // icon
- if (!opt->icon.isNull()) {
- QSize iconSize = opt->iconSize;
- if (!iconSize.isValid()) {
- int iconExtent = proxyStyle->pixelMetric(QStyle::PM_SmallIconSize);
- iconSize = QSize(iconExtent, iconExtent);
- }
- QSize tabIconSize = opt->icon.actualSize(iconSize,
- (opt->state & QStyle::State_Enabled) ? QIcon::Normal : QIcon::Disabled,
- (opt->state & QStyle::State_Selected) ? QIcon::On : QIcon::Off);
- // High-dpi icons do not need adjustment; make sure tabIconSize is not larger than iconSize
- tabIconSize = QSize(qMin(tabIconSize.width(), iconSize.width()), qMin(tabIconSize.height(), iconSize.height()));
-
- const int offsetX = (iconSize.width() - tabIconSize.width()) / 2;
- *iconRect = QRect(tr.left() + offsetX, tr.center().y() - tabIconSize.height() / 2,
- tabIconSize.width(), tabIconSize.height());
- if (!verticalTabs)
- *iconRect = QStyle::visualRect(opt->direction, opt->rect, *iconRect);
- tr.setLeft(tr.left() + tabIconSize.width() + 4);
- }
-
- if (!verticalTabs)
- tr = QStyle::visualRect(opt->direction, opt->rect, tr);
-
- *textRect = tr;
-}
-
-/*!
- \reimp
-*/
-void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, QPainter *p) const
-{
- Q_D(const QCommonStyle);
-
- // TODO: Set opt->window manually for now before calling any of the drawing functions. opt->window is
- // pulled of the widget is QStyle. But now that we have no widget, we need some other
- // solution.
- Q_ASSERT(opt->window);
-
- switch (element) {
-
- case CE_PushButton:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- proxy()->drawControl(CE_PushButtonBevel, btn, p);
- QStyleOptionButton subopt = *btn;
- subopt.rect = subElementRect(SE_PushButtonContents, btn);
- proxy()->drawControl(CE_PushButtonLabel, &subopt, p);
- }
- break;
- case CE_PushButtonBevel:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- QRect br = btn->rect;
- int dbi = proxy()->pixelMetric(PM_ButtonDefaultIndicator, btn);
- if (btn->features & QStyleOptionButton::DefaultButton)
- proxy()->drawPrimitive(PE_FrameDefaultButton, opt, p);
- if (btn->features & QStyleOptionButton::AutoDefaultButton)
- br.setCoords(br.left() + dbi, br.top() + dbi, br.right() - dbi, br.bottom() - dbi);
- if (!(btn->features & (QStyleOptionButton::Flat | QStyleOptionButton::CommandLinkButton))
- || btn->state & (State_Sunken | State_On)
- || (btn->features & QStyleOptionButton::CommandLinkButton && btn->state & State_MouseOver)) {
- QStyleOptionButton tmpBtn = *btn;
- tmpBtn.rect = br;
- proxy()->drawPrimitive(PE_PanelButtonCommand, &tmpBtn, p);
- }
- if (btn->features & QStyleOptionButton::HasMenu) {
- int mbi = proxy()->pixelMetric(PM_MenuButtonIndicator, btn);
- QRect ir = btn->rect;
- QStyleOptionButton newBtn = *btn;
- newBtn.rect = QRect(ir.right() - mbi + 2, ir.height()/2 - mbi/2 + 3, mbi - 6, mbi - 6);
- proxy()->drawPrimitive(PE_IndicatorArrowDown, &newBtn, p);
- }
- if (btn->state & State_HasFocus) {
- QStyleOptionFocusRect fropt;
- fropt.QStyleOption::operator=(*btn);
- fropt.rect = subElementRect(SE_PushButtonFocusRect, btn);
- proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, p);
- }
- }
- break;
- case CE_PushButtonLabel:
- if (const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- QRect textRect = button->rect;
- uint tf = Qt::AlignVCenter | Qt::TextShowMnemonic;
- if (!proxy()->styleHint(SH_UnderlineShortcut, button))
- tf |= Qt::TextHideMnemonic;
-
- if (!button->icon.isNull()) {
- //Center both icon and text
- QIcon::Mode mode = button->state & State_Enabled ? QIcon::Normal : QIcon::Disabled;
- if (mode == QIcon::Normal && button->state & State_HasFocus)
- mode = QIcon::Active;
- QIcon::State state = QIcon::Off;
- if (button->state & State_On)
- state = QIcon::On;
-
- QPixmap pixmap = button->icon.pixmap(button->iconSize, dpr(opt->window), mode, state);
- int pixmapWidth = pixmap.width() / pixmap.devicePixelRatio();
- int pixmapHeight = pixmap.height() / pixmap.devicePixelRatio();
- int labelWidth = pixmapWidth;
- int labelHeight = pixmapHeight;
- int iconSpacing = 4;//### 4 is currently hardcoded in QPushButton::sizeHint()
- if (!button->text.isEmpty()) {
- int textWidth = button->fontMetrics.boundingRect(opt->rect, tf, button->text).width();
- labelWidth += (textWidth + iconSpacing);
- }
-
- QRect iconRect = QRect(textRect.x() + (textRect.width() - labelWidth) / 2,
- textRect.y() + (textRect.height() - labelHeight) / 2,
- pixmapWidth, pixmapHeight);
-
- iconRect = visualRect(button->direction, textRect, iconRect);
-
- if (button->direction == Qt::RightToLeft) {
- tf |= Qt::AlignRight;
- textRect.setRight(iconRect.left() - iconSpacing);
- } else {
- tf |= Qt::AlignLeft; //left align, we adjust the text-rect instead
- textRect.setLeft(iconRect.left() + iconRect.width() + iconSpacing);
- }
-
- if (button->state & (State_On | State_Sunken))
- iconRect.translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, opt),
- proxy()->pixelMetric(PM_ButtonShiftVertical, opt));
- p->drawPixmap(iconRect, pixmap);
- } else {
- tf |= Qt::AlignHCenter;
- }
- if (button->state & (State_On | State_Sunken))
- textRect.translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, opt),
- proxy()->pixelMetric(PM_ButtonShiftVertical, opt));
-
- if (button->features & QStyleOptionButton::HasMenu) {
- int indicatorSize = proxy()->pixelMetric(PM_MenuButtonIndicator, button);
- if (button->direction == Qt::LeftToRight)
- textRect = textRect.adjusted(0, 0, -indicatorSize, 0);
- else
- textRect = textRect.adjusted(indicatorSize, 0, 0, 0);
- }
- proxy()->drawItemText(p, textRect, tf, button->palette, (button->state & State_Enabled),
- button->text, QPalette::ButtonText);
- }
- break;
- case CE_RadioButton:
- case CE_CheckBox:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- bool isRadio = (element == CE_RadioButton);
- QStyleOptionButton subopt = *btn;
- subopt.rect = subElementRect(isRadio ? SE_RadioButtonIndicator
- : SE_CheckBoxIndicator, btn);
- proxy()->drawPrimitive(isRadio ? PE_IndicatorRadioButton : PE_IndicatorCheckBox,
- &subopt, p);
- subopt.rect = subElementRect(isRadio ? SE_RadioButtonContents
- : SE_CheckBoxContents, btn);
- proxy()->drawControl(isRadio ? CE_RadioButtonLabel : CE_CheckBoxLabel, &subopt, p);
- if (btn->state & State_HasFocus) {
- QStyleOptionFocusRect fropt;
- fropt.QStyleOption::operator=(*btn);
- fropt.rect = subElementRect(isRadio ? SE_RadioButtonFocusRect
- : SE_CheckBoxFocusRect, btn);
- proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, p);
- }
- }
- break;
- case CE_RadioButtonLabel:
- case CE_CheckBoxLabel:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- uint alignment = visualAlignment(btn->direction, Qt::AlignLeft | Qt::AlignVCenter);
-
- if (!proxy()->styleHint(SH_UnderlineShortcut, btn))
- alignment |= Qt::TextHideMnemonic;
- QPixmap pix;
- QRect textRect = btn->rect;
- if (!btn->icon.isNull()) {
- pix = btn->icon.pixmap(btn->iconSize, dpr(opt->window), btn->state & State_Enabled ? QIcon::Normal : QIcon::Disabled);
- proxy()->drawItemPixmap(p, btn->rect, alignment, pix);
- if (btn->direction == Qt::RightToLeft)
- textRect.setRight(textRect.right() - btn->iconSize.width() - 4);
- else
- textRect.setLeft(textRect.left() + btn->iconSize.width() + 4);
- }
- if (!btn->text.isEmpty()){
- proxy()->drawItemText(p, textRect, alignment | Qt::TextShowMnemonic,
- btn->palette, btn->state & State_Enabled, btn->text, QPalette::WindowText);
- }
- }
- break;
- case CE_MenuScroller: {
- QStyleOption arrowOpt = *opt;
- arrowOpt.state |= State_Enabled;
- proxy()->drawPrimitive(((opt->state & State_DownArrow) ? PE_IndicatorArrowDown : PE_IndicatorArrowUp), &arrowOpt, p);
- break; }
- case CE_MenuTearoff:
- if (opt->state & State_Selected)
- p->fillRect(opt->rect, opt->palette.brush(QPalette::Highlight));
- else
- p->fillRect(opt->rect, opt->palette.brush(QPalette::Button));
- p->setPen(QPen(opt->palette.dark().color(), 1, Qt::DashLine));
- p->drawLine(opt->rect.x() + 2, opt->rect.y() + opt->rect.height() / 2 - 1,
- opt->rect.x() + opt->rect.width() - 4,
- opt->rect.y() + opt->rect.height() / 2 - 1);
- p->setPen(QPen(opt->palette.light().color(), 1, Qt::DashLine));
- p->drawLine(opt->rect.x() + 2, opt->rect.y() + opt->rect.height() / 2,
- opt->rect.x() + opt->rect.width() - 4, opt->rect.y() + opt->rect.height() / 2);
- break;
- case CE_MenuBarItem:
- if (const QStyleOptionMenuItem *mbi = qstyleoption_cast<const QStyleOptionMenuItem *>(opt)) {
- uint alignment = Qt::AlignCenter | Qt::TextShowMnemonic | Qt::TextDontClip
- | Qt::TextSingleLine;
- if (!proxy()->styleHint(SH_UnderlineShortcut, mbi))
- alignment |= Qt::TextHideMnemonic;
- int iconExtent = proxy()->pixelMetric(PM_SmallIconSize);
- QPixmap pix = mbi->icon.pixmap(QSize(iconExtent, iconExtent), dpr(opt->window),
- mbi->state.testFlag(State_Enabled) ? QIcon::Normal : QIcon::Disabled);
- if (!pix.isNull())
- proxy()->drawItemPixmap(p,mbi->rect, alignment, pix);
- else
- proxy()->drawItemText(p, mbi->rect, alignment, mbi->palette, mbi->state & State_Enabled,
- mbi->text, QPalette::ButtonText);
- }
- break;
- case CE_MenuBarEmptyArea:
- break;
- case CE_ProgressBar:
- if (const QStyleOptionProgressBar *pb
- = qstyleoption_cast<const QStyleOptionProgressBar *>(opt)) {
- QStyleOptionProgressBar subopt = *pb;
- subopt.rect = subElementRect(SE_ProgressBarGroove, pb);
- proxy()->drawControl(CE_ProgressBarGroove, &subopt, p);
- subopt.rect = subElementRect(SE_ProgressBarContents, pb);
- proxy()->drawControl(CE_ProgressBarContents, &subopt, p);
- if (pb->textVisible) {
- subopt.rect = subElementRect(SE_ProgressBarLabel, pb);
- proxy()->drawControl(CE_ProgressBarLabel, &subopt, p);
- }
- }
- break;
- case CE_ProgressBarGroove:
- if (opt->rect.isValid())
- qDrawShadePanel(p, opt->rect, opt->palette, true, 1,
- &opt->palette.brush(QPalette::Window));
- break;
- case CE_ProgressBarLabel:
- if (const QStyleOptionProgressBar *pb = qstyleoption_cast<const QStyleOptionProgressBar *>(opt)) {
- QPalette::ColorRole textRole = QPalette::NoRole;
- if ((pb->textAlignment & Qt::AlignCenter) && pb->textVisible
- && ((qint64(pb->progress) - qint64(pb->minimum)) * 2 >= (qint64(pb->maximum) - qint64(pb->minimum)))) {
- textRole = QPalette::HighlightedText;
- //Draw text shadow, This will increase readability when the background of same color
- QRect shadowRect(pb->rect);
- shadowRect.translate(1,1);
- QColor shadowColor = (pb->palette.color(textRole).value() <= 128)
- ? QColor(255,255,255,160) : QColor(0,0,0,160);
- QPalette shadowPalette = pb->palette;
- shadowPalette.setColor(textRole, shadowColor);
- proxy()->drawItemText(p, shadowRect, Qt::AlignCenter | Qt::TextSingleLine, shadowPalette,
- pb->state & State_Enabled, pb->text, textRole);
- }
- proxy()->drawItemText(p, pb->rect, Qt::AlignCenter | Qt::TextSingleLine, pb->palette,
- pb->state & State_Enabled, pb->text, textRole);
- }
- break;
- case CE_ProgressBarContents:
- if (const QStyleOptionProgressBar *pb = qstyleoption_cast<const QStyleOptionProgressBar *>(opt)) {
-
- QRect rect = pb->rect;
- const bool inverted = pb->invertedAppearance;
- qint64 minimum = qint64(pb->minimum);
- qint64 maximum = qint64(pb->maximum);
- qint64 progress = qint64(pb->progress);
-
- QPalette pal2 = pb->palette;
- // Correct the highlight color if it is the same as the background
- if (pal2.highlight() == pal2.window())
- pal2.setColor(QPalette::Highlight, pb->palette.color(QPalette::Active,
- QPalette::Highlight));
- bool reverse = pb->direction == Qt::RightToLeft;
- if (inverted)
- reverse = !reverse;
- int w = rect.width();
- if (pb->minimum == 0 && pb->maximum == 0) {
- // draw busy indicator
- int x = (progress - minimum) % (w * 2);
- if (x > w)
- x = 2 * w - x;
- x = reverse ? rect.right() - x : x + rect.x();
- p->setPen(QPen(pal2.highlight().color(), 4));
- p->drawLine(x, rect.y(), x, rect.height());
- } else {
- const int unit_width = proxy()->pixelMetric(PM_ProgressBarChunkWidth, pb);
- if (!unit_width)
- return;
-
- int u;
- if (unit_width > 1)
- u = ((rect.width() + unit_width) / unit_width);
- else
- u = w / unit_width;
- qint64 p_v = progress - minimum;
- qint64 t_s = (maximum - minimum) ? (maximum - minimum) : qint64(1);
-
- if (u > 0 && p_v >= INT_MAX / u && t_s >= u) {
- // scale down to something usable.
- p_v /= u;
- t_s /= u;
- }
-
- // nu < tnu, if last chunk is only a partial chunk
- int tnu, nu;
- tnu = nu = p_v * u / t_s;
-
- if (nu * unit_width > w)
- --nu;
-
- // Draw nu units out of a possible u of unit_width
- // width, each a rectangle bordered by background
- // color, all in a sunken panel with a percentage text
- // display at the end.
- int x = 0;
- int x0 = reverse ? rect.right() - ((unit_width > 1) ? unit_width : 0)
- : rect.x();
-
- QStyleOptionProgressBar pbBits = *pb;
- pbBits.rect = rect;
- pbBits.palette = pal2;
- int myY = pbBits.rect.y();
- int myHeight = pbBits.rect.height();
- pbBits.state = State_Horizontal;
- for (int i = 0; i < nu; ++i) {
- pbBits.rect.setRect(x0 + x, myY, unit_width, myHeight);
- proxy()->drawPrimitive(PE_IndicatorProgressChunk, &pbBits, p);
- x += reverse ? -unit_width : unit_width;
- }
-
- // Draw the last partial chunk to fill up the
- // progress bar entirely
- if (nu < tnu) {
- int pixels_left = w - (nu * unit_width);
- int offset = reverse ? x0 + x + unit_width-pixels_left : x0 + x;
- pbBits.rect.setRect(offset, myY, pixels_left, myHeight);
- proxy()->drawPrimitive(PE_IndicatorProgressChunk, &pbBits, p);
- }
- }
- }
- break;
- case CE_HeaderLabel:
- if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(opt)) {
- QRect rect = header->rect;
- if (!header->icon.isNull()) {
- int iconExtent = proxy()->pixelMetric(PM_SmallIconSize);
- QPixmap pixmap
- = header->icon.pixmap(QSize(iconExtent, iconExtent), dpr(opt->window),
- header->state.testFlag(State_Enabled) ? QIcon::Normal : QIcon::Disabled);
- int pixw = pixmap.width() / pixmap.devicePixelRatio();
-
- QRect aligned = alignedRect(header->direction, QFlag(header->iconAlignment), pixmap.size() / pixmap.devicePixelRatio(), rect);
- QRect inter = aligned.intersected(rect);
- p->drawPixmap(inter.x(), inter.y(), pixmap,
- inter.x() - aligned.x(), inter.y() - aligned.y(),
- aligned.width() * pixmap.devicePixelRatio(),
- pixmap.height() * pixmap.devicePixelRatio());
-
- const int margin = proxy()->pixelMetric(QStyle::PM_HeaderMargin, opt);
- if (header->direction == Qt::LeftToRight)
- rect.setLeft(rect.left() + pixw + margin);
- else
- rect.setRight(rect.right() - pixw - margin);
- }
- if (header->state & QStyle::State_On) {
- QFont fnt = p->font();
- fnt.setBold(true);
- p->setFont(fnt);
- }
- proxy()->drawItemText(p, rect, header->textAlignment, header->palette,
- (header->state & State_Enabled), header->text, QPalette::ButtonText);
- }
- break;
- case CE_ToolButtonLabel:
- if (const QStyleOptionToolButton *toolbutton
- = qstyleoption_cast<const QStyleOptionToolButton *>(opt)) {
- QRect rect = toolbutton->rect;
- int shiftX = 0;
- int shiftY = 0;
- if (toolbutton->state & (State_Sunken | State_On)) {
- shiftX = proxy()->pixelMetric(PM_ButtonShiftHorizontal, toolbutton);
- shiftY = proxy()->pixelMetric(PM_ButtonShiftVertical, toolbutton);
- }
- // Arrow type always overrules and is always shown
- bool hasArrow = toolbutton->features & QStyleOptionToolButton::Arrow;
- if (((!hasArrow && toolbutton->icon.isNull()) && !toolbutton->text.isEmpty())
- || toolbutton->toolButtonStyle == Qt::ToolButtonTextOnly) {
- int alignment = Qt::AlignCenter | Qt::TextShowMnemonic;
- if (!proxy()->styleHint(SH_UnderlineShortcut, opt))
- alignment |= Qt::TextHideMnemonic;
- rect.translate(shiftX, shiftY);
- p->setFont(toolbutton->font);
- proxy()->drawItemText(p, rect, alignment, toolbutton->palette,
- opt->state & State_Enabled, toolbutton->text,
- QPalette::ButtonText);
- } else {
- QPixmap pm;
- QSize pmSize = toolbutton->iconSize;
- if (!toolbutton->icon.isNull()) {
- QIcon::State state = toolbutton->state & State_On ? QIcon::On : QIcon::Off;
- QIcon::Mode mode;
- if (!(toolbutton->state & State_Enabled))
- mode = QIcon::Disabled;
- else if ((opt->state & State_MouseOver) && (opt->state & State_AutoRaise))
- mode = QIcon::Active;
- else
- mode = QIcon::Normal;
- pm = toolbutton->icon.pixmap(toolbutton->rect.size().boundedTo(toolbutton->iconSize),
- dpr(opt->window), mode, state);
- pmSize = pm.size() / pm.devicePixelRatio();
- }
-
- if (toolbutton->toolButtonStyle != Qt::ToolButtonIconOnly) {
- p->setFont(toolbutton->font);
- QRect pr = rect,
- tr = rect;
- int alignment = Qt::TextShowMnemonic;
- if (!proxy()->styleHint(SH_UnderlineShortcut, opt))
- alignment |= Qt::TextHideMnemonic;
-
- if (toolbutton->toolButtonStyle == Qt::ToolButtonTextUnderIcon) {
- pr.setHeight(pmSize.height() + 4); //### 4 is currently hardcoded in QToolButton::sizeHint()
- tr.adjust(0, pr.height() - 1, 0, -1);
- pr.translate(shiftX, shiftY);
- if (!hasArrow) {
- proxy()->drawItemPixmap(p, pr, Qt::AlignCenter, pm);
- } else {
- drawArrow(proxy(), toolbutton, pr, p);
- }
- alignment |= Qt::AlignCenter;
- } else {
- pr.setWidth(pmSize.width() + 4); //### 4 is currently hardcoded in QToolButton::sizeHint()
- tr.adjust(pr.width(), 0, 0, 0);
- pr.translate(shiftX, shiftY);
- if (!hasArrow) {
- proxy()->drawItemPixmap(p, QStyle::visualRect(opt->direction, rect, pr), Qt::AlignCenter, pm);
- } else {
- drawArrow(proxy(), toolbutton, pr, p);
- }
- alignment |= Qt::AlignLeft | Qt::AlignVCenter;
- }
- tr.translate(shiftX, shiftY);
- const QString text = d->toolButtonElideText(toolbutton, tr, alignment);
- proxy()->drawItemText(p, QStyle::visualRect(opt->direction, rect, tr), alignment, toolbutton->palette,
- toolbutton->state & State_Enabled, text,
- QPalette::ButtonText);
- } else {
- rect.translate(shiftX, shiftY);
- if (hasArrow) {
- drawArrow(proxy(), toolbutton, rect, p);
- } else {
- proxy()->drawItemPixmap(p, rect, Qt::AlignCenter, pm);
- }
- }
- }
- }
- break;
- case CE_ToolBoxTab:
- if (const QStyleOptionToolBox *tb = qstyleoption_cast<const QStyleOptionToolBox *>(opt)) {
- proxy()->drawControl(CE_ToolBoxTabShape, tb, p);
- proxy()->drawControl(CE_ToolBoxTabLabel, tb, p);
- }
- break;
- case CE_ToolBoxTabShape:
- if (const QStyleOptionToolBox *tb = qstyleoption_cast<const QStyleOptionToolBox *>(opt)) {
- p->setPen(tb->palette.mid().color().darker(150));
- int d = 20 + tb->rect.height() - 3;
- if (tb->direction != Qt::RightToLeft) {
- const QPoint points[] = {
- QPoint(-1, tb->rect.height() + 1),
- QPoint(-1, 1),
- QPoint(tb->rect.width() - d, 1),
- QPoint(tb->rect.width() - 20, tb->rect.height() - 2),
- QPoint(tb->rect.width() - 1, tb->rect.height() - 2),
- QPoint(tb->rect.width() - 1, tb->rect.height() + 1),
- QPoint(-1, tb->rect.height() + 1),
- };
- p->drawPolygon(points, sizeof points / sizeof *points);
- } else {
- const QPoint points[] = {
- QPoint(tb->rect.width(), tb->rect.height() + 1),
- QPoint(tb->rect.width(), 1),
- QPoint(d - 1, 1),
- QPoint(20 - 1, tb->rect.height() - 2),
- QPoint(0, tb->rect.height() - 2),
- QPoint(0, tb->rect.height() + 1),
- QPoint(tb->rect.width(), tb->rect.height() + 1),
- };
- p->drawPolygon(points, sizeof points / sizeof *points);
- }
- p->setPen(tb->palette.light().color());
- if (tb->direction != Qt::RightToLeft) {
- p->drawLine(0, 2, tb->rect.width() - d, 2);
- p->drawLine(tb->rect.width() - d - 1, 2, tb->rect.width() - 21, tb->rect.height() - 1);
- p->drawLine(tb->rect.width() - 20, tb->rect.height() - 1,
- tb->rect.width(), tb->rect.height() - 1);
- } else {
- p->drawLine(tb->rect.width() - 1, 2, d - 1, 2);
- p->drawLine(d, 2, 20, tb->rect.height() - 1);
- p->drawLine(19, tb->rect.height() - 1,
- -1, tb->rect.height() - 1);
- }
- p->setBrush(Qt::NoBrush);
- }
- break;
- case CE_TabBarTab:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) {
- proxy()->drawControl(CE_TabBarTabShape, tab, p);
- proxy()->drawControl(CE_TabBarTabLabel, tab, p);
- }
- break;
- case CE_TabBarTabShape:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) {
- p->save();
-
- QRect rect(tab->rect);
- bool selected = tab->state & State_Selected;
- bool onlyOne = tab->position == QStyleOptionTab::OnlyOneTab;
- int tabOverlap = onlyOne ? 0 : proxy()->pixelMetric(PM_TabBarTabOverlap, opt);
-
- if (!selected) {
- switch (tab->shape) {
- case QStyleOptionTab::TriangularNorth:
- rect.adjust(0, 0, 0, -tabOverlap);
- if(!selected)
- rect.adjust(1, 1, -1, 0);
- break;
- case QStyleOptionTab::TriangularSouth:
- rect.adjust(0, tabOverlap, 0, 0);
- if(!selected)
- rect.adjust(1, 0, -1, -1);
- break;
- case QStyleOptionTab::TriangularEast:
- rect.adjust(tabOverlap, 0, 0, 0);
- if(!selected)
- rect.adjust(0, 1, -1, -1);
- break;
- case QStyleOptionTab::TriangularWest:
- rect.adjust(0, 0, -tabOverlap, 0);
- if(!selected)
- rect.adjust(1, 1, 0, -1);
- break;
- default:
- break;
- }
- }
-
- p->setPen(QPen(tab->palette.windowText(), 0));
- if (selected) {
- p->setBrush(tab->palette.base());
- } else {
- p->setBrush(tab->palette.window());
- }
-
- int y;
- int x;
- QPolygon a(10);
- switch (tab->shape) {
- case QStyleOptionTab::TriangularNorth:
- case QStyleOptionTab::TriangularSouth: {
- a.setPoint(0, 0, -1);
- a.setPoint(1, 0, 0);
- y = rect.height() - 2;
- x = y / 3;
- a.setPoint(2, x++, y - 1);
- ++x;
- a.setPoint(3, x++, y++);
- a.setPoint(4, x, y);
-
- int i;
- int right = rect.width() - 1;
- for (i = 0; i < 5; ++i)
- a.setPoint(9 - i, right - a.point(i).x(), a.point(i).y());
- if (tab->shape == QStyleOptionTab::TriangularNorth)
- for (i = 0; i < 10; ++i)
- a.setPoint(i, a.point(i).x(), rect.height() - 1 - a.point(i).y());
-
- a.translate(rect.left(), rect.top());
- p->setRenderHint(QPainter::Antialiasing);
- p->translate(0, 0.5);
-
- QPainterPath path;
- path.addPolygon(a);
- p->drawPath(path);
- break; }
- case QStyleOptionTab::TriangularEast:
- case QStyleOptionTab::TriangularWest: {
- a.setPoint(0, -1, 0);
- a.setPoint(1, 0, 0);
- x = rect.width() - 2;
- y = x / 3;
- a.setPoint(2, x - 1, y++);
- ++y;
- a.setPoint(3, x++, y++);
- a.setPoint(4, x, y);
- int i;
- int bottom = rect.height() - 1;
- for (i = 0; i < 5; ++i)
- a.setPoint(9 - i, a.point(i).x(), bottom - a.point(i).y());
- if (tab->shape == QStyleOptionTab::TriangularWest)
- for (i = 0; i < 10; ++i)
- a.setPoint(i, rect.width() - 1 - a.point(i).x(), a.point(i).y());
- a.translate(rect.left(), rect.top());
- p->setRenderHint(QPainter::Antialiasing);
- p->translate(0.5, 0);
- QPainterPath path;
- path.addPolygon(a);
- p->drawPath(path);
- break; }
- default:
- break;
- }
- p->restore();
- }
- break;
- case CE_ToolBoxTabLabel:
- if (const QStyleOptionToolBox *tb = qstyleoption_cast<const QStyleOptionToolBox *>(opt)) {
- bool enabled = tb->state & State_Enabled;
- bool selected = tb->state & State_Selected;
- int iconExtent = proxy()->pixelMetric(QStyle::PM_SmallIconSize, tb);
- QPixmap pm = tb->icon.pixmap(QSize(iconExtent, iconExtent), dpr(opt->window),
- enabled ? QIcon::Normal : QIcon::Disabled);
-
- QRect cr = subElementRect(QStyle::SE_ToolBoxTabContents, tb);
- QRect tr, ir;
- int ih = 0;
- if (pm.isNull()) {
- tr = cr;
- tr.adjust(4, 0, -8, 0);
- } else {
- int iw = pm.width() / pm.devicePixelRatio() + 4;
- ih = pm.height()/ pm.devicePixelRatio();
- ir = QRect(cr.left() + 4, cr.top(), iw + 2, ih);
- tr = QRect(ir.right(), cr.top(), cr.width() - ir.right() - 4, cr.height());
- }
-
- if (selected && proxy()->styleHint(QStyle::SH_ToolBox_SelectedPageTitleBold, tb)) {
- QFont f(p->font());
- f.setBold(true);
- p->setFont(f);
- }
-
- QString txt = tb->fontMetrics.elidedText(tb->text, Qt::ElideRight, tr.width());
-
- if (ih)
- p->drawPixmap(ir.left(), (tb->rect.height() - ih) / 2, pm);
-
- int alignment = Qt::AlignLeft | Qt::AlignVCenter | Qt::TextShowMnemonic;
- if (!proxy()->styleHint(QStyle::SH_UnderlineShortcut, tb))
- alignment |= Qt::TextHideMnemonic;
- proxy()->drawItemText(p, tr, alignment, tb->palette, enabled, txt, QPalette::ButtonText);
-
- if (!txt.isEmpty() && opt->state & State_HasFocus) {
- QStyleOptionFocusRect opt;
- opt.rect = tr;
- opt.palette = tb->palette;
- opt.state = QStyle::State_None;
- proxy()->drawPrimitive(QStyle::PE_FrameFocusRect, &opt, p);
- }
- }
- break;
- case CE_TabBarTabLabel:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) {
- QRect tr = tab->rect;
- bool verticalTabs = tab->shape == QStyleOptionTab::RoundedEast
- || tab->shape == QStyleOptionTab::RoundedWest
- || tab->shape == QStyleOptionTab::TriangularEast
- || tab->shape == QStyleOptionTab::TriangularWest;
-
- int alignment = Qt::AlignCenter | Qt::TextShowMnemonic;
- if (!proxy()->styleHint(SH_UnderlineShortcut, opt))
- alignment |= Qt::TextHideMnemonic;
-
- if (verticalTabs) {
- p->save();
- int newX, newY, newRot;
- if (tab->shape == QStyleOptionTab::RoundedEast || tab->shape == QStyleOptionTab::TriangularEast) {
- newX = tr.width() + tr.x();
- newY = tr.y();
- newRot = 90;
- } else {
- newX = tr.x();
- newY = tr.y() + tr.height();
- newRot = -90;
- }
- QTransform m = QTransform::fromTranslate(newX, newY);
- m.rotate(newRot);
- p->setTransform(m, true);
- }
- QRect iconRect;
- d->tabLayout(tab, &tr, &iconRect);
- tr = proxy()->subElementRect(SE_TabBarTabText, opt); //we compute tr twice because the style may override subElementRect
-
- if (!tab->icon.isNull()) {
- QPixmap tabIcon = tab->icon.pixmap(tab->iconSize, dpr(opt->window),
- (tab->state & State_Enabled) ? QIcon::Normal
- : QIcon::Disabled,
- (tab->state & State_Selected) ? QIcon::On
- : QIcon::Off);
- p->drawPixmap(iconRect.x(), iconRect.y(), tabIcon);
- }
-
- proxy()->drawItemText(p, tr, alignment, tab->palette, tab->state & State_Enabled, tab->text, QPalette::WindowText);
- if (verticalTabs)
- p->restore();
-
- if (tab->state & State_HasFocus) {
- const int OFFSET = 1 + pixelMetric(PM_DefaultFrameWidth);
-
- int x1, x2;
- x1 = tab->rect.left();
- x2 = tab->rect.right() - 1;
-
- QStyleOptionFocusRect fropt;
- fropt.QStyleOption::operator=(*tab);
- fropt.rect.setRect(x1 + 1 + OFFSET, tab->rect.y() + OFFSET,
- x2 - x1 - 2*OFFSET, tab->rect.height() - 2*OFFSET);
- drawPrimitive(PE_FrameFocusRect, &fropt, p);
- }
- }
- break;
- case CE_SizeGrip: {
- p->save();
- int x, y, w, h;
- opt->rect.getRect(&x, &y, &w, &h);
-
- int sw = qMin(h, w);
- if (h > w)
- p->translate(0, h - w);
- else
- p->translate(w - h, 0);
-
- int sx = x;
- int sy = y;
- int s = sw / 3;
-
- Qt::Corner corner;
- if (const QStyleOptionSizeGrip *sgOpt = qstyleoption_cast<const QStyleOptionSizeGrip *>(opt))
- corner = sgOpt->corner;
- else if (opt->direction == Qt::RightToLeft)
- corner = Qt::BottomLeftCorner;
- else
- corner = Qt::BottomRightCorner;
-
- if (corner == Qt::BottomLeftCorner) {
- sx = x + sw;
- for (int i = 0; i < 4; ++i) {
- p->setPen(QPen(opt->palette.light().color(), 1));
- p->drawLine(x, sy - 1 , sx + 1, sw);
- p->setPen(QPen(opt->palette.dark().color(), 1));
- p->drawLine(x, sy, sx, sw);
- p->setPen(QPen(opt->palette.dark().color(), 1));
- p->drawLine(x, sy + 1, sx - 1, sw);
- sx -= s;
- sy += s;
- }
- } else if (corner == Qt::BottomRightCorner) {
- for (int i = 0; i < 4; ++i) {
- p->setPen(QPen(opt->palette.light().color(), 1));
- p->drawLine(sx - 1, sw, sw, sy - 1);
- p->setPen(QPen(opt->palette.dark().color(), 1));
- p->drawLine(sx, sw, sw, sy);
- p->setPen(QPen(opt->palette.dark().color(), 1));
- p->drawLine(sx + 1, sw, sw, sy + 1);
- sx += s;
- sy += s;
- }
- } else if (corner == Qt::TopRightCorner) {
- sy = y + sw;
- for (int i = 0; i < 4; ++i) {
- p->setPen(QPen(opt->palette.light().color(), 1));
- p->drawLine(sx - 1, y, sw, sy + 1);
- p->setPen(QPen(opt->palette.dark().color(), 1));
- p->drawLine(sx, y, sw, sy);
- p->setPen(QPen(opt->palette.dark().color(), 1));
- p->drawLine(sx + 1, y, sw, sy - 1);
- sx += s;
- sy -= s;
- }
- } else if (corner == Qt::TopLeftCorner) {
- for (int i = 0; i < 4; ++i) {
- p->setPen(QPen(opt->palette.light().color(), 1));
- p->drawLine(x, sy - 1, sx - 1, y);
- p->setPen(QPen(opt->palette.dark().color(), 1));
- p->drawLine(x, sy, sx, y);
- p->setPen(QPen(opt->palette.dark().color(), 1));
- p->drawLine(x, sy + 1, sx + 1, y);
- sx += s;
- sy += s;
- }
- }
- p->restore();
- break; }
- case CE_RubberBand: {
- if (const QStyleOptionRubberBand *rbOpt = qstyleoption_cast<const QStyleOptionRubberBand *>(opt)) {
- QPixmap tiledPixmap(16, 16);
- QPainter pixmapPainter(&tiledPixmap);
- pixmapPainter.setPen(Qt::NoPen);
- pixmapPainter.setBrush(Qt::Dense4Pattern);
- pixmapPainter.setBackground(QBrush(opt->palette.base()));
- pixmapPainter.setBackgroundMode(Qt::OpaqueMode);
- pixmapPainter.drawRect(0, 0, tiledPixmap.width(), tiledPixmap.height());
- pixmapPainter.end();
- // ### workaround for borked XRENDER
- tiledPixmap = QPixmap::fromImage(tiledPixmap.toImage());
-
- p->save();
- QRect r = opt->rect;
- QStyleHintReturnMask mask;
- if (proxy()->styleHint(QStyle::SH_RubberBand_Mask, opt, &mask))
- p->setClipRegion(mask.region);
- p->drawTiledPixmap(r.x(), r.y(), r.width(), r.height(), tiledPixmap);
- p->setPen(opt->palette.color(QPalette::Active, QPalette::WindowText));
- p->setBrush(Qt::NoBrush);
- p->drawRect(r.adjusted(0, 0, -1, -1));
- if (rbOpt->shape == QStyleOptionRubberBand::Rectangle)
- p->drawRect(r.adjusted(3, 3, -4, -4));
- p->restore();
- }
- break; }
- case CE_DockWidgetTitle:
- if (const QStyleOptionDockWidget *dwOpt = qstyleoption_cast<const QStyleOptionDockWidget *>(opt)) {
- QRect r = dwOpt->rect.adjusted(0, 0, -1, -1);
- if (dwOpt->movable) {
- p->setPen(dwOpt->palette.color(QPalette::Dark));
- p->drawRect(r);
- }
-
- if (!dwOpt->title.isEmpty()) {
- const bool verticalTitleBar = dwOpt->verticalTitleBar;
-
- if (verticalTitleBar) {
- r = r.transposed();
-
- p->save();
- p->translate(r.left(), r.top() + r.width());
- p->rotate(-90);
- p->translate(-r.left(), -r.top());
- }
-
- const int indent = p->fontMetrics().descent();
- proxy()->drawItemText(p, r.adjusted(indent + 1, 1, -indent - 1, -1),
- Qt::AlignLeft | Qt::AlignVCenter, dwOpt->palette,
- dwOpt->state & State_Enabled, dwOpt->title,
- QPalette::WindowText);
-
- if (verticalTitleBar)
- p->restore();
- }
- }
- break;
- case CE_Header:
- if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(opt)) {
- QRegion clipRegion = p->clipRegion();
- p->setClipRect(opt->rect);
- proxy()->drawControl(CE_HeaderSection, header, p);
- QStyleOptionHeader subopt = *header;
- subopt.rect = subElementRect(SE_HeaderLabel, header);
- if (subopt.rect.isValid())
- proxy()->drawControl(CE_HeaderLabel, &subopt, p);
- if (header->sortIndicator != QStyleOptionHeader::None) {
- subopt.rect = subElementRect(SE_HeaderArrow, opt);
- proxy()->drawPrimitive(PE_IndicatorHeaderArrow, &subopt, p);
- }
- p->setClipRegion(clipRegion);
- }
- break;
- case CE_FocusFrame:
- p->fillRect(opt->rect, opt->palette.windowText());
- break;
- case CE_HeaderSection:
- qDrawShadePanel(p, opt->rect, opt->palette,
- opt->state & State_Sunken, 1,
- &opt->palette.brush(QPalette::Button));
- break;
- case CE_HeaderEmptyArea:
- p->fillRect(opt->rect, opt->palette.window());
- break;
- case CE_ComboBoxLabel:
- if (const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(opt)) {
- QRect editRect = proxy()->subControlRect(CC_ComboBox, cb, SC_ComboBoxEditField);
- p->save();
- p->setClipRect(editRect);
- if (!cb->currentIcon.isNull()) {
- QIcon::Mode mode = cb->state & State_Enabled ? QIcon::Normal
- : QIcon::Disabled;
- QPixmap pixmap = cb->currentIcon.pixmap(cb->iconSize, dpr(opt->window), mode);
- QRect iconRect(editRect);
- iconRect.setWidth(cb->iconSize.width() + 4);
- iconRect = alignedRect(cb->direction,
- Qt::AlignLeft | Qt::AlignVCenter,
- iconRect.size(), editRect);
- if (cb->editable)
- p->fillRect(iconRect, opt->palette.brush(QPalette::Base));
- proxy()->drawItemPixmap(p, iconRect, Qt::AlignCenter, pixmap);
-
- if (cb->direction == Qt::RightToLeft)
- editRect.translate(-4 - cb->iconSize.width(), 0);
- else
- editRect.translate(cb->iconSize.width() + 4, 0);
- }
- if (!cb->currentText.isEmpty() && !cb->editable) {
- proxy()->drawItemText(p, editRect.adjusted(1, 0, -1, 0),
- visualAlignment(cb->direction, Qt::AlignLeft | Qt::AlignVCenter),
- cb->palette, cb->state & State_Enabled, cb->currentText);
- }
- p->restore();
- }
- break;
- case CE_ToolBar:
- if (const QStyleOptionToolBar *toolBar = qstyleoption_cast<const QStyleOptionToolBar *>(opt)) {
- // Compatibility with styles that use PE_PanelToolBar
- QStyleOptionFrame frame;
- frame.QStyleOption::operator=(*toolBar);
- frame.lineWidth = toolBar->lineWidth;
- frame.midLineWidth = toolBar->midLineWidth;
- proxy()->drawPrimitive(PE_PanelToolBar, opt, p);
-
- qDrawShadePanel(p, toolBar->rect, toolBar->palette, false, toolBar->lineWidth,
- &toolBar->palette.brush(QPalette::Button));
- }
- break;
- case CE_ColumnViewGrip: {
- // draw background gradients
- QLinearGradient g(0, 0, opt->rect.width(), 0);
- g.setColorAt(0, opt->palette.color(QPalette::Active, QPalette::Mid));
- g.setColorAt(0.5, Qt::white);
- p->fillRect(QRect(0, 0, opt->rect.width(), opt->rect.height()), g);
-
- // draw the two lines
- QPen pen(p->pen());
- pen.setWidth(opt->rect.width()/20);
- pen.setColor(opt->palette.color(QPalette::Active, QPalette::Dark));
- p->setPen(pen);
-
- int line1starting = opt->rect.width()*8 / 20;
- int line2starting = opt->rect.width()*13 / 20;
- int top = opt->rect.height()*20/75;
- int bottom = opt->rect.height() - 1 - top;
- p->drawLine(line1starting, top, line1starting, bottom);
- p->drawLine(line2starting, top, line2starting, bottom);
- }
- break;
- case CE_ItemViewItem:
- if (const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>(opt)) {
- p->save();
- p->setClipRect(opt->rect);
-
- QRect checkRect = proxy()->subElementRect(SE_ItemViewItemCheckIndicator, vopt);
- QRect iconRect = proxy()->subElementRect(SE_ItemViewItemDecoration, vopt);
- QRect textRect = proxy()->subElementRect(SE_ItemViewItemText, vopt);
-
- // draw the background
- proxy()->drawPrimitive(PE_PanelItemViewItem, opt, p);
-
- // draw the check mark
- if (vopt->features & QStyleOptionViewItem::HasCheckIndicator) {
- QStyleOptionViewItem option(*vopt);
- option.rect = checkRect;
- option.state = option.state & ~QStyle::State_HasFocus;
-
- switch (vopt->checkState) {
- case Qt::Unchecked:
- option.state |= QStyle::State_Off;
- break;
- case Qt::PartiallyChecked:
- option.state |= QStyle::State_NoChange;
- break;
- case Qt::Checked:
- option.state |= QStyle::State_On;
- break;
- }
- proxy()->drawPrimitive(QStyle::PE_IndicatorItemViewItemCheck, &option, p);
- }
-
- // draw the icon
- QIcon::Mode mode = QIcon::Normal;
- if (!(vopt->state & QStyle::State_Enabled))
- mode = QIcon::Disabled;
- else if (vopt->state & QStyle::State_Selected)
- mode = QIcon::Selected;
- QIcon::State state = vopt->state & QStyle::State_Open ? QIcon::On : QIcon::Off;
- vopt->icon.paint(p, iconRect, vopt->decorationAlignment, mode, state);
-
- // draw the text
- if (!vopt->text.isEmpty()) {
- QPalette::ColorGroup cg = vopt->state & QStyle::State_Enabled
- ? QPalette::Normal : QPalette::Disabled;
- if (cg == QPalette::Normal && !(vopt->state & QStyle::State_Active))
- cg = QPalette::Inactive;
-
- if (vopt->state & QStyle::State_Selected) {
- p->setPen(vopt->palette.color(cg, QPalette::HighlightedText));
- } else {
- p->setPen(vopt->palette.color(cg, QPalette::Text));
- }
- if (vopt->state & QStyle::State_Editing) {
- p->setPen(vopt->palette.color(cg, QPalette::Text));
- p->drawRect(textRect.adjusted(0, 0, -1, -1));
- }
-
- d->viewItemDrawText(p, vopt, textRect);
- }
-
- // draw the focus rect
- if (vopt->state & QStyle::State_HasFocus) {
- QStyleOptionFocusRect o;
- o.QStyleOption::operator=(*vopt);
- o.rect = proxy()->subElementRect(SE_ItemViewItemFocusRect, vopt);
- o.state |= QStyle::State_KeyboardFocusChange;
- o.state |= QStyle::State_Item;
- QPalette::ColorGroup cg = (vopt->state & QStyle::State_Enabled)
- ? QPalette::Normal : QPalette::Disabled;
- o.backgroundColor = vopt->palette.color(cg, (vopt->state & QStyle::State_Selected)
- ? QPalette::Highlight : QPalette::Window);
- proxy()->drawPrimitive(QStyle::PE_FrameFocusRect, &o, p);
- }
-
- p->restore();
- }
- break;
- case CE_ShapedFrame:
- if (const QStyleOptionFrame *f = qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
- int frameShape = f->frameShape;
- int frameShadow = QStyleOptionFrame::Plain;
- if (f->state & QStyle::State_Sunken) {
- frameShadow = QStyleOptionFrame::Sunken;
- } else if (f->state & QStyle::State_Raised) {
- frameShadow = QStyleOptionFrame::Raised;
- }
-
- int lw = f->lineWidth;
- int mlw = f->midLineWidth;
- QPalette::ColorRole foregroundRole = QPalette::WindowText;
-
- switch (frameShape) {
- case QStyleOptionFrame::Box:
- if (frameShadow == QStyleOptionFrame::Plain) {
- qDrawPlainRect(p, f->rect, f->palette.color(foregroundRole), lw);
- } else {
- qDrawShadeRect(p, f->rect, f->palette, frameShadow == QStyleOptionFrame::Sunken, lw, mlw);
- }
- break;
- case QStyleOptionFrame::StyledPanel:
- proxy()->drawPrimitive(QStyle::PE_Frame, opt, p);
- break;
- case QStyleOptionFrame::Panel:
- if (frameShadow == QStyleOptionFrame::Plain) {
- qDrawPlainRect(p, f->rect, f->palette.color(foregroundRole), lw);
- } else {
- qDrawShadePanel(p, f->rect, f->palette, frameShadow == QStyleOptionFrame::Sunken, lw);
- }
- break;
- case QStyleOptionFrame::WinPanel:
- if (frameShadow == QStyleOptionFrame::Plain) {
- qDrawPlainRect(p, f->rect, f->palette.color(foregroundRole), lw);
- } else {
- qDrawWinPanel(p, f->rect, f->palette, frameShadow == QStyleOptionFrame::Sunken);
- }
- break;
- case QStyleOptionFrame::HLine:
- case QStyleOptionFrame::VLine: {
- QPoint p1, p2;
- if (frameShape == QStyleOptionFrame::HLine) {
- p1 = QPoint(opt->rect.x(), opt->rect.y() + opt->rect.height() / 2);
- p2 = QPoint(opt->rect.x() + opt->rect.width(), p1.y());
- } else {
- p1 = QPoint(opt->rect.x() + opt->rect.width() / 2, opt->rect.y());
- p2 = QPoint(p1.x(), p1.y() + opt->rect.height());
- }
- if (frameShadow == QStyleOptionFrame::Plain) {
- QPen oldPen = p->pen();
- p->setPen(QPen(opt->palette.brush(foregroundRole), lw));
- p->drawLine(p1, p2);
- p->setPen(oldPen);
- } else {
- qDrawShadeLine(p, p1, p2, f->palette, frameShadow == QStyleOptionFrame::Sunken, lw, mlw);
- }
- break;
- }
- }
- }
- break;
- default:
- break;
- }
-}
-
-QRect QCommonStyle::subElementRect(SubElement sr, const QStyleOption *opt) const
-{
- Q_D(const QCommonStyle);
- QRect r;
- switch (sr) {
- case SE_PushButtonContents:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- int dx1, dx2;
- dx1 = proxy()->pixelMetric(PM_DefaultFrameWidth, btn);
- if (btn->features & QStyleOptionButton::AutoDefaultButton)
- dx1 += proxy()->pixelMetric(PM_ButtonDefaultIndicator, btn);
- dx2 = dx1 * 2;
- r.setRect(opt->rect.x() + dx1, opt->rect.y() + dx1, opt->rect.width() - dx2,
- opt->rect.height() - dx2);
- r = visualRect(opt->direction, opt->rect, r);
- }
- break;
- case SE_PushButtonFocusRect:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- int dbw1 = 0, dbw2 = 0;
- if (btn->features & QStyleOptionButton::AutoDefaultButton){
- dbw1 = proxy()->pixelMetric(PM_ButtonDefaultIndicator, btn);
- dbw2 = dbw1 * 2;
- }
-
- int dfw1 = proxy()->pixelMetric(PM_DefaultFrameWidth, btn) + 1,
- dfw2 = dfw1 * 2;
-
- r.setRect(btn->rect.x() + dfw1 + dbw1, btn->rect.y() + dfw1 + dbw1,
- btn->rect.width() - dfw2 - dbw2, btn->rect.height()- dfw2 - dbw2);
- r = visualRect(opt->direction, opt->rect, r);
- }
- break;
- case SE_CheckBoxIndicator:
- {
- int h = proxy()->pixelMetric(PM_IndicatorHeight, opt);
- r.setRect(opt->rect.x(), opt->rect.y() + ((opt->rect.height() - h) / 2),
- proxy()->pixelMetric(PM_IndicatorWidth, opt), h);
- r = visualRect(opt->direction, opt->rect, r);
- }
- break;
-
- case SE_CheckBoxContents:
- {
- // Deal with the logical first, then convert it back to screen coords.
- QRect ir = visualRect(opt->direction, opt->rect,
- subElementRect(SE_CheckBoxIndicator, opt));
- int spacing = proxy()->pixelMetric(PM_CheckBoxLabelSpacing, opt);
- r.setRect(ir.right() + spacing, opt->rect.y(), opt->rect.width() - ir.width() - spacing,
- opt->rect.height());
- r = visualRect(opt->direction, opt->rect, r);
- }
- break;
-
- case SE_CheckBoxFocusRect:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- if (btn->icon.isNull() && btn->text.isEmpty()) {
- r = subElementRect(SE_CheckBoxIndicator, opt);
- r.adjust(1, 1, -1, -1);
- break;
- }
- // As above, deal with the logical first, then convert it back to screen coords.
- QRect cr = visualRect(btn->direction, btn->rect, subElementRect(SE_CheckBoxContents, btn));
-
- QRect iconRect, textRect;
- if (!btn->text.isEmpty()) {
- textRect = itemTextRect(opt->fontMetrics, cr, Qt::AlignAbsolute | Qt::AlignLeft
- | Qt::AlignVCenter | Qt::TextShowMnemonic,
- btn->state & State_Enabled, btn->text);
- }
- if (!btn->icon.isNull()) {
- iconRect = itemPixmapRect(cr, Qt::AlignAbsolute | Qt::AlignLeft | Qt::AlignVCenter
- | Qt::TextShowMnemonic,
- btn->icon.pixmap(btn->iconSize, dpr(opt->window), QIcon::Normal));
- if (!textRect.isEmpty())
- textRect.translate(iconRect.right() + 4, 0);
- }
- r = iconRect | textRect;
- r.adjust(-3, -2, 3, 2);
- r = r.intersected(btn->rect);
- r = visualRect(btn->direction, btn->rect, r);
- }
- break;
-
- case SE_RadioButtonIndicator:
- {
- int h = proxy()->pixelMetric(PM_ExclusiveIndicatorHeight, opt);
- r.setRect(opt->rect.x(), opt->rect.y() + ((opt->rect.height() - h) / 2),
- proxy()->pixelMetric(PM_ExclusiveIndicatorWidth, opt), h);
- r = visualRect(opt->direction, opt->rect, r);
- }
- break;
-
- case SE_RadioButtonContents:
- {
- QRect ir = visualRect(opt->direction, opt->rect,
- subElementRect(SE_RadioButtonIndicator, opt));
- int spacing = proxy()->pixelMetric(PM_RadioButtonLabelSpacing, opt);
- r.setRect(ir.left() + ir.width() + spacing, opt->rect.y(), opt->rect.width() - ir.width() - spacing,
- opt->rect.height());
- r = visualRect(opt->direction, opt->rect, r);
- break;
- }
-
- case SE_RadioButtonFocusRect:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- if (btn->icon.isNull() && btn->text.isEmpty()) {
- r = subElementRect(SE_RadioButtonIndicator, opt);
- r.adjust(1, 1, -1, -1);
- break;
- }
- QRect cr = visualRect(btn->direction, btn->rect, subElementRect(SE_RadioButtonContents, opt));
-
- QRect iconRect, textRect;
- if (!btn->text.isEmpty()){
- textRect = itemTextRect(opt->fontMetrics, cr, Qt::AlignAbsolute | Qt::AlignLeft | Qt::AlignVCenter
- | Qt::TextShowMnemonic, btn->state & State_Enabled, btn->text);
- }
- if (!btn->icon.isNull()) {
- iconRect = itemPixmapRect(cr, Qt::AlignAbsolute | Qt::AlignLeft | Qt::AlignVCenter | Qt::TextShowMnemonic,
- btn->icon.pixmap(btn->iconSize, dpr(opt->window), QIcon::Normal));
- if (!textRect.isEmpty())
- textRect.translate(iconRect.right() + 4, 0);
- }
- r = iconRect | textRect;
- r.adjust(-3, -2, 3, 2);
- r = r.intersected(btn->rect);
- r = visualRect(btn->direction, btn->rect, r);
- }
- break;
- case SE_SliderFocusRect:
- if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- int tickOffset = proxy()->pixelMetric(PM_SliderTickmarkOffset, slider);
- int thickness = proxy()->pixelMetric(PM_SliderControlThickness, slider);
- if (slider->orientation == Qt::Horizontal)
- r.setRect(0, tickOffset - 1, slider->rect.width(), thickness + 2);
- else
- r.setRect(tickOffset - 1, 0, thickness + 2, slider->rect.height());
- r = r.intersected(slider->rect);
- r = visualRect(opt->direction, opt->rect, r);
- }
- break;
- case SE_ProgressBarGroove:
- case SE_ProgressBarContents:
- case SE_ProgressBarLabel:
- if (const QStyleOptionProgressBar *pb = qstyleoption_cast<const QStyleOptionProgressBar *>(opt)) {
- int textw = 0;
- if (pb->textVisible)
- textw = qMax(pb->fontMetrics.horizontalAdvance(pb->text), pb->fontMetrics.horizontalAdvance(QLatin1String("100%"))) + 6;
-
- if ((pb->textAlignment & Qt::AlignCenter) == 0) {
- if (sr != SE_ProgressBarLabel)
- r.setCoords(pb->rect.left(), pb->rect.top(),
- pb->rect.right() - textw, pb->rect.bottom());
- else
- r.setCoords(pb->rect.right() - textw, pb->rect.top(),
- pb->rect.right(), pb->rect.bottom());
- } else {
- r = pb->rect;
- }
- r = visualRect(pb->direction, pb->rect, r);
- }
- break;
- case SE_ComboBoxFocusRect:
- if (const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(opt)) {
- int margin = cb->frame ? 3 : 0;
- r.setRect(opt->rect.left() + margin, opt->rect.top() + margin,
- opt->rect.width() - 2*margin - 16, opt->rect.height() - 2*margin);
- r = visualRect(opt->direction, opt->rect, r);
- }
- break;
- case SE_ToolBoxTabContents:
- r = opt->rect;
- r.adjust(0, 0, -30, 0);
- break;
- case SE_HeaderLabel: {
- int margin = proxy()->pixelMetric(QStyle::PM_HeaderMargin, opt);
- r.setRect(opt->rect.x() + margin, opt->rect.y() + margin,
- opt->rect.width() - margin * 2, opt->rect.height() - margin * 2);
-
- if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(opt)) {
- // Subtract width needed for arrow, if there is one
- if (header->sortIndicator != QStyleOptionHeader::None) {
- if (opt->state & State_Horizontal)
- r.setWidth(r.width() - (opt->rect.height() / 2) - (margin * 2));
- else
- r.setHeight(r.height() - (opt->rect.width() / 2) - (margin * 2));
- }
- }
- r = visualRect(opt->direction, opt->rect, r);
- break; }
- case SE_HeaderArrow: {
- int h = opt->rect.height();
- int w = opt->rect.width();
- int x = opt->rect.x();
- int y = opt->rect.y();
- int margin = proxy()->pixelMetric(QStyle::PM_HeaderMargin, opt);
-
- if (opt->state & State_Horizontal) {
- int horiz_size = h / 2;
- r.setRect(x + w - margin * 2 - horiz_size, y + 5,
- horiz_size, h - margin * 2 - 5);
- } else {
- int vert_size = w / 2;
- r.setRect(x + 5, y + h - margin * 2 - vert_size,
- w - margin * 2 - 5, vert_size);
- }
- r = visualRect(opt->direction, opt->rect, r);
- break; }
-
- case SE_RadioButtonClickRect:
- r = subElementRect(SE_RadioButtonFocusRect, opt);
- r |= subElementRect(SE_RadioButtonIndicator, opt);
- break;
- case SE_CheckBoxClickRect:
- r = subElementRect(SE_CheckBoxFocusRect, opt);
- r |= subElementRect(SE_CheckBoxIndicator, opt);
- break;
- case SE_TabWidgetTabBar:
- if (const QStyleOptionTabWidgetFrame *twf
- = qstyleoption_cast<const QStyleOptionTabWidgetFrame *>(opt)) {
- r.setSize(twf->tabBarSize);
- const uint alingMask = Qt::AlignLeft | Qt::AlignRight | Qt::AlignHCenter;
- switch (twf->shape) {
- case QStyleOptionTab::RoundedNorth:
- case QStyleOptionTab::TriangularNorth:
- // Constrain the size now, otherwise, center could get off the page
- // This of course repeated for all the other directions
- r.setWidth(qMin(r.width(), twf->rect.width()
- - twf->leftCornerWidgetSize.width()
- - twf->rightCornerWidgetSize.width()));
- switch (proxy()->styleHint(SH_TabBar_Alignment, twf) & alingMask) {
- default:
- case Qt::AlignLeft:
- r.moveTopLeft(QPoint(twf->leftCornerWidgetSize.width(), 0));
- break;
- case Qt::AlignHCenter:
- r.moveTopLeft(QPoint(twf->rect.center().x() - qRound(r.width() / 2.0f)
- + (twf->leftCornerWidgetSize.width() / 2)
- - (twf->rightCornerWidgetSize.width() / 2), 0));
- break;
- case Qt::AlignRight:
- r.moveTopLeft(QPoint(twf->rect.width() - twf->tabBarSize.width()
- - twf->rightCornerWidgetSize.width(), 0));
- break;
- }
- r = visualRect(twf->direction, twf->rect, r);
- break;
- case QStyleOptionTab::RoundedSouth:
- case QStyleOptionTab::TriangularSouth:
- r.setWidth(qMin(r.width(), twf->rect.width()
- - twf->leftCornerWidgetSize.width()
- - twf->rightCornerWidgetSize.width()));
- switch (proxy()->styleHint(SH_TabBar_Alignment, twf) & alingMask) {
- default:
- case Qt::AlignLeft:
- r.moveTopLeft(QPoint(twf->leftCornerWidgetSize.width(),
- twf->rect.height() - twf->tabBarSize.height()));
- break;
- case Qt::AlignHCenter:
- r.moveTopLeft(QPoint(twf->rect.center().x() - qRound(r.width() / 2.0f)
- + (twf->leftCornerWidgetSize.width() / 2)
- - (twf->rightCornerWidgetSize.width() / 2),
- twf->rect.height() - twf->tabBarSize.height()));
- break;
- case Qt::AlignRight:
- r.moveTopLeft(QPoint(twf->rect.width() - twf->tabBarSize.width()
- - twf->rightCornerWidgetSize.width(),
- twf->rect.height() - twf->tabBarSize.height()));
- break;
- }
- r = visualRect(twf->direction, twf->rect, r);
- break;
- case QStyleOptionTab::RoundedEast:
- case QStyleOptionTab::TriangularEast:
- r.setHeight(qMin(r.height(), twf->rect.height()
- - twf->leftCornerWidgetSize.height()
- - twf->rightCornerWidgetSize.height()));
- switch (proxy()->styleHint(SH_TabBar_Alignment, twf) & alingMask) {
- default:
- case Qt::AlignLeft:
- r.moveTopLeft(QPoint(twf->rect.width() - twf->tabBarSize.width(),
- twf->leftCornerWidgetSize.height()));
- break;
- case Qt::AlignHCenter:
- r.moveTopLeft(QPoint(twf->rect.width() - twf->tabBarSize.width(),
- twf->rect.center().y() - r.height() / 2));
- break;
- case Qt::AlignRight:
- r.moveTopLeft(QPoint(twf->rect.width() - twf->tabBarSize.width(),
- twf->rect.height() - twf->tabBarSize.height()
- - twf->rightCornerWidgetSize.height()));
- break;
- }
- break;
- case QStyleOptionTab::RoundedWest:
- case QStyleOptionTab::TriangularWest:
- r.setHeight(qMin(r.height(), twf->rect.height()
- - twf->leftCornerWidgetSize.height()
- - twf->rightCornerWidgetSize.height()));
- switch (proxy()->styleHint(SH_TabBar_Alignment, twf) & alingMask) {
- default:
- case Qt::AlignLeft:
- r.moveTopLeft(QPoint(0, twf->leftCornerWidgetSize.height()));
- break;
- case Qt::AlignHCenter:
- r.moveTopLeft(QPoint(0, twf->rect.center().y() - r.height() / 2));
- break;
- case Qt::AlignRight:
- r.moveTopLeft(QPoint(0, twf->rect.height() - twf->tabBarSize.height()
- - twf->rightCornerWidgetSize.height()));
- break;
- }
- break;
- }
- }
- break;
- case SE_TabWidgetTabPane:
- case SE_TabWidgetTabContents:
- if (const QStyleOptionTabWidgetFrame *twf = qstyleoption_cast<const QStyleOptionTabWidgetFrame *>(opt)) {
- QStyleOptionTab tabopt;
- tabopt.shape = twf->shape;
- int overlap = proxy()->pixelMetric(PM_TabBarBaseOverlap, &tabopt);
- if (twf->lineWidth == 0)
- overlap = 0;
- switch (twf->shape) {
- case QStyleOptionTab::RoundedNorth:
- case QStyleOptionTab::TriangularNorth:
- r = QRect(QPoint(0,qMax(twf->tabBarSize.height() - overlap, 0)),
- QSize(twf->rect.width(), qMin(twf->rect.height() - twf->tabBarSize.height() + overlap, twf->rect.height())));
- break;
- case QStyleOptionTab::RoundedSouth:
- case QStyleOptionTab::TriangularSouth:
- r = QRect(QPoint(0,0), QSize(twf->rect.width(), qMin(twf->rect.height() - twf->tabBarSize.height() + overlap, twf->rect.height())));
- break;
- case QStyleOptionTab::RoundedEast:
- case QStyleOptionTab::TriangularEast:
- r = QRect(QPoint(0, 0), QSize(qMin(twf->rect.width() - twf->tabBarSize.width() + overlap, twf->rect.width()), twf->rect.height()));
- break;
- case QStyleOptionTab::RoundedWest:
- case QStyleOptionTab::TriangularWest:
- r = QRect(QPoint(qMax(twf->tabBarSize.width() - overlap, 0), 0),
- QSize(qMin(twf->rect.width() - twf->tabBarSize.width() + overlap, twf->rect.width()), twf->rect.height()));
- break;
- }
- if (sr == SE_TabWidgetTabContents && twf->lineWidth > 0)
- r.adjust(2, 2, -2, -2);
- }
- break;
- case SE_TabWidgetLeftCorner:
- if (const QStyleOptionTabWidgetFrame *twf = qstyleoption_cast<const QStyleOptionTabWidgetFrame *>(opt)) {
- QRect paneRect = subElementRect(SE_TabWidgetTabPane, twf);
- switch (twf->shape) {
- case QStyleOptionTab::RoundedNorth:
- case QStyleOptionTab::TriangularNorth:
- r = QRect(QPoint(paneRect.x(), paneRect.y() - twf->leftCornerWidgetSize.height()),
- twf->leftCornerWidgetSize);
- break;
- case QStyleOptionTab::RoundedSouth:
- case QStyleOptionTab::TriangularSouth:
- r = QRect(QPoint(paneRect.x(), paneRect.height()), twf->leftCornerWidgetSize);
- break;
- default:
- break;
- }
- r = visualRect(twf->direction, twf->rect, r);
- }
- break;
- case SE_TabWidgetRightCorner:
- if (const QStyleOptionTabWidgetFrame *twf = qstyleoption_cast<const QStyleOptionTabWidgetFrame *>(opt)) {
- QRect paneRect = subElementRect(SE_TabWidgetTabPane, twf);
- switch (twf->shape) {
- case QStyleOptionTab::RoundedNorth:
- case QStyleOptionTab::TriangularNorth:
- r = QRect(QPoint(paneRect.width() - twf->rightCornerWidgetSize.width(),
- paneRect.y() - twf->rightCornerWidgetSize.height()),
- twf->rightCornerWidgetSize);
- break;
- case QStyleOptionTab::RoundedSouth:
- case QStyleOptionTab::TriangularSouth:
- r = QRect(QPoint(paneRect.width() - twf->rightCornerWidgetSize.width(),
- paneRect.height()), twf->rightCornerWidgetSize);
- break;
- default:
- break;
- }
- r = visualRect(twf->direction, twf->rect, r);
- }
- break;
- case SE_TabBarTabText:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) {
- QRect dummyIconRect;
- d->tabLayout(tab, &r, &dummyIconRect);
- }
- break;
- case SE_TabBarTabLeftButton:
- case SE_TabBarTabRightButton:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) {
- bool selected = tab->state & State_Selected;
- int verticalShift = proxy()->pixelMetric(QStyle::PM_TabBarTabShiftVertical, tab);
- int horizontalShift = proxy()->pixelMetric(QStyle::PM_TabBarTabShiftHorizontal, tab);
- int hpadding = proxy()->pixelMetric(QStyle::PM_TabBarTabHSpace, opt) / 2;
- hpadding = qMax(hpadding, 4); //workaround KStyle returning 0 because they workaround an old bug in Qt
-
- bool verticalTabs = tab->shape == QStyleOptionTab::RoundedEast
- || tab->shape == QStyleOptionTab::RoundedWest
- || tab->shape == QStyleOptionTab::TriangularEast
- || tab->shape == QStyleOptionTab::TriangularWest;
-
- QRect tr = tab->rect;
- if (tab->shape == QStyleOptionTab::RoundedSouth || tab->shape == QStyleOptionTab::TriangularSouth)
- verticalShift = -verticalShift;
- if (verticalTabs) {
- qSwap(horizontalShift, verticalShift);
- horizontalShift *= -1;
- verticalShift *= -1;
- }
- if (tab->shape == QStyleOptionTab::RoundedWest || tab->shape == QStyleOptionTab::TriangularWest)
- horizontalShift = -horizontalShift;
-
- tr.adjust(0, 0, horizontalShift, verticalShift);
- if (selected)
- {
- tr.setBottom(tr.bottom() - verticalShift);
- tr.setRight(tr.right() - horizontalShift);
- }
-
- QSize size = (sr == SE_TabBarTabLeftButton) ? tab->leftButtonSize : tab->rightButtonSize;
- int w = size.width();
- int h = size.height();
- int midHeight = static_cast<int>(qCeil(float(tr.height() - h) / 2));
- int midWidth = ((tr.width() - w) / 2);
-
- bool atTheTop = true;
- switch (tab->shape) {
- case QStyleOptionTab::RoundedWest:
- case QStyleOptionTab::TriangularWest:
- atTheTop = (sr == SE_TabBarTabLeftButton);
- break;
- case QStyleOptionTab::RoundedEast:
- case QStyleOptionTab::TriangularEast:
- atTheTop = (sr == SE_TabBarTabRightButton);
- break;
- default:
- if (sr == SE_TabBarTabLeftButton)
- r = QRect(tab->rect.x() + hpadding, midHeight, w, h);
- else
- r = QRect(tab->rect.right() - w - hpadding, midHeight, w, h);
- r = visualRect(tab->direction, tab->rect, r);
- }
- if (verticalTabs) {
- if (atTheTop)
- r = QRect(midWidth, tr.y() + tab->rect.height() - hpadding - h, w, h);
- else
- r = QRect(midWidth, tr.y() + hpadding, w, h);
- }
- }
-
- break;
- case SE_TabBarTearIndicator:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) {
- switch (tab->shape) {
- case QStyleOptionTab::RoundedNorth:
- case QStyleOptionTab::TriangularNorth:
- case QStyleOptionTab::RoundedSouth:
- case QStyleOptionTab::TriangularSouth:
- r.setRect(tab->rect.left(), tab->rect.top(), 8, opt->rect.height());
- break;
- case QStyleOptionTab::RoundedWest:
- case QStyleOptionTab::TriangularWest:
- case QStyleOptionTab::RoundedEast:
- case QStyleOptionTab::TriangularEast:
- r.setRect(tab->rect.left(), tab->rect.top(), opt->rect.width(), 8);
- break;
- default:
- break;
- }
- r = visualRect(opt->direction, opt->rect, r);
- }
- break;
- case SE_TabBarScrollLeftButton: {
- const bool vertical = opt->rect.width() < opt->rect.height();
- const Qt::LayoutDirection ld = opt->direction;
- const int buttonWidth = proxy()->pixelMetric(QStyle::PM_TabBarScrollButtonWidth, nullptr);
- const int buttonOverlap = proxy()->pixelMetric(QStyle::PM_TabBar_ScrollButtonOverlap, nullptr);
-
- r = vertical ? QRect(0, opt->rect.height() - (buttonWidth * 2) + buttonOverlap, opt->rect.width(), buttonWidth)
- : QStyle::visualRect(ld, opt->rect, QRect(opt->rect.width() - (buttonWidth * 2) + buttonOverlap, 0, buttonWidth, opt->rect.height()));
- break; }
- case SE_TabBarScrollRightButton: {
- const bool vertical = opt->rect.width() < opt->rect.height();
- const Qt::LayoutDirection ld = opt->direction;
- const int buttonWidth = proxy()->pixelMetric(QStyle::PM_TabBarScrollButtonWidth, nullptr);
-
- r = vertical ? QRect(0, opt->rect.height() - buttonWidth, opt->rect.width(), buttonWidth)
- : QStyle::visualRect(ld, opt->rect, QRect(opt->rect.width() - buttonWidth, 0, buttonWidth, opt->rect.height()));
- break; }
- case SE_TreeViewDisclosureItem:
- r = opt->rect;
- break;
- case SE_LineEditContents:
- if (const QStyleOptionFrame *f = qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
- r = f->rect.adjusted(f->lineWidth, f->lineWidth, -f->lineWidth, -f->lineWidth);
- r = visualRect(opt->direction, opt->rect, r);
- }
- break;
- case SE_FrameContents:
- if (const QStyleOptionFrame *f = qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
- int fw = proxy()->pixelMetric(PM_DefaultFrameWidth, f);
- r = opt->rect.adjusted(fw, fw, -fw, -fw);
- r = visualRect(opt->direction, opt->rect, r);
- }
- break;
- case SE_ShapedFrameContents:
- if (const QStyleOptionFrame *f = qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
- int frameShape = f->frameShape;
- int frameShadow = QStyleOptionFrame::Plain;
- if (f->state & QStyle::State_Sunken) {
- frameShadow = QStyleOptionFrame::Sunken;
- } else if (f->state & QStyle::State_Raised) {
- frameShadow = QStyleOptionFrame::Raised;
- }
-
- int frameWidth = 0;
-
- switch (frameShape) {
- case QStyleOptionFrame::NoFrame:
- frameWidth = 0;
- break;
-
- case QStyleOptionFrame::Box:
- case QStyleOptionFrame::HLine:
- case QStyleOptionFrame::VLine:
- switch (frameShadow) {
- case QStyleOptionFrame::Plain:
- frameWidth = f->lineWidth;
- break;
- case QStyleOptionFrame::Raised:
- case QStyleOptionFrame::Sunken:
- frameWidth = (short)(f->lineWidth*2 + f->midLineWidth);
- break;
- }
- break;
-
- case QStyleOptionFrame::StyledPanel:
- //keep the compatibility with Qt 4.4 if there is a proxy style.
- //be sure to call drawPrimitive(QStyle::SE_FrameContents) on the proxy style
- return subElementRect(QStyle::SE_FrameContents, opt);
-
- case QStyleOptionFrame::WinPanel:
- frameWidth = 2;
- break;
-
- case QStyleOptionFrame::Panel:
- switch (frameShadow) {
- case QStyleOptionFrame::Plain:
- case QStyleOptionFrame::Raised:
- case QStyleOptionFrame::Sunken:
- frameWidth = f->lineWidth;
- break;
- }
- break;
- }
- r = f->rect.adjusted(frameWidth, frameWidth, -frameWidth, -frameWidth);
- }
- break;
- case SE_DockWidgetCloseButton:
- case SE_DockWidgetFloatButton:
- case SE_DockWidgetTitleBarText:
- case SE_DockWidgetIcon: {
- int iconSize = proxy()->pixelMetric(PM_SmallIconSize, opt);
- int buttonMargin = proxy()->pixelMetric(PM_DockWidgetTitleBarButtonMargin, opt);
- QRect rect = opt->rect;
-
- const QStyleOptionDockWidget *dwOpt
- = qstyleoption_cast<const QStyleOptionDockWidget*>(opt);
- bool canClose = dwOpt == nullptr ? true : dwOpt->closable;
- bool canFloat = dwOpt == nullptr ? false : dwOpt->floatable;
-
- const bool verticalTitleBar = dwOpt && dwOpt->verticalTitleBar;
-
- // If this is a vertical titlebar, we transpose and work as if it was
- // horizontal, then transpose again.
-
- if (verticalTitleBar)
- rect = rect.transposed();
-
- do {
- int right = rect.right();
- int left = rect.left();
-
- QRect closeRect;
- if (canClose) {
- QSize sz = proxy()->standardIcon(QStyle::SP_TitleBarCloseButton,
- opt).actualSize(QSize(iconSize, iconSize));
- sz += QSize(buttonMargin, buttonMargin);
- if (verticalTitleBar)
- sz = sz.transposed();
- closeRect = QRect(right - sz.width(),
- rect.center().y() - sz.height()/2,
- sz.width(), sz.height());
- right = closeRect.left() - 1;
- }
- if (sr == SE_DockWidgetCloseButton) {
- r = closeRect;
- break;
- }
-
- QRect floatRect;
- if (canFloat) {
- QSize sz = proxy()->standardIcon(QStyle::SP_TitleBarNormalButton,
- opt).actualSize(QSize(iconSize, iconSize));
- sz += QSize(buttonMargin, buttonMargin);
- if (verticalTitleBar)
- sz = sz.transposed();
- floatRect = QRect(right - sz.width(),
- rect.center().y() - sz.height()/2,
- sz.width(), sz.height());
- right = floatRect.left() - 1;
- }
- if (sr == SE_DockWidgetFloatButton) {
- r = floatRect;
- break;
- }
-
- QRect iconRect;
- if (sr == SE_DockWidgetIcon) {
- r = iconRect;
- break;
- }
-
- QRect textRect = QRect(left, rect.top(),
- right - left, rect.height());
- if (sr == SE_DockWidgetTitleBarText) {
- r = textRect;
- break;
- }
-
- } while (false);
-
- if (verticalTitleBar) {
- r = QRect(rect.left() + r.top() - rect.top(),
- rect.top() + rect.right() - r.right(),
- r.height(), r.width());
- } else {
- r = visualRect(opt->direction, rect, r);
- }
- break;
- }
- case SE_ItemViewItemCheckIndicator:
- if (!qstyleoption_cast<const QStyleOptionViewItem *>(opt)) {
- r = subElementRect(SE_CheckBoxIndicator, opt);
- break;
- }
- Q_FALLTHROUGH();
- case SE_ItemViewItemDecoration:
- case SE_ItemViewItemText:
- case SE_ItemViewItemFocusRect:
- if (const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>(opt)) {
- if (!d->isViewItemCached(*vopt)) {
- d->viewItemLayout(vopt, &d->checkRect, &d->decorationRect, &d->displayRect, false);
- if (d->cachedOption) {
- delete d->cachedOption;
- d->cachedOption = nullptr;
- }
- d->cachedOption = new QStyleOptionViewItem(*vopt);
- }
- if (sr == SE_ItemViewItemCheckIndicator)
- r = d->checkRect;
- else if (sr == SE_ItemViewItemDecoration)
- r = d->decorationRect;
- else if (sr == SE_ItemViewItemText || sr == SE_ItemViewItemFocusRect)
- r = d->displayRect;
- }
- break;
- case SE_ToolBarHandle:
- if (const QStyleOptionToolBar *tbopt = qstyleoption_cast<const QStyleOptionToolBar *>(opt)) {
- if (tbopt->features & QStyleOptionToolBar::Movable) {
- ///we need to access the widget here because the style option doesn't
- //have all the information we need (ie. the layout's margin)
- const QMargins margins(2, 2, 2, 2);
- const int handleExtent = proxy()->pixelMetric(QStyle::PM_ToolBarHandleExtent, opt);
- if (tbopt->state & QStyle::State_Horizontal) {
- r = QRect(margins.left(), margins.top(),
- handleExtent,
- tbopt->rect.height() - (margins.top() + margins.bottom()));
- r = QStyle::visualRect(tbopt->direction, tbopt->rect, r);
- } else {
- r = QRect(margins.left(), margins.top(),
- tbopt->rect.width() - (margins.left() + margins.right()),
- handleExtent);
- }
- }
- }
- break;
- default:
- break;
- }
- return r;
-}
-
-// in lieu of std::array, minimal API
-template <int N>
-struct StaticPolygonF
-{
- QPointF data[N];
-
- Q_DECL_CONSTEXPR int size() const { return N; }
- Q_DECL_CONSTEXPR const QPointF *cbegin() const { return data; }
- Q_DECL_CONSTEXPR const QPointF &operator[](int idx) const { return data[idx]; }
-};
-
-static StaticPolygonF<3> calcArrow(const QStyleOptionSlider *dial, qreal &a)
-{
- int width = dial->rect.width();
- int height = dial->rect.height();
- int r = qMin(width, height) / 2;
- int currentSliderPosition = dial->upsideDown ? dial->sliderPosition : (dial->maximum - dial->sliderPosition);
-
- if (dial->maximum == dial->minimum)
- a = Q_PI / 2;
- else if (dial->dialWrapping)
- a = Q_PI * 3 / 2 - (currentSliderPosition - dial->minimum) * 2 * Q_PI
- / (dial->maximum - dial->minimum);
- else
- a = (Q_PI * 8 - (currentSliderPosition - dial->minimum) * 10 * Q_PI
- / (dial->maximum - dial->minimum)) / 6;
-
- int xc = width / 2;
- int yc = height / 2;
-
- int len = r - QStyleHelper::calcBigLineSize(r) - 5;
- if (len < 5)
- len = 5;
- int back = len / 2;
-
- StaticPolygonF<3> arrow = {{
- QPointF(0.5 + xc + len * qCos(a),
- 0.5 + yc - len * qSin(a)),
- QPointF(0.5 + xc + back * qCos(a + Q_PI * 5 / 6),
- 0.5 + yc - back * qSin(a + Q_PI * 5 / 6)),
- QPointF(0.5 + xc + back * qCos(a - Q_PI * 5 / 6),
- 0.5 + yc - back * qSin(a - Q_PI * 5 / 6)),
- }};
- return arrow;
-}
-
-void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComplex *opt, QPainter *p) const
-{
- switch (cc) {
- case CC_Slider:
- if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- if (slider->subControls == SC_SliderTickmarks) {
- int tickOffset = proxy()->pixelMetric(PM_SliderTickmarkOffset, slider);
- int ticks = slider->tickPosition;
- int thickness = proxy()->pixelMetric(PM_SliderControlThickness, slider);
- int len = proxy()->pixelMetric(PM_SliderLength, slider);
- int available = proxy()->pixelMetric(PM_SliderSpaceAvailable, slider);
- 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)
- interval = 1;
- int fudge = len / 2;
- int pos;
- // Since there is no subrect for tickmarks do a translation here.
- p->save();
- p->translate(slider->rect.x(), slider->rect.y());
- p->setPen(slider->palette.windowText().color());
- int v = slider->minimum;
- while (v <= slider->maximum + 1) {
- if (v == slider->maximum + 1 && interval == 1)
- break;
- const int v_ = qMin(v, slider->maximum);
- pos = QStyle::sliderPositionFromValue(slider->minimum, slider->maximum,
- v_, available) + fudge;
- if (slider->orientation == Qt::Horizontal) {
- if (ticks & QStyleOptionSlider::TicksAbove)
- p->drawLine(pos, 0, pos, tickOffset - 2);
- if (ticks & QStyleOptionSlider::TicksBelow)
- p->drawLine(pos, tickOffset + thickness + 1, pos,
- slider->rect.height()-1);
- } else {
- if (ticks & QStyleOptionSlider::TicksAbove)
- p->drawLine(0, pos, tickOffset - 2, pos);
- if (ticks & QStyleOptionSlider::TicksBelow)
- p->drawLine(tickOffset + thickness + 1, pos,
- slider->rect.width()-1, pos);
- }
- // in the case where maximum is max int
- int nextInterval = v + interval;
- if (nextInterval < v)
- break;
- v = nextInterval;
- }
- p->restore();
- }
- }
- break;
- case CC_ScrollBar:
- if (const QStyleOptionSlider *scrollbar = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- // Make a copy here and reset it for each primitive.
- QStyleOptionSlider newScrollbar = *scrollbar;
- State saveFlags = scrollbar->state;
-
- if (scrollbar->subControls & SC_ScrollBarSubLine) {
- newScrollbar.state = saveFlags;
- newScrollbar.rect = proxy()->subControlRect(cc, &newScrollbar, SC_ScrollBarSubLine);
- if (newScrollbar.rect.isValid()) {
- if (!(scrollbar->activeSubControls & SC_ScrollBarSubLine))
- newScrollbar.state &= ~(State_Sunken | State_MouseOver);
- proxy()->drawControl(CE_ScrollBarSubLine, &newScrollbar, p);
- }
- }
- if (scrollbar->subControls & SC_ScrollBarAddLine) {
- newScrollbar.rect = scrollbar->rect;
- newScrollbar.state = saveFlags;
- newScrollbar.rect = proxy()->subControlRect(cc, &newScrollbar, SC_ScrollBarAddLine);
- if (newScrollbar.rect.isValid()) {
- if (!(scrollbar->activeSubControls & SC_ScrollBarAddLine))
- newScrollbar.state &= ~(State_Sunken | State_MouseOver);
- proxy()->drawControl(CE_ScrollBarAddLine, &newScrollbar, p);
- }
- }
- if (scrollbar->subControls & SC_ScrollBarSubPage) {
- newScrollbar.rect = scrollbar->rect;
- newScrollbar.state = saveFlags;
- newScrollbar.rect = proxy()->subControlRect(cc, &newScrollbar, SC_ScrollBarSubPage);
- if (newScrollbar.rect.isValid()) {
- if (!(scrollbar->activeSubControls & SC_ScrollBarSubPage))
- newScrollbar.state &= ~(State_Sunken | State_MouseOver);
- proxy()->drawControl(CE_ScrollBarSubPage, &newScrollbar, p);
- }
- }
- if (scrollbar->subControls & SC_ScrollBarAddPage) {
- newScrollbar.rect = scrollbar->rect;
- newScrollbar.state = saveFlags;
- newScrollbar.rect = proxy()->subControlRect(cc, &newScrollbar, SC_ScrollBarAddPage);
- if (newScrollbar.rect.isValid()) {
- if (!(scrollbar->activeSubControls & SC_ScrollBarAddPage))
- newScrollbar.state &= ~(State_Sunken | State_MouseOver);
- proxy()->drawControl(CE_ScrollBarAddPage, &newScrollbar, p);
- }
- }
- if (scrollbar->subControls & SC_ScrollBarFirst) {
- newScrollbar.rect = scrollbar->rect;
- newScrollbar.state = saveFlags;
- newScrollbar.rect = proxy()->subControlRect(cc, &newScrollbar, SC_ScrollBarFirst);
- if (newScrollbar.rect.isValid()) {
- if (!(scrollbar->activeSubControls & SC_ScrollBarFirst))
- newScrollbar.state &= ~(State_Sunken | State_MouseOver);
- proxy()->drawControl(CE_ScrollBarFirst, &newScrollbar, p);
- }
- }
- if (scrollbar->subControls & SC_ScrollBarLast) {
- newScrollbar.rect = scrollbar->rect;
- newScrollbar.state = saveFlags;
- newScrollbar.rect = proxy()->subControlRect(cc, &newScrollbar, SC_ScrollBarLast);
- if (newScrollbar.rect.isValid()) {
- if (!(scrollbar->activeSubControls & SC_ScrollBarLast))
- newScrollbar.state &= ~(State_Sunken | State_MouseOver);
- proxy()->drawControl(CE_ScrollBarLast, &newScrollbar, p);
- }
- }
- if (scrollbar->subControls & SC_ScrollBarSlider) {
- newScrollbar.rect = scrollbar->rect;
- newScrollbar.state = saveFlags;
- newScrollbar.rect = proxy()->subControlRect(cc, &newScrollbar, SC_ScrollBarSlider);
- if (newScrollbar.rect.isValid()) {
- if (!(scrollbar->activeSubControls & SC_ScrollBarSlider))
- newScrollbar.state &= ~(State_Sunken | State_MouseOver);
- proxy()->drawControl(CE_ScrollBarSlider, &newScrollbar, p);
-
- if (scrollbar->state & State_HasFocus) {
- QStyleOptionFocusRect fropt;
- fropt.QStyleOption::operator=(newScrollbar);
- fropt.rect.setRect(newScrollbar.rect.x() + 2, newScrollbar.rect.y() + 2,
- newScrollbar.rect.width() - 5,
- newScrollbar.rect.height() - 5);
- proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, p);
- }
- }
- }
- }
- break;
- case CC_SpinBox:
- if (const QStyleOptionSpinBox *sb = qstyleoption_cast<const QStyleOptionSpinBox *>(opt)) {
- QStyleOptionSpinBox copy = *sb;
- PrimitiveElement pe;
-
- if (sb->frame && (sb->subControls & SC_SpinBoxFrame)) {
- QRect r = proxy()->subControlRect(CC_SpinBox, sb, SC_SpinBoxFrame);
- qDrawWinPanel(p, r, sb->palette, true);
- }
-
- if (sb->subControls & SC_SpinBoxUp) {
- copy.subControls = SC_SpinBoxUp;
- QPalette pal2 = sb->palette;
- if (!(sb->stepEnabled & QStyleOptionSpinBox::StepUpEnabled)) {
- pal2.setCurrentColorGroup(QPalette::Disabled);
- copy.state &= ~State_Enabled;
- }
-
- copy.palette = pal2;
-
- if (sb->activeSubControls == SC_SpinBoxUp && (sb->state & State_Sunken)) {
- copy.state |= State_On;
- copy.state |= State_Sunken;
- } else {
- copy.state |= State_Raised;
- copy.state &= ~State_Sunken;
- }
- pe = (sb->buttonSymbols == QStyleOptionSpinBox::PlusMinus ? PE_IndicatorSpinPlus
- : PE_IndicatorSpinUp);
-
- copy.rect = proxy()->subControlRect(CC_SpinBox, sb, SC_SpinBoxUp);
- proxy()->drawPrimitive(PE_PanelButtonBevel, &copy, p);
- copy.rect.adjust(3, 0, -4, 0);
- proxy()->drawPrimitive(pe, &copy, p);
- }
-
- if (sb->subControls & SC_SpinBoxDown) {
- copy.subControls = SC_SpinBoxDown;
- copy.state = sb->state;
- QPalette pal2 = sb->palette;
- if (!(sb->stepEnabled & QStyleOptionSpinBox::StepDownEnabled)) {
- pal2.setCurrentColorGroup(QPalette::Disabled);
- copy.state &= ~State_Enabled;
- }
- copy.palette = pal2;
-
- if (sb->activeSubControls == SC_SpinBoxDown && (sb->state & State_Sunken)) {
- copy.state |= State_On;
- copy.state |= State_Sunken;
- } else {
- copy.state |= State_Raised;
- copy.state &= ~State_Sunken;
- }
- pe = (sb->buttonSymbols == QStyleOptionSpinBox::PlusMinus ? PE_IndicatorSpinMinus
- : PE_IndicatorSpinDown);
-
- copy.rect = proxy()->subControlRect(CC_SpinBox, sb, SC_SpinBoxDown);
- proxy()->drawPrimitive(PE_PanelButtonBevel, &copy, p);
- copy.rect.adjust(3, 0, -4, 0);
- proxy()->drawPrimitive(pe, &copy, p);
- }
- }
- break;
- case CC_ToolButton:
- if (const QStyleOptionToolButton *toolbutton
- = qstyleoption_cast<const QStyleOptionToolButton *>(opt)) {
- QRect button, menuarea;
- button = proxy()->subControlRect(cc, toolbutton, SC_ToolButton);
- menuarea = proxy()->subControlRect(cc, toolbutton, SC_ToolButtonMenu);
-
- State bflags = toolbutton->state & ~State_Sunken;
-
- if (bflags & State_AutoRaise) {
- if (!(bflags & State_MouseOver) || !(bflags & State_Enabled)) {
- bflags &= ~State_Raised;
- }
- }
- State mflags = bflags;
- if (toolbutton->state & State_Sunken) {
- if (toolbutton->activeSubControls & SC_ToolButton)
- bflags |= State_Sunken;
- mflags |= State_Sunken;
- }
-
- QStyleOption tool = *toolbutton;
- if (toolbutton->subControls & SC_ToolButton) {
- if (bflags & (State_Sunken | State_On | State_Raised)) {
- tool.rect = button;
- tool.state = bflags;
- proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p);
- }
- }
-
- if (toolbutton->state & State_HasFocus) {
- QStyleOptionFocusRect fr;
- fr.QStyleOption::operator=(*toolbutton);
- fr.rect.adjust(3, 3, -3, -3);
- if (toolbutton->features & QStyleOptionToolButton::MenuButtonPopup)
- fr.rect.adjust(0, 0, -proxy()->pixelMetric(QStyle::PM_MenuButtonIndicator,
- toolbutton), 0);
- proxy()->drawPrimitive(PE_FrameFocusRect, &fr, p);
- }
- QStyleOptionToolButton label = *toolbutton;
- label.state = bflags;
- int fw = proxy()->pixelMetric(PM_DefaultFrameWidth, opt);
- label.rect = button.adjusted(fw, fw, -fw, -fw);
- proxy()->drawControl(CE_ToolButtonLabel, &label, p);
-
- if (toolbutton->subControls & SC_ToolButtonMenu) {
- tool.rect = menuarea;
- tool.state = mflags;
- if (mflags & (State_Sunken | State_On | State_Raised))
- proxy()->drawPrimitive(PE_IndicatorButtonDropDown, &tool, p);
- proxy()->drawPrimitive(PE_IndicatorArrowDown, &tool, p);
- } else if (toolbutton->features & QStyleOptionToolButton::HasMenu) {
- int mbi = proxy()->pixelMetric(PM_MenuButtonIndicator, toolbutton);
- QRect ir = toolbutton->rect;
- QStyleOptionToolButton newBtn = *toolbutton;
- newBtn.rect = QRect(ir.right() + 5 - mbi, ir.y() + ir.height() - mbi + 4, mbi - 6, mbi - 6);
- newBtn.rect = visualRect(toolbutton->direction, button, newBtn.rect);
- proxy()->drawPrimitive(PE_IndicatorArrowDown, &newBtn, p);
- }
- }
- break;
- case CC_TitleBar:
- if (const QStyleOptionTitleBar *tb = qstyleoption_cast<const QStyleOptionTitleBar *>(opt)) {
- QRect ir;
- if (opt->subControls & SC_TitleBarLabel) {
- QColor left = tb->palette.highlight().color();
- QColor right = tb->palette.base().color();
-
- QBrush fillBrush(left);
- if (left != right) {
- QPoint p1(tb->rect.x(), tb->rect.top() + tb->rect.height()/2);
- QPoint p2(tb->rect.right(), tb->rect.top() + tb->rect.height()/2);
- QLinearGradient lg(p1, p2);
- lg.setColorAt(0, left);
- lg.setColorAt(1, right);
- fillBrush = lg;
- }
-
- p->fillRect(opt->rect, fillBrush);
-
- ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarLabel);
-
- p->setPen(tb->palette.highlightedText().color());
- p->drawText(ir.x() + 2, ir.y(), ir.width() - 2, ir.height(),
- Qt::AlignLeft | Qt::AlignVCenter | Qt::TextSingleLine, tb->text);
- }
-
- bool down = false;
- QPixmap pm;
-
- QStyleOption tool = *tb;
- if (tb->subControls & SC_TitleBarCloseButton && tb->titleBarFlags & Qt::WindowSystemMenuHint) {
- ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarCloseButton);
- down = tb->activeSubControls & SC_TitleBarCloseButton && (opt->state & State_Sunken);
- if ((tb->titleBarFlags & Qt::WindowType_Mask) == Qt::Tool)
- pm = proxy()->standardIcon(SP_DockWidgetCloseButton, &tool).pixmap(QSize(10, 10), dpr(opt->window));
- else
- pm = proxy()->standardIcon(SP_TitleBarCloseButton, &tool).pixmap(QSize(10, 10), dpr(opt->window));
- tool.rect = ir;
- tool.state = down ? State_Sunken : State_Raised;
- proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p);
-
- p->save();
- if (down)
- p->translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, tb),
- proxy()->pixelMetric(PM_ButtonShiftVertical, tb));
- proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm);
- p->restore();
- }
-
- if (tb->subControls & SC_TitleBarMaxButton
- && tb->titleBarFlags & Qt::WindowMaximizeButtonHint
- && !(tb->titleBarState & Qt::WindowMaximized)) {
- ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarMaxButton);
-
- down = tb->activeSubControls & SC_TitleBarMaxButton && (opt->state & State_Sunken);
- pm = proxy()->standardIcon(SP_TitleBarMaxButton, &tool).pixmap(QSize(10, 10), dpr(opt->window));
- tool.rect = ir;
- tool.state = down ? State_Sunken : State_Raised;
- proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p);
-
- p->save();
- if (down)
- p->translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, tb),
- proxy()->pixelMetric(PM_ButtonShiftVertical, tb));
- proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm);
- p->restore();
- }
-
- if (tb->subControls & SC_TitleBarMinButton
- && tb->titleBarFlags & Qt::WindowMinimizeButtonHint
- && !(tb->titleBarState & Qt::WindowMinimized)) {
- ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarMinButton);
- down = tb->activeSubControls & SC_TitleBarMinButton && (opt->state & State_Sunken);
- pm = proxy()->standardIcon(SP_TitleBarMinButton, &tool).pixmap(QSize(10, 10), dpr(opt->window));
- tool.rect = ir;
- tool.state = down ? State_Sunken : State_Raised;
- proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p);
-
- p->save();
- if (down)
- p->translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, tb),
- proxy()->pixelMetric(PM_ButtonShiftVertical, tb));
- proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm);
- p->restore();
- }
-
- bool drawNormalButton = (tb->subControls & SC_TitleBarNormalButton)
- && (((tb->titleBarFlags & Qt::WindowMinimizeButtonHint)
- && (tb->titleBarState & Qt::WindowMinimized))
- || ((tb->titleBarFlags & Qt::WindowMaximizeButtonHint)
- && (tb->titleBarState & Qt::WindowMaximized)));
-
- if (drawNormalButton) {
- ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarNormalButton);
- down = tb->activeSubControls & SC_TitleBarNormalButton && (opt->state & State_Sunken);
- pm = proxy()->standardIcon(SP_TitleBarNormalButton, &tool).pixmap(QSize(10, 10), dpr(opt->window));
- tool.rect = ir;
- tool.state = down ? State_Sunken : State_Raised;
- proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p);
-
- p->save();
- if (down)
- p->translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, tb),
- proxy()->pixelMetric(PM_ButtonShiftVertical, tb));
- proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm);
- p->restore();
- }
-
- if (tb->subControls & SC_TitleBarShadeButton
- && tb->titleBarFlags & Qt::WindowShadeButtonHint
- && !(tb->titleBarState & Qt::WindowMinimized)) {
- ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarShadeButton);
- down = (tb->activeSubControls & SC_TitleBarShadeButton && (opt->state & State_Sunken));
- pm = proxy()->standardIcon(SP_TitleBarShadeButton, &tool).pixmap(QSize(10, 10), dpr(opt->window));
- tool.rect = ir;
- tool.state = down ? State_Sunken : State_Raised;
- proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p);
- p->save();
- if (down)
- p->translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, tb),
- proxy()->pixelMetric(PM_ButtonShiftVertical, tb));
- proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm);
- p->restore();
- }
-
- if (tb->subControls & SC_TitleBarUnshadeButton
- && tb->titleBarFlags & Qt::WindowShadeButtonHint
- && tb->titleBarState & Qt::WindowMinimized) {
- ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarUnshadeButton);
-
- down = tb->activeSubControls & SC_TitleBarUnshadeButton && (opt->state & State_Sunken);
- pm = proxy()->standardIcon(SP_TitleBarUnshadeButton, &tool).pixmap(QSize(10, 10), dpr(opt->window));
- tool.rect = ir;
- tool.state = down ? State_Sunken : State_Raised;
- proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p);
- p->save();
- if (down)
- p->translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, tb),
- proxy()->pixelMetric(PM_ButtonShiftVertical, tb));
- proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm);
- p->restore();
- }
- if (tb->subControls & SC_TitleBarContextHelpButton
- && tb->titleBarFlags & Qt::WindowContextHelpButtonHint) {
- ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarContextHelpButton);
-
- down = tb->activeSubControls & SC_TitleBarContextHelpButton && (opt->state & State_Sunken);
- pm = proxy()->standardIcon(SP_TitleBarContextHelpButton, &tool).pixmap(QSize(10, 10), dpr(opt->window));
- tool.rect = ir;
- tool.state = down ? State_Sunken : State_Raised;
- proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p);
- p->save();
- if (down)
- p->translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, tb),
- proxy()->pixelMetric(PM_ButtonShiftVertical, tb));
- proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm);
- p->restore();
- }
- if (tb->subControls & SC_TitleBarSysMenu && tb->titleBarFlags & Qt::WindowSystemMenuHint) {
- ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarSysMenu);
- if (!tb->icon.isNull()) {
- tb->icon.paint(p, ir);
- } else {
- int iconSize = proxy()->pixelMetric(PM_SmallIconSize, tb);
- pm = proxy()->standardIcon(SP_TitleBarMenuButton, &tool).pixmap(QSize(iconSize, iconSize), dpr(opt->window));
- tool.rect = ir;
- p->save();
- proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm);
- p->restore();
- }
- }
- }
- break;
- case CC_Dial:
- if (const QStyleOptionSlider *dial = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- // OK, this is more a port of things over
- p->save();
-
- // avoid dithering
- if (p->paintEngine()->hasFeature(QPaintEngine::Antialiasing))
- p->setRenderHint(QPainter::Antialiasing);
-
- int width = dial->rect.width();
- int height = dial->rect.height();
- qreal r = qMin(width, height) / 2;
- qreal d_ = r / 6;
- qreal dx = dial->rect.x() + d_ + (width - 2 * r) / 2 + 1;
- qreal dy = dial->rect.y() + d_ + (height - 2 * r) / 2 + 1;
- QRect br = QRect(int(dx), int(dy), int(r * 2 - 2 * d_ - 2), int(r * 2 - 2 * d_ - 2));
-
- QPalette pal = opt->palette;
- // draw notches
- if (dial->subControls & QStyle::SC_DialTickmarks) {
- p->setPen(pal.windowText().color());
- p->drawLines(QStyleHelper::calcLines(dial));
- }
-
- if (dial->state & State_Enabled) {
- p->setBrush(pal.brush(QPalette::ColorRole(proxy()->styleHint(SH_Dial_BackgroundRole, dial))));
- p->setPen(Qt::NoPen);
- p->drawEllipse(br);
- p->setBrush(Qt::NoBrush);
- }
- p->setPen(QPen(pal.dark().color()));
- p->drawArc(br, 60 * 16, 180 * 16);
- p->setPen(QPen(pal.light().color()));
- p->drawArc(br, 240 * 16, 180 * 16);
-
- qreal a;
- const StaticPolygonF<3> arrow = calcArrow(dial, a);
-
- p->setPen(Qt::NoPen);
- p->setBrush(pal.button());
- p->drawPolygon(arrow.cbegin(), arrow.size());
-
- a = QStyleHelper::angle(QPointF(width / 2, height / 2), arrow[0]);
- p->setBrush(Qt::NoBrush);
-
- if (a <= 0 || a > 200) {
- p->setPen(pal.light().color());
- p->drawLine(arrow[2], arrow[0]);
- p->drawLine(arrow[1], arrow[2]);
- p->setPen(pal.dark().color());
- p->drawLine(arrow[0], arrow[1]);
- } else if (a > 0 && a < 45) {
- p->setPen(pal.light().color());
- p->drawLine(arrow[2], arrow[0]);
- p->setPen(pal.dark().color());
- p->drawLine(arrow[1], arrow[2]);
- p->drawLine(arrow[0], arrow[1]);
- } else if (a >= 45 && a < 135) {
- p->setPen(pal.dark().color());
- p->drawLine(arrow[2], arrow[0]);
- p->drawLine(arrow[1], arrow[2]);
- p->setPen(pal.light().color());
- p->drawLine(arrow[0], arrow[1]);
- } else if (a >= 135 && a < 200) {
- p->setPen(pal.dark().color());
- p->drawLine(arrow[2], arrow[0]);
- p->setPen(pal.light().color());
- p->drawLine(arrow[0], arrow[1]);
- p->drawLine(arrow[1], arrow[2]);
- }
-
- // draw focus rect around the dial
- QStyleOptionFocusRect fropt;
- fropt.rect = dial->rect;
- fropt.state = dial->state;
- fropt.palette = dial->palette;
- if (fropt.state & QStyle::State_HasFocus) {
- br.adjust(0, 0, 2, 2);
- if (dial->subControls & SC_DialTickmarks) {
- int r = qMin(width, height) / 2;
- br.translate(-r / 6, - r / 6);
- br.setWidth(br.width() + r / 3);
- br.setHeight(br.height() + r / 3);
- }
- fropt.rect = br.adjusted(-2, -2, 2, 2);
- proxy()->drawPrimitive(QStyle::PE_FrameFocusRect, &fropt, p);
- }
- p->restore();
- }
- break;
- case CC_GroupBox:
- if (const QStyleOptionGroupBox *groupBox = qstyleoption_cast<const QStyleOptionGroupBox *>(opt)) {
- // Draw frame
- QRect textRect = proxy()->subControlRect(CC_GroupBox, opt, SC_GroupBoxLabel);
- QRect checkBoxRect = proxy()->subControlRect(CC_GroupBox, opt, SC_GroupBoxCheckBox);
- if (groupBox->subControls & QStyle::SC_GroupBoxFrame) {
- QStyleOptionFrame frame;
- frame.QStyleOption::operator=(*groupBox);
- frame.features = groupBox->features;
- frame.lineWidth = groupBox->lineWidth;
- frame.midLineWidth = groupBox->midLineWidth;
- frame.rect = proxy()->subControlRect(CC_GroupBox, opt, SC_GroupBoxFrame);
- p->save();
- QRegion region(groupBox->rect);
- if (!groupBox->text.isEmpty()) {
- bool ltr = groupBox->direction == Qt::LeftToRight;
- QRect finalRect;
- if (groupBox->subControls & QStyle::SC_GroupBoxCheckBox) {
- finalRect = checkBoxRect.united(textRect);
- finalRect.adjust(ltr ? -4 : 0, 0, ltr ? 0 : 4, 0);
- } else {
- finalRect = textRect;
- }
- region -= finalRect;
- }
- p->setClipRegion(region);
- proxy()->drawPrimitive(PE_FrameGroupBox, &frame, p);
- p->restore();
- }
-
- // Draw title
- if ((groupBox->subControls & QStyle::SC_GroupBoxLabel) && !groupBox->text.isEmpty()) {
- QColor textColor = groupBox->textColor;
- if (textColor.isValid())
- p->setPen(textColor);
- int alignment = int(groupBox->textAlignment);
- if (!proxy()->styleHint(QStyle::SH_UnderlineShortcut, opt))
- alignment |= Qt::TextHideMnemonic;
-
- proxy()->drawItemText(p, textRect, Qt::TextShowMnemonic | Qt::AlignHCenter | alignment,
- groupBox->palette, groupBox->state & State_Enabled, groupBox->text,
- textColor.isValid() ? QPalette::NoRole : QPalette::WindowText);
-
- if (groupBox->state & State_HasFocus) {
- QStyleOptionFocusRect fropt;
- fropt.QStyleOption::operator=(*groupBox);
- fropt.rect = textRect;
- proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, p);
- }
- }
-
- // Draw checkbox
- if (groupBox->subControls & SC_GroupBoxCheckBox) {
- QStyleOptionButton box;
- box.QStyleOption::operator=(*groupBox);
- box.rect = checkBoxRect;
- proxy()->drawPrimitive(PE_IndicatorCheckBox, &box, p);
- }
- }
- break;
- case CC_MdiControls:
- {
- QStyleOptionButton btnOpt;
- btnOpt.QStyleOption::operator=(*opt);
- btnOpt.state &= ~State_MouseOver;
- int bsx = 0;
- int bsy = 0;
- const int buttonIconMetric = proxy()->pixelMetric(PM_TitleBarButtonIconSize, &btnOpt);
- const QSize buttonIconSize(buttonIconMetric, buttonIconMetric);
- if (opt->subControls & QStyle::SC_MdiCloseButton) {
- if (opt->activeSubControls & QStyle::SC_MdiCloseButton && (opt->state & State_Sunken)) {
- btnOpt.state |= State_Sunken;
- btnOpt.state &= ~State_Raised;
- bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal);
- bsy = proxy()->pixelMetric(PM_ButtonShiftVertical);
- } else {
- btnOpt.state |= State_Raised;
- btnOpt.state &= ~State_Sunken;
- bsx = 0;
- bsy = 0;
- }
- btnOpt.rect = proxy()->subControlRect(CC_MdiControls, opt, SC_MdiCloseButton);
- proxy()->drawPrimitive(PE_PanelButtonCommand, &btnOpt, p);
- QPixmap pm = proxy()->standardIcon(SP_TitleBarCloseButton).pixmap(buttonIconSize, dpr(opt->window));
- proxy()->drawItemPixmap(p, btnOpt.rect.translated(bsx, bsy), Qt::AlignCenter, pm);
- }
- if (opt->subControls & QStyle::SC_MdiNormalButton) {
- if (opt->activeSubControls & QStyle::SC_MdiNormalButton && (opt->state & State_Sunken)) {
- btnOpt.state |= State_Sunken;
- btnOpt.state &= ~State_Raised;
- bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal);
- bsy = proxy()->pixelMetric(PM_ButtonShiftVertical);
- } else {
- btnOpt.state |= State_Raised;
- btnOpt.state &= ~State_Sunken;
- bsx = 0;
- bsy = 0;
- }
- btnOpt.rect = proxy()->subControlRect(CC_MdiControls, opt, SC_MdiNormalButton);
- proxy()->drawPrimitive(PE_PanelButtonCommand, &btnOpt, p);
- QPixmap pm = proxy()->standardIcon(SP_TitleBarNormalButton).pixmap(buttonIconSize, dpr(opt->window));
- proxy()->drawItemPixmap(p, btnOpt.rect.translated(bsx, bsy), Qt::AlignCenter, pm);
- }
- if (opt->subControls & QStyle::SC_MdiMinButton) {
- if (opt->activeSubControls & QStyle::SC_MdiMinButton && (opt->state & State_Sunken)) {
- btnOpt.state |= State_Sunken;
- btnOpt.state &= ~State_Raised;
- bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal);
- bsy = proxy()->pixelMetric(PM_ButtonShiftVertical);
- } else {
- btnOpt.state |= State_Raised;
- btnOpt.state &= ~State_Sunken;
- bsx = 0;
- bsy = 0;
- }
- btnOpt.rect = proxy()->subControlRect(CC_MdiControls, opt, SC_MdiMinButton);
- proxy()->drawPrimitive(PE_PanelButtonCommand, &btnOpt, p);
- QPixmap pm = proxy()->standardIcon(SP_TitleBarMinButton).pixmap(buttonIconSize, dpr(opt->window));
- proxy()->drawItemPixmap(p, btnOpt.rect.translated(bsx, bsy), Qt::AlignCenter, pm);
- }
- }
- break;
- default:
- qWarning("QCommonStyle::drawComplexControl: Control %d not handled", cc);
- }
-}
-
-/*!
- \reimp
-*/
-QStyle::SubControl QCommonStyle::hitTestComplexControl(ComplexControl cc, const QStyleOptionComplex *opt, const QPoint &pt) const
-{
- SubControl sc = SC_None;
- switch (cc) {
- case CC_Slider:
- if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- QRect r = proxy()->subControlRect(cc, slider, SC_SliderHandle);
- if (r.isValid() && r.contains(pt)) {
- sc = SC_SliderHandle;
- } else {
- r = proxy()->subControlRect(cc, slider, SC_SliderGroove);
- if (r.isValid() && r.contains(pt))
- sc = SC_SliderGroove;
- }
- }
- break;
- case CC_ScrollBar:
- if (const QStyleOptionSlider *scrollbar = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- QRect r;
- uint ctrl = SC_ScrollBarAddLine;
- while (ctrl <= SC_ScrollBarGroove) {
- r = proxy()->subControlRect(cc, scrollbar, QStyle::SubControl(ctrl));
- if (r.isValid() && r.contains(pt)) {
- sc = QStyle::SubControl(ctrl);
- break;
- }
- ctrl <<= 1;
- }
- }
- break;
- case CC_ToolButton:
- if (const QStyleOptionToolButton *toolbutton = qstyleoption_cast<const QStyleOptionToolButton *>(opt)) {
- QRect r;
- uint ctrl = SC_ToolButton;
- while (ctrl <= SC_ToolButtonMenu) {
- r = proxy()->subControlRect(cc, toolbutton, QStyle::SubControl(ctrl));
- if (r.isValid() && r.contains(pt)) {
- sc = QStyle::SubControl(ctrl);
- break;
- }
- ctrl <<= 1;
- }
- }
- break;
- case CC_SpinBox:
- if (const QStyleOptionSpinBox *spinbox = qstyleoption_cast<const QStyleOptionSpinBox *>(opt)) {
- QRect r;
- uint ctrl = SC_SpinBoxUp;
- while (ctrl <= SC_SpinBoxEditField) {
- r = proxy()->subControlRect(cc, spinbox, QStyle::SubControl(ctrl));
- if (r.isValid() && r.contains(pt)) {
- sc = QStyle::SubControl(ctrl);
- break;
- }
- ctrl <<= 1;
- }
- }
- break;
- case CC_TitleBar:
- if (const QStyleOptionTitleBar *tb = qstyleoption_cast<const QStyleOptionTitleBar *>(opt)) {
- QRect r;
- uint ctrl = SC_TitleBarSysMenu;
-
- while (ctrl <= SC_TitleBarLabel) {
- r = proxy()->subControlRect(cc, tb, QStyle::SubControl(ctrl));
- if (r.isValid() && r.contains(pt)) {
- sc = QStyle::SubControl(ctrl);
- break;
- }
- ctrl <<= 1;
- }
- }
- break;
- case CC_ComboBox:
- if (const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(opt)) {
- QRect r;
- uint ctrl = SC_ComboBoxArrow; // Start here and go down.
- while (ctrl > 0) {
- r = proxy()->subControlRect(cc, cb, QStyle::SubControl(ctrl));
- if (r.isValid() && r.contains(pt)) {
- sc = QStyle::SubControl(ctrl);
- break;
- }
- ctrl >>= 1;
- }
- }
- break;
- case CC_GroupBox:
- if (const QStyleOptionGroupBox *groupBox = qstyleoption_cast<const QStyleOptionGroupBox *>(opt)) {
- QRect r;
- uint ctrl = SC_GroupBoxCheckBox;
- while (ctrl <= SC_GroupBoxFrame) {
- r = proxy()->subControlRect(cc, groupBox, QStyle::SubControl(ctrl));
- if (r.isValid() && r.contains(pt)) {
- sc = QStyle::SubControl(ctrl);
- break;
- }
- ctrl <<= 1;
- }
- }
- break;
- case CC_MdiControls:
- {
- QRect r;
- uint ctrl = SC_MdiMinButton;
- while (ctrl <= SC_MdiCloseButton) {
- r = proxy()->subControlRect(CC_MdiControls, opt, QStyle::SubControl(ctrl));
- if (r.isValid() && r.contains(pt) && (opt->subControls & ctrl)) {
- sc = QStyle::SubControl(ctrl);
- return sc;
- }
- ctrl <<= 1;
- }
- }
- break;
- default:
- qWarning("QCommonStyle::hitTestComplexControl: Case %d not handled", cc);
- }
- return sc;
-}
-
-/*!
- \reimp
-*/
-QRect QCommonStyle::subControlRect(ComplexControl cc, const QStyleOptionComplex *opt, SubControl sc) const
-{
- QRect ret;
- switch (cc) {
- case CC_Slider:
- if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- int tickOffset = proxy()->pixelMetric(PM_SliderTickmarkOffset, slider);
- int thickness = proxy()->pixelMetric(PM_SliderControlThickness, slider);
-
- switch (sc) {
- case SC_SliderHandle: {
- int sliderPos = 0;
- int len = proxy()->pixelMetric(PM_SliderLength, slider);
- bool horizontal = slider->orientation == Qt::Horizontal;
- sliderPos = sliderPositionFromValue(slider->minimum, slider->maximum,
- slider->sliderPosition,
- (horizontal ? slider->rect.width()
- : slider->rect.height()) - len,
- slider->upsideDown);
- if (horizontal)
- ret.setRect(slider->rect.x() + sliderPos, slider->rect.y() + tickOffset, len, thickness);
- else
- ret.setRect(slider->rect.x() + tickOffset, slider->rect.y() + sliderPos, thickness, len);
- break; }
- case SC_SliderGroove:
- if (slider->orientation == Qt::Horizontal)
- ret.setRect(slider->rect.x(), slider->rect.y() + tickOffset,
- slider->rect.width(), thickness);
- else
- ret.setRect(slider->rect.x() + tickOffset, slider->rect.y(),
- thickness, slider->rect.height());
- break;
- default:
- break;
- }
- ret = visualRect(slider->direction, slider->rect, ret);
- }
- break;
- case CC_ScrollBar:
- if (const QStyleOptionSlider *scrollbar = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- const QRect scrollBarRect = scrollbar->rect;
- int sbextent = 0;
- if (!proxy()->styleHint(SH_ScrollBar_Transient, scrollbar))
- sbextent = proxy()->pixelMetric(PM_ScrollBarExtent, scrollbar);
- int maxlen = ((scrollbar->orientation == Qt::Horizontal) ?
- scrollBarRect.width() : scrollBarRect.height()) - (sbextent * 2);
- int sliderlen;
-
- // calculate slider length
- if (scrollbar->maximum != scrollbar->minimum) {
- uint range = scrollbar->maximum - scrollbar->minimum;
- sliderlen = (qint64(scrollbar->pageStep) * maxlen) / (range + scrollbar->pageStep);
-
- int slidermin = proxy()->pixelMetric(PM_ScrollBarSliderMin, scrollbar);
- if (sliderlen < slidermin || range > INT_MAX / 2)
- sliderlen = slidermin;
- if (sliderlen > maxlen)
- sliderlen = maxlen;
- } else {
- sliderlen = maxlen;
- }
-
- int sliderstart = sbextent + sliderPositionFromValue(scrollbar->minimum,
- scrollbar->maximum,
- scrollbar->sliderPosition,
- maxlen - sliderlen,
- scrollbar->upsideDown);
-
- switch (sc) {
- case SC_ScrollBarSubLine: // top/left button
- if (scrollbar->orientation == Qt::Horizontal) {
- int buttonWidth = qMin(scrollBarRect.width() / 2, sbextent);
- ret.setRect(0, 0, buttonWidth, scrollBarRect.height());
- } else {
- int buttonHeight = qMin(scrollBarRect.height() / 2, sbextent);
- ret.setRect(0, 0, scrollBarRect.width(), buttonHeight);
- }
- break;
- case SC_ScrollBarAddLine: // bottom/right button
- if (scrollbar->orientation == Qt::Horizontal) {
- int buttonWidth = qMin(scrollBarRect.width()/2, sbextent);
- ret.setRect(scrollBarRect.width() - buttonWidth, 0, buttonWidth, scrollBarRect.height());
- } else {
- int buttonHeight = qMin(scrollBarRect.height()/2, sbextent);
- ret.setRect(0, scrollBarRect.height() - buttonHeight, scrollBarRect.width(), buttonHeight);
- }
- break;
- case SC_ScrollBarSubPage: // between top/left button and slider
- if (scrollbar->orientation == Qt::Horizontal)
- ret.setRect(sbextent, 0, sliderstart - sbextent, scrollBarRect.height());
- else
- ret.setRect(0, sbextent, scrollBarRect.width(), sliderstart - sbextent);
- break;
- case SC_ScrollBarAddPage: // between bottom/right button and slider
- if (scrollbar->orientation == Qt::Horizontal)
- ret.setRect(sliderstart + sliderlen, 0,
- maxlen - sliderstart - sliderlen + sbextent, scrollBarRect.height());
- else
- ret.setRect(0, sliderstart + sliderlen, scrollBarRect.width(),
- maxlen - sliderstart - sliderlen + sbextent);
- break;
- case SC_ScrollBarGroove:
- if (scrollbar->orientation == Qt::Horizontal)
- ret.setRect(sbextent, 0, scrollBarRect.width() - sbextent * 2,
- scrollBarRect.height());
- else
- ret.setRect(0, sbextent, scrollBarRect.width(),
- scrollBarRect.height() - sbextent * 2);
- break;
- case SC_ScrollBarSlider:
- if (scrollbar->orientation == Qt::Horizontal)
- ret.setRect(sliderstart, 0, sliderlen, scrollBarRect.height());
- else
- ret.setRect(0, sliderstart, scrollBarRect.width(), sliderlen);
- break;
- default:
- break;
- }
- ret = visualRect(scrollbar->direction, scrollBarRect, ret);
- }
- break;
- case CC_SpinBox:
- if (const QStyleOptionSpinBox *spinbox = qstyleoption_cast<const QStyleOptionSpinBox *>(opt)) {
- QSize bs;
- int fw = spinbox->frame ? proxy()->pixelMetric(PM_SpinBoxFrameWidth, spinbox) : 0;
- bs.setHeight(qMax(8, spinbox->rect.height()/2 - fw));
- // 1.6 -approximate golden mean
- bs.setWidth(qMax(16, qMin(bs.height() * 8 / 5, spinbox->rect.width() / 4)));
- int y = fw + spinbox->rect.y();
- int x, lx, rx;
- x = spinbox->rect.x() + spinbox->rect.width() - fw - bs.width();
- lx = fw;
- rx = x - fw;
- switch (sc) {
- case SC_SpinBoxUp:
- if (spinbox->buttonSymbols == QStyleOptionSpinBox::NoButtons)
- return QRect();
- ret = QRect(x, y, bs.width(), bs.height());
- break;
- case SC_SpinBoxDown:
- if (spinbox->buttonSymbols == QStyleOptionSpinBox::NoButtons)
- return QRect();
-
- ret = QRect(x, y + bs.height(), bs.width(), bs.height());
- break;
- case SC_SpinBoxEditField:
- if (spinbox->buttonSymbols == QStyleOptionSpinBox::NoButtons) {
- ret = QRect(lx, fw, spinbox->rect.width() - 2*fw, spinbox->rect.height() - 2*fw);
- } else {
- ret = QRect(lx, fw, rx, spinbox->rect.height() - 2*fw);
- }
- break;
- case SC_SpinBoxFrame:
- ret = spinbox->rect;
- default:
- break;
- }
- ret = visualRect(spinbox->direction, spinbox->rect, ret);
- }
- break;
- case CC_ToolButton:
- if (const QStyleOptionToolButton *tb = qstyleoption_cast<const QStyleOptionToolButton *>(opt)) {
- int mbi = proxy()->pixelMetric(PM_MenuButtonIndicator, tb);
- ret = tb->rect;
- switch (sc) {
- case SC_ToolButton:
- if ((tb->features
- & (QStyleOptionToolButton::MenuButtonPopup | QStyleOptionToolButton::PopupDelay))
- == QStyleOptionToolButton::MenuButtonPopup)
- ret.adjust(0, 0, -mbi, 0);
- break;
- case SC_ToolButtonMenu:
- if ((tb->features
- & (QStyleOptionToolButton::MenuButtonPopup | QStyleOptionToolButton::PopupDelay))
- == QStyleOptionToolButton::MenuButtonPopup)
- ret.adjust(ret.width() - mbi, 0, 0, 0);
- break;
- default:
- break;
- }
- ret = visualRect(tb->direction, tb->rect, ret);
- }
- break;
- case CC_ComboBox:
- if (const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(opt)) {
- const qreal dpi = QStyleHelper::dpi(opt);
- const int x = cb->rect.x(), y = cb->rect.y(), wi = cb->rect.width(), he = cb->rect.height();
- const int margin = cb->frame ? qRound(QStyleHelper::dpiScaled(3, dpi)) : 0;
- const int bmarg = cb->frame ? qRound(QStyleHelper::dpiScaled(2, dpi)) : 0;
- const int xpos = x + wi - bmarg - qRound(QStyleHelper::dpiScaled(16, dpi));
-
-
- switch (sc) {
- case SC_ComboBoxFrame:
- ret = cb->rect;
- break;
- case SC_ComboBoxArrow:
- ret.setRect(xpos, y + bmarg, qRound(QStyleHelper::dpiScaled(16, opt)), he - 2*bmarg);
- break;
- case SC_ComboBoxEditField:
- ret.setRect(x + margin, y + margin, wi - 2 * margin - qRound(QStyleHelper::dpiScaled(16, dpi)), he - 2 * margin);
- break;
- case SC_ComboBoxListBoxPopup:
- ret = cb->rect;
- break;
- default:
- break;
- }
- ret = visualRect(cb->direction, cb->rect, ret);
- }
- break;
- case CC_TitleBar:
- if (const QStyleOptionTitleBar *tb = qstyleoption_cast<const QStyleOptionTitleBar *>(opt)) {
- const int controlMargin = 2;
- const int controlHeight = tb->rect.height() - controlMargin *2;
- const int delta = controlHeight + controlMargin;
- 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);
- }
- break;
- case SC_TitleBarContextHelpButton:
- if (tb->titleBarFlags & Qt::WindowContextHelpButtonHint)
- offset += delta;
- Q_FALLTHROUGH();
- case SC_TitleBarMinButton:
- if (!isMinimized && (tb->titleBarFlags & Qt::WindowMinimizeButtonHint))
- offset += delta;
- else if (sc == SC_TitleBarMinButton)
- break;
- Q_FALLTHROUGH();
- 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;
- Q_FALLTHROUGH();
- case SC_TitleBarMaxButton:
- if (!isMaximized && (tb->titleBarFlags & Qt::WindowMaximizeButtonHint))
- offset += delta;
- else if (sc == SC_TitleBarMaxButton)
- break;
- Q_FALLTHROUGH();
- case SC_TitleBarShadeButton:
- if (!isMinimized && (tb->titleBarFlags & Qt::WindowShadeButtonHint))
- offset += delta;
- else if (sc == SC_TitleBarShadeButton)
- break;
- Q_FALLTHROUGH();
- case SC_TitleBarUnshadeButton:
- if (isMinimized && (tb->titleBarFlags & Qt::WindowShadeButtonHint))
- offset += delta;
- else if (sc == SC_TitleBarUnshadeButton)
- break;
- Q_FALLTHROUGH();
- case SC_TitleBarCloseButton:
- if (tb->titleBarFlags & Qt::WindowSystemMenuHint)
- offset += delta;
- else if (sc == SC_TitleBarCloseButton)
- break;
- ret.setRect(tb->rect.right() - offset, tb->rect.top() + controlMargin,
- controlHeight, controlHeight);
- break;
- case SC_TitleBarSysMenu:
- if (tb->titleBarFlags & Qt::WindowSystemMenuHint) {
- ret.setRect(tb->rect.left() + controlMargin, tb->rect.top() + controlMargin,
- controlHeight, controlHeight);
- }
- break;
- default:
- break;
- }
- ret = visualRect(tb->direction, tb->rect, ret);
- }
- break;
- case CC_GroupBox: {
- if (const QStyleOptionGroupBox *groupBox = qstyleoption_cast<const QStyleOptionGroupBox *>(opt)) {
- switch (sc) {
- case SC_GroupBoxFrame:
- case SC_GroupBoxContents: {
- int topMargin = 0;
- int topHeight = 0;
- int verticalAlignment = proxy()->styleHint(SH_GroupBox_TextLabelVerticalAlignment, groupBox);
- bool hasCheckBox = groupBox->subControls & QStyle::SC_GroupBoxCheckBox;
- if (groupBox->text.size() || hasCheckBox) {
- int checkBoxHeight = hasCheckBox ? proxy()->pixelMetric(PM_IndicatorHeight, groupBox) : 0;
- topHeight = qMax(groupBox->fontMetrics.height(), checkBoxHeight);
- if (verticalAlignment & Qt::AlignVCenter)
- topMargin = topHeight / 2;
- else if (verticalAlignment & Qt::AlignTop)
- topMargin = topHeight;
- }
-
- QRect frameRect = groupBox->rect;
- frameRect.setTop(topMargin);
-
- if (sc == SC_GroupBoxFrame) {
- ret = frameRect;
- break;
- }
-
- int frameWidth = 0;
- if ((groupBox->features & QStyleOptionFrame::Flat) == 0)
- frameWidth = proxy()->pixelMetric(PM_DefaultFrameWidth, groupBox);
- ret = frameRect.adjusted(frameWidth, frameWidth + topHeight - topMargin,
- -frameWidth, -frameWidth);
- break;
- }
- case SC_GroupBoxCheckBox:
- case SC_GroupBoxLabel: {
- QFontMetrics fontMetrics = groupBox->fontMetrics;
- int th = fontMetrics.height();
- int tw = fontMetrics.size(Qt::TextShowMnemonic, groupBox->text + QLatin1Char(' ')).width();
- int marg = (groupBox->features & QStyleOptionFrame::Flat) ? 0 : 8;
- ret = groupBox->rect.adjusted(marg, 0, -marg, 0);
-
- int indicatorWidth = proxy()->pixelMetric(PM_IndicatorWidth, opt);
- int indicatorHeight = proxy()->pixelMetric(PM_IndicatorHeight, opt);
- int indicatorSpace = proxy()->pixelMetric(PM_CheckBoxLabelSpacing, opt) - 1;
- bool hasCheckBox = groupBox->subControls & QStyle::SC_GroupBoxCheckBox;
- int checkBoxWidth = hasCheckBox ? (indicatorWidth + indicatorSpace) : 0;
- int checkBoxHeight = hasCheckBox ? indicatorHeight : 0;
-
- int h = qMax(th, checkBoxHeight);
- ret.setHeight(h);
-
- // Adjusted rect for label + indicatorWidth + indicatorSpace
- QRect totalRect = alignedRect(groupBox->direction, groupBox->textAlignment,
- QSize(tw + checkBoxWidth, h), ret);
-
- // Adjust totalRect if checkbox is set
- if (hasCheckBox) {
- bool ltr = groupBox->direction == Qt::LeftToRight;
- int left = 0;
- // Adjust for check box
- if (sc == SC_GroupBoxCheckBox) {
- left = ltr ? totalRect.left() : (totalRect.right() - indicatorWidth);
- int top = totalRect.top() + (h - checkBoxHeight) / 2;
- totalRect.setRect(left, top, indicatorWidth, indicatorHeight);
- // Adjust for label
- } else {
- left = ltr ? (totalRect.left() + checkBoxWidth - 2) : totalRect.left();
- int top = totalRect.top() + (h - th) / 2;
- totalRect.setRect(left, top, totalRect.width() - checkBoxWidth, th);
- }
- }
- ret = totalRect;
- break;
- }
- default:
- break;
- }
- }
- break;
- }
- case CC_MdiControls:
- {
- int numSubControls = 0;
- if (opt->subControls & SC_MdiCloseButton)
- ++numSubControls;
- if (opt->subControls & SC_MdiMinButton)
- ++numSubControls;
- if (opt->subControls & SC_MdiNormalButton)
- ++numSubControls;
- if (numSubControls == 0)
- break;
-
- int buttonWidth = opt->rect.width() / numSubControls - 1;
- int offset = 0;
- switch (sc) {
- case SC_MdiCloseButton:
- // Only one sub control, no offset needed.
- if (numSubControls == 1)
- break;
- offset += buttonWidth + 2;
- Q_FALLTHROUGH();
- case SC_MdiNormalButton:
- // No offset needed if
- // 1) There's only one sub control
- // 2) We have a close button and a normal button (offset already added in SC_MdiClose)
- if (numSubControls == 1 || (numSubControls == 2 && !(opt->subControls & SC_MdiMinButton)))
- break;
- if (opt->subControls & SC_MdiNormalButton)
- offset += buttonWidth;
- break;
- default:
- break;
- }
-
- // Subtract one pixel if we only have one sub control. At this point
- // buttonWidth is the actual width + 1 pixel margin, but we don't want the
- // margin when there are no other controllers.
- if (numSubControls == 1)
- --buttonWidth;
- ret = QRect(offset, 0, buttonWidth, opt->rect.height());
- break; }
- default:
- qWarning("QCommonStyle::subControlRect: Case %d not handled", cc);
- }
-
- return ret;
-}
-
-int QCommonStyle::pixelMetric(PixelMetric m, const QStyleOption *opt) const
-{
- int ret;
-
- switch (m) {
- case PM_FocusFrameVMargin:
- case PM_FocusFrameHMargin:
- ret = 2;
- break;
- case PM_MenuBarVMargin:
- case PM_MenuBarHMargin:
- ret = 0;
- break;
- case PM_DialogButtonsSeparator:
- ret = int(QStyleHelper::dpiScaled(5, opt));
- break;
- case PM_DialogButtonsButtonWidth:
- ret = int(QStyleHelper::dpiScaled(70, opt));
- break;
- case PM_DialogButtonsButtonHeight:
- ret = int(QStyleHelper::dpiScaled(30, opt));
- break;
- case PM_TitleBarHeight: {
- if (const QStyleOptionTitleBar *tb = qstyleoption_cast<const QStyleOptionTitleBar *>(opt)) {
- if ((tb->titleBarFlags & Qt::WindowType_Mask) == Qt::Tool) {
- ret = qMax(opt->fontMetrics.height(), 16);
- } else {
- ret = qMax(opt->fontMetrics.height(), 18);
- }
- } else {
- ret = int(QStyleHelper::dpiScaled(18., opt));
- }
-
- break; }
- case PM_TitleBarButtonSize:
- ret = int(QStyleHelper::dpiScaled(16., opt));
- break;
- case PM_TitleBarButtonIconSize:
- ret = int(QStyleHelper::dpiScaled(16., opt));
- break;
-
- case PM_ScrollBarSliderMin:
- ret = int(QStyleHelper::dpiScaled(9., opt));
- break;
-
- case PM_ButtonMargin:
- ret = int(QStyleHelper::dpiScaled(6., opt));
- break;
-
- case PM_DockWidgetTitleBarButtonMargin:
- ret = int(QStyleHelper::dpiScaled(2., opt));
- break;
-
- case PM_ButtonDefaultIndicator:
- ret = 0;
- break;
-
- case PM_MenuButtonIndicator:
- ret = int(QStyleHelper::dpiScaled(12, opt));
- break;
-
- case PM_ButtonShiftHorizontal:
- case PM_ButtonShiftVertical:
-
- case PM_DefaultFrameWidth:
- ret = 2;
- break;
-
- case PM_ComboBoxFrameWidth:
- case PM_SpinBoxFrameWidth:
- case PM_MenuPanelWidth:
- case PM_TabBarBaseOverlap:
- case PM_TabBarBaseHeight:
- ret = proxy()->pixelMetric(PM_DefaultFrameWidth, opt);
- break;
- case PM_MdiSubWindowFrameWidth:
- ret = int(QStyleHelper::dpiScaled(4, opt));
- break;
- case PM_MdiSubWindowMinimizedWidth:
- ret = int(QStyleHelper::dpiScaled(196, opt));
- break;
- case PM_ScrollBarExtent:
- ret = int(QStyleHelper::dpiScaled(16, opt));
- break;
- case PM_MaximumDragDistance:
- ret = QGuiApplicationPrivate::platformTheme()->themeHint(QPlatformTheme::MaximumScrollBarDragDistance).toInt();
- break;
- case PM_SliderThickness:
- ret = int(QStyleHelper::dpiScaled(16, opt));
- break;
- case PM_SliderTickmarkOffset:
- if (const QStyleOptionSlider *sl = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- int space = (sl->orientation == Qt::Horizontal) ? sl->rect.height()
- : sl->rect.width();
- int thickness = proxy()->pixelMetric(PM_SliderControlThickness, sl);
- int ticks = sl->tickPosition;
-
- if (ticks == QStyleOptionSlider::TicksBothSides)
- ret = (space - thickness) / 2;
- else if (ticks == QStyleOptionSlider::TicksAbove)
- ret = space - thickness;
- else
- ret = 0;
- } else {
- ret = 0;
- }
- break;
- case PM_SliderSpaceAvailable:
- if (const QStyleOptionSlider *sl = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- if (sl->orientation == Qt::Horizontal)
- ret = sl->rect.width() - proxy()->pixelMetric(PM_SliderLength, sl);
- else
- ret = sl->rect.height() - proxy()->pixelMetric(PM_SliderLength, sl);
- } else {
- ret = 0;
- }
- break;
- case PM_DockWidgetSeparatorExtent:
- ret = int(QStyleHelper::dpiScaled(6, opt));
- break;
-
- case PM_DockWidgetHandleExtent:
- ret = int(QStyleHelper::dpiScaled(8, opt));
- break;
- case PM_DockWidgetTitleMargin:
- ret = 0;
- break;
- case PM_DockWidgetFrameWidth:
- ret = 1;
- break;
- case PM_SpinBoxSliderHeight:
- case PM_MenuBarPanelWidth:
- ret = 2;
- break;
- case PM_MenuBarItemSpacing:
- ret = 0;
- break;
- case PM_ToolBarFrameWidth:
- ret = 1;
- break;
-
- case PM_ToolBarItemMargin:
- ret = 0;
- break;
-
- case PM_ToolBarItemSpacing:
- ret = int(QStyleHelper::dpiScaled(4, opt));
- break;
-
- case PM_ToolBarHandleExtent:
- ret = int(QStyleHelper::dpiScaled(8, opt));
- break;
-
- case PM_ToolBarSeparatorExtent:
- ret = int(QStyleHelper::dpiScaled(6, opt));
- break;
-
- case PM_ToolBarExtensionExtent:
- ret = int(QStyleHelper::dpiScaled(12, opt));
- break;
-
- case PM_TabBarTabOverlap:
- ret = 3;
- break;
-
- case PM_TabBarTabHSpace:
- ret = int(QStyleHelper::dpiScaled(24, opt));
- break;
-
- case PM_TabBarTabShiftHorizontal:
- ret = 0;
- break;
-
- case PM_TabBarTabShiftVertical:
- ret = 2;
- break;
-
- case PM_TabBarTabVSpace: {
- const QStyleOptionTab *tb = qstyleoption_cast<const QStyleOptionTab *>(opt);
- if (tb && (tb->shape == QStyleOptionTab::RoundedNorth || tb->shape == QStyleOptionTab::RoundedSouth
- || tb->shape == QStyleOptionTab::RoundedWest || tb->shape == QStyleOptionTab::RoundedEast))
- ret = 8;
- else
- if(tb && (tb->shape == QStyleOptionTab::TriangularWest || tb->shape == QStyleOptionTab::TriangularEast))
- ret = 3;
- else
- ret = 2;
- break; }
-
- case PM_ProgressBarChunkWidth:
- ret = 9;
- break;
-
- case PM_IndicatorWidth:
- ret = int(QStyleHelper::dpiScaled(13, opt));
- break;
-
- case PM_IndicatorHeight:
- ret = int(QStyleHelper::dpiScaled(13, opt));
- break;
-
- case PM_ExclusiveIndicatorWidth:
- ret = int(QStyleHelper::dpiScaled(12, opt));
- break;
-
- case PM_ExclusiveIndicatorHeight:
- ret = int(QStyleHelper::dpiScaled(12, opt));
- break;
-
- case PM_MenuTearoffHeight:
- ret = int(QStyleHelper::dpiScaled(10, opt));
- break;
-
- case PM_MenuScrollerHeight:
- ret = int(QStyleHelper::dpiScaled(10, opt));
- break;
-
- case PM_MenuDesktopFrameWidth:
- case PM_MenuHMargin:
- case PM_MenuVMargin:
- ret = 0;
- break;
-
- case PM_HeaderMargin:
- ret = int(QStyleHelper::dpiScaled(4, opt));
- break;
- case PM_HeaderMarkSize:
- ret = int(QStyleHelper::dpiScaled(16, opt));
- break;
- case PM_HeaderGripMargin:
- ret = int(QStyleHelper::dpiScaled(4, opt));
- break;
- case PM_HeaderDefaultSectionSizeHorizontal:
- ret = int(QStyleHelper::dpiScaled(100, opt));
- break;
- case PM_HeaderDefaultSectionSizeVertical:
- ret = int(QStyleHelper::dpiScaled(30, opt));
- break;
- case PM_TabBarScrollButtonWidth:
- ret = int(QStyleHelper::dpiScaled(16, opt));
- break;
- case PM_LayoutLeftMargin:
- case PM_LayoutTopMargin:
- case PM_LayoutRightMargin:
- case PM_LayoutBottomMargin:
- {
- bool isWindow = opt ? (opt->state & State_Window) : false;
- ret = proxy()->pixelMetric(isWindow ? PM_DefaultTopLevelMargin : PM_DefaultChildMargin);
- }
- break;
- case PM_LayoutHorizontalSpacing:
- case PM_LayoutVerticalSpacing:
- ret = proxy()->pixelMetric(PM_DefaultLayoutSpacing);
- break;
-
- case PM_DefaultTopLevelMargin:
- ret = int(QStyleHelper::dpiScaled(11, opt));
- break;
- case PM_DefaultChildMargin:
- ret = int(QStyleHelper::dpiScaled(9, opt));
- break;
- case PM_DefaultLayoutSpacing:
- ret = int(QStyleHelper::dpiScaled(6, opt));
- break;
-
- case PM_ToolBarIconSize:
- ret = 0;
- if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme())
- ret = theme->themeHint(QPlatformTheme::ToolBarIconSize).toInt();
- if (ret <= 0)
- ret = int(QStyleHelper::dpiScaled(24, opt));
- break;
-
- case PM_TabBarIconSize:
- case PM_ListViewIconSize:
- ret = proxy()->pixelMetric(PM_SmallIconSize, opt);
- break;
-
- case PM_ButtonIconSize:
- case PM_SmallIconSize:
- ret = int(QStyleHelper::dpiScaled(16, opt));
- break;
- case PM_IconViewIconSize:
- ret = proxy()->pixelMetric(PM_LargeIconSize, opt);
- break;
-
- case PM_LargeIconSize:
- ret = int(QStyleHelper::dpiScaled(32, opt));
- break;
-
- case PM_ToolTipLabelFrameWidth:
- ret = 1;
- break;
- case PM_CheckBoxLabelSpacing:
- case PM_RadioButtonLabelSpacing:
- ret = int(QStyleHelper::dpiScaled(6, opt));
- break;
- case PM_SizeGripSize:
- ret = int(QStyleHelper::dpiScaled(13, opt));
- break;
- case PM_MessageBoxIconSize:
-#ifdef Q_OS_MAC
- if (QGuiApplication::desktopSettingsAware()) {
- ret = 64; // No DPI scaling, it's handled elsewhere.
- } else
-#endif
- {
- ret = int(QStyleHelper::dpiScaled(32, opt));
- }
- break;
- case PM_TextCursorWidth:
- ret = QGuiApplicationPrivate::platformTheme()->themeHint(QPlatformTheme::TextCursorWidth).toInt();
- break;
- case PM_TabBar_ScrollButtonOverlap:
- ret = 1;
- break;
- case PM_TabCloseIndicatorWidth:
- case PM_TabCloseIndicatorHeight:
- ret = int(QStyleHelper::dpiScaled(16, opt));
- break;
- case PM_ScrollView_ScrollBarSpacing:
- ret = 2 * proxy()->pixelMetric(PM_DefaultFrameWidth, opt);
- break;
- case PM_ScrollView_ScrollBarOverlap:
- ret = 0;
- break;
- case PM_SubMenuOverlap:
- ret = -proxy()->pixelMetric(QStyle::PM_MenuPanelWidth, opt);
- break;
- case PM_TreeViewIndentation:
- ret = int(QStyleHelper::dpiScaled(20, opt));
- break;
- default:
- ret = 0;
- break;
- }
-
- return ret;
-}
-
-QSize QCommonStyle::sizeFromContents(ContentsType ct, const QStyleOption *opt, const QSize &csz) const
-{
- Q_D(const QCommonStyle);
- QSize sz(csz);
- switch (ct) {
- case CT_PushButton:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- int w = csz.width(),
- h = csz.height(),
- bm = proxy()->pixelMetric(PM_ButtonMargin, btn),
- fw = proxy()->pixelMetric(PM_DefaultFrameWidth, btn) * 2;
- w += bm + fw;
- h += bm + fw;
- if (btn->features & QStyleOptionButton::AutoDefaultButton){
- int dbw = proxy()->pixelMetric(PM_ButtonDefaultIndicator, btn) * 2;
- w += dbw;
- h += dbw;
- }
- sz = QSize(w, h);
- }
- break;
- case CT_RadioButton:
- case CT_CheckBox:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- bool isRadio = (ct == CT_RadioButton);
-
- int w = proxy()->pixelMetric(isRadio ? PM_ExclusiveIndicatorWidth
- : PM_IndicatorWidth, btn);
- int h = proxy()->pixelMetric(isRadio ? PM_ExclusiveIndicatorHeight
- : PM_IndicatorHeight, btn);
-
- int margins = 0;
- // we add 4 pixels for label margins
- if (!btn->icon.isNull() || !btn->text.isEmpty())
- margins = 4 + proxy()->pixelMetric(isRadio ? PM_RadioButtonLabelSpacing
- : PM_CheckBoxLabelSpacing, opt);
- sz += QSize(w + margins, 4);
- sz.setHeight(qMax(sz.height(), h));
- }
- break;
- case CT_MenuItem:
- if (const QStyleOptionMenuItem *mi = qstyleoption_cast<const QStyleOptionMenuItem *>(opt)) {
- bool checkable = mi->menuHasCheckableItems;
- int maxpmw = mi->maxIconWidth;
- int w = sz.width(), h = sz.height();
- if (mi->menuItemType == QStyleOptionMenuItem::Separator) {
- w = 10;
- h = 2;
- } else {
- h = mi->fontMetrics.height() + 8;
- if (!mi->icon.isNull()) {
- int iconExtent = proxy()->pixelMetric(PM_SmallIconSize);
- h = qMax(h, mi->icon.actualSize(QSize(iconExtent, iconExtent)).height() + 4);
- }
- }
- if (mi->text.contains(QLatin1Char('\t')))
- w += 12;
- if (maxpmw > 0)
- w += maxpmw + 6;
- if (checkable && maxpmw < 20)
- w += 20 - maxpmw;
- if (checkable || maxpmw > 0)
- w += 2;
- w += 12;
- sz = QSize(w, h);
- }
- break;
- case CT_ToolButton:
- sz = QSize(sz.width() + 6, sz.height() + 5);
- break;
- case CT_ComboBox:
- if (const QStyleOptionComboBox *cmb = qstyleoption_cast<const QStyleOptionComboBox *>(opt)) {
- int fw = cmb->frame ? proxy()->pixelMetric(PM_ComboBoxFrameWidth, opt) * 2 : 0;
- const int textMargins = 2*(proxy()->pixelMetric(PM_FocusFrameHMargin) + 1);
- // QItemDelegate::sizeHint expands the textMargins two times, thus the 2*textMargins...
- int other = qMax(23, 2*textMargins + proxy()->pixelMetric(QStyle::PM_ScrollBarExtent, opt));
- sz = QSize(sz.width() + fw + other, sz.height() + fw);
- }
- break;
- case CT_HeaderSection:
- if (const QStyleOptionHeader *hdr = qstyleoption_cast<const QStyleOptionHeader *>(opt)) {
- bool nullIcon = hdr->icon.isNull();
- int margin = proxy()->pixelMetric(QStyle::PM_HeaderMargin, hdr);
- int iconSize = nullIcon ? 0 : proxy()->pixelMetric(QStyle::PM_SmallIconSize, hdr);
- QSize txt = hdr->fontMetrics.size(0, hdr->text);
- sz.setHeight(margin + qMax(iconSize, txt.height()) + margin);
- sz.setWidth((nullIcon ? 0 : margin) + iconSize
- + (hdr->text.isNull() ? 0 : margin) + txt.width() + margin);
- if (hdr->sortIndicator != QStyleOptionHeader::None) {
- int margin = proxy()->pixelMetric(QStyle::PM_HeaderMargin, hdr);
- if (hdr->orientation == Qt::Horizontal)
- sz.rwidth() += sz.height() + margin;
- else
- sz.rheight() += sz.width() + margin;
- }
- }
- break;
- case CT_TabWidget:
- sz += QSize(4, 4);
- break;
- case CT_LineEdit:
- if (const QStyleOptionFrame *f = qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
- const int borderSize = 2 * f->lineWidth;
- sz += QSize(borderSize, borderSize);
- const int minSize = 10;
- if (sz.width() < minSize)
- sz.rwidth() = minSize;
- if (sz.height() < minSize)
- sz.rheight() = minSize;
- }
- break;
- case CT_GroupBox:
- if (const QStyleOptionGroupBox *styleOpt = qstyleoption_cast<const QStyleOptionGroupBox *>(opt)) {
- if (sz.isEmpty())
- sz = QSize(20, 20);
- sz += QSize(styleOpt->features.testFlag(QStyleOptionFrame::Flat) ? 0 : 16, 0);
- }
- break;
- case CT_MdiControls:
- if (const QStyleOptionComplex *styleOpt = qstyleoption_cast<const QStyleOptionComplex *>(opt)) {
- const int buttonSize = proxy()->pixelMetric(PM_TitleBarButtonSize, styleOpt);
- int width = 1;
- if (styleOpt->subControls & SC_MdiMinButton)
- width += buttonSize + 1;
- if (styleOpt->subControls & SC_MdiNormalButton)
- width += buttonSize + 1;
- if (styleOpt->subControls & SC_MdiCloseButton)
- width += buttonSize + 1;
- sz = QSize(width, buttonSize);
- } else {
- const int buttonSize = proxy()->pixelMetric(PM_TitleBarButtonSize, opt);
- sz = QSize(1 + 3 * (buttonSize + 1), buttonSize);
- }
- break;
- case CT_ItemViewItem:
- if (const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>(opt)) {
- QRect decorationRect, displayRect, checkRect;
- d->viewItemLayout(vopt, &checkRect, &decorationRect, &displayRect, true);
- sz = (decorationRect|displayRect|checkRect).size();
- if (decorationRect.isValid() && sz.height() == decorationRect.height())
- sz.rheight() += 2; // Prevent icons from overlapping.
- }
- break;
- case CT_SpinBox:
- if (const QStyleOptionSpinBox *vopt = qstyleoption_cast<const QStyleOptionSpinBox *>(opt)) {
- // Add button + frame widths
- if (vopt->subControls == SC_SpinBoxFrame) {
- const qreal dpi = QStyleHelper::dpi(opt);
- const bool hasButtons = (vopt->buttonSymbols != QStyleOptionSpinBox::NoButtons);
- const int buttonWidth = hasButtons ? qRound(QStyleHelper::dpiScaled(16, dpi)) : 0;
- const int fw = vopt->frame ? proxy()->pixelMetric(PM_SpinBoxFrameWidth, vopt) : 0;
- sz += QSize(buttonWidth + 2*fw, 1 + 2*fw);
- } else {
- const QSize buttonSize = proxy()->subControlRect(CC_SpinBox, vopt, SC_SpinBoxUp).size();
- const int upAndDownTogetherHeight = buttonSize.height() * 2;
- sz += QSize(buttonSize.width(), upAndDownTogetherHeight);
- }
- }
- break;
- case CT_Slider:
- if (const QStyleOptionSlider *option = qstyleoption_cast<const QStyleOptionSlider *>(opt))
- sz = subControlRect(QStyle::CC_Slider, option, QStyle::SC_SliderHandle).size();
- break;
- case CT_Dial:
- sz = QSize(20, 20);
- break;
- case CT_Frame:
- if (const QStyleOptionFrame *option = qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
- const int ninePatchSplit = 1;
- int w = qMax(10, (option->lineWidth * 2) + ninePatchSplit);
- sz = QSize(w, w);
- }
- break;
- case CT_ProgressBar:
- if (sz.isNull()) {
- // Special case: return minimum nine patch image size
- sz = QSize(10, 10);
- }
- break;
- case CT_ScrollBar:
- case CT_MenuBar:
- case CT_Menu:
- case CT_MenuBarItem:
- case CT_TabBarTab:
- // just return the contentsSize for now
- Q_FALLTHROUGH();
- default:
- break;
- }
- return sz;
-}
-
-QFont QCommonStyle::font(QStyle::ControlElement element, const QStyle::State state) const
-{
- Q_UNUSED(element);
- Q_UNUSED(state);
- return QGuiApplication::font();
-}
-
-QMargins QCommonStyle::ninePatchMargins(QStyle::ControlElement /*ce*/, const QStyleOption * /*opt*/, const QSize &imageSize) const
-{
- // By default, we just divide the image at the center
- int w = imageSize.width() / 2;
- int h = imageSize.height() / 2;
- return QMargins(w, h, w, h);
-}
-
-QMargins QCommonStyle::ninePatchMargins(QStyle::ComplexControl /*cc*/, const QStyleOptionComplex * /*opt*/, const QSize &imageSize) const
-{
- // By default, we just divide the image at the center
- int w = imageSize.width() / 2;
- int h = imageSize.height() / 2;
- return QMargins(w, h, w, h);
-}
-
-int QCommonStyle::styleHint(StyleHint sh, const QStyleOption *opt, QStyleHintReturn *hret) const
-{
- int ret = 0;
-
- switch (sh) {
- case SH_Menu_KeyboardSearch:
- ret = false;
- break;
- case SH_Slider_AbsoluteSetButtons:
- ret = Qt::MiddleButton;
- break;
- case SH_Slider_PageSetButtons:
- ret = Qt::LeftButton;
- break;
- case SH_ScrollBar_ContextMenu:
- ret = true;
- break;
- case SH_GroupBox_TextLabelVerticalAlignment:
- ret = Qt::AlignVCenter;
- break;
- case SH_GroupBox_TextLabelColor:
- ret = opt ? int(opt->palette.color(QPalette::Text).rgba()) : 0;
- break;
-
- case SH_ListViewExpand_SelectMouseType:
- case SH_TabBar_SelectMouseType:
- ret = QEvent::MouseButtonPress;
- break;
-
- case SH_TabBar_Alignment:
- ret = Qt::AlignLeft;
- break;
-
- case SH_Header_ArrowAlignment:
- ret = Qt::AlignRight | Qt::AlignVCenter;
- break;
-
- case SH_TitleBar_AutoRaise:
- ret = false;
- break;
-
- case SH_Menu_SubMenuPopupDelay:
- ret = 256;
- break;
-
- case SH_Menu_SloppySubMenus:
- ret = true;
- break;
-
- case SH_Menu_SubMenuUniDirection:
- ret = false;
- break;
- case SH_Menu_SubMenuUniDirectionFailCount:
- ret = 1;
- break;
- case SH_Menu_SubMenuSloppySelectOtherActions:
- ret = true;
- break;
- case SH_Menu_SubMenuSloppyCloseTimeout:
- ret = 1000;
- break;
- case SH_Menu_SubMenuResetWhenReenteringParent:
- ret = false;
- break;
- case SH_Menu_SubMenuDontStartSloppyOnLeave:
- ret = false;
- break;
-
- case SH_ProgressDialog_TextLabelAlignment:
- ret = Qt::AlignCenter;
- break;
-
- case SH_BlinkCursorWhenTextSelected:
-#if defined(Q_OS_DARWIN)
- ret = 0;
-#else
- ret = 1;
-#endif
- break;
-
- case SH_Table_GridLineColor:
- if (opt)
- ret = opt->palette.color(QPalette::Mid).rgba();
- else
- ret = -1;
- break;
- case SH_LineEdit_PasswordCharacter: {
- const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme();
- const QPlatformTheme::ThemeHint hintType = QPlatformTheme::PasswordMaskCharacter;
- const QVariant hint = theme ? theme->themeHint(hintType) : QPlatformTheme::defaultThemeHint(hintType);
- ret = hint.toChar().unicode();
- break;
- }
- case SH_LineEdit_PasswordMaskDelay:
- ret = QGuiApplicationPrivate::platformTheme()->themeHint(QPlatformTheme::PasswordMaskDelay).toInt();
- break;
- case SH_ToolBox_SelectedPageTitleBold:
- ret = 1;
- break;
-
- case SH_UnderlineShortcut:
- ret = 1;
- break;
-
- case SH_SpinBox_ClickAutoRepeatRate:
- ret = 150;
- break;
-
- case SH_SpinBox_ClickAutoRepeatThreshold:
- ret = 500;
- break;
-
- case SH_SpinBox_KeyPressAutoRepeatRate:
- ret = 75;
- break;
-
- case SH_Menu_SelectionWrap:
- ret = true;
- break;
-
- case SH_Menu_FillScreenWithScroll:
- ret = true;
- break;
-
- case SH_ToolTipLabel_Opacity:
- ret = 255;
- break;
-
- case SH_Button_FocusPolicy:
- ret = Qt::StrongFocus;
- break;
-
- case SH_MessageBox_UseBorderForButtonSpacing:
- ret = 0;
- break;
-
- case SH_ToolButton_PopupDelay:
- ret = 600;
- break;
-
- case SH_FocusFrame_Mask:
- ret = 1;
- break;
- case SH_RubberBand_Mask:
- if (const QStyleOptionRubberBand *rbOpt = qstyleoption_cast<const QStyleOptionRubberBand *>(opt)) {
- ret = 0;
- if (rbOpt->shape == QStyleOptionRubberBand::Rectangle) {
- ret = true;
- if(QStyleHintReturnMask *mask = qstyleoption_cast<QStyleHintReturnMask*>(hret)) {
- mask->region = opt->rect;
- int margin = proxy()->pixelMetric(PM_DefaultFrameWidth) * 2;
- mask->region -= opt->rect.adjusted(margin, margin, -margin, -margin);
- }
- }
- }
- break;
- case SH_SpinControls_DisableOnBounds:
- ret = 1;
- break;
-
- case SH_Dial_BackgroundRole:
- ret = QPalette::Window;
- break;
-
- case SH_ComboBox_LayoutDirection:
- ret = opt ? opt->direction : Qt::LeftToRight;
- break;
-
- case SH_ItemView_EllipsisLocation:
- ret = Qt::AlignTrailing;
- break;
-
- case SH_ItemView_ShowDecorationSelected:
- ret = false;
- break;
-
- case SH_ItemView_ActivateItemOnSingleClick:
- ret = 0;
- if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme())
- ret = theme->themeHint(QPlatformTheme::ItemViewActivateItemOnSingleClick).toBool() ? 1 : 0;
- break;
- case SH_TitleBar_ModifyNotification:
- ret = true;
- break;
- case SH_ScrollBar_RollBetweenButtons:
- ret = false;
- break;
- case SH_TabBar_ElideMode:
- ret = Qt::ElideNone;
- break;
- case SH_DialogButtonLayout:
- if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme())
- ret = theme->themeHint(QPlatformTheme::DialogButtonBoxLayout).toInt();
- break;
- case SH_ComboBox_PopupFrameStyle:
- ret = QStyleOptionFrame::StyledPanel | QStyleOptionFrame::Plain;
- break;
- case SH_MessageBox_TextInteractionFlags:
- ret = Qt::LinksAccessibleByMouse;
- break;
- case SH_DialogButtonBox_ButtonsHaveIcons:
- ret = 0;
- if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme())
- ret = theme->themeHint(QPlatformTheme::DialogButtonBoxButtonsHaveIcons).toBool() ? 1 : 0;
- break;
- case SH_SpellCheckUnderlineStyle:
- ret = QTextCharFormat::WaveUnderline;
- break;
- case SH_MessageBox_CenterButtons:
- ret = true;
- break;
- case SH_ItemView_MovementWithoutUpdatingSelection:
- ret = true;
- break;
- case SH_FocusFrame_AboveWidget:
- ret = false;
- break;
- case SH_TabWidget_DefaultTabPosition:
- ret = QStyleOptionTabBarBase::North;
- break;
- case SH_ToolBar_Movable:
- ret = true;
- break;
- case SH_TextControl_FocusIndicatorTextCharFormat:
- ret = true;
- if (QStyleHintReturnVariant *vret = qstyleoption_cast<QStyleHintReturnVariant*>(hret)) {
- QPen outline(opt->palette.color(QPalette::Text), 1, Qt::DotLine);
- QTextCharFormat fmt;
- fmt.setProperty(QTextFormat::OutlinePen, outline);
- vret->variant = fmt;
- }
- break;
- case SH_WizardStyle:
- break;
- case SH_FormLayoutWrapPolicy:
- break;
- case SH_FormLayoutFieldGrowthPolicy:
- break;
- case SH_FormLayoutFormAlignment:
- ret = Qt::AlignLeft | Qt::AlignTop;
- break;
- case SH_FormLayoutLabelAlignment:
- ret = Qt::AlignLeft;
- break;
- case SH_ItemView_ArrowKeysNavigateIntoChildren:
- ret = false;
- break;
- case SH_ItemView_DrawDelegateFrame:
- ret = 0;
- break;
- case SH_TabBar_CloseButtonPosition:
- ret = QStyleOptionTabBarBase::RightSide;
- break;
- case SH_TabBar_ChangeCurrentDelay:
- ret = 500;
- break;
- case SH_DockWidget_ButtonsHaveFrame:
- ret = true;
- break;
- case SH_ToolButtonStyle:
- ret = 0;
- if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme())
- ret = theme->themeHint(QPlatformTheme::ToolButtonStyle).toInt();
- break;
- case SH_RequestSoftwareInputPanel:
- ret = RSIP_OnMouseClick;
- break;
- case SH_ScrollBar_Transient:
- ret = false;
- break;
- case SH_Menu_SupportsSections:
- ret = false;
- break;
- case SH_ToolTip_WakeUpDelay:
- ret = 700;
- break;
- case SH_ToolTip_FallAsleepDelay:
- ret = 2000;
- break;
- case SH_Widget_Animate:
- ret = true;
- break;
- case SH_Splitter_OpaqueResize:
- ret = true;
- break;
- case SH_ItemView_ScrollMode:
- ret = QStyleOptionViewItem::ScrollPerItem;
- break;
- case SH_TitleBar_ShowToolTipsOnButtons:
- ret = true;
- break;
- case SH_Widget_Animation_Duration:
- ret = styleHint(SH_Widget_Animate, opt, hret) ? 200 : 0;
- break;
- case SH_ComboBox_AllowWheelScrolling:
- ret = true;
- break;
- case SH_SpinBox_ButtonsInsideFrame:
- ret = true;
- break;
- case SH_SpinBox_StepModifier:
- ret = Qt::ControlModifier;
- break;
- default:
- ret = 0;
- break;
- }
-
- return ret;
-}
-
-#if QT_CONFIG(imageformat_xpm)
-static QPixmap cachedPixmapFromXPM(const char * const *xpm)
-{
- QPixmap result;
- const QString tag = QString::asprintf("xpm:0x%p", static_cast<const void*>(xpm));
- if (!QPixmapCache::find(tag, &result)) {
- result = QPixmap(xpm);
- QPixmapCache::insert(tag, result);
- }
- return result;
-}
-
-static inline QPixmap titleBarMenuCachedPixmapFromXPM() { return cachedPixmapFromXPM(qt_menu_xpm); }
-#endif
-
-static inline QString clearText16IconPath()
-{
- return QStringLiteral(":/qt-project.org/styles/commonstyle/images/cleartext-16.png");
-}
-
-#if defined(Q_OS_WIN) || QT_CONFIG(imageformat_png)
-static QIcon clearTextIcon(bool rtl)
-{
- const QString directionalThemeName = rtl
- ? QStringLiteral("edit-clear-locationbar-ltr") : QStringLiteral("edit-clear-locationbar-rtl");
- if (QIcon::hasThemeIcon(directionalThemeName))
- return QIcon::fromTheme(directionalThemeName);
- const QString themeName = QStringLiteral("edit-clear");
- if (QIcon::hasThemeIcon(themeName))
- return QIcon::fromTheme(themeName);
-
- QIcon icon;
-#ifndef QT_NO_IMAGEFORMAT_PNG
- QPixmap clearText16(clearText16IconPath());
- Q_ASSERT(!clearText16.size().isEmpty());
- icon.addPixmap(clearText16);
- QPixmap clearText32(QStringLiteral(":/qt-project.org/styles/commonstyle/images/cleartext-32.png"));
- Q_ASSERT(!clearText32.size().isEmpty());
- icon.addPixmap(clearText32);
- clearText32.setDevicePixelRatio(2); // The 32x32 pixmap can also be used for 16x16/devicePixelRatio=2
- icon.addPixmap(clearText32);
-#endif // !QT_NO_IMAGEFORMAT_PNG
- return icon;
-}
-#endif
-
-QPixmap QCommonStyle::standardPixmap(StandardPixmap sp, const QStyleOption *option) const
-{
- const bool rtl = (option && option->direction == Qt::RightToLeft) || (!option && QGuiApplication::isRightToLeft());
-#if QT_CONFIG(imageformat_png)
- QPixmap pixmap;
-
- if (QGuiApplication::desktopSettingsAware() && !QIcon::themeName().isEmpty()) {
- switch (sp) {
- case SP_DialogYesButton:
- case SP_DialogOkButton:
- pixmap = QIcon::fromTheme(QLatin1String("dialog-ok")).pixmap(16);
- break;
- case SP_DialogApplyButton:
- pixmap = QIcon::fromTheme(QLatin1String("dialog-ok-apply")).pixmap(16);
- break;
- case SP_DialogDiscardButton:
- pixmap = QIcon::fromTheme(QLatin1String("edit-delete")).pixmap(16);
- break;
- case SP_DialogCloseButton:
- pixmap = QIcon::fromTheme(QLatin1String("dialog-close")).pixmap(16);
- break;
- case SP_DirHomeIcon:
- pixmap = QIcon::fromTheme(QLatin1String("user-home")).pixmap(16);
- break;
- case SP_MessageBoxInformation:
- pixmap = QIcon::fromTheme(QLatin1String("messagebox_info")).pixmap(16);
- break;
- case SP_MessageBoxWarning:
- pixmap = QIcon::fromTheme(QLatin1String("messagebox_warning")).pixmap(16);
- break;
- case SP_MessageBoxCritical:
- pixmap = QIcon::fromTheme(QLatin1String("messagebox_critical")).pixmap(16);
- break;
- case SP_MessageBoxQuestion:
- pixmap = QIcon::fromTheme(QLatin1String("help")).pixmap(16);
- break;
- case SP_DialogOpenButton:
- case SP_DirOpenIcon:
- pixmap = QIcon::fromTheme(QLatin1String("folder-open")).pixmap(16);
- break;
- case SP_FileIcon:
- pixmap = QIcon::fromTheme(QLatin1String("text-x-generic"),
- QIcon::fromTheme(QLatin1String("empty"))).pixmap(16);
- break;
- case SP_DirClosedIcon:
- case SP_DirIcon:
- pixmap = QIcon::fromTheme(QLatin1String("folder")).pixmap(16);
- break;
- case SP_DriveFDIcon:
- pixmap = QIcon::fromTheme(QLatin1String("media-floppy"),
- QIcon::fromTheme(QLatin1String("3floppy_unmount"))).pixmap(16);
- break;
- case SP_ComputerIcon:
- pixmap = QIcon::fromTheme(QLatin1String("computer"),
- QIcon::fromTheme(QLatin1String("system"))).pixmap(16);
- break;
- case SP_DesktopIcon:
- pixmap = QIcon::fromTheme(QLatin1String("user-desktop"),
- QIcon::fromTheme(QLatin1String("desktop"))).pixmap(16);
- break;
- case SP_TrashIcon:
- pixmap = QIcon::fromTheme(QLatin1String("user-trash"),
- QIcon::fromTheme(QLatin1String("trashcan_empty"))).pixmap(16);
- break;
- case SP_DriveCDIcon:
- case SP_DriveDVDIcon:
- pixmap = QIcon::fromTheme(QLatin1String("media-optical"),
- QIcon::fromTheme(QLatin1String("cdrom_unmount"))).pixmap(16);
- break;
- case SP_DriveHDIcon:
- pixmap = QIcon::fromTheme(QLatin1String("drive-harddisk"),
- QIcon::fromTheme(QLatin1String("hdd_unmount"))).pixmap(16);
- break;
- case SP_FileDialogToParent:
- pixmap = QIcon::fromTheme(QLatin1String("go-up"),
- QIcon::fromTheme(QLatin1String("up"))).pixmap(16);
- break;
- case SP_FileDialogNewFolder:
- pixmap = QIcon::fromTheme(QLatin1String("folder_new")).pixmap(16);
- break;
- case SP_ArrowUp:
- pixmap = QIcon::fromTheme(QLatin1String("go-up"),
- QIcon::fromTheme(QLatin1String("up"))).pixmap(16);
- break;
- case SP_ArrowDown:
- pixmap = QIcon::fromTheme(QLatin1String("go-down"),
- QIcon::fromTheme(QLatin1String("down"))).pixmap(16);
- break;
- case SP_ArrowRight:
- pixmap = QIcon::fromTheme(QLatin1String("go-next"),
- QIcon::fromTheme(QLatin1String("forward"))).pixmap(16);
- break;
- case SP_ArrowLeft:
- pixmap = QIcon::fromTheme(QLatin1String("go-previous"),
- QIcon::fromTheme(QLatin1String("back"))).pixmap(16);
- break;
- case SP_FileDialogDetailedView:
- pixmap = QIcon::fromTheme(QLatin1String("view_detailed")).pixmap(16);
- break;
- case SP_FileDialogListView:
- pixmap = QIcon::fromTheme(QLatin1String("view_icon")).pixmap(16);
- break;
- case SP_BrowserReload:
- pixmap = QIcon::fromTheme(QLatin1String("reload")).pixmap(16);
- break;
- case SP_BrowserStop:
- pixmap = QIcon::fromTheme(QLatin1String("process-stop")).pixmap(16);
- break;
- case SP_MediaPlay:
- pixmap = QIcon::fromTheme(QLatin1String("media-playback-start")).pixmap(16);
- break;
- case SP_MediaPause:
- pixmap = QIcon::fromTheme(QLatin1String("media-playback-pause")).pixmap(16);
- break;
- case SP_MediaStop:
- pixmap = QIcon::fromTheme(QLatin1String("media-playback-stop")).pixmap(16);
- break;
- case SP_MediaSeekForward:
- pixmap = QIcon::fromTheme(QLatin1String("media-seek-forward")).pixmap(16);
- break;
- case SP_MediaSeekBackward:
- pixmap = QIcon::fromTheme(QLatin1String("media-seek-backward")).pixmap(16);
- break;
- case SP_MediaSkipForward:
- pixmap = QIcon::fromTheme(QLatin1String("media-skip-forward")).pixmap(16);
- break;
- case SP_MediaSkipBackward:
- pixmap = QIcon::fromTheme(QLatin1String("media-skip-backward")).pixmap(16);
- break;
- case SP_DialogResetButton:
- pixmap = QIcon::fromTheme(QLatin1String("edit-clear")).pixmap(24);
- break;
- case SP_DialogHelpButton:
- pixmap = QIcon::fromTheme(QLatin1String("help-contents")).pixmap(24);
- break;
- case SP_DialogNoButton:
- case SP_DialogCancelButton:
- pixmap = QIcon::fromTheme(QLatin1String("dialog-cancel"),
- QIcon::fromTheme(QLatin1String("process-stop"))).pixmap(24);
- break;
- case SP_DialogSaveButton:
- pixmap = QIcon::fromTheme(QLatin1String("document-save")).pixmap(24);
- break;
- case SP_FileLinkIcon:
- pixmap = QIcon::fromTheme(QLatin1String("emblem-symbolic-link")).pixmap(16);
- if (!pixmap.isNull()) {
- QPixmap fileIcon = QIcon::fromTheme(QLatin1String("text-x-generic")).pixmap(16);
- if (fileIcon.isNull())
- fileIcon = QIcon::fromTheme(QLatin1String("empty")).pixmap(16);
- if (!fileIcon.isNull()) {
- QPainter painter(&fileIcon);
- painter.drawPixmap(0, 0, 16, 16, pixmap);
- return fileIcon;
- }
- }
- break;
- case SP_DirLinkIcon:
- pixmap = QIcon::fromTheme(QLatin1String("emblem-symbolic-link")).pixmap(16);
- if (!pixmap.isNull()) {
- QPixmap dirIcon = QIcon::fromTheme(QLatin1String("folder")).pixmap(16);
- if (!dirIcon.isNull()) {
- QPainter painter(&dirIcon);
- painter.drawPixmap(0, 0, 16, 16, pixmap);
- return dirIcon;
- }
- }
- break;
- case SP_LineEditClearButton:
- pixmap = clearTextIcon(rtl).pixmap(16);
- break;
- default:
- break;
- }
- }
-
- if (!pixmap.isNull())
- return pixmap;
-#endif // QT_CONFIG(imageformat_png)
- switch (sp) {
-#ifndef QT_NO_IMAGEFORMAT_XPM
- case SP_ToolBarHorizontalExtensionButton:
- if (rtl) {
- QImage im(tb_extension_arrow_h_xpm);
- im = im.convertToFormat(QImage::Format_ARGB32).mirrored(true, false);
- return QPixmap::fromImage(im);
- }
- return cachedPixmapFromXPM(tb_extension_arrow_h_xpm);
- case SP_ToolBarVerticalExtensionButton:
- return cachedPixmapFromXPM(tb_extension_arrow_v_xpm);
- case SP_FileDialogStart:
- return cachedPixmapFromXPM(filedialog_start_xpm);
- case SP_FileDialogEnd:
- return cachedPixmapFromXPM(filedialog_end_xpm);
-#endif
-#ifndef QT_NO_IMAGEFORMAT_PNG
- case SP_CommandLink:
- case SP_ArrowForward:
- if (rtl)
- return proxy()->standardPixmap(SP_ArrowLeft, option);
- return proxy()->standardPixmap(SP_ArrowRight, option);
- case SP_ArrowBack:
- if (rtl)
- return proxy()->standardPixmap(SP_ArrowRight, option);
- return proxy()->standardPixmap(SP_ArrowLeft, option);
- case SP_ArrowLeft:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/left-16.png"));
- case SP_ArrowRight:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/right-16.png"));
- case SP_ArrowUp:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/up-16.png"));
- case SP_ArrowDown:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/down-16.png"));
- case SP_FileDialogToParent:
- return proxy()->standardPixmap(SP_ArrowUp, option);
- case SP_FileDialogNewFolder:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/newdirectory-16.png"));
- case SP_FileDialogDetailedView:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/viewdetailed-16.png"));
- case SP_FileDialogInfoView:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/fileinfo-16.png"));
- case SP_FileDialogContentsView:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/filecontents-16.png"));
- case SP_FileDialogListView:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/viewlist-16.png"));
- case SP_FileDialogBack:
- return proxy()->standardPixmap(SP_ArrowBack, option);
- case SP_DriveHDIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/harddrive-16.png"));
- case SP_TrashIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/trash-16.png"));
- case SP_DriveFDIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/floppy-16.png"));
- case SP_DriveNetIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/networkdrive-16.png"));
- case SP_DesktopIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/desktop-16.png"));
- case SP_ComputerIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/computer-16.png"));
- case SP_DriveCDIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/cdr-16.png"));
- case SP_DriveDVDIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/dvd-16.png"));
- case SP_DirHomeIcon:
- case SP_DirOpenIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/diropen-16.png"));
- case SP_DirIcon:
- case SP_DirClosedIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/dirclosed-16.png"));
- case SP_DirLinkIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/dirlink-16.png"));
- case SP_FileIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/file-16.png"));
- case SP_FileLinkIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/filelink-16.png"));
- case SP_DialogOkButton:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-ok-16.png"));
- case SP_DialogCancelButton:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-cancel-16.png"));
- case SP_DialogHelpButton:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-help-16.png"));
- case SP_DialogOpenButton:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-open-16.png"));
- case SP_DialogSaveButton:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-save-16.png"));
- case SP_DialogCloseButton:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-close-16.png"));
- case SP_DialogApplyButton:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-apply-16.png"));
- case SP_DialogResetButton:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-clear-16.png"));
- case SP_DialogDiscardButton:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-delete-16.png"));
- case SP_DialogYesButton:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-yes-16.png"));
- case SP_DialogNoButton:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-no-16.png"));
- case SP_BrowserReload:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/refresh-24.png"));
- case SP_BrowserStop:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/stop-24.png"));
- case SP_MediaPlay:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-play-32.png"));
- case SP_MediaPause:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-pause-32.png"));
- case SP_MediaStop:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-stop-32.png"));
- case SP_MediaSeekForward:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-seek-forward-32.png"));
- case SP_MediaSeekBackward:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-seek-backward-32.png"));
- case SP_MediaSkipForward:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-skip-forward-32.png"));
- case SP_MediaSkipBackward:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-skip-backward-32.png"));
- case SP_MediaVolume:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-volume-16.png"));
- case SP_MediaVolumeMuted:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-volume-muted-16.png"));
- case SP_LineEditClearButton:
- return QPixmap(clearText16IconPath());
-#endif // QT_NO_IMAGEFORMAT_PNG
- default:
- break;
- }
-
-#ifndef QT_NO_IMAGEFORMAT_XPM
- switch (sp) {
- case SP_TitleBarMenuButton:
- return titleBarMenuCachedPixmapFromXPM();
- case SP_TitleBarShadeButton:
- return cachedPixmapFromXPM(qt_shade_xpm);
- case SP_TitleBarUnshadeButton:
- return cachedPixmapFromXPM(qt_unshade_xpm);
- case SP_TitleBarNormalButton:
- return cachedPixmapFromXPM(qt_normalizeup_xpm);
- case SP_TitleBarMinButton:
- return cachedPixmapFromXPM(qt_minimize_xpm);
- case SP_TitleBarMaxButton:
- return cachedPixmapFromXPM(qt_maximize_xpm);
- case SP_TitleBarCloseButton:
- return cachedPixmapFromXPM(qt_close_xpm);
- case SP_TitleBarContextHelpButton:
- return cachedPixmapFromXPM(qt_help_xpm);
- case SP_DockWidgetCloseButton:
- return cachedPixmapFromXPM(dock_widget_close_xpm);
- case SP_MessageBoxInformation:
- return cachedPixmapFromXPM(information_xpm);
- case SP_MessageBoxWarning:
- return cachedPixmapFromXPM(warning_xpm);
- case SP_MessageBoxCritical:
- return cachedPixmapFromXPM(critical_xpm);
- case SP_MessageBoxQuestion:
- return cachedPixmapFromXPM(question_xpm);
- default:
- break;
- }
-#endif //QT_NO_IMAGEFORMAT_XPM
-
-#if !QT_CONFIG(imageformat_png) && !QT_CONFIG(imageformat_xpm)
- Q_UNUSED(rtl);
-#endif
-
- return QPixmap();
-}
-
-#if QT_CONFIG(imageformat_png)
-static inline QString iconResourcePrefix() { return QStringLiteral(":/qt-project.org/styles/commonstyle/images/"); }
-static inline QString iconPngSuffix() { return QStringLiteral(".png"); }
-
-static void addIconFiles(const QString &prefix, const int sizes[], size_t count, QIcon &icon)
-{
- for (size_t i = 0; i < count; ++i)
- icon.addFile(prefix + QString::number(sizes[i]) + iconPngSuffix());
-}
-
-static const int dockTitleIconSizes[] = {10, 16, 20, 32, 48, 64};
-static const int titleBarSizes[] = {16, 32, 48};
-static const int toolBarExtHSizes[] = {8, 16, 32};
-static const int toolBarExtVSizes[] = {5, 10, 20};
-#endif // imageformat_png
-
-/*!
- \internal
-*/
-QIcon QCommonStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption *option) const
-{
- QIcon icon;
- const bool rtl = (option && option->direction == Qt::RightToLeft) || (!option && QGuiApplication::isRightToLeft());
-
-#ifdef Q_OS_WIN
- switch (standardIcon) {
- case SP_DriveCDIcon:
- case SP_DriveDVDIcon:
- case SP_DriveNetIcon:
- case SP_DriveHDIcon:
- case SP_DriveFDIcon:
- case SP_FileIcon:
- case SP_FileLinkIcon:
- case SP_DesktopIcon:
- case SP_ComputerIcon:
- case SP_VistaShield:
- case SP_MessageBoxInformation:
- case SP_MessageBoxWarning:
- case SP_MessageBoxCritical:
- case SP_MessageBoxQuestion:
- if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) {
- QPlatformTheme::StandardPixmap sp = static_cast<QPlatformTheme::StandardPixmap>(standardIcon);
- for (int size = 16 ; size <= 32 ; size += 16) {
- QPixmap pixmap = theme->standardPixmap(sp, QSizeF(size, size));
- icon.addPixmap(pixmap, QIcon::Normal);
- }
- }
- break;
- case SP_DirIcon:
- case SP_DirLinkIcon:
- if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) {
- QPlatformTheme::StandardPixmap spOff = static_cast<QPlatformTheme::StandardPixmap>(standardIcon);
- QPlatformTheme::StandardPixmap spOn = standardIcon == SP_DirIcon ? QPlatformTheme::DirOpenIcon :
- QPlatformTheme::DirLinkOpenIcon;
- for (int size = 16 ; size <= 32 ; size += 16) {
- QSizeF pixSize(size, size);
- QPixmap pixmap = theme->standardPixmap(spOff, pixSize);
- icon.addPixmap(pixmap, QIcon::Normal, QIcon::Off);
- pixmap = theme->standardPixmap(spOn, pixSize);
- icon.addPixmap(pixmap, QIcon::Normal, QIcon::On);
- }
- }
- break;
- case SP_LineEditClearButton:
- icon = clearTextIcon(rtl);
- break;
- default:
- break;
- }
- if (!icon.isNull())
- return icon;
-
-#endif
-
- if (QGuiApplication::desktopSettingsAware() && !QIcon::themeName().isEmpty()) {
- switch (standardIcon) {
- case SP_DirHomeIcon:
- icon = QIcon::fromTheme(QLatin1String("user-home"));
- break;
- case SP_MessageBoxInformation:
- icon = QIcon::fromTheme(QLatin1String("dialog-information"));
- break;
- case SP_MessageBoxWarning:
- icon = QIcon::fromTheme(QLatin1String("dialog-warning"));
- break;
- case SP_MessageBoxCritical:
- icon = QIcon::fromTheme(QLatin1String("dialog-error"));
- break;
- case SP_MessageBoxQuestion:
- icon = QIcon::fromTheme(QLatin1String("dialog-question"));
- break;
- case SP_DialogOpenButton:
- case SP_DirOpenIcon:
- icon = QIcon::fromTheme(QLatin1String("folder-open"));
- break;
- case SP_DialogSaveButton:
- icon = QIcon::fromTheme(QLatin1String("document-save"));
- break;
- case SP_DialogApplyButton:
- icon = QIcon::fromTheme(QLatin1String("dialog-ok-apply"));
- break;
- case SP_DialogYesButton:
- case SP_DialogOkButton:
- icon = QIcon::fromTheme(QLatin1String("dialog-ok"));
- break;
- case SP_DialogDiscardButton:
- icon = QIcon::fromTheme(QLatin1String("edit-delete"));
- break;
- case SP_DialogResetButton:
- icon = QIcon::fromTheme(QLatin1String("edit-clear"));
- break;
- case SP_DialogHelpButton:
- icon = QIcon::fromTheme(QLatin1String("help-contents"));
- break;
- case SP_FileIcon:
- icon = QIcon::fromTheme(QLatin1String("text-x-generic"));
- break;
- case SP_DirClosedIcon:
- case SP_DirIcon:
- icon = QIcon::fromTheme(QLatin1String("folder"));
- break;
- case SP_DriveFDIcon:
- icon = QIcon::fromTheme(QLatin1String("floppy_unmount"));
- break;
- case SP_ComputerIcon:
- icon = QIcon::fromTheme(QLatin1String("computer"),
- QIcon::fromTheme(QLatin1String("system")));
- break;
- case SP_DesktopIcon:
- icon = QIcon::fromTheme(QLatin1String("user-desktop"));
- break;
- case SP_TrashIcon:
- icon = QIcon::fromTheme(QLatin1String("user-trash"));
- break;
- case SP_DriveCDIcon:
- case SP_DriveDVDIcon:
- icon = QIcon::fromTheme(QLatin1String("media-optical"));
- break;
- case SP_DriveHDIcon:
- icon = QIcon::fromTheme(QLatin1String("drive-harddisk"));
- break;
- case SP_FileDialogToParent:
- icon = QIcon::fromTheme(QLatin1String("go-up"));
- break;
- case SP_FileDialogNewFolder:
- icon = QIcon::fromTheme(QLatin1String("folder-new"));
- break;
- case SP_ArrowUp:
- icon = QIcon::fromTheme(QLatin1String("go-up"));
- break;
- case SP_ArrowDown:
- icon = QIcon::fromTheme(QLatin1String("go-down"));
- break;
- case SP_ArrowRight:
- icon = QIcon::fromTheme(QLatin1String("go-next"));
- break;
- case SP_ArrowLeft:
- icon = QIcon::fromTheme(QLatin1String("go-previous"));
- break;
- case SP_DialogNoButton:
- case SP_DialogCancelButton:
- icon = QIcon::fromTheme(QLatin1String("dialog-cancel"),
- QIcon::fromTheme(QLatin1String("process-stop")));
- break;
- case SP_DialogCloseButton:
- icon = QIcon::fromTheme(QLatin1String("window-close"));
- break;
- case SP_FileDialogDetailedView:
- icon = QIcon::fromTheme(QLatin1String("view-list-details"));
- break;
- case SP_FileDialogListView:
- icon = QIcon::fromTheme(QLatin1String("view-list-icons"));
- break;
- case SP_BrowserReload:
- icon = QIcon::fromTheme(QLatin1String("view-refresh"));
- break;
- case SP_BrowserStop:
- icon = QIcon::fromTheme(QLatin1String("process-stop"));
- break;
- case SP_MediaPlay:
- icon = QIcon::fromTheme(QLatin1String("media-playback-start"));
- break;
- case SP_MediaPause:
- icon = QIcon::fromTheme(QLatin1String("media-playback-pause"));
- break;
- case SP_MediaStop:
- icon = QIcon::fromTheme(QLatin1String("media-playback-stop"));
- break;
- case SP_MediaSeekForward:
- icon = QIcon::fromTheme(QLatin1String("media-seek-forward"));
- break;
- case SP_MediaSeekBackward:
- icon = QIcon::fromTheme(QLatin1String("media-seek-backward"));
- break;
- case SP_MediaSkipForward:
- icon = QIcon::fromTheme(QLatin1String("media-skip-forward"));
- break;
- case SP_MediaSkipBackward:
- icon = QIcon::fromTheme(QLatin1String("media-skip-backward"));
- break;
- case SP_MediaVolume:
- icon = QIcon::fromTheme(QLatin1String("audio-volume-medium"));
- break;
- case SP_MediaVolumeMuted:
- icon = QIcon::fromTheme(QLatin1String("audio-volume-muted"));
- break;
- case SP_ArrowForward:
- if (rtl)
- return QCommonStyle::standardIcon(SP_ArrowLeft, option);
- return QCommonStyle::standardIcon(SP_ArrowRight, option);
- case SP_ArrowBack:
- if (rtl)
- return QCommonStyle::standardIcon(SP_ArrowRight, option);
- return QCommonStyle::standardIcon(SP_ArrowLeft, option);
- case SP_FileLinkIcon:
- {
- QIcon linkIcon = QIcon::fromTheme(QLatin1String("emblem-symbolic-link"));
- if (!linkIcon.isNull()) {
- QIcon baseIcon = QCommonStyle::standardIcon(SP_FileIcon, option);
- const QList<QSize> sizes = baseIcon.availableSizes(QIcon::Normal, QIcon::Off);
- const qreal devicePixelRatio = option ? dpr(option->window) : 1.;
- for (int i = 0 ; i < sizes.size() ; ++i) {
- int size = sizes[i].width();
- QPixmap basePixmap = baseIcon.pixmap(QSize(size, size), devicePixelRatio);
- QPixmap linkPixmap = linkIcon.pixmap(QSize(size / 2, size / 2), devicePixelRatio);
- QPainter painter(&basePixmap);
- painter.drawPixmap(size/2, size/2, linkPixmap);
- icon.addPixmap(basePixmap);
- }
- }
- }
- break;
- case SP_DirLinkIcon:
- {
- QIcon linkIcon = QIcon::fromTheme(QLatin1String("emblem-symbolic-link"));
- if (!linkIcon.isNull()) {
- QIcon baseIcon = QCommonStyle::standardIcon(SP_DirIcon, option);
- const QList<QSize> sizes = baseIcon.availableSizes(QIcon::Normal, QIcon::Off);
- const qreal devicePixelRatio = option ? dpr(option->window) : 1.;
- for (int i = 0 ; i < sizes.size() ; ++i) {
- int size = sizes[i].width();
- QPixmap basePixmap = baseIcon.pixmap(QSize(size, size), devicePixelRatio);
- QPixmap linkPixmap = linkIcon.pixmap(QSize(size / 2, size / 2), devicePixelRatio);
- QPainter painter(&basePixmap);
- painter.drawPixmap(size/2, size/2, linkPixmap);
- icon.addPixmap(basePixmap);
- }
- }
- }
- break;
- default:
- break;
- }
- } // if (QGuiApplication::desktopSettingsAware() && !QIcon::themeName().isEmpty())
-
- if (!icon.isNull())
- return icon;
-
-#if defined(Q_OS_MAC)
- if (QGuiApplication::desktopSettingsAware()) {
- switch (standardIcon) {
- case SP_DirIcon: {
- // A rather special case
- QIcon closeIcon = QCommonStyle::standardIcon(SP_DirClosedIcon, option);
- QIcon openIcon = QCommonStyle::standardIcon(SP_DirOpenIcon, option);
- closeIcon.addPixmap(openIcon.pixmap(16, 16), QIcon::Normal, QIcon::On);
- closeIcon.addPixmap(openIcon.pixmap(32, 32), QIcon::Normal, QIcon::On);
- closeIcon.addPixmap(openIcon.pixmap(64, 64), QIcon::Normal, QIcon::On);
- closeIcon.addPixmap(openIcon.pixmap(128, 128), QIcon::Normal, QIcon::On);
- return closeIcon;
- }
-
- case SP_TitleBarNormalButton:
- case SP_TitleBarCloseButton: {
- QIcon titleBarIcon;
- if (standardIcon == SP_TitleBarCloseButton) {
- titleBarIcon.addFile(QLatin1String(":/qt-project.org/styles/macstyle/images/closedock-16.png"));
- titleBarIcon.addFile(QLatin1String(":/qt-project.org/styles/macstyle/images/closedock-down-16.png"), QSize(16, 16), QIcon::Normal, QIcon::On);
- } else {
- titleBarIcon.addFile(QLatin1String(":/qt-project.org/styles/macstyle/images/dockdock-16.png"));
- titleBarIcon.addFile(QLatin1String(":/qt-project.org/styles/macstyle/images/dockdock-down-16.png"), QSize(16, 16), QIcon::Normal, QIcon::On);
- }
- return titleBarIcon;
- }
-
- case SP_MessageBoxQuestion:
- case SP_MessageBoxInformation:
- case SP_MessageBoxWarning:
- case SP_MessageBoxCritical:
- case SP_DesktopIcon:
- case SP_TrashIcon:
- case SP_ComputerIcon:
- case SP_DriveFDIcon:
- case SP_DriveHDIcon:
- case SP_DriveCDIcon:
- case SP_DriveDVDIcon:
- case SP_DriveNetIcon:
- case SP_DirOpenIcon:
- case SP_DirClosedIcon:
- case SP_DirLinkIcon:
- case SP_FileLinkIcon:
- case SP_FileIcon:
- if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) {
- QPlatformTheme::StandardPixmap sp = static_cast<QPlatformTheme::StandardPixmap>(standardIcon);
- QIcon retIcon;
- const QList<QSize> sizes = theme->themeHint(QPlatformTheme::IconPixmapSizes).value<QList<QSize> >();
- for (const QSize &size : sizes) {
- QPixmap mainIcon;
- const QString cacheKey = QLatin1String("qt_mac_constructQIconFromIconRef") + QString::number(standardIcon) + QString::number(size.width());
- if (standardIcon >= QStyle::SP_CustomBase) {
- mainIcon = theme->standardPixmap(sp, QSizeF(size));
- } else if (QPixmapCache::find(cacheKey, &mainIcon) == false) {
- mainIcon = theme->standardPixmap(sp, QSizeF(size));
- QPixmapCache::insert(cacheKey, mainIcon);
- }
-
- retIcon.addPixmap(mainIcon);
- }
- if (!retIcon.isNull())
- return retIcon;
- }
-
- default:
- break;
- }
- } // if (QGuiApplication::desktopSettingsAware())
-#endif // Q_OS_MAC
-
- switch (standardIcon) {
-#ifndef QT_NO_IMAGEFORMAT_PNG
- case SP_TitleBarMinButton:
- addIconFiles(iconResourcePrefix() + QStringLiteral("titlebar-min-"),
- titleBarSizes, sizeof(titleBarSizes)/sizeof(titleBarSizes[0]), icon);
- break;
- case SP_TitleBarMaxButton:
- addIconFiles(iconResourcePrefix() + QStringLiteral("titlebar-max-"),
- titleBarSizes, sizeof(titleBarSizes)/sizeof(titleBarSizes[0]), icon);
- break;
- case SP_TitleBarShadeButton:
- addIconFiles(iconResourcePrefix() + QStringLiteral("titlebar-shade-"),
- titleBarSizes, sizeof(titleBarSizes)/sizeof(titleBarSizes[0]), icon);
-
- break;
- case SP_TitleBarUnshadeButton:
- addIconFiles(iconResourcePrefix() + QStringLiteral("titlebar-unshade-"),
- titleBarSizes, sizeof(titleBarSizes)/sizeof(titleBarSizes[0]), icon);
- break;
- case SP_TitleBarContextHelpButton:
- addIconFiles(iconResourcePrefix() + QStringLiteral("titlebar-contexthelp-"),
- titleBarSizes, sizeof(titleBarSizes)/sizeof(titleBarSizes[0]), icon);
- break;
- case SP_FileDialogNewFolder:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/newdirectory-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/newdirectory-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/newdirectory-128.png"), QSize(128, 128));
- break;
- case SP_FileDialogBack:
- return QCommonStyle::standardIcon(SP_ArrowBack, option);
- case SP_FileDialogToParent:
- return QCommonStyle::standardIcon(SP_ArrowUp, option);
- case SP_FileDialogDetailedView:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/viewdetailed-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/viewdetailed-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/viewdetailed-128.png"), QSize(128, 128));
- break;
- case SP_FileDialogInfoView:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/fileinfo-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/fileinfo-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/fileinfo-128.png"), QSize(128, 128));
- break;
- case SP_FileDialogContentsView:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/filecontents-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/filecontents-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/filecontents-128.png"), QSize(128, 128));
- break;
- case SP_FileDialogListView:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/viewlist-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/viewlist-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/viewlist-128.png"), QSize(128, 128));
- break;
- case SP_DialogOkButton:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-ok-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-ok-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-ok-128.png"), QSize(128, 128));
- break;
- case SP_DialogCancelButton:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-cancel-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-cancel-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-cancel-128.png"), QSize(128, 128));
- break;
- case SP_DialogHelpButton:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-help-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-help-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-help-128.png"), QSize(128, 128));
- break;
- case SP_DialogOpenButton:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-open-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-open-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-open-128.png"), QSize(128, 128));
- break;
- case SP_DialogSaveButton:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-save-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-save-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-save-128.png"), QSize(128, 128));
- break;
- case SP_DialogCloseButton:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-close-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-close-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-close-128.png"), QSize(128, 128));
- break;
- case SP_DialogApplyButton:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-apply-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-apply-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-apply-128.png"), QSize(128, 128));
- break;
- case SP_DialogResetButton:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-clear-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-clear-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-clear-128.png"), QSize(128, 128));
- break;
- case SP_DialogDiscardButton:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-delete-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-delete-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-delete-128.png"), QSize(128, 128));
- break;
- case SP_DialogYesButton:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-yes-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-yes-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-yes-128.png"), QSize(128, 128));
- break;
- case SP_DialogNoButton:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-no-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-no-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-no-128.png"), QSize(128, 128));
- break;
- case SP_ArrowForward:
- if (rtl)
- return QCommonStyle::standardIcon(SP_ArrowLeft, option);
- return QCommonStyle::standardIcon(SP_ArrowRight, option);
- case SP_ArrowBack:
- if (rtl)
- return QCommonStyle::standardIcon(SP_ArrowRight, option);
- return QCommonStyle::standardIcon(SP_ArrowLeft, option);
- case SP_ArrowLeft:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/left-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/left-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/left-128.png"), QSize(128, 128));
- break;
- case SP_ArrowRight:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/right-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/right-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/right-128.png"), QSize(128, 128));
- break;
- case SP_ArrowUp:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/up-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/up-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/up-128.png"), QSize(128, 128));
- break;
- case SP_ArrowDown:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/down-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/down-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/down-128.png"), QSize(128, 128));
- break;
- case SP_DirHomeIcon:
- case SP_DirIcon:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/dirclosed-16.png"),
- QSize(), QIcon::Normal, QIcon::Off);
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/diropen-16.png"),
- QSize(), QIcon::Normal, QIcon::On);
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/dirclosed-32.png"),
- QSize(32, 32), QIcon::Normal, QIcon::Off);
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/diropen-32.png"),
- QSize(32, 32), QIcon::Normal, QIcon::On);
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/dirclosed-128.png"),
- QSize(128, 128), QIcon::Normal, QIcon::Off);
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/diropen-128.png"),
- QSize(128, 128), QIcon::Normal, QIcon::On);
- break;
- case SP_DriveCDIcon:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/cdr-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/cdr-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/cdr-128.png"), QSize(128, 128));
- break;
- case SP_DriveDVDIcon:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/dvd-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/dvd-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/dvd-128.png"), QSize(128, 128));
- break;
- case SP_FileIcon:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/file-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/file-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/file-128.png"), QSize(128, 128));
- break;
- case SP_FileLinkIcon:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/filelink-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/filelink-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/filelink-128.png"), QSize(128, 128));
- break;
- case SP_TrashIcon:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/trash-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/trash-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/trash-128.png"), QSize(128, 128));
- break;
- case SP_BrowserReload:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/refresh-24.png"), QSize(24, 24));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/refresh-32.png"), QSize(32, 32));
- break;
- case SP_BrowserStop:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/stop-24.png"), QSize(24, 24));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/stop-32.png"), QSize(32, 32));
- break;
- case SP_MediaPlay:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-play-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-play-32.png"), QSize(32, 32));
- break;
- case SP_MediaPause:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-pause-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-pause-32.png"), QSize(32, 32));
- break;
- case SP_MediaStop:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-stop-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-stop-32.png"), QSize(32, 32));
- break;
- case SP_MediaSeekForward:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-seek-forward-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-seek-forward-32.png"), QSize(32, 32));
- break;
- case SP_MediaSeekBackward:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-seek-backward-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-seek-backward-32.png"), QSize(32, 32));
- break;
- case SP_MediaSkipForward:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-skip-forward-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-skip-forward-32.png"), QSize(32, 32));
- break;
- case SP_MediaSkipBackward:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-skip-backward-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-skip-backward-32.png"), QSize(32, 32));
- break;
- case SP_MediaVolume:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-volume-16.png"), QSize(16, 16));
- break;
- case SP_MediaVolumeMuted:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-volume-muted-16.png"), QSize(16, 16));
- break;
- case SP_TitleBarCloseButton:
- addIconFiles(iconResourcePrefix() + QStringLiteral("closedock-"),
- dockTitleIconSizes, sizeof(dockTitleIconSizes)/sizeof(dockTitleIconSizes[0]), icon);
- break;
- case SP_TitleBarMenuButton:
-# ifndef QT_NO_IMAGEFORMAT_XPM
- icon.addPixmap(titleBarMenuCachedPixmapFromXPM());
-# endif
- icon.addFile(QLatin1String(":/qt-project.org/qmessagebox/images/qtlogo-64.png"));
- break;
- case SP_TitleBarNormalButton:
- addIconFiles(iconResourcePrefix() + QStringLiteral("normalizedockup-"),
- dockTitleIconSizes, sizeof(dockTitleIconSizes)/sizeof(dockTitleIconSizes[0]), icon);
- break;
- case SP_ToolBarHorizontalExtensionButton: {
- QString prefix = iconResourcePrefix() + QStringLiteral("toolbar-ext-h-");
- if (rtl)
- prefix += QStringLiteral("rtl-");
- addIconFiles(prefix, toolBarExtHSizes, sizeof(toolBarExtHSizes)/sizeof(toolBarExtHSizes[0]), icon);
- }
- break;
- case SP_ToolBarVerticalExtensionButton:
- addIconFiles(iconResourcePrefix() + QStringLiteral("toolbar-ext-v-"),
- toolBarExtVSizes, sizeof(toolBarExtVSizes)/sizeof(toolBarExtVSizes[0]), icon);
- break;
-#endif // QT_NO_IMAGEFORMAT_PNG
- default:
- icon.addPixmap(proxy()->standardPixmap(standardIcon, option));
- break;
- }
- return icon;
-}
-
-static inline uint qt_intensity(uint r, uint g, uint b)
-{
- // 30% red, 59% green, 11% blue
- return (77 * r + 150 * g + 28 * b) / 255;
-}
-
-/*! \reimp */
-QPixmap QCommonStyle::generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap,
- const QStyleOption *opt) const
-{
- switch (iconMode) {
- case QIcon::Disabled: {
- QImage im = pixmap.toImage().convertToFormat(QImage::Format_ARGB32);
-
- // Create a colortable based on the background (black -> bg -> white)
- QColor bg = opt->palette.color(QPalette::Disabled, QPalette::Window);
- int red = bg.red();
- int green = bg.green();
- int blue = bg.blue();
- uchar reds[256], greens[256], blues[256];
- for (int i=0; i<128; ++i) {
- reds[i] = uchar((red * (i<<1)) >> 8);
- greens[i] = uchar((green * (i<<1)) >> 8);
- blues[i] = uchar((blue * (i<<1)) >> 8);
- }
- for (int i=0; i<128; ++i) {
- reds[i+128] = uchar(qMin(red + (i << 1), 255));
- greens[i+128] = uchar(qMin(green + (i << 1), 255));
- blues[i+128] = uchar(qMin(blue + (i << 1), 255));
- }
-
- int intensity = qt_intensity(red, green, blue);
- const int factor = 191;
-
- // High intensity colors needs dark shifting in the color table, while
- // low intensity colors needs light shifting. This is to increase the
- // perceived contrast.
- if ((red - factor > green && red - factor > blue)
- || (green - factor > red && green - factor > blue)
- || (blue - factor > red && blue - factor > green))
- intensity = qMin(255, intensity + 91);
- else if (intensity <= 128)
- intensity -= 51;
-
- for (int y=0; y<im.height(); ++y) {
- QRgb *scanLine = (QRgb*)im.scanLine(y);
- for (int x=0; x<im.width(); ++x) {
- QRgb pixel = *scanLine;
- // Calculate color table index, taking intensity adjustment
- // and a magic offset into account.
- uint ci = uint(qGray(pixel)/3 + (130 - intensity / 3));
- *scanLine = qRgba(reds[ci], greens[ci], blues[ci], qAlpha(pixel));
- ++scanLine;
- }
- }
-
- return QPixmap::fromImage(im);
- }
- case QIcon::Selected: {
- QImage img = pixmap.toImage().convertToFormat(QImage::Format_ARGB32_Premultiplied);
- QColor color = opt->palette.color(QPalette::Normal, QPalette::Highlight);
- color.setAlphaF(0.3f);
- QPainter painter(&img);
- painter.setCompositionMode(QPainter::CompositionMode_SourceAtop);
- painter.fillRect(0, 0, img.width(), img.height(), color);
- painter.end();
- return QPixmap::fromImage(img); }
- case QIcon::Active:
- return pixmap;
- default:
- break;
- }
- return pixmap;
-}
-
-} // namespace QQC2
-
-QT_END_NAMESPACE
-
-#include "moc_qquickcommonstyle.cpp"