diff options
Diffstat (limited to 'src/plugins/coreplugin/stylehelper.cpp')
-rw-r--r-- | src/plugins/coreplugin/stylehelper.cpp | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/src/plugins/coreplugin/stylehelper.cpp b/src/plugins/coreplugin/stylehelper.cpp new file mode 100644 index 0000000000..5630b464df --- /dev/null +++ b/src/plugins/coreplugin/stylehelper.cpp @@ -0,0 +1,229 @@ +/*************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** +** Non-Open Source Usage +** +** Licensees may use this file in accordance with the Qt Beta Version +** License Agreement, Agreement version 2.2 provided with the Software or, +** alternatively, in accordance with the terms contained in a written +** agreement between you and Nokia. +** +** GNU General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the packaging +** of this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** +** http://www.fsf.org/licensing/licenses/info/GPLv2.html and +** http://www.gnu.org/copyleft/gpl.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt GPL Exception version +** 1.2, included in the file GPL_EXCEPTION.txt in this package. +** +***************************************************************************/ +#include "stylehelper.h" + +#include <QtGui/QPixmapCache> +#include <QtGui/QWidget> + +// Clamps float color values within (0, 255) +static int clamp(float x) { + const int val = x > 255 ? 255 : static_cast<int>(x); + return val < 0 ? 0 : val; +} + +// Clamps float color values within (0, 255) +/* +static int range(float x, int min, int max) { + int val = x > max ? max : x; + return val < min ? min : val; +} +*/ + +qreal StyleHelper::sidebarFontSize() +{ +#if defined(Q_OS_MAC) + return 9; +#else + return 7.5; +#endif +} + +QPalette StyleHelper::sidebarFontPalette(const QPalette &original) +{ + QPalette palette = original; + palette.setColor(QPalette::Active, QPalette::Text, panelTextColor()); + palette.setColor(QPalette::Active, QPalette::WindowText, panelTextColor()); + palette.setColor(QPalette::Inactive, QPalette::Text, panelTextColor().darker()); + palette.setColor(QPalette::Inactive, QPalette::WindowText, panelTextColor().darker()); + return palette; +} + +QColor StyleHelper::panelTextColor() +{ + //qApp->palette().highlightedText().color(); + return Qt::white; +} + +QColor StyleHelper::m_baseColor(0x666666); + +QColor StyleHelper::baseColor() +{ + return m_baseColor; +} + +QColor StyleHelper::highlightColor() +{ + QColor result = baseColor(); + result.setHsv(result.hue(), + clamp(result.saturation()), + clamp(result.value() * 1.16)); + return result; +} + +QColor StyleHelper::shadowColor() +{ + QColor result = baseColor(); + result.setHsv(result.hue(), + clamp(result.saturation() * 1.1), + clamp(result.value() * 0.70)); + return result; +} + +QColor StyleHelper::borderColor() +{ + QColor result = baseColor(); + result.setHsv(result.hue(), + result.saturation(), + result.value() / 2); + return result; +} + +void StyleHelper::setBaseColor(const QColor &color) +{ + if (color.isValid() && color != m_baseColor) { + m_baseColor = color; + foreach (QWidget *w, QApplication::topLevelWidgets()) + w->update(); + } +} + +static QColor mergedColors(const QColor &colorA, const QColor &colorB, int factor = 50) +{ + const int maxFactor = 100; + QColor tmp = colorA; + tmp.setRed((tmp.red() * factor) / maxFactor + (colorB.red() * (maxFactor - factor)) / maxFactor); + tmp.setGreen((tmp.green() * factor) / maxFactor + (colorB.green() * (maxFactor - factor)) / maxFactor); + tmp.setBlue((tmp.blue() * factor) / maxFactor + (colorB.blue() * (maxFactor - factor)) / maxFactor); + return tmp; +} + +void StyleHelper::verticalGradient(QPainter *painter, const QRect &spanRect, const QRect &clipRect) +{ + QString key; + key.sprintf("mh_toolbar %d %d %d %d %d", spanRect.width(), spanRect.height(), clipRect.width(), + clipRect.height(), StyleHelper::baseColor().rgb());; + QPixmap pixmap; + QPainter *p = painter; + QRect rect = clipRect; + if (StyleHelper::usePixmapCache() && !QPixmapCache::find(key, pixmap)) { + pixmap = QPixmap(clipRect.size()); + p = new QPainter(&pixmap); + rect = QRect(0, 0, clipRect.width(), clipRect.height()); + } + + QColor base = StyleHelper::baseColor(); + QLinearGradient grad(spanRect.topRight(), spanRect.topLeft()); + grad.setColorAt(0, highlightColor()); + grad.setColorAt(0.301, base); + grad.setColorAt(1, shadowColor()); + p->fillRect(rect, grad); + + QColor light(255, 255, 255, 80); + p->setPen(light); + p->drawLine(rect.topRight() - QPoint(1, 0), rect.bottomRight() - QPoint(1, 0)); + + if (StyleHelper::usePixmapCache() && !QPixmapCache::find(key, pixmap)) { + painter->drawPixmap(clipRect.topLeft(), pixmap); + p->end(); + delete p; + QPixmapCache::insert(key, pixmap); + } + +} + +void StyleHelper::horizontalGradient(QPainter *painter, const QRect &spanRect, const QRect &clipRect) +{ + QString key; + key.sprintf("mh_toolbar %d %d %d %d %d", spanRect.width(), spanRect.height(), + clipRect.width(), clipRect.height(), StyleHelper::baseColor().rgb()); + QPixmap pixmap; + QPainter *p = painter; + QRect rect = clipRect; + if (StyleHelper::usePixmapCache() && !QPixmapCache::find(key, pixmap)) { + pixmap = QPixmap(clipRect.size()); + p = new QPainter(&pixmap); + rect = QRect(0, 0, clipRect.width(), clipRect.height()); + } + + QColor base = StyleHelper::baseColor(); + QLinearGradient grad(rect.topLeft(), rect.bottomLeft()); + + grad.setColorAt(0, highlightColor().lighter(120)); + grad.setColorAt(0.4, highlightColor()); + grad.setColorAt(0.401, base); + grad.setColorAt(1, shadowColor()); + p->fillRect(rect, grad); + + QLinearGradient shadowGradient(spanRect.topLeft(), spanRect.topRight()); + shadowGradient.setColorAt(0, QColor(0, 0, 0, 30)); + QColor highlight = highlightColor().lighter(130); + highlight.setAlpha(100); + shadowGradient.setColorAt(0.7, highlight); + shadowGradient.setColorAt(1, QColor(0, 0, 0, 40)); + p->fillRect(rect, shadowGradient); + + if (StyleHelper::usePixmapCache() && !QPixmapCache::find(key, pixmap)) { + painter->drawPixmap(clipRect.topLeft(), pixmap); + p->end(); + delete p; + QPixmapCache::insert(key, pixmap); + } +} + +void StyleHelper::menuGradient(QPainter *painter, const QRect &spanRect, const QRect &clipRect) +{ + QString key; + key.sprintf("mh_toolbar %d %d %d %d %d", spanRect.width(), spanRect.height(), clipRect.width(), + clipRect.height(), StyleHelper::baseColor().rgb());; + QPixmap pixmap; + QPainter *p = painter; + QRect rect = clipRect; + if (StyleHelper::usePixmapCache() && !QPixmapCache::find(key, pixmap)) { + pixmap = QPixmap(clipRect.size()); + p = new QPainter(&pixmap); + rect = QRect(0, 0, clipRect.width(), clipRect.height()); + } + + QLinearGradient grad(spanRect.topLeft(), spanRect.bottomLeft()); + QColor menuColor = mergedColors(StyleHelper::baseColor(), QColor(240, 240, 240), 25); + grad.setColorAt(0, menuColor.lighter(112)); + grad.setColorAt(1, menuColor); + p->fillRect(rect, grad); + + if (StyleHelper::usePixmapCache() && !QPixmapCache::find(key, pixmap)) { + painter->drawPixmap(clipRect.topLeft(), pixmap); + p->end(); + delete p; + QPixmapCache::insert(key, pixmap); + } +} |