##// END OF EJS Templates
Fixes and improvments to series API...
Fixes and improvments to series API * removes pos index * adds unified append, replace , remove * optimizes spline drawing to use QVector

File last commit:

r1006:a8ef6d6db8bf
r1057:d444309c9f1b
Show More
charttheme.cpp
400 lines | 11.6 KiB | text/x-c | CppLexer
Jani Honkonen
Add license headers
r794 /****************************************************************************
**
** Copyright (C) 2012 Digia Plc
** All rights reserved.
** For any questions to Digia, please use contact form at http://qt.digia.com
**
** This file is part of the Qt Commercial Charts Add-on.
**
** $QT_BEGIN_LICENSE$
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** 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$
**
****************************************************************************/
Tero Ahola
Refactored themes; now enabled for line, scatter and pies...
r103 #include "charttheme_p.h"
#include "qchart.h"
Tero Ahola
Added drop shadow effect for light themes
r1001 #include "qchart_p.h"
Tero Ahola
New theme with light colors, chartview background
r584 #include "qchartview.h"
sauimone
background to legend, theme applies
r540 #include "qlegend.h"
Michal Klocek
Changes QChartAxis -> QAxis
r1006 #include "qaxis.h"
Jani Honkonen
Fix color generation for pie
r324 #include <QTime>
Tero Ahola
Refactored themes; now enabled for line, scatter and pies...
r103
Michal Klocek
Refactor themes...
r143 //series
sauimone
Added pen & brush to QBarSet
r214 #include "qbarset.h"
sauimone
Naming convention change for barcharts. QBarChartSeries is now QBarSeries etc.
r338 #include "qbarseries.h"
#include "qstackedbarseries.h"
#include "qpercentbarseries.h"
Michal Klocek
Rename QLineChartSeries to QLineSeries
r349 #include "qlineseries.h"
Michal Klocek
Adds area chart...
r421 #include "qareaseries.h"
Tero Ahola
Enabled theme colors in scatter again
r182 #include "qscatterseries.h"
Jani Honkonen
Make pie work better with chartwidgettest
r163 #include "qpieseries.h"
Jani Honkonen
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
r203 #include "qpieslice.h"
Marek Rosa
Spline working somewhat
r401 #include "qsplineseries.h"
Jani Honkonen
Make pie work better with chartwidgettest
r163
Michal Klocek
Refactor themes...
r143 //items
Michal Klocek
Changes QChartAxis -> QAxis
r1006 #include "chartaxis_p.h"
sauimone
combined barpresenterbase and barpresenter. renamed barchartpresenters to barchartitems
r666 #include "barchartitem_p.h"
#include "stackedbarchartitem_p.h"
#include "percentbarchartitem_p.h"
Michal Klocek
Fix previous broken commit
r145 #include "linechartitem_p.h"
Michal Klocek
Adds area chart...
r421 #include "areachartitem_p.h"
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 #include "scatterchartitem_p.h"
Jani Honkonen
Rename piepresenter -> piechartitem
r568 #include "piechartitem_p.h"
Marek Rosa
Renamed SplinePresenter to SplineChartItem
r460 #include "splinechartitem_p.h"
Tero Ahola
Refactored themes; now enabled for line, scatter and pies...
r103
Michal Klocek
Refactor themes...
r143 //themes
Tero Ahola
Removed default theme, now using light as the default
r853 #include "chartthemesystem_p.h"
Tero Ahola
Three more themes
r651 #include "chartthemelight_p.h"
#include "chartthemebluecerulean_p.h"
#include "chartthemedark_p.h"
#include "chartthemebrownsand_p.h"
#include "chartthemebluencs_p.h"
Tero Ahola
Added Icy Blue and High Contrast theme
r757 #include "chartthemehighcontrast_p.h"
#include "chartthemeblueicy_p.h"
Tero Ahola
tuning theme colors
r125
Michal Klocek
Refactor themes...
r143 QTCOMMERCIALCHART_BEGIN_NAMESPACE
Tero Ahola
Fonts and background of the themes...
r614 ChartTheme::ChartTheme(QChart::ChartTheme id) :
Tero Ahola
Removed default theme, now using light as the default
r853 m_masterFont(QFont("arial", 14)),
Tero Ahola
Defined point sizes for fonts
r717 m_labelFont(QFont("arial", 10)),
Tero Ahola
Fonts and background of the themes...
r614 m_titleBrush(QColor(QRgb(0x000000))),
m_axisLinePen(QPen(QRgb(0x000000))),
m_axisLabelBrush(QColor(QRgb(0x000000))),
m_backgroundShadesPen(Qt::NoPen),
m_backgroundShadesBrush(Qt::NoBrush),
m_backgroundShades(BackgroundShadesNone),
Tero Ahola
Added drop shadow effect for light themes
r1001 m_backgroundDropShadowEnabled(false),
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 m_gridLinePen(QPen(QRgb(0x000000))),
m_force(false)
Michal Klocek
Refactor themes...
r143 {
Michal Klocek
Adds missing ids to theme classes
r153 m_id = id;
Jani Honkonen
Fix color generation for pie
r324 qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
Michal Klocek
Refactor themes...
r143 }
Michal Klocek
Adds missing ids to theme classes
r153 ChartTheme* ChartTheme::createTheme(QChart::ChartTheme theme)
Michal Klocek
Refactor themes...
r143 {
switch(theme) {
Tero Ahola
Three more themes
r651 case QChart::ChartThemeLight:
return new ChartThemeLight();
case QChart::ChartThemeBlueCerulean:
return new ChartThemeBlueCerulean();
case QChart::ChartThemeDark:
return new ChartThemeDark();
case QChart::ChartThemeBrownSand:
return new ChartThemeBrownSand();
case QChart::ChartThemeBlueNcs:
return new ChartThemeBlueNcs();
Tero Ahola
Added Icy Blue and High Contrast theme
r757 case QChart::ChartThemeHighContrast:
return new ChartThemeHighContrast();
case QChart::ChartThemeBlueIcy:
return new ChartThemeBlueIcy();
Jani Honkonen
Adding list of series gradients to theme.
r494 default:
Tero Ahola
Removed default theme, now using light as the default
r853 return new ChartThemeSystem();
Michal Klocek
Refactor themes...
r143 }
}
Marek Rosa
White spaces fixes in Theme and animation classes
r948 void ChartTheme::decorate(QChart *chart)
Michal Klocek
Refactor themes...
r143 {
Michal Klocek
Adds force option to chartTheme...
r645 QBrush brush;
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 if(brush == chart->backgroundBrush() || m_force)
Tero Ahola
Added Icy Blue and High Contrast theme
r757 chart->setBackgroundBrush(m_chartBackgroundGradient);
Michal Klocek
Adds force option to chartTheme...
r645 chart->setTitleFont(m_masterFont);
chart->setTitleBrush(m_titleBrush);
Tero Ahola
Added drop shadow effect for light themes
r1001 chart->setBackgroundDropShadowEnabled(m_backgroundDropShadowEnabled);
Michal Klocek
Refactor themes...
r143 }
Marek Rosa
White spaces fixes in Theme and animation classes
r948 void ChartTheme::decorate(QLegend *legend)
sauimone
background to legend, theme applies
r540 {
Michal Klocek
Adds force option to chartTheme...
r645 QPen pen;
QBrush brush;
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 if (pen == legend->pen() || m_force){
sauimone
improved legend layout
r783 legend->setPen(Qt::NoPen);
Michal Klocek
Adds force option to chartTheme...
r645 }
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 if (brush == legend->brush() || m_force) {
Michal Klocek
Adds force option to chartTheme...
r645 legend->setBrush(m_chartBackgroundGradient);
}
sauimone
background to legend, theme applies
r540 }
Marek Rosa
White spaces fixes in Theme and animation classes
r948 void ChartTheme::decorate(QAreaSeries *series, int index)
Michal Klocek
Adds area chart...
r421 {
Michal Klocek
Revert "Theme change now affects also XY series"...
r644 QPen pen;
QBrush brush;
Michal Klocek
Adds area chart...
r421
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 if (pen == series->pen() || m_force){
Tero Ahola
Use light outline color instead of dark for bar, area and scatter
r653 pen.setColor(colorAt(m_seriesGradients.at(index % m_seriesGradients.size()), 0.0));
Michal Klocek
Revert "Theme change now affects also XY series"...
r644 pen.setWidthF(2);
series->setPen(pen);
}
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 if (brush == series->brush() || m_force) {
Michal Klocek
Revert "Theme change now affects also XY series"...
r644 QBrush brush(m_seriesColors.at(index % m_seriesColors.size()));
series->setBrush(brush);
}
Michal Klocek
Adds area chart...
r421 }
Marek Rosa
White spaces fixes in Theme and animation classes
r948 void ChartTheme::decorate(QLineSeries *series,int index)
Tero Ahola
Refactored themes; now enabled for line, scatter and pies...
r103 {
Michal Klocek
Revert "Theme change now affects also XY series"...
r644 QPen pen;
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 if(pen == series->pen() || m_force ){
Michal Klocek
Revert "Theme change now affects also XY series"...
r644 pen.setColor(m_seriesColors.at(index%m_seriesColors.size()));
pen.setWidthF(2);
series->setPen(pen);
}
Tero Ahola
Refactored themes; now enabled for line, scatter and pies...
r103 }
Marek Rosa
White spaces fixes in Theme and animation classes
r948 void ChartTheme::decorate(QBarSeries *series, int index)
Tero Ahola
One more alternative for changing themes
r108 {
Michal Klocek
Adds force option to chartTheme...
r645 QBrush brush;
Tero Ahola
Use light outline color instead of dark for bar, area and scatter
r653 QPen pen;
Marek Rosa
White spaces fixes in Theme and animation classes
r948 QList<QBarSet *> sets = series->barSets();
Michal Klocek
Adds force option to chartTheme...
r645
Tero Ahola
Bar series to use theme base colors. Pie brush minor fix....
r661 qreal takeAtPos = 0.5;
qreal step = 0.2;
if (sets.count() > 1 ) {
step = 1.0 / (qreal) sets.count();
if (sets.count() % m_seriesGradients.count())
step *= m_seriesGradients.count();
else
step *= (m_seriesGradients.count() - 1);
}
Michal Klocek
Adds force option to chartTheme...
r645
Tero Ahola
Bar series to use theme base colors. Pie brush minor fix....
r661 for (int i(0); i < sets.count(); i++) {
int colorIndex = (index + i) % m_seriesGradients.count();
if (i > 0 && i % m_seriesGradients.count() == 0) {
// There is no dedicated base color for each sets, generate more colors
takeAtPos += step;
if (takeAtPos == 1.0)
takeAtPos += step;
takeAtPos -= (int) takeAtPos;
sauimone
better use of gradients in barcharts
r512 }
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 if (brush == sets.at(i)->brush() || m_force )
Tero Ahola
Bar series to use theme base colors. Pie brush minor fix....
r661 sets.at(i)->setBrush(colorAt(m_seriesGradients.at(colorIndex), takeAtPos));
Tero Ahola
Refactored themes; now enabled for line, scatter and pies...
r103
Tero Ahola
Use light outline color instead of dark for bar, area and scatter
r653 // Pick label color from the opposite end of the gradient.
// 0.3 as a boundary seems to work well.
Tero Ahola
Bar series to use theme base colors. Pie brush minor fix....
r661 if (takeAtPos < 0.3)
sauimone
renamed barchart floating values with labels to be consistent with piechart
r820 sets.at(i)->setLabelBrush(colorAt(m_seriesGradients.at(index % m_seriesGradients.size()), 1));
Tero Ahola
Use light outline color instead of dark for bar, area and scatter
r653 else
sauimone
renamed barchart floating values with labels to be consistent with piechart
r820 sets.at(i)->setLabelBrush(colorAt(m_seriesGradients.at(index % m_seriesGradients.size()), 0));
Michal Klocek
Adds force option to chartTheme...
r645
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 if (pen == sets.at(i)->pen() || m_force) {
Tero Ahola
Use light outline color instead of dark for bar, area and scatter
r653 QColor c = colorAt(m_seriesGradients.at(index % m_seriesGradients.size()), 0.0);
sets.at(i)->setPen(c);
sauimone
better use of gradients in barcharts
r512 }
sauimone
integrating bar charts to test app.. crashes for now
r164 }
Michal Klocek
Refactor themes...
r143 }
Tero Ahola
Refactored themes; now enabled for line, scatter and pies...
r103
Marek Rosa
White spaces fixes in Theme and animation classes
r948 void ChartTheme::decorate(QScatterSeries *series, int index)
Tero Ahola
Enabled theme colors in scatter again
r182 {
Michal Klocek
Revert "Theme change now affects also XY series"...
r644 QPen pen;
QBrush brush;
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 if (pen == series->pen() || m_force) {
Tero Ahola
Use light outline color instead of dark for bar, area and scatter
r653 pen.setColor(colorAt(m_seriesGradients.at(index % m_seriesGradients.size()), 0.0));
Michal Klocek
Revert "Theme change now affects also XY series"...
r644 pen.setWidthF(2);
series->setPen(pen);
}
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 if (brush == series->brush() || m_force) {
Michal Klocek
Revert "Theme change now affects also XY series"...
r644 QBrush brush(m_seriesColors.at(index % m_seriesColors.size()));
series->setBrush(brush);
}
Tero Ahola
Enabled theme colors in scatter again
r182 }
Marek Rosa
White spaces fixes in Theme and animation classes
r948 void ChartTheme::decorate(QPieSeries *series, int index)
Jani Honkonen
Make pie work better with chartwidgettest
r163 {
Jani Honkonen
Refactoring QPieSlice private implementation. Removes the useless QPieSlicePrivate layer and uses PieSliceData directly.
r818
Tero Ahola
Theme gradients now generated from a single base color
r507 for (int i(0); i < series->slices().count(); i++) {
Jani Honkonen
Fix setting custom color to pie. Now the pie knows if the color is set by the user.
r691
QColor penColor = colorAt(m_seriesGradients.at(index % m_seriesGradients.size()), 0.0);
Tero Ahola
Use light outline color instead of dark for bar, area and scatter
r653
// Get color for a slice from a gradient linearly, beginning from the start of the gradient
Tero Ahola
Bar series to use theme base colors. Pie brush minor fix....
r661 qreal pos = (qreal) (i + 1) / (qreal) series->count();
Jani Honkonen
Fix setting custom color to pie. Now the pie knows if the color is set by the user.
r691 QColor brushColor = colorAt(m_seriesGradients.at(index % m_seriesGradients.size()), pos);
Jani Honkonen
Refactoring QPieSlice private implementation. Removes the useless QPieSlicePrivate layer and uses PieSliceData directly.
r818 QPieSlice *s = series->slices().at(i);
Jani Honkonen
Polish QPieSlice API by removing the DataPtr stuff
r822 PieSliceData data = PieSliceData::data(s);
Jani Honkonen
Fix setting custom color to pie. Now the pie knows if the color is set by the user.
r691
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 if (data.m_slicePen.isThemed() || m_force) {
Jani Honkonen
Fix setting custom color to pie. Now the pie knows if the color is set by the user.
r691 data.m_slicePen = penColor;
data.m_slicePen.setThemed(true);
}
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 if (data.m_sliceBrush.isThemed() || m_force) {
Jani Honkonen
Fix setting custom color to pie. Now the pie knows if the color is set by the user.
r691 data.m_sliceBrush = brushColor;
data.m_sliceBrush.setThemed(true);
}
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 if (data.m_labelPen.isThemed() || m_force) {
Jani Honkonen
Get pie slice label font and pen from theme
r714 data.m_labelPen = QPen(m_titleBrush.color());
data.m_labelPen.setThemed(true);
}
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 if (data.m_labelFont.isThemed() || m_force) {
Tero Ahola
Defined point sizes for fonts
r717 data.m_labelFont = m_labelFont;
Jani Honkonen
Get pie slice label font and pen from theme
r714 data.m_labelFont.setThemed(true);
}
Jani Honkonen
Polish QPieSlice API by removing the DataPtr stuff
r822 if (PieSliceData::data(s) != data) {
PieSliceData::data(s) = data;
emit PieSliceData::data(s).emitChangedSignal(s);
Michal Klocek
Adds force option to chartTheme...
r645 }
Jani Honkonen
Make pie work better with chartwidgettest
r163 }
}
Marek Rosa
White spaces fixes in Theme and animation classes
r948 void ChartTheme::decorate(QSplineSeries *series, int index)
Marek Rosa
Spline working somewhat
r401 {
Michal Klocek
Revert "Theme change now affects also XY series"...
r644 QPen pen;
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 if(pen == series->pen() || m_force){
Michal Klocek
Revert "Theme change now affects also XY series"...
r644 pen.setColor(m_seriesColors.at(index%m_seriesColors.size()));
pen.setWidthF(2);
series->setPen(pen);
}
Marek Rosa
Spline working somewhat
r401 }
Michal Klocek
Changes QChartAxis -> QAxis
r1006 void ChartTheme::decorate(QAxis *axis,bool axisX)
Tero Ahola
Added axis related modifiers to theme
r548 {
Michal Klocek
Adds force option to chartTheme...
r645 QPen pen;
QBrush brush;
QFont font;
Tero Ahola
Added axis related modifiers to theme
r548 if (axis->isAxisVisible()) {
Michal Klocek
Adds force option to chartTheme...
r645
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 if(brush == axis->labelsBrush() || m_force){
Michal Klocek
Adds force option to chartTheme...
r645 axis->setLabelsBrush(m_axisLabelBrush);
}
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 if(pen == axis->labelsPen() || m_force){
Michal Klocek
Adds force option to chartTheme...
r645 axis->setLabelsPen(Qt::NoPen); // NoPen for performance reasons
}
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 if (axis->shadesVisible() || m_force) {
Michal Klocek
Adds force option to chartTheme...
r645
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 if(brush == axis->shadesBrush() || m_force){
Michal Klocek
Adds force option to chartTheme...
r645 axis->setShadesBrush(m_backgroundShadesBrush);
}
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 if(pen == axis->shadesPen() || m_force){
Michal Klocek
Adds force option to chartTheme...
r645 axis->setShadesPen(m_backgroundShadesPen);
}
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 if( m_force && (m_backgroundShades == BackgroundShadesBoth
Michal Klocek
Adds force option to chartTheme...
r645 || (m_backgroundShades == BackgroundShadesVertical && axisX)
|| (m_backgroundShades == BackgroundShadesHorizontal && !axisX))){
axis->setShadesVisible(true);
}
}
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 if(pen == axis->axisPen() || m_force){
Michal Klocek
Adds force option to chartTheme...
r645 axis->setAxisPen(m_axisLinePen);
}
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 if(pen == axis->gridLinePen() || m_force){
Michal Klocek
Adds force option to chartTheme...
r645 axis->setGridLinePen(m_gridLinePen);
}
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 if(font == axis->labelsFont() || m_force){
Tero Ahola
Defined point sizes for fonts
r717 axis->setLabelsFont(m_labelFont);
Tero Ahola
Added axis related modifiers to theme
r548 }
}
}
Tero Ahola
Theme gradients now generated from a single base color
r507 void ChartTheme::generateSeriesGradients()
{
// Generate gradients in HSV color space
Michal Klocek
Krazy reported errors...
r974 foreach (const QColor& color, m_seriesColors) {
Tero Ahola
Theme gradients now generated from a single base color
r507 QLinearGradient g;
qreal h = color.hsvHueF();
qreal s = color.hsvSaturationF();
// TODO: tune the algorithm to give nice results with most base colors defined in
// most themes. The rest of the gradients we can define manually in theme specific
// implementation.
QColor start = color;
Tero Ahola
Use pure white in the light end of gradients
r656 start.setHsvF(h, 0.0, 1.0);
Tero Ahola
Theme gradients now generated from a single base color
r507 g.setColorAt(0.0, start);
g.setColorAt(0.5, color);
QColor end = color;
end.setHsvF(h, s, 0.25);
g.setColorAt(1.0, end);
m_seriesGradients << g;
}
}
Jani Honkonen
Adding list of series gradients to theme.
r494 QColor ChartTheme::colorAt(const QColor &start, const QColor &end, qreal pos)
{
Marek Rosa
White spaces fixes in Theme and animation classes
r948 Q_ASSERT(pos >= 0.0 && pos <= 1.0);
Jani Honkonen
Adding list of series gradients to theme.
r494 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 ChartTheme::colorAt(const QGradient &gradient, qreal pos)
{
Marek Rosa
White spaces fixes in Theme and animation classes
r948 Q_ASSERT(pos >= 0 && pos <= 1.0);
Jani Honkonen
Adding list of series gradients to theme.
r494
// another possibility:
// http://stackoverflow.com/questions/3306786/get-intermediate-color-from-a-gradient
QGradientStops stops = gradient.stops();
int count = stops.count();
// find previous stop relative to position
QGradientStop prev = stops.first();
Marek Rosa
White spaces fixes in Theme and animation classes
r948 for (int i = 0; i < count; i++) {
Jani Honkonen
Adding list of series gradients to theme.
r494 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();
Marek Rosa
White spaces fixes in Theme and animation classes
r948 for (int i = count - 1; i >= 0; i--) {
Jani Honkonen
Adding list of series gradients to theme.
r494 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);
}
Michal Klocek
Refactor to use qseries private for implmentation interface...
r943 void ChartTheme::setForced(bool enabled)
{
m_force=enabled;
}
Tero Ahola
Refactored themes; now enabled for line, scatter and pies...
r103 QTCOMMERCIALCHART_END_NAMESPACE