2012-10-02 09:12:39 +02:00
|
|
|
/****************************************************************************
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
2014-01-07 13:27:11 +01:00
|
|
|
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
|
2012-10-02 09:12:39 +02:00
|
|
|
** Contact: http://www.qt-project.org/legal
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
** This file is part of Qt Creator.
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
** Commercial License Usage
|
|
|
|
|
** Licensees holding valid commercial Qt licenses may use this file in
|
|
|
|
|
** accordance with the commercial license agreement provided with the
|
|
|
|
|
** Software or, alternatively, in accordance with the terms contained in
|
|
|
|
|
** a written agreement between you and Digia. For licensing terms and
|
|
|
|
|
** conditions see http://qt.digia.com/licensing. For further information
|
|
|
|
|
** use the contact form at http://qt.digia.com/contact-us.
|
2008-12-02 14:17:16 +01:00
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** GNU Lesser General Public License Usage
|
2012-10-02 09:12:39 +02:00
|
|
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
|
|
|
** General Public License version 2.1 as published by the Free Software
|
|
|
|
|
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
|
|
|
** packaging of this file. Please review the following information to
|
|
|
|
|
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
|
|
|
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
2008-12-02 14:17:16 +01:00
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
** In addition, as a special exception, Digia gives you certain additional
|
|
|
|
|
** rights. These rights are described in the Digia Qt LGPL Exception
|
2010-12-17 16:01:08 +01:00
|
|
|
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
****************************************************************************/
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
#include "manhattanstyle.h"
|
2008-12-02 14:09:21 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
#include "styleanimator.h"
|
2008-12-09 15:25:01 +01:00
|
|
|
|
2010-07-30 22:16:59 +02:00
|
|
|
#include <coreplugin/coreconstants.h>
|
|
|
|
|
|
2013-03-14 10:44:46 +01:00
|
|
|
#include <utils/hostosinfo.h>
|
2009-07-15 12:38:45 +02:00
|
|
|
#include <utils/stylehelper.h>
|
|
|
|
|
|
2010-03-22 13:20:31 +01:00
|
|
|
#include <utils/fancymainwindow.h>
|
|
|
|
|
|
2012-02-15 10:42:41 +01:00
|
|
|
#include <QApplication>
|
|
|
|
|
#include <QComboBox>
|
|
|
|
|
#include <QDockWidget>
|
|
|
|
|
#include <QLabel>
|
|
|
|
|
#include <QLineEdit>
|
2012-10-19 13:13:57 +02:00
|
|
|
#include <QMenuBar>
|
2012-02-15 10:42:41 +01:00
|
|
|
#include <QPainter>
|
|
|
|
|
#include <QPixmap>
|
|
|
|
|
#include <QStatusBar>
|
|
|
|
|
#include <QStyleFactory>
|
|
|
|
|
#include <QStyleOption>
|
|
|
|
|
#include <QToolBar>
|
|
|
|
|
#include <QToolButton>
|
2008-12-09 15:25:01 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
// We define a currently unused state for indicating animations
|
2012-05-21 09:19:16 +02:00
|
|
|
const QStyle::State State_Animating = QStyle::State(0x00000040);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
// Because designer needs to disable this for widget previews
|
|
|
|
|
// we have a custom property that is inherited
|
|
|
|
|
bool styleEnabled(const QWidget *widget)
|
|
|
|
|
{
|
|
|
|
|
const QWidget *p = widget;
|
|
|
|
|
while (p) {
|
|
|
|
|
if (p->property("_q_custom_style_disabled").toBool())
|
|
|
|
|
return false;
|
2014-05-19 18:29:38 +03:00
|
|
|
p = p->parentWidget();
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Consider making this a QStyle state
|
|
|
|
|
bool panelWidget(const QWidget *widget)
|
|
|
|
|
{
|
2009-12-11 12:41:13 +01:00
|
|
|
if (!widget)
|
|
|
|
|
return false;
|
|
|
|
|
|
2010-01-11 10:22:55 +01:00
|
|
|
// Do not style dialogs or explicitly ignored widgets
|
2010-04-29 19:11:07 +02:00
|
|
|
if ((widget->window()->windowFlags() & Qt::WindowType_Mask) == Qt::Dialog)
|
2009-12-11 12:41:13 +01:00
|
|
|
return false;
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2010-03-22 13:20:31 +01:00
|
|
|
if (qobject_cast<const Utils::FancyMainWindow *>(widget))
|
|
|
|
|
return true;
|
|
|
|
|
|
2010-03-23 13:51:32 +01:00
|
|
|
if (qobject_cast<const QTabBar *>(widget))
|
|
|
|
|
return styleEnabled(widget);
|
|
|
|
|
|
2009-12-11 12:41:13 +01:00
|
|
|
const QWidget *p = widget;
|
2008-12-02 12:01:29 +01:00
|
|
|
while (p) {
|
2009-12-11 17:16:17 +01:00
|
|
|
if (qobject_cast<const QToolBar *>(p) ||
|
|
|
|
|
qobject_cast<const QStatusBar *>(p) ||
|
2012-10-19 13:13:57 +02:00
|
|
|
qobject_cast<const QMenuBar *>(p) ||
|
2010-03-16 16:55:56 +01:00
|
|
|
p->property("panelwidget").toBool())
|
2009-12-11 17:16:17 +01:00
|
|
|
return styleEnabled(widget);
|
2008-12-02 12:01:29 +01:00
|
|
|
p = p->parentWidget();
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2010-02-19 09:54:29 +01:00
|
|
|
// Consider making this a QStyle state
|
|
|
|
|
bool lightColored(const QWidget *widget)
|
|
|
|
|
{
|
|
|
|
|
if (!widget)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
// Don't style dialogs or explicitly ignored widgets
|
2010-04-29 19:11:07 +02:00
|
|
|
if ((widget->window()->windowFlags() & Qt::WindowType_Mask) == Qt::Dialog)
|
2010-02-19 09:54:29 +01:00
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
const QWidget *p = widget;
|
|
|
|
|
while (p) {
|
|
|
|
|
if (p->property("lightColored").toBool())
|
|
|
|
|
return true;
|
|
|
|
|
p = p->parentWidget();
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
class ManhattanStylePrivate
|
|
|
|
|
{
|
|
|
|
|
public:
|
2010-02-23 12:42:04 +01:00
|
|
|
explicit ManhattanStylePrivate();
|
2008-12-02 12:01:29 +01:00
|
|
|
void init();
|
2008-12-09 15:25:01 +01:00
|
|
|
|
|
|
|
|
public:
|
2010-02-10 10:47:34 +01:00
|
|
|
const QImage lineeditImage;
|
|
|
|
|
const QImage lineeditImage_disabled;
|
|
|
|
|
const QPixmap extButtonPixmap;
|
|
|
|
|
const QPixmap closeButtonPixmap;
|
2008-12-02 12:01:29 +01:00
|
|
|
StyleAnimator animator;
|
|
|
|
|
};
|
|
|
|
|
|
2010-02-23 12:42:04 +01:00
|
|
|
ManhattanStylePrivate::ManhattanStylePrivate() :
|
2010-02-10 10:47:34 +01:00
|
|
|
lineeditImage(QLatin1String(":/core/images/inputfield.png")),
|
|
|
|
|
lineeditImage_disabled(QLatin1String(":/core/images/inputfield_disabled.png")),
|
|
|
|
|
extButtonPixmap(QLatin1String(":/core/images/extension.png")),
|
2010-07-30 22:16:59 +02:00
|
|
|
closeButtonPixmap(QLatin1String(Core::Constants::ICON_CLOSE))
|
2010-02-10 10:47:34 +01:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
ManhattanStyle::ManhattanStyle(const QString &baseStyleName)
|
2010-02-23 12:42:04 +01:00
|
|
|
: QProxyStyle(QStyleFactory::create(baseStyleName)),
|
|
|
|
|
d(new ManhattanStylePrivate())
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ManhattanStyle::~ManhattanStyle()
|
|
|
|
|
{
|
|
|
|
|
delete d;
|
|
|
|
|
d = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QPixmap ManhattanStyle::generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap, const QStyleOption *opt) const
|
|
|
|
|
{
|
2010-02-23 12:42:04 +01:00
|
|
|
return QProxyStyle::generatedIconPixmap(iconMode, pixmap, opt);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QSize ManhattanStyle::sizeFromContents(ContentsType type, const QStyleOption *option,
|
|
|
|
|
const QSize &size, const QWidget *widget) const
|
|
|
|
|
{
|
2010-02-23 12:42:04 +01:00
|
|
|
QSize newSize = QProxyStyle::sizeFromContents(type, option, size, widget);
|
2009-01-26 18:10:53 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
if (type == CT_Splitter && widget && widget->property("minisplitter").toBool())
|
|
|
|
|
return QSize(1, 1);
|
2009-01-26 18:10:53 +01:00
|
|
|
else if (type == CT_ComboBox && panelWidget(widget))
|
2009-02-23 16:25:53 +01:00
|
|
|
newSize += QSize(14, 0);
|
2009-01-26 18:10:53 +01:00
|
|
|
return newSize;
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QRect ManhattanStyle::subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget) const
|
|
|
|
|
{
|
2010-02-23 12:42:04 +01:00
|
|
|
return QProxyStyle::subElementRect(element, option, widget);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QRect ManhattanStyle::subControlRect(ComplexControl control, const QStyleOptionComplex *option,
|
|
|
|
|
SubControl subControl, const QWidget *widget) const
|
|
|
|
|
{
|
2010-02-23 12:42:04 +01:00
|
|
|
return QProxyStyle::subControlRect(control, option, subControl, widget);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QStyle::SubControl ManhattanStyle::hitTestComplexControl(ComplexControl control, const QStyleOptionComplex *option,
|
|
|
|
|
const QPoint &pos, const QWidget *widget) const
|
|
|
|
|
{
|
2010-02-23 12:42:04 +01:00
|
|
|
return QProxyStyle::hitTestComplexControl(control, option, pos, widget);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int ManhattanStyle::pixelMetric(PixelMetric metric, const QStyleOption *option, const QWidget *widget) const
|
|
|
|
|
{
|
|
|
|
|
int retval = 0;
|
2010-02-23 12:42:04 +01:00
|
|
|
retval = QProxyStyle::pixelMetric(metric, option, widget);
|
2008-12-02 12:01:29 +01:00
|
|
|
switch (metric) {
|
|
|
|
|
case PM_SplitterWidth:
|
|
|
|
|
if (widget && widget->property("minisplitter").toBool())
|
|
|
|
|
retval = 1;
|
|
|
|
|
break;
|
|
|
|
|
case PM_ToolBarIconSize:
|
|
|
|
|
if (panelWidget(widget))
|
|
|
|
|
retval = 16;
|
|
|
|
|
break;
|
2010-03-18 17:46:30 +01:00
|
|
|
case PM_DockWidgetHandleExtent:
|
2010-03-16 16:55:56 +01:00
|
|
|
case PM_DockWidgetSeparatorExtent:
|
|
|
|
|
return 1;
|
2012-10-19 13:13:57 +02:00
|
|
|
case PM_MenuPanelWidth:
|
|
|
|
|
case PM_MenuBarHMargin:
|
|
|
|
|
case PM_MenuBarVMargin:
|
2008-12-02 12:01:29 +01:00
|
|
|
case PM_ToolBarFrameWidth:
|
|
|
|
|
if (panelWidget(widget))
|
|
|
|
|
retval = 1;
|
|
|
|
|
break;
|
|
|
|
|
case PM_ButtonShiftVertical:
|
|
|
|
|
case PM_ButtonShiftHorizontal:
|
2012-10-19 13:13:57 +02:00
|
|
|
case PM_MenuBarPanelWidth:
|
2008-12-02 12:01:29 +01:00
|
|
|
case PM_ToolBarItemMargin:
|
|
|
|
|
case PM_ToolBarItemSpacing:
|
|
|
|
|
if (panelWidget(widget))
|
|
|
|
|
retval = 0;
|
|
|
|
|
break;
|
|
|
|
|
case PM_DefaultFrameWidth:
|
|
|
|
|
if (qobject_cast<const QLineEdit*>(widget) && panelWidget(widget))
|
|
|
|
|
return 1;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return retval;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QPalette ManhattanStyle::standardPalette() const
|
|
|
|
|
{
|
2010-02-23 12:42:04 +01:00
|
|
|
return QProxyStyle::standardPalette();
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ManhattanStyle::polish(QApplication *app)
|
|
|
|
|
{
|
2010-02-23 12:42:04 +01:00
|
|
|
return QProxyStyle::polish(app);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ManhattanStyle::unpolish(QApplication *app)
|
|
|
|
|
{
|
2010-02-23 12:42:04 +01:00
|
|
|
return QProxyStyle::unpolish(app);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
2010-02-19 09:54:29 +01:00
|
|
|
QPalette panelPalette(const QPalette &oldPalette, bool lightColored = false)
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
2010-02-19 09:54:29 +01:00
|
|
|
QColor color = Utils::StyleHelper::panelTextColor(lightColored);
|
2008-12-02 12:01:29 +01:00
|
|
|
QPalette pal = oldPalette;
|
|
|
|
|
pal.setBrush(QPalette::All, QPalette::WindowText, color);
|
|
|
|
|
pal.setBrush(QPalette::All, QPalette::ButtonText, color);
|
|
|
|
|
pal.setBrush(QPalette::All, QPalette::Foreground, color);
|
|
|
|
|
color.setAlpha(100);
|
|
|
|
|
pal.setBrush(QPalette::Disabled, QPalette::WindowText, color);
|
|
|
|
|
pal.setBrush(QPalette::Disabled, QPalette::ButtonText, color);
|
|
|
|
|
pal.setBrush(QPalette::Disabled, QPalette::Foreground, color);
|
|
|
|
|
return pal;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ManhattanStyle::polish(QWidget *widget)
|
|
|
|
|
{
|
2010-02-23 12:42:04 +01:00
|
|
|
QProxyStyle::polish(widget);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2010-03-18 17:46:30 +01:00
|
|
|
// OxygenStyle forces a rounded widget mask on toolbars and dock widgets
|
2011-10-14 13:02:37 +02:00
|
|
|
if (baseStyle()->inherits("OxygenStyle") || baseStyle()->inherits("Oxygen::Style")) {
|
2010-03-18 17:46:30 +01:00
|
|
|
if (qobject_cast<QToolBar*>(widget) || qobject_cast<QDockWidget*>(widget)) {
|
2010-02-23 12:42:04 +01:00
|
|
|
widget->removeEventFilter(baseStyle());
|
2010-03-18 17:46:30 +01:00
|
|
|
widget->setContentsMargins(0, 0, 0, 0);
|
|
|
|
|
}
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
if (panelWidget(widget)) {
|
2010-03-23 13:51:32 +01:00
|
|
|
|
|
|
|
|
// Oxygen and possibly other styles override this
|
|
|
|
|
if (qobject_cast<QDockWidget*>(widget))
|
|
|
|
|
widget->setContentsMargins(0, 0, 0, 0);
|
|
|
|
|
|
2009-07-15 16:23:07 +02:00
|
|
|
widget->setAttribute(Qt::WA_LayoutUsesWidgetRect, true);
|
2008-12-02 12:01:29 +01:00
|
|
|
if (qobject_cast<QToolButton*>(widget)) {
|
|
|
|
|
widget->setAttribute(Qt::WA_Hover);
|
2009-10-05 11:06:05 +02:00
|
|
|
widget->setMaximumHeight(Utils::StyleHelper::navigationWidgetHeight() - 2);
|
2013-07-17 00:01:45 +03:00
|
|
|
} else if (qobject_cast<QLineEdit*>(widget)) {
|
2008-12-02 12:01:29 +01:00
|
|
|
widget->setAttribute(Qt::WA_Hover);
|
2009-10-05 11:06:05 +02:00
|
|
|
widget->setMaximumHeight(Utils::StyleHelper::navigationWidgetHeight() - 2);
|
2013-07-17 00:01:45 +03:00
|
|
|
} else if (qobject_cast<QLabel*>(widget)) {
|
2008-12-02 12:01:29 +01:00
|
|
|
widget->setPalette(panelPalette(widget->palette()));
|
2013-07-17 00:01:45 +03:00
|
|
|
} else if (widget->property("panelwidget_singlerow").toBool()) {
|
2009-10-05 11:06:05 +02:00
|
|
|
widget->setFixedHeight(Utils::StyleHelper::navigationWidgetHeight());
|
2013-07-17 00:01:45 +03:00
|
|
|
} else if (qobject_cast<QStatusBar*>(widget)) {
|
2009-10-05 11:06:05 +02:00
|
|
|
widget->setFixedHeight(Utils::StyleHelper::navigationWidgetHeight() + 2);
|
2013-07-17 00:01:45 +03:00
|
|
|
} else if (qobject_cast<QComboBox*>(widget)) {
|
2009-10-05 11:06:05 +02:00
|
|
|
widget->setMaximumHeight(Utils::StyleHelper::navigationWidgetHeight() - 2);
|
2009-02-10 15:09:24 +01:00
|
|
|
widget->setAttribute(Qt::WA_Hover);
|
|
|
|
|
}
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ManhattanStyle::unpolish(QWidget *widget)
|
|
|
|
|
{
|
2010-02-23 12:42:04 +01:00
|
|
|
QProxyStyle::unpolish(widget);
|
2008-12-02 12:01:29 +01:00
|
|
|
if (panelWidget(widget)) {
|
2009-07-15 16:23:07 +02:00
|
|
|
widget->setAttribute(Qt::WA_LayoutUsesWidgetRect, false);
|
2008-12-02 12:01:29 +01:00
|
|
|
if (qobject_cast<QTabBar*>(widget))
|
|
|
|
|
widget->setAttribute(Qt::WA_Hover, false);
|
|
|
|
|
else if (qobject_cast<QToolBar*>(widget))
|
|
|
|
|
widget->setAttribute(Qt::WA_Hover, false);
|
2009-02-10 15:09:24 +01:00
|
|
|
else if (qobject_cast<QComboBox*>(widget))
|
|
|
|
|
widget->setAttribute(Qt::WA_Hover, false);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ManhattanStyle::polish(QPalette &pal)
|
|
|
|
|
{
|
2010-02-23 12:42:04 +01:00
|
|
|
QProxyStyle::polish(pal);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
2010-02-23 12:42:04 +01:00
|
|
|
QIcon ManhattanStyle::standardIconImplementation(StandardPixmap standardIcon, const QStyleOption *option, const QWidget *widget) const
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
|
|
|
|
QIcon icon;
|
|
|
|
|
switch (standardIcon) {
|
|
|
|
|
case QStyle::SP_TitleBarCloseButton:
|
2009-01-26 15:46:11 +01:00
|
|
|
case QStyle::SP_ToolBarHorizontalExtensionButton:
|
|
|
|
|
return QIcon(standardPixmap(standardIcon, option, widget));
|
2008-12-02 12:01:29 +01:00
|
|
|
default:
|
2010-02-23 12:42:04 +01:00
|
|
|
icon = baseStyle()->standardIcon(standardIcon, option, widget);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
return icon;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QPixmap ManhattanStyle::standardPixmap(StandardPixmap standardPixmap, const QStyleOption *opt,
|
|
|
|
|
const QWidget *widget) const
|
|
|
|
|
{
|
2009-01-26 15:46:11 +01:00
|
|
|
if (widget && !panelWidget(widget))
|
2010-02-23 12:42:04 +01:00
|
|
|
return QProxyStyle::standardPixmap(standardPixmap, opt, widget);
|
2009-01-26 15:46:11 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
QPixmap pixmap;
|
|
|
|
|
switch (standardPixmap) {
|
2010-02-10 10:47:34 +01:00
|
|
|
case QStyle::SP_ToolBarHorizontalExtensionButton:
|
|
|
|
|
pixmap = d->extButtonPixmap;
|
2009-01-26 15:46:11 +01:00
|
|
|
break;
|
2010-02-10 10:47:34 +01:00
|
|
|
case QStyle::SP_TitleBarCloseButton:
|
|
|
|
|
pixmap = d->closeButtonPixmap;
|
2008-12-02 12:01:29 +01:00
|
|
|
break;
|
|
|
|
|
default:
|
2010-02-23 12:42:04 +01:00
|
|
|
pixmap = QProxyStyle::standardPixmap(standardPixmap, opt, widget);
|
2010-02-10 10:47:34 +01:00
|
|
|
break;
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
return pixmap;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int ManhattanStyle::styleHint(StyleHint hint, const QStyleOption *option, const QWidget *widget,
|
|
|
|
|
QStyleHintReturn *returnData) const
|
|
|
|
|
{
|
2010-02-23 12:42:04 +01:00
|
|
|
int ret = QProxyStyle::styleHint(hint, option, widget, returnData);
|
2008-12-02 12:01:29 +01:00
|
|
|
switch (hint) {
|
2009-01-27 10:09:37 +01:00
|
|
|
// Make project explorer alternate rows all the way
|
|
|
|
|
case QStyle::SH_ItemView_PaintAlternatingRowColorsForEmptyArea:
|
|
|
|
|
if (widget && widget->property("AlternateEmpty").toBool())
|
|
|
|
|
ret = true;
|
|
|
|
|
break;
|
2008-12-02 12:01:29 +01:00
|
|
|
case QStyle::SH_EtchDisabledText:
|
2009-01-27 10:09:37 +01:00
|
|
|
if (panelWidget(widget))
|
|
|
|
|
ret = false;
|
2008-12-02 12:01:29 +01:00
|
|
|
break;
|
2010-02-02 14:29:07 +01:00
|
|
|
case QStyle::SH_ItemView_ArrowKeysNavigateIntoChildren:
|
|
|
|
|
ret = true;
|
|
|
|
|
break;
|
2014-04-07 17:40:43 +02:00
|
|
|
case QStyle::SH_ItemView_ActivateItemOnSingleClick:
|
|
|
|
|
// default depends on the style
|
|
|
|
|
if (widget) {
|
|
|
|
|
QVariant activationMode = widget->property("ActivationMode");
|
|
|
|
|
if (activationMode.isValid())
|
|
|
|
|
ret = activationMode.toBool();
|
|
|
|
|
}
|
2008-12-02 12:01:29 +01:00
|
|
|
default:
|
2009-01-27 10:09:37 +01:00
|
|
|
break;
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ManhattanStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option,
|
|
|
|
|
QPainter *painter, const QWidget *widget) const
|
|
|
|
|
{
|
|
|
|
|
if (!panelWidget(widget))
|
2010-02-23 12:42:04 +01:00
|
|
|
return QProxyStyle::drawPrimitive(element, option, painter, widget);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
bool animating = (option->state & State_Animating);
|
|
|
|
|
int state = option->state;
|
|
|
|
|
QRect rect = option->rect;
|
|
|
|
|
QRect oldRect;
|
|
|
|
|
QRect newRect;
|
|
|
|
|
if (widget && (element == PE_PanelButtonTool) && !animating) {
|
|
|
|
|
QWidget *w = const_cast<QWidget *> (widget);
|
|
|
|
|
int oldState = w->property("_q_stylestate").toInt();
|
|
|
|
|
oldRect = w->property("_q_stylerect").toRect();
|
|
|
|
|
newRect = w->rect();
|
|
|
|
|
w->setProperty("_q_stylestate", (int)option->state);
|
|
|
|
|
w->setProperty("_q_stylerect", w->rect());
|
|
|
|
|
|
|
|
|
|
// Determine the animated transition
|
|
|
|
|
bool doTransition = ((state & State_On) != (oldState & State_On) ||
|
|
|
|
|
(state & State_MouseOver) != (oldState & State_MouseOver));
|
|
|
|
|
if (oldRect != newRect)
|
|
|
|
|
{
|
|
|
|
|
doTransition = false;
|
|
|
|
|
d->animator.stopAnimation(widget);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (doTransition) {
|
|
|
|
|
QImage startImage(option->rect.size(), QImage::Format_ARGB32_Premultiplied);
|
|
|
|
|
QImage endImage(option->rect.size(), QImage::Format_ARGB32_Premultiplied);
|
|
|
|
|
Animation *anim = d->animator.widgetAnimation(widget);
|
|
|
|
|
QStyleOption opt = *option;
|
|
|
|
|
opt.state = (QStyle::State)oldState;
|
2012-05-21 09:19:16 +02:00
|
|
|
opt.state |= State_Animating;
|
2008-12-02 12:01:29 +01:00
|
|
|
startImage.fill(0);
|
|
|
|
|
Transition *t = new Transition;
|
|
|
|
|
t->setWidget(w);
|
|
|
|
|
QPainter startPainter(&startImage);
|
|
|
|
|
if (!anim) {
|
|
|
|
|
drawPrimitive(element, &opt, &startPainter, widget);
|
|
|
|
|
} else {
|
|
|
|
|
anim->paint(&startPainter, &opt);
|
|
|
|
|
d->animator.stopAnimation(widget);
|
|
|
|
|
}
|
|
|
|
|
QStyleOption endOpt = *option;
|
2012-05-21 09:19:16 +02:00
|
|
|
endOpt.state |= State_Animating;
|
2008-12-02 12:01:29 +01:00
|
|
|
t->setStartImage(startImage);
|
|
|
|
|
d->animator.startAnimation(t);
|
|
|
|
|
endImage.fill(0);
|
|
|
|
|
QPainter endPainter(&endImage);
|
|
|
|
|
drawPrimitive(element, &endOpt, &endPainter, widget);
|
|
|
|
|
t->setEndImage(endImage);
|
2009-07-20 18:56:50 +02:00
|
|
|
if (oldState & State_MouseOver)
|
|
|
|
|
t->setDuration(150);
|
|
|
|
|
else
|
|
|
|
|
t->setDuration(75);
|
2008-12-02 12:01:29 +01:00
|
|
|
t->setStartTime(QTime::currentTime());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch (element) {
|
2010-03-18 17:46:30 +01:00
|
|
|
case PE_IndicatorDockWidgetResizeHandle:
|
|
|
|
|
painter->fillRect(option->rect, Utils::StyleHelper::borderColor());
|
|
|
|
|
break;
|
|
|
|
|
case PE_FrameDockWidget:
|
|
|
|
|
QCommonStyle::drawPrimitive(element, option, painter, widget);
|
|
|
|
|
break;
|
2008-12-02 12:01:29 +01:00
|
|
|
case PE_PanelLineEdit:
|
|
|
|
|
{
|
|
|
|
|
painter->save();
|
2009-08-31 15:02:16 +02:00
|
|
|
|
|
|
|
|
// Fill the line edit background
|
|
|
|
|
QRect filledRect = option->rect.adjusted(1, 1, -1, -1);
|
|
|
|
|
painter->setBrushOrigin(filledRect.topLeft());
|
|
|
|
|
painter->fillRect(filledRect, option->palette.base());
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
if (option->state & State_Enabled)
|
2010-02-24 19:23:40 +01:00
|
|
|
Utils::StyleHelper::drawCornerImage(d->lineeditImage, painter, option->rect, 5, 5, 5, 5);
|
2008-12-02 12:01:29 +01:00
|
|
|
else
|
2010-02-24 19:23:40 +01:00
|
|
|
Utils::StyleHelper::drawCornerImage(d->lineeditImage_disabled, painter, option->rect, 5, 5, 5, 5);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
if (option->state & State_HasFocus || option->state & State_MouseOver) {
|
2009-10-05 11:06:05 +02:00
|
|
|
QColor hover = Utils::StyleHelper::baseColor();
|
2008-12-02 12:01:29 +01:00
|
|
|
if (state & State_HasFocus)
|
|
|
|
|
hover.setAlpha(100);
|
|
|
|
|
else
|
|
|
|
|
hover.setAlpha(50);
|
|
|
|
|
|
|
|
|
|
painter->setPen(QPen(hover, 1));
|
|
|
|
|
painter->drawRect(option->rect.adjusted(1, 1, -2 ,-2));
|
|
|
|
|
}
|
|
|
|
|
painter->restore();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case PE_FrameStatusBarItem:
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case PE_PanelButtonTool: {
|
|
|
|
|
Animation *anim = d->animator.widgetAnimation(widget);
|
|
|
|
|
if (!animating && anim) {
|
|
|
|
|
anim->paint(painter, option);
|
|
|
|
|
} else {
|
|
|
|
|
bool pressed = option->state & State_Sunken || option->state & State_On;
|
|
|
|
|
QColor shadow(0, 0, 0, 30);
|
|
|
|
|
painter->setPen(shadow);
|
|
|
|
|
if (pressed) {
|
2009-02-23 17:11:41 +01:00
|
|
|
QColor shade(0, 0, 0, 40);
|
|
|
|
|
painter->fillRect(rect, shade);
|
|
|
|
|
painter->drawLine(rect.topLeft() + QPoint(1, 0), rect.topRight() - QPoint(1, 0));
|
2008-12-02 12:01:29 +01:00
|
|
|
painter->drawLine(rect.topLeft(), rect.bottomLeft());
|
2009-02-23 17:11:41 +01:00
|
|
|
painter->drawLine(rect.topRight(), rect.bottomRight());
|
|
|
|
|
// painter->drawLine(rect.bottomLeft() + QPoint(1, 0), rect.bottomRight() - QPoint(1, 0));
|
2008-12-02 12:01:29 +01:00
|
|
|
QColor highlight(255, 255, 255, 30);
|
|
|
|
|
painter->setPen(highlight);
|
2013-10-17 14:52:26 +02:00
|
|
|
} else if (option->state & State_Enabled && option->state & State_MouseOver) {
|
2009-02-23 16:25:53 +01:00
|
|
|
QColor lighter(255, 255, 255, 37);
|
2008-12-02 12:01:29 +01:00
|
|
|
painter->fillRect(rect, lighter);
|
2013-10-17 14:52:26 +02:00
|
|
|
} else if (widget && widget->property("highlightWidget").toBool()) {
|
|
|
|
|
QColor shade(0, 0, 0, 128);
|
|
|
|
|
painter->fillRect(rect, shade);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
2010-03-01 14:51:48 +01:00
|
|
|
if (option->state & State_HasFocus && (option->state & State_KeyboardFocusChange)) {
|
|
|
|
|
QColor highlight = option->palette.highlight().color();
|
|
|
|
|
highlight.setAlphaF(0.4);
|
|
|
|
|
painter->setPen(QPen(highlight.lighter(), 1));
|
|
|
|
|
highlight.setAlphaF(0.3);
|
|
|
|
|
painter->setBrush(highlight);
|
|
|
|
|
painter->setRenderHint(QPainter::Antialiasing);
|
|
|
|
|
QRectF rect = option->rect;
|
|
|
|
|
rect.translate(0.5, 0.5);
|
|
|
|
|
painter->drawRoundedRect(rect.adjusted(2, 2, -3, -3), 2, 2);
|
|
|
|
|
}
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case PE_PanelStatusBar:
|
|
|
|
|
{
|
|
|
|
|
painter->save();
|
2013-03-22 14:06:42 +01:00
|
|
|
QLinearGradient grad = Utils::StyleHelper::statusBarGradient(rect);
|
|
|
|
|
painter->fillRect(rect, grad);
|
2008-12-02 12:01:29 +01:00
|
|
|
painter->setPen(QColor(255, 255, 255, 60));
|
|
|
|
|
painter->drawLine(rect.topLeft() + QPoint(0,1),
|
|
|
|
|
rect.topRight()+ QPoint(0,1));
|
2009-10-05 11:06:05 +02:00
|
|
|
painter->setPen(Utils::StyleHelper::borderColor().darker(110));
|
2008-12-02 12:01:29 +01:00
|
|
|
painter->drawLine(rect.topLeft(), rect.topRight());
|
|
|
|
|
painter->restore();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case PE_IndicatorToolBarSeparator:
|
|
|
|
|
{
|
2009-10-05 11:06:05 +02:00
|
|
|
QColor separatorColor = Utils::StyleHelper::borderColor();
|
2008-12-02 12:01:29 +01:00
|
|
|
separatorColor.setAlpha(100);
|
|
|
|
|
painter->setPen(separatorColor);
|
|
|
|
|
const int margin = 6;
|
|
|
|
|
if (option->state & State_Horizontal) {
|
|
|
|
|
const int offset = rect.width()/2;
|
|
|
|
|
painter->drawLine(rect.bottomLeft().x() + offset,
|
|
|
|
|
rect.bottomLeft().y() - margin,
|
|
|
|
|
rect.topLeft().x() + offset,
|
|
|
|
|
rect.topLeft().y() + margin);
|
|
|
|
|
} else { //Draw vertical separator
|
|
|
|
|
const int offset = rect.height()/2;
|
|
|
|
|
painter->setPen(QPen(option->palette.background().color().darker(110)));
|
|
|
|
|
painter->drawLine(rect.topLeft().x() + margin ,
|
|
|
|
|
rect.topLeft().y() + offset,
|
|
|
|
|
rect.topRight().x() - margin,
|
|
|
|
|
rect.topRight().y() + offset);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case PE_IndicatorToolBarHandle:
|
|
|
|
|
{
|
|
|
|
|
bool horizontal = option->state & State_Horizontal;
|
|
|
|
|
painter->save();
|
|
|
|
|
QPainterPath path;
|
2011-06-04 20:47:29 +02:00
|
|
|
int x = option->rect.x() + (horizontal ? 2 : 6);
|
|
|
|
|
int y = option->rect.y() + (horizontal ? 6 : 2);
|
2008-12-02 12:01:29 +01:00
|
|
|
static const int RectHeight = 2;
|
|
|
|
|
if (horizontal) {
|
|
|
|
|
while (y < option->rect.height() - RectHeight - 6) {
|
|
|
|
|
path.moveTo(x, y);
|
|
|
|
|
path.addRect(x, y, RectHeight, RectHeight);
|
|
|
|
|
y += 6;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
while (x < option->rect.width() - RectHeight - 6) {
|
|
|
|
|
path.moveTo(x, y);
|
|
|
|
|
path.addRect(x, y, RectHeight, RectHeight);
|
|
|
|
|
x += 6;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
painter->setPen(Qt::NoPen);
|
2009-10-05 11:06:05 +02:00
|
|
|
QColor dark = Utils::StyleHelper::borderColor();
|
2008-12-02 12:01:29 +01:00
|
|
|
dark.setAlphaF(0.4);
|
|
|
|
|
|
2009-10-05 11:06:05 +02:00
|
|
|
QColor light = Utils::StyleHelper::baseColor();
|
2008-12-02 12:01:29 +01:00
|
|
|
light.setAlphaF(0.4);
|
|
|
|
|
|
|
|
|
|
painter->fillPath(path, light);
|
|
|
|
|
painter->save();
|
|
|
|
|
painter->translate(1, 1);
|
|
|
|
|
painter->fillPath(path, dark);
|
|
|
|
|
painter->restore();
|
|
|
|
|
painter->translate(3, 3);
|
|
|
|
|
painter->fillPath(path, light);
|
|
|
|
|
painter->translate(1, 1);
|
|
|
|
|
painter->fillPath(path, dark);
|
|
|
|
|
painter->restore();
|
|
|
|
|
}
|
|
|
|
|
break;
|
2009-01-26 15:46:11 +01:00
|
|
|
case PE_IndicatorArrowUp:
|
|
|
|
|
case PE_IndicatorArrowDown:
|
|
|
|
|
case PE_IndicatorArrowRight:
|
|
|
|
|
case PE_IndicatorArrowLeft:
|
|
|
|
|
{
|
2010-02-17 17:09:00 +01:00
|
|
|
Utils::StyleHelper::drawArrow(element, painter, option);
|
2009-01-26 15:46:11 +01:00
|
|
|
}
|
|
|
|
|
break;
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
default:
|
2010-02-23 12:42:04 +01:00
|
|
|
QProxyStyle::drawPrimitive(element, option, painter, widget);
|
2008-12-02 12:01:29 +01:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ManhattanStyle::drawControl(ControlElement element, const QStyleOption *option,
|
|
|
|
|
QPainter *painter, const QWidget *widget) const
|
|
|
|
|
{
|
|
|
|
|
if (!panelWidget(widget))
|
2010-02-23 12:42:04 +01:00
|
|
|
return QProxyStyle::drawControl(element, option, painter, widget);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
switch (element) {
|
2010-03-16 16:55:56 +01:00
|
|
|
case CE_Splitter:
|
|
|
|
|
painter->fillRect(option->rect, Utils::StyleHelper::borderColor());
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case CE_TabBarTabShape:
|
|
|
|
|
// Most styles draw a single dark outline. This looks rather ugly when combined with our
|
|
|
|
|
// single pixel dark separator so we adjust the first tab to compensate for this
|
|
|
|
|
|
|
|
|
|
if (const QStyleOptionTabV3 *tab = qstyleoption_cast<const QStyleOptionTabV3 *>(option)) {
|
|
|
|
|
QStyleOptionTabV3 adjustedTab = *tab;
|
2010-03-29 11:35:44 +02:00
|
|
|
if (tab->cornerWidgets == QStyleOptionTab::NoCornerWidgets && (
|
|
|
|
|
tab->position == QStyleOptionTab::Beginning ||
|
|
|
|
|
tab->position == QStyleOptionTab::OnlyOneTab))
|
|
|
|
|
{
|
2010-03-16 16:55:56 +01:00
|
|
|
if (option->direction == Qt::LeftToRight)
|
|
|
|
|
adjustedTab.rect = adjustedTab.rect.adjusted(-1, 0, 0, 0);
|
|
|
|
|
else
|
|
|
|
|
adjustedTab.rect = adjustedTab.rect.adjusted(0, 0, 1 ,0);
|
|
|
|
|
}
|
|
|
|
|
QProxyStyle::drawControl(element, &adjustedTab, painter, widget);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
2012-10-19 13:13:57 +02:00
|
|
|
case CE_MenuBarItem:
|
|
|
|
|
painter->save();
|
|
|
|
|
if (const QStyleOptionMenuItem *mbi = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) {
|
|
|
|
|
QColor highlightOutline = Utils::StyleHelper::borderColor().lighter(120);
|
2012-10-23 09:40:21 +02:00
|
|
|
bool act = mbi->state & State_Sunken;
|
2012-10-19 13:13:57 +02:00
|
|
|
bool dis = !(mbi->state & State_Enabled);
|
|
|
|
|
Utils::StyleHelper::menuGradient(painter, option->rect, option->rect);
|
|
|
|
|
QStyleOptionMenuItem item = *mbi;
|
|
|
|
|
item.rect = mbi->rect;
|
|
|
|
|
QPalette pal = mbi->palette;
|
|
|
|
|
pal.setBrush(QPalette::ButtonText, dis ? Qt::gray : Qt::black);
|
|
|
|
|
item.palette = pal;
|
|
|
|
|
QCommonStyle::drawControl(element, &item, painter, widget);
|
|
|
|
|
QRect r = option->rect;
|
|
|
|
|
|
|
|
|
|
if (act) {
|
|
|
|
|
// Fill|
|
|
|
|
|
QColor baseColor = Utils::StyleHelper::baseColor();
|
|
|
|
|
QLinearGradient grad(option->rect.topLeft(), option->rect.bottomLeft());
|
|
|
|
|
grad.setColorAt(0, baseColor.lighter(120));
|
|
|
|
|
grad.setColorAt(1, baseColor.lighter(130));
|
|
|
|
|
painter->fillRect(option->rect.adjusted(1, 1, -1, 0), grad);
|
|
|
|
|
|
|
|
|
|
// Outline
|
|
|
|
|
painter->setPen(QPen(highlightOutline, 0));
|
|
|
|
|
painter->drawLine(QPoint(r.left(), r.top() + 1), QPoint(r.left(), r.bottom()));
|
|
|
|
|
painter->drawLine(QPoint(r.right(), r.top() + 1), QPoint(r.right(), r.bottom()));
|
|
|
|
|
painter->drawLine(QPoint(r.left() + 1, r.top()), QPoint(r.right() - 1, r.top()));
|
|
|
|
|
highlightOutline.setAlpha(60);
|
|
|
|
|
painter->setPen(QPen(highlightOutline, 0));
|
|
|
|
|
painter->drawPoint(r.topLeft());
|
|
|
|
|
painter->drawPoint(r.topRight());
|
|
|
|
|
|
|
|
|
|
QPalette pal = mbi->palette;
|
|
|
|
|
uint alignment = Qt::AlignCenter | Qt::TextShowMnemonic | Qt::TextDontClip | Qt::TextSingleLine;
|
|
|
|
|
if (!styleHint(SH_UnderlineShortcut, mbi, widget))
|
|
|
|
|
alignment |= Qt::TextHideMnemonic;
|
|
|
|
|
pal.setBrush(QPalette::Text, dis ? Qt::gray : QColor(0, 0, 0, 60));
|
|
|
|
|
drawItemText(painter, item.rect.translated(0, 1), alignment, pal, mbi->state & State_Enabled, mbi->text, QPalette::Text);
|
|
|
|
|
pal.setBrush(QPalette::Text, dis ? Qt::gray : Qt::white);
|
|
|
|
|
drawItemText(painter, item.rect, alignment, pal, mbi->state & State_Enabled, mbi->text, QPalette::Text);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
painter->restore();
|
|
|
|
|
break;
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
case CE_ComboBoxLabel:
|
|
|
|
|
if (const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
|
|
|
|
|
if (panelWidget(widget)) {
|
2010-03-09 11:14:19 +01:00
|
|
|
painter->save();
|
2008-12-02 12:01:29 +01:00
|
|
|
QRect editRect = subControlRect(CC_ComboBox, cb, SC_ComboBoxEditField, widget);
|
|
|
|
|
QPalette customPal = cb->palette;
|
2011-12-09 16:45:49 +01:00
|
|
|
bool drawIcon = !(widget && widget->property("hideicon").toBool());
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2011-12-09 16:45:49 +01:00
|
|
|
if (!cb->currentIcon.isNull() && drawIcon) {
|
2008-12-02 12:01:29 +01:00
|
|
|
QIcon::Mode mode = cb->state & State_Enabled ? QIcon::Normal
|
|
|
|
|
: QIcon::Disabled;
|
|
|
|
|
QPixmap pixmap = cb->currentIcon.pixmap(cb->iconSize, mode);
|
|
|
|
|
QRect iconRect(editRect);
|
|
|
|
|
iconRect.setWidth(cb->iconSize.width() + 4);
|
|
|
|
|
iconRect = alignedRect(cb->direction,
|
|
|
|
|
Qt::AlignLeft | Qt::AlignVCenter,
|
|
|
|
|
iconRect.size(), editRect);
|
|
|
|
|
if (cb->editable)
|
|
|
|
|
painter->fillRect(iconRect, customPal.brush(QPalette::Base));
|
|
|
|
|
drawItemPixmap(painter, iconRect, Qt::AlignCenter, pixmap);
|
|
|
|
|
|
|
|
|
|
if (cb->direction == Qt::RightToLeft)
|
|
|
|
|
editRect.translate(-4 - cb->iconSize.width(), 0);
|
|
|
|
|
else
|
|
|
|
|
editRect.translate(cb->iconSize.width() + 4, 0);
|
2009-02-23 16:25:53 +01:00
|
|
|
|
|
|
|
|
// Reserve some space for the down-arrow
|
|
|
|
|
editRect.adjust(0, 0, -13, 0);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
2012-10-11 11:18:26 +04:00
|
|
|
QLatin1Char asterisk('*');
|
|
|
|
|
int elideWidth = editRect.width();
|
|
|
|
|
|
|
|
|
|
bool notElideAsterisk = widget && widget->property("notelideasterisk").toBool()
|
|
|
|
|
&& cb->currentText.endsWith(asterisk)
|
|
|
|
|
&& option->fontMetrics.width(cb->currentText) > elideWidth;
|
|
|
|
|
|
|
|
|
|
QString text;
|
|
|
|
|
if (notElideAsterisk) {
|
|
|
|
|
elideWidth -= option->fontMetrics.width(asterisk);
|
|
|
|
|
text = asterisk;
|
|
|
|
|
}
|
|
|
|
|
text.prepend(option->fontMetrics.elidedText(cb->currentText, Qt::ElideRight, elideWidth));
|
|
|
|
|
|
2010-03-12 13:16:18 +01:00
|
|
|
if ((option->state & State_Enabled)) {
|
|
|
|
|
painter->setPen(QColor(0, 0, 0, 70));
|
2010-04-28 12:32:20 +02:00
|
|
|
painter->drawText(editRect.adjusted(1, 0, -1, 0), Qt::AlignLeft | Qt::AlignVCenter, text);
|
2010-03-12 13:16:18 +01:00
|
|
|
} else {
|
2010-03-09 11:14:19 +01:00
|
|
|
painter->setOpacity(0.8);
|
2010-03-12 13:16:18 +01:00
|
|
|
}
|
|
|
|
|
painter->setPen(Utils::StyleHelper::panelTextColor());
|
2010-04-28 12:32:20 +02:00
|
|
|
painter->drawText(editRect.adjusted(1, 0, -1, 0), Qt::AlignLeft | Qt::AlignVCenter, text);
|
2010-03-09 11:14:19 +01:00
|
|
|
|
|
|
|
|
painter->restore();
|
2008-12-02 12:01:29 +01:00
|
|
|
} else {
|
2010-02-23 12:42:04 +01:00
|
|
|
QProxyStyle::drawControl(element, option, painter, widget);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case CE_SizeGrip: {
|
|
|
|
|
painter->save();
|
|
|
|
|
QColor dark = Qt::white;
|
|
|
|
|
dark.setAlphaF(0.1);
|
|
|
|
|
int x, y, w, h;
|
|
|
|
|
option->rect.getRect(&x, &y, &w, &h);
|
|
|
|
|
int sw = qMin(h, w);
|
|
|
|
|
if (h > w)
|
|
|
|
|
painter->translate(0, h - w);
|
|
|
|
|
else
|
|
|
|
|
painter->translate(w - h, 0);
|
|
|
|
|
int sx = x;
|
|
|
|
|
int sy = y;
|
|
|
|
|
int s = 4;
|
|
|
|
|
painter->setPen(dark);
|
|
|
|
|
if (option->direction == Qt::RightToLeft) {
|
|
|
|
|
sx = x + sw;
|
|
|
|
|
for (int i = 0; i < 4; ++i) {
|
|
|
|
|
painter->drawLine(x, sy, sx, sw);
|
|
|
|
|
sx -= s;
|
|
|
|
|
sy += s;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
for (int i = 0; i < 4; ++i) {
|
|
|
|
|
painter->drawLine(sx, sw, sw, sy);
|
|
|
|
|
sx += s;
|
|
|
|
|
sy += s;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
painter->restore();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
2012-10-19 13:13:57 +02:00
|
|
|
case CE_MenuBarEmptyArea: {
|
|
|
|
|
Utils::StyleHelper::menuGradient(painter, option->rect, option->rect);
|
|
|
|
|
painter->save();
|
|
|
|
|
painter->setPen(Utils::StyleHelper::borderColor());
|
|
|
|
|
painter->drawLine(option->rect.bottomLeft(), option->rect.bottomRight());
|
|
|
|
|
painter->restore();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
case CE_ToolBar:
|
|
|
|
|
{
|
|
|
|
|
QRect rect = option->rect;
|
2010-02-19 09:54:29 +01:00
|
|
|
bool horizontal = option->state & State_Horizontal;
|
2010-03-19 17:47:45 +01:00
|
|
|
|
|
|
|
|
// Map offset for global window gradient
|
|
|
|
|
QRect gradientSpan;
|
2014-05-06 00:04:22 +03:00
|
|
|
if (widget) {
|
|
|
|
|
QPoint offset = widget->window()->mapToGlobal(option->rect.topLeft()) -
|
|
|
|
|
widget->mapToGlobal(option->rect.topLeft());
|
2010-03-19 17:47:45 +01:00
|
|
|
gradientSpan = QRect(offset, widget->window()->size());
|
2014-05-06 00:04:22 +03:00
|
|
|
}
|
2010-03-19 17:47:45 +01:00
|
|
|
|
|
|
|
|
bool drawLightColored = lightColored(widget);
|
|
|
|
|
if (horizontal)
|
|
|
|
|
Utils::StyleHelper::horizontalGradient(painter, gradientSpan, rect, drawLightColored);
|
|
|
|
|
else
|
|
|
|
|
Utils::StyleHelper::verticalGradient(painter, gradientSpan, rect, drawLightColored);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2010-04-28 16:09:48 +02:00
|
|
|
if (!drawLightColored)
|
|
|
|
|
painter->setPen(Utils::StyleHelper::borderColor());
|
|
|
|
|
else
|
|
|
|
|
painter->setPen(QColor(0x888888));
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
if (horizontal) {
|
2009-02-04 12:46:38 +01:00
|
|
|
// Note: This is a hack to determine if the
|
|
|
|
|
// toolbar should draw the top or bottom outline
|
|
|
|
|
// (needed for the find toolbar for instance)
|
2010-02-18 11:41:58 +01:00
|
|
|
QColor lighter(Utils::StyleHelper::sidebarHighlight());
|
2010-04-28 16:09:48 +02:00
|
|
|
if (drawLightColored)
|
|
|
|
|
lighter = QColor(255, 255, 255, 180);
|
2009-02-04 12:46:38 +01:00
|
|
|
if (widget && widget->property("topBorder").toBool()) {
|
2010-02-19 09:54:29 +01:00
|
|
|
painter->drawLine(rect.topLeft(), rect.topRight());
|
|
|
|
|
painter->setPen(lighter);
|
|
|
|
|
painter->drawLine(rect.topLeft() + QPoint(0, 1), rect.topRight() + QPoint(0, 1));
|
2008-12-02 12:01:29 +01:00
|
|
|
} else {
|
2010-02-19 09:54:29 +01:00
|
|
|
painter->drawLine(rect.bottomLeft(), rect.bottomRight());
|
|
|
|
|
painter->setPen(lighter);
|
|
|
|
|
painter->drawLine(rect.topLeft(), rect.topRight());
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
} else {
|
2010-02-19 09:54:29 +01:00
|
|
|
painter->drawLine(rect.topLeft(), rect.bottomLeft());
|
|
|
|
|
painter->drawLine(rect.topRight(), rect.bottomRight());
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
2010-04-28 16:09:48 +02:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
default:
|
2010-02-23 12:42:04 +01:00
|
|
|
QProxyStyle::drawControl(element, option, painter, widget);
|
2008-12-02 12:01:29 +01:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ManhattanStyle::drawComplexControl(ComplexControl control, const QStyleOptionComplex *option,
|
|
|
|
|
QPainter *painter, const QWidget *widget) const
|
|
|
|
|
{
|
|
|
|
|
if (!panelWidget(widget))
|
2010-02-23 12:42:04 +01:00
|
|
|
return QProxyStyle::drawComplexControl(control, option, painter, widget);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
QRect rect = option->rect;
|
|
|
|
|
switch (control) {
|
|
|
|
|
case CC_ToolButton:
|
|
|
|
|
if (const QStyleOptionToolButton *toolbutton = qstyleoption_cast<const QStyleOptionToolButton *>(option)) {
|
2011-12-05 13:28:56 +01:00
|
|
|
bool reverse = option->direction == Qt::RightToLeft;
|
|
|
|
|
bool drawborder = (widget && widget->property("showborder").toBool());
|
|
|
|
|
|
|
|
|
|
if (drawborder)
|
|
|
|
|
drawButtonSeparator(painter, rect, reverse);
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
QRect button, menuarea;
|
|
|
|
|
button = subControlRect(control, toolbutton, SC_ToolButton, widget);
|
|
|
|
|
menuarea = subControlRect(control, toolbutton, SC_ToolButtonMenu, widget);
|
|
|
|
|
|
|
|
|
|
State bflags = toolbutton->state;
|
|
|
|
|
if (bflags & State_AutoRaise) {
|
Remove braces for single lines of conditions
#!/usr/bin/env ruby
Dir.glob('**/*.cpp') { |file|
# skip ast (excluding paste, astpath, and canv'ast'imer)
next if file =~ /ast[^eip]|keywords\.|qualifiers|preprocessor|names.cpp/i
s = File.read(file)
next if s.include?('qlalr')
orig = s.dup
s.gsub!(/\n *if [^\n]*{\n[^\n]*\n\s+}(\s+else if [^\n]* {\n[^\n]*\n\s+})*(\s+else {\n[^\n]*\n\s+})?\n/m) { |m|
res = $&
if res =~ /^\s*(\/\/|[A-Z_]{3,})/ # C++ comment or macro (Q_UNUSED, SDEBUG), do not touch braces
res
else
res.gsub!('} else', 'else')
res.gsub!(/\n +} *\n/m, "\n")
res.gsub(/ *{$/, '')
end
}
s.gsub!(/ *$/, '')
File.open(file, 'wb').write(s) if s != orig
}
Change-Id: I3b30ee60df0986f66c02132c65fc38a3fbb6bbdc
Reviewed-by: hjk <qthjk@ovi.com>
2013-01-08 03:32:53 +02:00
|
|
|
if (!(bflags & State_MouseOver))
|
2008-12-02 12:01:29 +01:00
|
|
|
bflags &= ~State_Raised;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
State mflags = bflags;
|
2009-01-05 10:42:42 +01:00
|
|
|
if (toolbutton->state & State_Sunken) {
|
|
|
|
|
if (toolbutton->activeSubControls & SC_ToolButton)
|
|
|
|
|
bflags |= State_Sunken;
|
|
|
|
|
if (toolbutton->activeSubControls & SC_ToolButtonMenu)
|
|
|
|
|
mflags |= State_Sunken;
|
|
|
|
|
}
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
QStyleOption tool(0);
|
|
|
|
|
tool.palette = toolbutton->palette;
|
|
|
|
|
if (toolbutton->subControls & SC_ToolButton) {
|
2009-07-17 13:13:12 +02:00
|
|
|
tool.rect = button;
|
|
|
|
|
tool.state = bflags;
|
|
|
|
|
drawPrimitive(PE_PanelButtonTool, &tool, painter, widget);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QStyleOptionToolButton label = *toolbutton;
|
2010-02-19 09:54:29 +01:00
|
|
|
|
|
|
|
|
label.palette = panelPalette(option->palette, lightColored(widget));
|
2013-10-17 14:52:26 +02:00
|
|
|
if (widget && widget->property("highlightWidget").toBool())
|
|
|
|
|
label.palette.setColor(QPalette::ButtonText, Qt::red);
|
2008-12-02 12:01:29 +01:00
|
|
|
int fw = pixelMetric(PM_DefaultFrameWidth, option, widget);
|
|
|
|
|
label.rect = button.adjusted(fw, fw, -fw, -fw);
|
2010-02-19 09:54:29 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
drawControl(CE_ToolButtonLabel, &label, painter, widget);
|
|
|
|
|
|
|
|
|
|
if (toolbutton->subControls & SC_ToolButtonMenu) {
|
|
|
|
|
tool.state = mflags;
|
|
|
|
|
tool.rect = menuarea.adjusted(1, 1, -1, -1);
|
|
|
|
|
if (mflags & (State_Sunken | State_On | State_Raised)) {
|
|
|
|
|
painter->setPen(Qt::gray);
|
|
|
|
|
painter->drawLine(tool.rect.topLeft(), tool.rect.bottomLeft());
|
|
|
|
|
if (mflags & (State_Sunken)) {
|
|
|
|
|
QColor shade(0, 0, 0, 50);
|
|
|
|
|
painter->fillRect(tool.rect.adjusted(0, -1, 1, 1), shade);
|
2013-03-14 10:44:46 +01:00
|
|
|
} else if (!Utils::HostOsInfo::isMacHost() && (mflags & State_MouseOver)) {
|
2008-12-02 12:01:29 +01:00
|
|
|
QColor shade(255, 255, 255, 50);
|
|
|
|
|
painter->fillRect(tool.rect.adjusted(0, -1, 1, 1), shade);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
tool.rect = tool.rect.adjusted(2, 2, -2, -2);
|
|
|
|
|
drawPrimitive(PE_IndicatorArrowDown, &tool, painter, widget);
|
2010-04-28 16:09:48 +02:00
|
|
|
} else if (toolbutton->features & QStyleOptionToolButton::HasMenu
|
|
|
|
|
&& !widget->property("noArrow").toBool()) {
|
2009-01-02 09:33:47 +01:00
|
|
|
int arrowSize = 6;
|
2008-12-02 12:01:29 +01:00
|
|
|
QRect ir = toolbutton->rect.adjusted(1, 1, -1, -1);
|
|
|
|
|
QStyleOptionToolButton newBtn = *toolbutton;
|
|
|
|
|
newBtn.palette = panelPalette(option->palette);
|
2009-01-02 09:33:47 +01:00
|
|
|
newBtn.rect = QRect(ir.right() - arrowSize - 1,
|
|
|
|
|
ir.height() - arrowSize - 2, arrowSize, arrowSize);
|
2009-01-26 15:46:11 +01:00
|
|
|
drawPrimitive(PE_IndicatorArrowDown, &newBtn, painter, widget);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case CC_ComboBox:
|
2009-02-23 16:25:53 +01:00
|
|
|
if (const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
|
2008-12-02 12:01:29 +01:00
|
|
|
painter->save();
|
2009-02-23 16:25:53 +01:00
|
|
|
bool isEmpty = cb->currentText.isEmpty() && cb->currentIcon.isNull();
|
|
|
|
|
bool reverse = option->direction == Qt::RightToLeft;
|
2010-02-24 19:23:40 +01:00
|
|
|
bool drawborder = !(widget && widget->property("hideborder").toBool());
|
|
|
|
|
bool alignarrow = !(widget && widget->property("alignarrow").toBool());
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2011-12-05 13:28:56 +01:00
|
|
|
if (drawborder)
|
|
|
|
|
drawButtonSeparator(painter, rect, reverse);
|
|
|
|
|
|
2009-02-10 15:09:24 +01:00
|
|
|
QStyleOption toolbutton = *option;
|
2009-02-23 16:25:53 +01:00
|
|
|
if (isEmpty)
|
|
|
|
|
toolbutton.state &= ~(State_Enabled | State_Sunken);
|
2009-02-23 17:11:41 +01:00
|
|
|
painter->save();
|
2010-02-24 19:23:40 +01:00
|
|
|
if (drawborder)
|
|
|
|
|
painter->setClipRect(toolbutton.rect.adjusted(0, 0, -2, 0));
|
2009-02-10 15:09:24 +01:00
|
|
|
drawPrimitive(PE_PanelButtonTool, &toolbutton, painter, widget);
|
2009-02-23 17:11:41 +01:00
|
|
|
painter->restore();
|
2008-12-02 12:01:29 +01:00
|
|
|
// Draw arrow
|
2009-01-26 18:10:53 +01:00
|
|
|
int menuButtonWidth = 12;
|
2008-12-02 12:01:29 +01:00
|
|
|
int left = !reverse ? rect.right() - menuButtonWidth : rect.left();
|
|
|
|
|
int right = !reverse ? rect.right() : rect.left() + menuButtonWidth;
|
2009-02-23 16:25:53 +01:00
|
|
|
QRect arrowRect((left + right) / 2 + (reverse ? 6 : -6), rect.center().y() - 3, 9, 9);
|
2010-02-24 19:23:40 +01:00
|
|
|
|
|
|
|
|
if (!alignarrow) {
|
2010-04-28 12:32:20 +02:00
|
|
|
int labelwidth = option->fontMetrics.width(cb->currentText);
|
|
|
|
|
if (reverse)
|
|
|
|
|
arrowRect.moveLeft(qMax(rect.width() - labelwidth - menuButtonWidth - 2, 4));
|
|
|
|
|
else
|
|
|
|
|
arrowRect.moveLeft(qMin(labelwidth + menuButtonWidth - 2, rect.width() - menuButtonWidth - 4));
|
2010-02-24 19:23:40 +01:00
|
|
|
}
|
2008-12-02 12:01:29 +01:00
|
|
|
if (option->state & State_On)
|
2010-02-23 12:42:04 +01:00
|
|
|
arrowRect.translate(QProxyStyle::pixelMetric(PM_ButtonShiftHorizontal, option, widget),
|
|
|
|
|
QProxyStyle::pixelMetric(PM_ButtonShiftVertical, option, widget));
|
2009-02-23 16:25:53 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
QStyleOption arrowOpt = *option;
|
|
|
|
|
arrowOpt.rect = arrowRect;
|
2009-02-23 16:25:53 +01:00
|
|
|
if (isEmpty)
|
|
|
|
|
arrowOpt.state &= ~(State_Enabled | State_Sunken);
|
|
|
|
|
|
2009-02-10 15:09:24 +01:00
|
|
|
if (styleHint(SH_ComboBox_Popup, option, widget)) {
|
|
|
|
|
arrowOpt.rect.translate(0, -3);
|
|
|
|
|
drawPrimitive(PE_IndicatorArrowUp, &arrowOpt, painter, widget);
|
|
|
|
|
arrowOpt.rect.translate(0, 6);
|
|
|
|
|
drawPrimitive(PE_IndicatorArrowDown, &arrowOpt, painter, widget);
|
|
|
|
|
} else {
|
|
|
|
|
drawPrimitive(PE_IndicatorArrowDown, &arrowOpt, painter, widget);
|
|
|
|
|
}
|
2010-03-01 14:51:48 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
painter->restore();
|
|
|
|
|
}
|
|
|
|
|
break;
|
2010-04-28 16:09:48 +02:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
default:
|
2010-02-23 12:42:04 +01:00
|
|
|
QProxyStyle::drawComplexControl(control, option, painter, widget);
|
2008-12-02 12:01:29 +01:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-12-05 13:28:56 +01:00
|
|
|
|
|
|
|
|
void ManhattanStyle::drawButtonSeparator(QPainter *painter, const QRect &rect, bool reverse) const
|
|
|
|
|
{
|
|
|
|
|
QLinearGradient grad(rect.topRight(), rect.bottomRight());
|
|
|
|
|
grad.setColorAt(0, QColor(255, 255, 255, 20));
|
|
|
|
|
grad.setColorAt(0.4, QColor(255, 255, 255, 60));
|
|
|
|
|
grad.setColorAt(0.7, QColor(255, 255, 255, 50));
|
|
|
|
|
grad.setColorAt(1, QColor(255, 255, 255, 40));
|
|
|
|
|
painter->setPen(QPen(grad, 0));
|
|
|
|
|
painter->drawLine(rect.topRight(), rect.bottomRight());
|
|
|
|
|
grad.setColorAt(0, QColor(0, 0, 0, 30));
|
|
|
|
|
grad.setColorAt(0.4, QColor(0, 0, 0, 70));
|
|
|
|
|
grad.setColorAt(0.7, QColor(0, 0, 0, 70));
|
|
|
|
|
grad.setColorAt(1, QColor(0, 0, 0, 40));
|
|
|
|
|
painter->setPen(QPen(grad, 0));
|
|
|
|
|
if (!reverse)
|
|
|
|
|
painter->drawLine(rect.topRight() - QPoint(1,0), rect.bottomRight() - QPoint(1,0));
|
|
|
|
|
else
|
|
|
|
|
painter->drawLine(rect.topLeft(), rect.bottomLeft());
|
|
|
|
|
}
|