/** ****************************************************************************** * * @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 #include #include #include #include #include // Clamps float color values within (0, 255) static int clamp(float x) { const int val = x > 255 ? 255 : static_cast(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