You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
253 lines
8.0 KiB
253 lines
8.0 KiB
/** |
|
****************************************************************************** |
|
* |
|
* @file stylehelper.cpp |
|
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. |
|
* Parts by Nokia Corporation (qt-info@nokia.com) Copyright (C) 2009. |
|
* @brief |
|
* @see The GNU Public License (GPL) Version 3 |
|
* @defgroup |
|
* @{ |
|
* |
|
*****************************************************************************/ |
|
/* |
|
* This program is free software; you can redistribute it and/or modify |
|
* it under the terms of the GNU General Public License as published by |
|
* the Free Software Foundation; either version 3 of the License, or |
|
* (at your option) any later version. |
|
* |
|
* This program is distributed in the hope that it will be useful, but |
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
* for more details. |
|
* |
|
* You should have received a copy of the GNU General Public License along |
|
* with this program; if not, write to the Free Software Foundation, Inc., |
|
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
*/ |
|
|
|
#include "stylehelper.h" |
|
|
|
#include <QtGui/QPixmapCache> |
|
#include <QtGui/QWidget> |
|
#include <QtCore/QRect> |
|
#include <QtGui/QPainter> |
|
#include <QtGui/QApplication> |
|
#include <QtGui/QPalette> |
|
|
|
// 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; |
|
} |
|
*/ |
|
|
|
namespace Utils { |
|
|
|
QColor StyleHelper::mergedColors(const QColor &colorA, const QColor &colorB, int factor) |
|
{ |
|
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; |
|
} |
|
|
|
qreal StyleHelper::sidebarFontSize() |
|
{ |
|
#if defined(Q_WS_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 void verticalGradientHelper(QPainter *p, const QRect &spanRect, const QRect &rect) |
|
{ |
|
QColor base = StyleHelper::baseColor(); |
|
QLinearGradient grad(spanRect.topRight(), spanRect.topLeft()); |
|
grad.setColorAt(0, StyleHelper::highlightColor()); |
|
grad.setColorAt(0.301, base); |
|
grad.setColorAt(1, StyleHelper::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)); |
|
} |
|
|
|
void StyleHelper::verticalGradient(QPainter *painter, const QRect &spanRect, const QRect &clipRect) |
|
{ |
|
if (StyleHelper::usePixmapCache()) { |
|
QString key; |
|
key.sprintf("mh_vertical %d %d %d %d %d", |
|
spanRect.width(), spanRect.height(), clipRect.width(), |
|
clipRect.height(), StyleHelper::baseColor().rgb());; |
|
|
|
QPixmap pixmap; |
|
if (!QPixmapCache::find(key, pixmap)) { |
|
pixmap = QPixmap(clipRect.size()); |
|
QPainter p(&pixmap); |
|
QRect rect(0, 0, clipRect.width(), clipRect.height()); |
|
verticalGradientHelper(&p, spanRect, rect); |
|
p.end(); |
|
QPixmapCache::insert(key, pixmap); |
|
} |
|
|
|
painter->drawPixmap(clipRect.topLeft(), pixmap); |
|
} else { |
|
verticalGradientHelper(painter, spanRect, clipRect); |
|
} |
|
} |
|
|
|
static void horizontalGradientHelper(QPainter *p, const QRect &spanRect, const |
|
QRect &rect) |
|
{ |
|
QColor base = StyleHelper::baseColor(); |
|
QLinearGradient grad(rect.topLeft(), rect.bottomLeft()); |
|
grad.setColorAt(0, StyleHelper::highlightColor().lighter(120)); |
|
if (rect.height() == StyleHelper::navigationWidgetHeight()) { |
|
grad.setColorAt(0.4, StyleHelper::highlightColor()); |
|
grad.setColorAt(0.401, base); |
|
} |
|
grad.setColorAt(1, StyleHelper::shadowColor()); |
|
p->fillRect(rect, grad); |
|
|
|
QLinearGradient shadowGradient(spanRect.topLeft(), spanRect.topRight()); |
|
shadowGradient.setColorAt(0, QColor(0, 0, 0, 30)); |
|
QColor highlight = StyleHelper::highlightColor().lighter(130); |
|
highlight.setAlpha(100); |
|
shadowGradient.setColorAt(0.7, highlight); |
|
shadowGradient.setColorAt(1, QColor(0, 0, 0, 40)); |
|
p->fillRect(rect, shadowGradient); |
|
|
|
} |
|
|
|
void StyleHelper::horizontalGradient(QPainter *painter, const QRect &spanRect, const QRect &clipRect) |
|
{ |
|
if (StyleHelper::usePixmapCache()) { |
|
QString key; |
|
key.sprintf("mh_horizontal %d %d %d %d %d", |
|
spanRect.width(), spanRect.height(), clipRect.width(), |
|
clipRect.height(), StyleHelper::baseColor().rgb()); |
|
|
|
QPixmap pixmap; |
|
if (!QPixmapCache::find(key, pixmap)) { |
|
pixmap = QPixmap(clipRect.size()); |
|
QPainter p(&pixmap); |
|
QRect rect = QRect(0, 0, clipRect.width(), clipRect.height()); |
|
horizontalGradientHelper(&p, spanRect, rect); |
|
p.end(); |
|
QPixmapCache::insert(key, pixmap); |
|
} |
|
|
|
painter->drawPixmap(clipRect.topLeft(), pixmap); |
|
|
|
} else { |
|
horizontalGradientHelper(painter, spanRect, clipRect); |
|
} |
|
} |
|
|
|
static void menuGradientHelper(QPainter *p, const QRect &spanRect, const QRect &rect) |
|
{ |
|
QLinearGradient grad(spanRect.topLeft(), spanRect.bottomLeft()); |
|
QColor menuColor = StyleHelper::mergedColors(StyleHelper::baseColor(), QColor(244, 244, 244), 25); |
|
grad.setColorAt(0, menuColor.lighter(112)); |
|
grad.setColorAt(1, menuColor); |
|
p->fillRect(rect, grad); |
|
} |
|
|
|
void StyleHelper::menuGradient(QPainter *painter, const QRect &spanRect, const QRect &clipRect) |
|
{ |
|
if (StyleHelper::usePixmapCache()) { |
|
QString key; |
|
key.sprintf("mh_menu %d %d %d %d %d", |
|
spanRect.width(), spanRect.height(), clipRect.width(), |
|
clipRect.height(), StyleHelper::baseColor().rgb()); |
|
|
|
QPixmap pixmap; |
|
if (!QPixmapCache::find(key, pixmap)) { |
|
pixmap = QPixmap(clipRect.size()); |
|
QPainter p(&pixmap); |
|
QRect rect = QRect(0, 0, clipRect.width(), clipRect.height()); |
|
menuGradientHelper(&p, spanRect, rect); |
|
p.end(); |
|
QPixmapCache::insert(key, pixmap); |
|
} |
|
|
|
painter->drawPixmap(clipRect.topLeft(), pixmap); |
|
} else { |
|
menuGradientHelper(painter, spanRect, clipRect); |
|
} |
|
} |
|
|
|
} // namespace Utils
|
|
|