##// END OF EJS Templates
Fix Creator crash when opening Charts project...
Fix Creator crash when opening Charts project There's a problem with Creator parsing the headers defined in Charts src.pro. This will cause the Creator (3.0.0-beta) to crash when trying to open charts.pro. As a workaround the headers are defined using new variables for each function and unsetting the variables after each rotation. Task-number: QTRD-2480 Change-Id: Ia77428dab61fa9fa57ca5501ad27f8c3f514f017 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>

File last commit:

r2625:3dc2625e2a47
r2641:614285c5dc95
Show More
chartthememanager.cpp
249 lines | 7.2 KiB | text/x-c | CppLexer
/ src / chartthememanager.cpp
Michal Klocek
Refactors internals...
r2273 /****************************************************************************
**
Miikka Heikkinen
Fixed the copyright year 2012 -> 2013
r2432 ** Copyright (C) 2013 Digia Plc
Michal Klocek
Refactors internals...
r2273 ** All rights reserved.
** For any questions to Digia, please use contact form at http://qt.digia.com
**
Miikka Heikkinen
Qt Commercial -> Qt Enterprise...
r2574 ** This file is part of the Qt Enterprise Charts Add-on.
Michal Klocek
Refactors internals...
r2273 **
** $QT_BEGIN_LICENSE$
Miikka Heikkinen
Qt Commercial -> Qt Enterprise...
r2574 ** Licensees holding valid Qt Enterprise licenses may use this file in
** accordance with the Qt Enterprise License Agreement provided with the
Michal Klocek
Refactors internals...
r2273 ** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia.
**
** If you have questions regarding the use of this file, please use
** contact form at http://qt.digia.com
** $QT_END_LICENSE$
**
****************************************************************************/
#include "qabstractseries_p.h"
#include "qabstractaxis_p.h"
#include <QTime>
//themes
#include "chartthemesystem_p.h"
#include "chartthemelight_p.h"
#include "chartthemebluecerulean_p.h"
#include "chartthemedark_p.h"
#include "chartthemebrownsand_p.h"
#include "chartthemebluencs_p.h"
#include "chartthemehighcontrast_p.h"
#include "chartthemeblueicy_p.h"
Titta Heikkala
Add new Qt theme template...
r2625 #include "chartthemeqt_p.h"
Michal Klocek
Refactors internals...
r2273
QTCOMMERCIALCHART_BEGIN_NAMESPACE
ChartThemeManager::ChartThemeManager(QChart* chart) :
m_chart(chart)
{
qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
}
void ChartThemeManager::setTheme(QChart::ChartTheme theme)
{
Miikka Heikkinen
Fix explicitly set default pen/brush/font getting overridden by theme...
r2516 if (m_theme.isNull() || theme != m_theme->id()) {
Michal Klocek
Refactors internals...
r2273 switch (theme) {
Miikka Heikkinen
Fix explicitly set default pen/brush/font getting overridden by theme...
r2516 case QChart::ChartThemeLight:
Michal Klocek
Refactors internals...
r2273 m_theme.reset(new ChartThemeLight());
break;
Miikka Heikkinen
Fix explicitly set default pen/brush/font getting overridden by theme...
r2516 case QChart::ChartThemeBlueCerulean:
Michal Klocek
Refactors internals...
r2273 m_theme.reset(new ChartThemeBlueCerulean());
break;
Miikka Heikkinen
Fix explicitly set default pen/brush/font getting overridden by theme...
r2516 case QChart::ChartThemeDark:
Michal Klocek
Refactors internals...
r2273 m_theme.reset(new ChartThemeDark());
break;
Miikka Heikkinen
Fix explicitly set default pen/brush/font getting overridden by theme...
r2516 case QChart::ChartThemeBrownSand:
Michal Klocek
Refactors internals...
r2273 m_theme.reset(new ChartThemeBrownSand());
break;
Miikka Heikkinen
Fix explicitly set default pen/brush/font getting overridden by theme...
r2516 case QChart::ChartThemeBlueNcs:
Michal Klocek
Refactors internals...
r2273 m_theme.reset(new ChartThemeBlueNcs());
break;
Miikka Heikkinen
Fix explicitly set default pen/brush/font getting overridden by theme...
r2516 case QChart::ChartThemeHighContrast:
Michal Klocek
Refactors internals...
r2273 m_theme.reset(new ChartThemeHighContrast());
break;
Miikka Heikkinen
Fix explicitly set default pen/brush/font getting overridden by theme...
r2516 case QChart::ChartThemeBlueIcy:
Michal Klocek
Refactors internals...
r2273 m_theme.reset(new ChartThemeBlueIcy());
break;
Titta Heikkala
Add new Qt theme template...
r2625 case QChart::ChartThemeQt:
m_theme.reset(new ChartThemeQt());
break;
Miikka Heikkinen
Fix explicitly set default pen/brush/font getting overridden by theme...
r2516 default:
Michal Klocek
Refactors internals...
r2273 m_theme.reset(new ChartThemeSystem());
break;
}
Miikka Heikkinen
Fix explicitly set default pen/brush/font getting overridden by theme...
r2516 if (!m_theme.isNull()) {
decorateChart(m_chart,m_theme.data());
decorateLegend(m_chart->legend(),m_theme.data());
foreach (QAbstractAxis* axis, m_axisList)
axis->d_ptr->initializeTheme(m_theme.data(), true);
foreach (QAbstractSeries* series, m_seriesMap.keys())
series->d_ptr->initializeTheme(m_seriesMap[series], m_theme.data(), true);
Michal Klocek
Refactors internals...
r2273 }
}
}
Miikka Heikkinen
Fix explicitly set default pen/brush/font getting overridden by theme...
r2516 // decorateChart is only called when theme is forcibly initialized
void ChartThemeManager::decorateChart(QChart *chart, ChartTheme *theme) const
Michal Klocek
Refactors internals...
r2273 {
Miikka Heikkinen
Fix explicitly set default pen/brush/font getting overridden by theme...
r2516 chart->setBackgroundBrush(theme->chartBackgroundGradient());
Michal Klocek
Refactors internals...
r2273
Miikka Heikkinen
Fix explicitly set default pen/brush/font getting overridden by theme...
r2516 QPen pen(Qt::transparent);
QBrush brush;
chart->setPlotAreaBackgroundBrush(brush);
chart->setPlotAreaBackgroundPen(pen);
chart->setPlotAreaBackgroundVisible(false);
Miikka Heikkinen
Add API to specify plot area background....
r2498
Michal Klocek
Refactors internals...
r2273 chart->setTitleFont(theme->masterFont());
chart->setTitleBrush(theme->labelBrush());
chart->setDropShadowEnabled(theme->isBackgroundDropShadowEnabled());
}
Miikka Heikkinen
Fix explicitly set default pen/brush/font getting overridden by theme...
r2516 // decorateLegend is only called when theme is forcibly initialized
void ChartThemeManager::decorateLegend(QLegend *legend, ChartTheme *theme) const
Michal Klocek
Refactors internals...
r2273 {
Miikka Heikkinen
Fix explicitly set default pen/brush/font getting overridden by theme...
r2516 legend->setPen(theme->axisLinePen());
legend->setBrush(theme->chartBackgroundGradient());
legend->setFont(theme->labelFont());
legend->setLabelBrush(theme->labelBrush());
Michal Klocek
Refactors internals...
r2273 }
Miikka Heikkinen
Fix explicitly set default pen/brush/font getting overridden by theme...
r2516 int ChartThemeManager::createIndexKey(QList<int> keys) const
Michal Klocek
Refactors internals...
r2273 {
qSort(keys);
int key = 0;
QList<int>::iterator i;
i = keys.begin();
while (i != keys.end()) {
if (*i != key)
break;
key++;
i++;
}
return key;
}
int ChartThemeManager::seriesCount(QAbstractSeries::SeriesType type) const
{
int count = 0;
QList<QAbstractSeries *> series = m_seriesMap.keys();
foreach(QAbstractSeries *s, series) {
if (s->type() == type)
count++;
}
return count;
}
void ChartThemeManager::handleSeriesAdded(QAbstractSeries *series)
{
int key = createIndexKey(m_seriesMap.values());
m_seriesMap.insert(series,key);
series->d_ptr->initializeTheme(key,m_theme.data(),false);
}
void ChartThemeManager::handleSeriesRemoved(QAbstractSeries *series)
{
m_seriesMap.remove(series);
}
void ChartThemeManager::handleAxisAdded(QAbstractAxis *axis)
{
m_axisList.append(axis);
axis->d_ptr->initializeTheme(m_theme.data(),false);
}
void ChartThemeManager::handleAxisRemoved(QAbstractAxis *axis)
{
m_axisList.removeAll(axis);
}
void ChartThemeManager::updateSeries(QAbstractSeries *series)
{
if(m_seriesMap.contains(series)){
series->d_ptr->initializeTheme(m_seriesMap[series],m_theme.data(),false);
}
}
QList<QGradient> ChartThemeManager::generateSeriesGradients(const QList<QColor>& colors)
{
QList<QGradient> result;
// Generate gradients in HSV color space
foreach (const QColor &color, colors) {
QLinearGradient g;
qreal h = color.hsvHueF();
qreal s = color.hsvSaturationF();
QColor start = color;
start.setHsvF(h, 0.0, 1.0);
g.setColorAt(0.0, start);
g.setColorAt(0.5, color);
QColor end = color;
end.setHsvF(h, s, 0.25);
g.setColorAt(1.0, end);
result << g;
}
return result;
}
QColor ChartThemeManager::colorAt(const QColor &start, const QColor &end, qreal pos)
{
Q_ASSERT(pos >= 0.0 && pos <= 1.0);
qreal r = start.redF() + ((end.redF() - start.redF()) * pos);
qreal g = start.greenF() + ((end.greenF() - start.greenF()) * pos);
qreal b = start.blueF() + ((end.blueF() - start.blueF()) * pos);
QColor c;
c.setRgbF(r, g, b);
return c;
}
QColor ChartThemeManager::colorAt(const QGradient &gradient, qreal pos)
{
Q_ASSERT(pos >= 0 && pos <= 1.0);
QGradientStops stops = gradient.stops();
int count = stops.count();
// find previous stop relative to position
QGradientStop prev = stops.first();
for (int i = 0; i < count; i++) {
QGradientStop stop = stops.at(i);
if (pos > stop.first)
prev = stop;
// given position is actually a stop position?
if (pos == stop.first) {
//qDebug() << "stop color" << pos;
return stop.second;
}
}
// find next stop relative to position
QGradientStop next = stops.last();
for (int i = count - 1; i >= 0; i--) {
QGradientStop stop = stops.at(i);
if (pos < stop.first)
next = stop;
}
//qDebug() << "prev" << prev.first << "pos" << pos << "next" << next.first;
qreal range = next.first - prev.first;
qreal posDelta = pos - prev.first;
qreal relativePos = posDelta / range;
//qDebug() << "range" << range << "posDelta" << posDelta << "relativePos" << relativePos;
return colorAt(prev.second, next.second, relativePos);
}
#include "moc_chartthememanager_p.cpp"
QTCOMMERCIALCHART_END_NAMESPACE