##// END OF EJS Templates
Fix label visibility for category axis...
Fix label visibility for category axis Hide the labels in category axis that would be drawn on top of other labels. Task-number: QTRD-2525 Change-Id: Ic66a6b501821bbb14636229096d86d38301cf8b6 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>

File last commit:

r2625:3dc2625e2a47
r2651:99ad874661ac
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