From 399cbfcd557c95cf286d881a54448acb52e193f2 2012-01-31 08:27:56 From: Tero Ahola Date: 2012-01-31 08:27:56 Subject: [PATCH] Refactored themes; now enabled for line, scatter and pies Draft themes implemented for most of the series types. The themes are still missing most of the features, only the line color and line width can be defined. --- diff --git a/src/axisitem.cpp b/src/axisitem.cpp index 8de869c..d51adf7 100644 --- a/src/axisitem.cpp +++ b/src/axisitem.cpp @@ -6,9 +6,10 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE -AxisItem::AxisItem(AxisType type,QGraphicsItem* parent): ChartItem(parent), -m_ticks(4), -m_type(type) +AxisItem::AxisItem(AxisType type,QGraphicsItem* parent) : + QGraphicsItem(parent), + m_ticks(4), + m_type(type) { } @@ -16,12 +17,6 @@ AxisItem::~AxisItem() { } -void AxisItem::setSize(const QSize& size) -{ - m_rect = QRectF(QPoint(0,0),size); - createItems(); -} - void AxisItem::setLength(int length) { QPainterPath path; @@ -47,6 +42,25 @@ void AxisItem::setPlotDomain(const PlotDomain& plotDomain) m_plotDomain = plotDomain; createItems(); } + +void AxisItem::setPos(const QPointF & pos) +{ + QGraphicsItem::setPos(pos); +} + +void AxisItem::resize(const QSize &size) +{ + m_rect = QRectF(QPoint(0,0),size); + createItems(); +} + +void AxisItem::setTheme(ChartTheme *theme) +{ + if (theme) { + // TODO: add axis related properties to the theme class and use them here + } +} + /* void AxisItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget) { diff --git a/src/axisitem_p.h b/src/axisitem_p.h index 859c149..4b72836 100644 --- a/src/axisitem_p.h +++ b/src/axisitem_p.h @@ -1,13 +1,13 @@ #ifndef AXISITEM_H_ #define AXISITEM_H_ -#include "chartitem_p.h" #include "plotdomain_p.h" +#include "chartitemcontrol.h" #include QTCOMMERCIALCHART_BEGIN_NAMESPACE -class AxisItem: public ChartItem +class AxisItem: public QGraphicsItem, public ChartItemControl { public: enum AxisType{X_AXIS,Y_AXIS}; @@ -19,10 +19,13 @@ public: QRectF boundingRect() const; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){}; - //from ChartItem - void setSize(const QSize& size); +public: // from ChartItemControl + void setPos (const QPointF & pos); + void resize(const QSize &size); + void setTheme(ChartTheme *theme); void setPlotDomain(const PlotDomain& data); +public: void setLength(int length); void setWidth(int width); AxisType axisType() const {return m_type;}; diff --git a/src/barchart/bar.cpp b/src/barchart/bar.cpp index 8121311..e351172 100644 --- a/src/barchart/bar.cpp +++ b/src/barchart/bar.cpp @@ -4,12 +4,17 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE -Bar::Bar(ChartItem *parent) - : ChartItem(parent) +Bar::Bar(QGraphicsItem *parent) + : QGraphicsItem(parent) { } -void Bar::setSize(const QSize& size) +void Bar::setPos(const QPointF & pos) +{ + QGraphicsItem::setPos(pos); +} + +void Bar::resize(const QSize& size) { mWidth = size.width(); mHeight = size.height(); @@ -20,6 +25,11 @@ void Bar::setPlotDomain(const PlotDomain& data) mPlotDomain = data; } +void Bar::setTheme(ChartTheme *theme) +{ + // TODO +} + void Bar::resize( int w, int h ) { // qDebug() << "bar::resize" << w << h; diff --git a/src/barchart/bar.h b/src/barchart/bar.h index 2142035..3efb6f3 100644 --- a/src/barchart/bar.h +++ b/src/barchart/bar.h @@ -1,20 +1,23 @@ #ifndef BAR_H #define BAR_H -#include "chartitem_p.h" +#include "chartitemcontrol.h" #include "qchartglobal.h" +#include QTCOMMERCIALCHART_BEGIN_NAMESPACE // Single bar item of chart -class Bar : public ChartItem +class Bar : public QGraphicsItem, public ChartItemControl { public: - Bar(ChartItem *parent=0); + Bar(QGraphicsItem *parent=0); - // From ChartItem - virtual void setSize(const QSize& size); - virtual void setPlotDomain(const PlotDomain& data); +public: // from ChartItemControl + void setPos (const QPointF & pos); + void resize(const QSize &size); + void setTheme(ChartTheme *theme); + void setPlotDomain(const PlotDomain& data); // Layout Stuff void resize( int w, int h ); // Size of bar. in screen coordinates. diff --git a/src/barchart/bargroup.cpp b/src/barchart/bargroup.cpp index f19053c..b758265 100644 --- a/src/barchart/bargroup.cpp +++ b/src/barchart/bargroup.cpp @@ -5,7 +5,7 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE BarGroup::BarGroup(BarChartSeries& series, QGraphicsItem *parent) : - ChartItem(parent) + QGraphicsItem(parent) ,mSeries(series) ,mLayoutSet(false) ,mLayoutDirty(true) @@ -14,8 +14,12 @@ BarGroup::BarGroup(BarChartSeries& series, QGraphicsItem *parent) : dataChanged(); } +void BarGroup::setPos(const QPointF & pos) +{ + QGraphicsItem::setPos(pos); +} -void BarGroup::setSize(const QSize& size) +void BarGroup::resize(const QSize& size) { qDebug() << "BarGroup::setSize"; mWidth = size.width(); @@ -31,6 +35,11 @@ void BarGroup::setPlotDomain(const PlotDomain& data) mPlotDomain = data; } +void BarGroup::setTheme(ChartTheme *theme) +{ + // TODO +} + void BarGroup::setBarWidth( int w ) { mBarDefaultWidth = w; diff --git a/src/barchart/bargroup.h b/src/barchart/bargroup.h index 0dc8432..26e751a 100644 --- a/src/barchart/bargroup.h +++ b/src/barchart/bargroup.h @@ -1,20 +1,23 @@ #ifndef QBARGROUP_H #define QBARGROUP_H -#include "chartitem_p.h" +#include "chartitemcontrol.h" #include "bar.h" #include "barchartseries.h" +#include QTCOMMERCIALCHART_BEGIN_NAMESPACE -class BarGroup : public ChartItem +class BarGroup : public QGraphicsItem, public ChartItemControl { public: explicit BarGroup(BarChartSeries& series, QGraphicsItem *parent = 0); - // From ChartItem - virtual void setSize(const QSize& size); - virtual void setPlotDomain(const PlotDomain& data); +public: // from ChartItemControl + void setPos (const QPointF & pos); + void resize(const QSize &size); + void setTheme(ChartTheme *theme); + void setPlotDomain(const PlotDomain& data); // Layout "api" void setPos(qreal x, qreal y); diff --git a/src/barchart/percentbargroup.cpp b/src/barchart/percentbargroup.cpp index af4ed37..c5e61c8 100644 --- a/src/barchart/percentbargroup.cpp +++ b/src/barchart/percentbargroup.cpp @@ -7,19 +7,25 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE StackedBarGroup::StackedBarGroup(StackedBarChartSeries& series, QGraphicsItem *parent) : - ChartItem(parent) - ,mSeries(series) - ,mLayoutSet(false) - ,mLayoutDirty(true) - ,mBarDefaultWidth(20) // TODO: remove hard coding, when we have layout code ready + QGraphicsItem(parent) + ,mSeries(series) + ,mLayoutSet(false) + ,mLayoutDirty(true) + ,mBarDefaultWidth(20) // TODO: remove hard coding, when we have layout code ready { dataChanged(); } -void StackedBarGroup::setSize(const QSize& size) +void StackedBarGroup::setPos(const QPointF & pos) { - qDebug() << "StackedBarGroup::setSize"; + qDebug() << "StackedBarGroup::setPos"; + // TODO: +} + +void StackedBarGroup::resize(const QSize& size) +{ + qDebug() << "StackedBarGroup::resize"; mWidth = size.width(); mHeight = size.height(); layoutChanged(); @@ -32,6 +38,12 @@ void StackedBarGroup::setPlotDomain(const PlotDomain& data) // TODO: } +void StackedBarGroup::setTheme(ChartTheme *theme) +{ + qDebug() << "StackedBarGroup::setTheme"; + // TODO: +} + void StackedBarGroup::setBarWidth( int w ) { mBarDefaultWidth = w; diff --git a/src/barchart/percentbargroup.h b/src/barchart/percentbargroup.h index e049c28..ab3cfb0 100644 --- a/src/barchart/percentbargroup.h +++ b/src/barchart/percentbargroup.h @@ -1,21 +1,25 @@ #ifndef PERCENTBARGROUP_H #define PERCENTBARGROUP_H -#include "chartitem_p.h" +#include "chartitemcontrol.h" #include "bar.h" #include "percentbarchartseries.h" +#include QTCOMMERCIALCHART_BEGIN_NAMESPACE -class PercentBarGroup : public ChartItem +class PercentBarGroup : public QGraphicsItem, public ChartItemControl { public: PercentBarGroup(PercentBarChartSeries& series, QGraphicsItem *parent = 0); - // From ChartItem - virtual void setSize(const QSize& size); - virtual void setPlotDomain(const PlotDomain& data); +public: // From ChartItemControl + void setPos(const QPointF & pos); + void resize(const QSize &size); + void setTheme(ChartTheme *theme); + void setPlotDomain(const PlotDomain& data); +public: // Layout "api" void setPos(qreal x, qreal y); void setBarWidth( int w ); // Default width for each bar diff --git a/src/barchart/stackedbargroup.cpp b/src/barchart/stackedbargroup.cpp index 28242b3..cdbc755 100644 --- a/src/barchart/stackedbargroup.cpp +++ b/src/barchart/stackedbargroup.cpp @@ -5,19 +5,24 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE PercentBarGroup::PercentBarGroup(PercentBarChartSeries& series, QGraphicsItem *parent) : - ChartItem(parent) - ,mSeries(series) - ,mLayoutSet(false) - ,mLayoutDirty(true) - ,mBarDefaultWidth(20) // TODO: remove hard coding, when we have layout code ready + QGraphicsItem(parent) + ,mSeries(series) + ,mLayoutSet(false) + ,mLayoutDirty(true) + ,mBarDefaultWidth(20) // TODO: remove hard coding, when we have layout code ready { dataChanged(); } +void PercentBarGroup::setPos(const QPointF & pos) +{ + qDebug() << "PercentBarGroup::setPos"; + // TODO: +} -void PercentBarGroup::setSize(const QSize& size) +void PercentBarGroup::resize(const QSize& size) { - qDebug() << "PercentBarGroup::setSize"; + qDebug() << "PercentBarGroup::resize"; mWidth = size.width(); mHeight = size.height(); layoutChanged(); @@ -30,6 +35,12 @@ void PercentBarGroup::setPlotDomain(const PlotDomain& data) // TODO: } +void PercentBarGroup::setTheme(ChartTheme *theme) +{ + qDebug() << "PercentBarGroup::setTheme"; + // TODO: +} + void PercentBarGroup::setBarWidth( int w ) { mBarDefaultWidth = w; diff --git a/src/barchart/stackedbargroup.h b/src/barchart/stackedbargroup.h index 7f8e33d..09ee983 100644 --- a/src/barchart/stackedbargroup.h +++ b/src/barchart/stackedbargroup.h @@ -1,22 +1,25 @@ #ifndef STACKEDBARGROUP_H #define STACKEDBARGROUP_H -#include "chartitem_p.h" +#include "chartitemcontrol.h" #include "bar.h" #include "stackedbarchartseries.h" +#include QTCOMMERCIALCHART_BEGIN_NAMESPACE -class StackedBarGroup : public ChartItem +class StackedBarGroup : public QGraphicsItem, public ChartItemControl { public: StackedBarGroup(StackedBarChartSeries& series, QGraphicsItem *parent = 0); - // From ChartItem - virtual void setSize(const QSize& size); - virtual void setPlotDomain(const PlotDomain& data); +public: // From ChartItemControl + void setPos(const QPointF & pos); + void resize(const QSize &size); + void setTheme(ChartTheme *theme); + void setPlotDomain(const PlotDomain& data); - // Layout "api" +public: // Layout "api" void setPos(qreal x, qreal y); void setBarWidth( int w ); // Default width for each bar diff --git a/src/chartitem_p.h b/src/chartitem_p.h deleted file mode 100644 index 97b928e..0000000 --- a/src/chartitem_p.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef CHARTITEM_H_ -#define CHARTITEM_H_ - -#include "plotdomain_p.h" -#include - -QTCOMMERCIALCHART_BEGIN_NAMESPACE - -class ChartItem : public QGraphicsItem -{ - enum ChartItemTypes{ AXIS_ITEM = UserType+1, XYLINE_ITEM}; -public: - ChartItem(QGraphicsItem* parent = 0):QGraphicsItem(parent){}; - virtual ~ChartItem(){}; - - virtual void setSize(const QSize& size) = 0; - virtual void setPlotDomain(const PlotDomain& data) = 0; -}; - -QTCOMMERCIALCHART_END_NAMESPACE - -#endif /* CHARTITEM_H_ */ diff --git a/src/chartitemcontrol.h b/src/chartitemcontrol.h new file mode 100644 index 0000000..852a602 --- /dev/null +++ b/src/chartitemcontrol.h @@ -0,0 +1,24 @@ +#ifndef CHARTITEMCONTROL_H +#define CHARTITEMCONTROL_H + +#include "plotdomain_p.h" +#include +#include + +QTCOMMERCIALCHART_BEGIN_NAMESPACE + +class ChartTheme; +class PlotDomain; + +class ChartItemControl +{ +public: + virtual void setPos (const QPointF & pos) = 0; + virtual void resize(const QSize &size) = 0; + virtual void setTheme(ChartTheme *theme) = 0; + virtual void setPlotDomain(const PlotDomain& data) = 0; +}; + +QTCOMMERCIALCHART_END_NAMESPACE + +#endif // CHARTITEMCONTROL_H diff --git a/src/charttheme.cpp b/src/charttheme.cpp new file mode 100644 index 0000000..378296b --- /dev/null +++ b/src/charttheme.cpp @@ -0,0 +1,102 @@ +#include "charttheme_p.h" +#include "qchart.h" + +QTCOMMERCIALCHART_BEGIN_NAMESPACE + +void ChartThemeData::setTheme(int theme) +{ + if (theme == m_currentTheme) return; + + m_seriesThemes.clear(); + m_seriesIndex = 0; + m_currentTheme = theme; + + switch (theme) { + case QChart::ChartThemeDefault: + // line: solid, dashed, dotted + // line width: 1 + // line color (and opacity) + // line shadow (on/off) + // marker shape: "x", "o", "." + // TODO: define the default theme based on the OS + m_seriesThemes.append(SeriesTheme(m_seriesThemes.count(), QRgb(0xff000000), 2)); + m_seriesThemes.append(SeriesTheme(m_seriesThemes.count(), QRgb(0xff707070), 2)); + m_gradientStartColor = QColor(QRgb(0xffffffff)); + m_gradientEndColor = QColor(QRgb(0xffafafaf)); + break; + case QChart::ChartThemeVanilla: + m_seriesThemes.append(SeriesTheme(m_seriesThemes.count(), QColor(217, 197, 116), 10)); + m_seriesThemes.append(SeriesTheme(m_seriesThemes.count(), QColor(214, 168, 150), 10)); + m_seriesThemes.append(SeriesTheme(m_seriesThemes.count(), QColor(160, 160, 113), 10)); + m_seriesThemes.append(SeriesTheme(m_seriesThemes.count(), QColor(210, 210, 52), 10)); + m_seriesThemes.append(SeriesTheme(m_seriesThemes.count(), QColor(136, 114, 58), 10)); + + m_gradientStartColor = QColor(QRgb(0xff9d844d)); + m_gradientEndColor = QColor(QRgb(0xffafafaf)); + break; + case QChart::ChartThemeIcy: + m_seriesThemes.append(SeriesTheme(m_seriesThemes.count(), QColor(0, 3, 165), 2)); + m_seriesThemes.append(SeriesTheme(m_seriesThemes.count(), QColor(49, 52, 123), 2)); + m_seriesThemes.append(SeriesTheme(m_seriesThemes.count(), QColor(71, 114, 187), 2)); + m_seriesThemes.append(SeriesTheme(m_seriesThemes.count(), QColor(48, 97, 87), 2)); + m_seriesThemes.append(SeriesTheme(m_seriesThemes.count(), QColor(19, 71, 90), 2)); + m_seriesThemes.append(SeriesTheme(m_seriesThemes.count(), QColor(110, 70, 228), 2)); + + m_gradientStartColor = QColor(QRgb(0xffe4ffff)); + m_gradientEndColor = QColor(QRgb(0xffe4ffff)); + break; + case QChart::ChartThemeGrayscale: + m_seriesThemes.append(SeriesTheme(m_seriesThemes.count(), QColor(0, 0, 0), 2)); + m_seriesThemes.append(SeriesTheme(m_seriesThemes.count(), QColor(50, 50, 50), 2)); + m_seriesThemes.append(SeriesTheme(m_seriesThemes.count(), QColor(100, 100, 100), 2)); + m_seriesThemes.append(SeriesTheme(m_seriesThemes.count(), QColor(140, 140, 140), 2)); + m_seriesThemes.append(SeriesTheme(m_seriesThemes.count(), QColor(180, 180, 180), 2)); + + m_gradientStartColor = QColor(QRgb(0xffffffff)); + m_gradientEndColor = QColor(QRgb(0xffafafaf)); + break; + case QChart::ChartThemeUnnamed1: + m_seriesThemes.append(SeriesTheme(m_seriesThemes.count(), QColor(QRgb(0xff3fa9f5)), 2)); + m_seriesThemes.append(SeriesTheme(m_seriesThemes.count(), QColor(QRgb(0xff7AC943)), 2)); + m_seriesThemes.append(SeriesTheme(m_seriesThemes.count(), QColor(QRgb(0xffFF931E)), 2)); + m_seriesThemes.append(SeriesTheme(m_seriesThemes.count(), QColor(QRgb(0xffFF1D25)), 2)); + m_seriesThemes.append(SeriesTheme(m_seriesThemes.count(), QColor(QRgb(0xffFF7BAC)), 2)); + + m_gradientStartColor = QColor(QRgb(0xfff3dc9e)); + m_gradientEndColor = QColor(QRgb(0xffafafaf)); + break; + default: + Q_ASSERT(false); + break; + } + + //themeChanged(); + // TODO: update coloring of different elements to match the selected theme +} + +ChartTheme::ChartTheme(QObject *parent) : + QObject(parent), + d(new ChartThemeData()) +{ + d->m_currentTheme = QChart::ChartThemeInvalid; + d->m_seriesIndex = 0; +} + +SeriesTheme ChartTheme::themeForSeries() +{ + if (d->m_seriesThemes.count() == 0) { + return SeriesTheme(); + } else { + // Get the next available theme for the series; if no more themes available start over + // beginning from the first theme in the list + SeriesTheme nextTheme = + d->m_seriesThemes[d->m_seriesIndex % d->m_seriesThemes.count()]; + d->m_seriesIndex++; + return nextTheme; + } +} + + +#include "moc_charttheme_p.cpp" + +QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/charttheme_p.h b/src/charttheme_p.h new file mode 100644 index 0000000..928a756 --- /dev/null +++ b/src/charttheme_p.h @@ -0,0 +1,80 @@ +#ifndef CHARTTHEME_H +#define CHARTTHEME_H + +#include "qchartglobal.h" +#include +#include +#include +#include +#include + +QTCOMMERCIALCHART_BEGIN_NAMESPACE + +/*! + * The theme specific settings for the appearance of a series. TODO: These can be overridden by setting + * custom settings to a QChartSeries object. + */ +struct SeriesTheme { +public: +// SeriesTheme() : +// themeIndex(-1), lineColor(QColor()) {} +// SeriesTheme(int index, QColor line) : +// themeIndex(index), lineColor(line) {} + SeriesTheme() : + themeIndex(-1), linePen(QPen()), markerPen(QPen()) {} + SeriesTheme(int index, QColor lineColor, qreal lineWidth/*, QPen marker*/) : + themeIndex(index), + linePen(QPen(QBrush(lineColor), lineWidth)), + markerPen(linePen) {} + +//const QBrush & brush, qreal width, Qt::PenStyle style = Qt::SolidLine, Qt::PenCapStyle cap = Qt::SquareCap, Qt::PenJoinStyle join = Qt::BevelJo + int themeIndex; + // TODO: + //QColor lineColor; + QPen linePen; + //QBrush lineBrush; + QPen markerPen; + //QBrush markerBrush; +}; + +/*! + * Explicitly shared data class for the themes. + */ +class ChartThemeData : public QSharedData +{ +public: + ChartThemeData() : m_currentTheme(0) {} + ~ChartThemeData() {} + +public: + void setTheme(int theme); + +public: + int m_currentTheme; + QColor m_gradientStartColor; + QColor m_gradientEndColor; + QList m_seriesThemes; + int m_seriesIndex; +}; + +class ChartTheme : public QObject +{ + Q_OBJECT +public: + explicit ChartTheme(QObject *parent = 0); + explicit ChartTheme(const ChartTheme &other) : d(other.d) {} + void operator =(const ChartTheme &other) { d = other.d; } + +//signals: +// void themeChanged(ChartTheme theme); + SeriesTheme themeForSeries(); + +public: + // All the graphical elements of a QChart share the same theme settings + // so let's use explicitly shared data + QExplicitlySharedDataPointer d; +}; + +QTCOMMERCIALCHART_END_NAMESPACE + +#endif // CHARTTHEME_H diff --git a/src/pieslice.cpp b/src/pieslice.cpp index 850bc84..0c23770 100644 --- a/src/pieslice.cpp +++ b/src/pieslice.cpp @@ -46,14 +46,10 @@ QPainterPath PieSlice::shape() const void PieSlice::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { - // Setup painter - painter->setBrush(m_color); painter->setRenderHint(QPainter::Antialiasing); - QPen pen; - //pen.setColor(m_color.darker()); - pen.setColor(Qt::gray); - pen.setWidth(1); - painter->setPen(pen); + painter->setPen(m_theme.linePen); + // TODO: + painter->setBrush(m_theme.linePen.color()); // From Qt docs: // The startAngle and spanAngle must be specified in 1/16th of a degree, i.e. a full circle equals 5760 (16 * 360). diff --git a/src/pieslice.h b/src/pieslice.h index 72f95f1..67fdcdf 100644 --- a/src/pieslice.h +++ b/src/pieslice.h @@ -2,6 +2,7 @@ #define PIESLICE_H #include "qchartglobal.h" +#include "charttheme_p.h" #include #include #include @@ -25,6 +26,7 @@ public: qreal m_startAngle; qreal m_span; QRectF m_rect; + SeriesTheme m_theme; }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/qchart.cpp b/src/qchart.cpp index 81b2e3e..a4b497f 100644 --- a/src/qchart.cpp +++ b/src/qchart.cpp @@ -3,6 +3,7 @@ #include "qscatterseries.h" #include "qscatterseries_p.h" #include "qpieseries.h" +#include "qpieseries_p.h" #include "qxychartseries.h" #include "qchartaxis.h" #include "barchartseries.h" @@ -11,6 +12,8 @@ #include "stackedbargroup.h" #include "percentbarchartseries.h" #include "percentbargroup.h" +#include "charttheme_p.h" +#include "chartitemcontrol.h" #include "xylinechartitem_p.h" #include "plotdomain_p.h" @@ -25,16 +28,17 @@ QChart::QChart(QGraphicsObject* parent) : QGraphicsObject(parent), m_titleItem(0), m_axisXItem(new AxisItem(AxisItem::X_AXIS,this)), m_plotDataIndex(0), - m_marginSize(0) + m_marginSize(0), + m_chartTheme(new ChartTheme()) { // TODO: the default theme? setTheme(QChart::ChartThemeDefault); PlotDomain domain; - m_plotDomainList<(series); - // Use color defined by theme in case the series does not define a custom color - - if (!xyseries->pen().color().isValid() && m_themeColors.count()) //TODO: wtf - xyseries->setPen(nextColor()); - m_plotDataIndex = 0 ; m_plotDomainList.resize(1); @@ -76,9 +75,12 @@ void QChart::addSeries(QChartSeries* series) } XYLineChartItem* item = new XYLineChartItem(xyseries,this); - m_chartItems<setTheme(m_chartTheme); + + foreach(ChartItemControl* i, m_chartItemControls) i->setPlotDomain(m_plotDomainList.at(m_plotDataIndex)); break; @@ -96,7 +98,7 @@ void QChart::addSeries(QChartSeries* series) barGroup->addColor(QColor(0,0,255,128)); barGroup->addColor(QColor(255,128,0,128)); - m_chartItems<addColor(QColor(0,0,255,128)); stackedBarGroup->addColor(QColor(255,128,0,128)); - m_chartItems<addColor(QColor(0,0,255,128)); percentBarGroup->addColor(QColor(255,128,0,128)); - m_chartItems<(series); + scatterSeries->d->m_theme = m_chartTheme->themeForSeries(); scatterSeries->d->setParentItem(this); - // Set pre-defined colors in case the series has no colors defined - if (!scatterSeries->markerColor().isValid()) - scatterSeries->setMarkerColor(nextColor()); - connect(this, SIGNAL(sizeChanged(QRectF)), - scatterSeries, SLOT(chartSizeChanged(QRectF))); -// QColor nextColor = m_themeColors.takeFirst(); -// nextColor.setAlpha(150); // TODO: default opacity? -// scatterSeries->setMarkerColor(nextColor); + m_chartItemControls << scatterSeries->d; + //TODO:? scatterSeries->d->m_themeIndex = m_chartSeries.count() - 1; break; } case QChartSeries::SeriesTypePie: { QPieSeries *pieSeries = qobject_cast(series); - for (int i(0); i < pieSeries->sliceCount(); i++) { - if (!pieSeries->sliceColor(i).isValid()) - pieSeries->setSliceColor(i, nextColor()); - } - connect(this, SIGNAL(sizeChanged(QRectF)), - pieSeries, SLOT(chartSizeChanged(QRectF))); +// for (int i(0); i < pieSeries->sliceCount(); i++) { +// if (!pieSeries->sliceColor(i).isValid()) +// pieSeries->setSliceColor(i, nextColor()); +// } + pieSeries->d->setTheme(m_chartTheme); + m_chartItemControls << pieSeries->d; // Set pre-defined colors in case the series has no colors defined // TODO: how to define the color for all the slices of a pie? @@ -217,27 +214,19 @@ void QChart::setSize(const QSize& size) } //recalculate background gradient - if(m_backgroundItem){ + if (m_backgroundItem) { m_backgroundItem->setRect(rect); - if(m_bacgroundOrinetation==HorizonatlGradientOrientation) - m_backgroundGradient.setFinalStop(m_backgroundItem->rect().width(),0); + if (m_bacgroundOrinetation == HorizonatlGradientOrientation) + m_backgroundGradient.setFinalStop(m_backgroundItem->rect().width(), 0); else - m_backgroundGradient.setFinalStop(0,m_backgroundItem->rect().height()); - + m_backgroundGradient.setFinalStop(0, m_backgroundItem->rect().height()); m_backgroundItem->setBrush(m_backgroundGradient); } - //resize elements - foreach (ChartItem* item ,m_chartItems) { - item->setPos(rect.topLeft()); - item->setSize(rect.size()); - + foreach (ChartItemControl *ctrl, m_chartItemControls) { + ctrl->setPos(rect.topLeft()); + ctrl->resize(rect.size()); } - // TODO: TTD for setting scale - //emit scaleChanged(100, 100); - // TODO: calculate the origo - // TODO: not sure if emitting a signal here is the best from performance point of view - emit sizeChanged(QRectF(0, 0, size.width(), size.height())); update(); } @@ -251,8 +240,8 @@ void QChart::setBackground(const QColor& startColor, const QColor& endColor, Gra } m_bacgroundOrinetation = orientation; - m_backgroundGradient.setColorAt( 0.0, startColor); - m_backgroundGradient.setColorAt( 1.0, endColor); + m_backgroundGradient.setColorAt(0.0, startColor); + m_backgroundGradient.setColorAt(1.0, endColor); m_backgroundGradient.setStart(0,0); if(orientation == VerticalGradientOrientation){ @@ -285,86 +274,15 @@ void QChart::setMargin(int margin) void QChart::setTheme(QChart::ChartThemeId theme) { -// if (theme != m_currentTheme) { - m_themeColors.clear(); - - // TODO: define color themes - switch (theme) { - case QChart::ChartThemeDefault: - // TODO: define the default theme based on the OS - m_themeColors.append(QColor(QRgb(0xff000000))); - m_themeColors.append(QColor(QRgb(0xff707070))); - setBackground(QColor(QRgb(0xffffffff)), QColor(QRgb(0xffafafaf)), VerticalGradientOrientation); - break; - case QChart::ChartThemeVanilla: - m_themeColors.append(QColor(217, 197, 116)); - m_themeColors.append(QColor(214, 168, 150)); - m_themeColors.append(QColor(160, 160, 113)); - m_themeColors.append(QColor(210, 210, 52)); - m_themeColors.append(QColor(136, 114, 58)); - - setBackground(QColor(QRgb(0xff9d844d)), QColor(QRgb(0xffafafaf)), VerticalGradientOrientation); - break; - case QChart::ChartThemeIcy: - m_themeColors.append(QColor(0, 3, 165)); - m_themeColors.append(QColor(49, 52, 123)); - m_themeColors.append(QColor(71, 114, 187)); - m_themeColors.append(QColor(48, 97, 87)); - m_themeColors.append(QColor(19, 71, 90)); - m_themeColors.append(QColor(110, 70, 228)); - - setBackground(QColor(QRgb(0xffe4ffff)), QColor(QRgb(0xffe4ffff)), VerticalGradientOrientation); - break; - case QChart::ChartThemeGrayscale: - m_themeColors.append(QColor(0, 0, 0)); - m_themeColors.append(QColor(50, 50, 50)); - m_themeColors.append(QColor(100, 100, 100)); - m_themeColors.append(QColor(140, 140, 140)); - m_themeColors.append(QColor(180, 180, 180)); - - setBackground(QColor(QRgb(0xffffffff)), QColor(QRgb(0xffafafaf)), VerticalGradientOrientation); - break; - case QChart::ChartThemeUnnamed1: - m_themeColors.append(QColor(QRgb(0xff3fa9f5))); - m_themeColors.append(QColor(QRgb(0xff7AC943))); - m_themeColors.append(QColor(QRgb(0xffFF931E))); - m_themeColors.append(QColor(QRgb(0xffFF1D25))); - m_themeColors.append(QColor(QRgb(0xffFF7BAC))); - - setBackground(QColor(QRgb(0xfff3dc9e)), QColor(QRgb(0xffafafaf)), VerticalGradientOrientation); - break; - default: - Q_ASSERT(false); - break; - } - - if(m_backgroundItem){ - m_backgroundItem->setBrush(m_backgroundGradient); - m_backgroundItem->setPen(Qt::NoPen); - } - - foreach(QChartSeries* series, m_chartSeries) { - // TODO: other series interested on themes? - if (series->type() == QChartSeries::SeriesTypeLine) { - QXYChartSeries *lineseries = reinterpret_cast(series); - lineseries->setPen(nextColor()); - } else if (series->type() == QChartSeries::SeriesTypeScatter) { - QScatterSeries *scatter = qobject_cast(series); - scatter->setMarkerColor(nextColor()); - } else if (series->type() == QChartSeries::SeriesTypePie) { - QPieSeries *pieSeries = qobject_cast(series); - for (int i(0); i < pieSeries->sliceCount(); i++) - pieSeries->setSliceColor(i, nextColor()); - } + if (theme != m_chartTheme->d->m_currentTheme) { + m_chartTheme->d->setTheme(theme); + setBackground(m_chartTheme->d->m_gradientStartColor, + m_chartTheme->d->m_gradientEndColor, + m_bacgroundOrinetation); + foreach (ChartItemControl *ctrl, m_chartItemControls) + ctrl->setTheme(m_chartTheme); + update(); } - update(); -} - -QColor QChart::nextColor() -{ - QColor nextColor = m_themeColors.first(); - m_themeColors.move(0, m_themeColors.size() - 1); - return nextColor; } void QChart::zoomInToRect(const QRect& rectangle) @@ -385,8 +303,8 @@ void QChart::zoomInToRect(const QRect& rectangle) m_plotDomainList<setPlotDomain(m_plotDomainList[m_plotDataIndex]); + foreach (ChartItemControl* ctrl, m_chartItemControls) + ctrl->setPlotDomain(m_plotDomainList[m_plotDataIndex]); update(); } @@ -394,7 +312,7 @@ void QChart::zoomIn() { if (m_plotDataIndex < m_plotDomainList.count() - 1) { m_plotDataIndex++; - foreach (ChartItem* item ,m_chartItems) + foreach (ChartItemControl* item, m_chartItemControls) item->setPlotDomain(m_plotDomainList[m_plotDataIndex]); update(); } else { @@ -410,7 +328,7 @@ void QChart::zoomOut() { if (m_plotDataIndex > 0) { m_plotDataIndex--; - foreach (ChartItem* item ,m_chartItems) + foreach (ChartItemControl* item, m_chartItemControls) item->setPlotDomain(m_plotDomainList[m_plotDataIndex]); update(); } @@ -420,7 +338,7 @@ void QChart::zoomReset() { if (m_plotDataIndex > 0) { m_plotDataIndex = 0; - foreach (ChartItem* item ,m_chartItems) + foreach (ChartItemControl* item, m_chartItemControls) item->setPlotDomain(m_plotDomainList[m_plotDataIndex]); update(); } diff --git a/src/qchart.h b/src/qchart.h index f1501fb..612d6ff 100644 --- a/src/qchart.h +++ b/src/qchart.h @@ -12,9 +12,10 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE class AxisItem; class QChartSeries; class PlotDomain; -class ChartItem; class BarGroup; class QChartAxis; +class ChartTheme; +class ChartItemControl; // TODO: We don't need to have QChart tied to QGraphicsItem: //class QTCOMMERCIALCHART_EXPORT QChart @@ -33,8 +34,9 @@ public: VerticalGradientOrientation }; enum ChartThemeId { + ChartThemeInvalid = -1, /*! The default theme follows the GUI style of the Operating System */ - ChartThemeDefault = 0, + ChartThemeDefault, ChartThemeVanilla, ChartThemeIcy, ChartThemeGrayscale, @@ -75,14 +77,7 @@ public: private: void setAxis(AxisItem *item, const QChartAxis& axis); -signals: - //TODO chage to const QSize& size - void sizeChanged(QRectF rect); - void scaleChanged(qreal xscale, qreal yscale); - private: - QColor nextColor(); - Q_DISABLE_COPY(QChart) QGraphicsRectItem* m_backgroundItem; QLinearGradient m_backgroundGradient; @@ -91,12 +86,12 @@ private: AxisItem* m_axisXItem; QList m_axisYItem; QRect m_rect; - QList m_chartSeries; + QList m_chartSeries; + QList m_chartItemControls; QVector m_plotDomainList; - QList m_chartItems; int m_plotDataIndex; int m_marginSize; - QList m_themeColors; + ChartTheme *m_chartTheme; }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/qpieseries.cpp b/src/qpieseries.cpp index 2a2b8e8..0c9a9db 100644 --- a/src/qpieseries.cpp +++ b/src/qpieseries.cpp @@ -1,78 +1,80 @@ +#include "qpieseries_p.h" #include "qpieseries.h" -#include "pieslice.h" #include +#include "pieslice.h" #include QTCOMMERCIALCHART_BEGIN_NAMESPACE -QPieSeries::QPieSeries(QGraphicsObject *parent) : - QChartSeries(parent), +QPieSeriesPrivate::QPieSeriesPrivate() : m_sizeFactor(1.0), - m_position(PiePositionMaximized) + m_position(QPieSeries::PiePositionMaximized) { } -QPieSeries::~QPieSeries() +QPieSeriesPrivate::~QPieSeriesPrivate() { while (m_slices.count()) delete m_slices.takeLast(); } -bool QPieSeries::setData(QList data) +bool QPieSeriesPrivate::setData(QList data) { m_data = data; - // Create slices - qreal fullPie = 360; - qreal total = 0; - foreach (qreal value, m_data) - total += value; + if (m_parentItem) { + // Create slices + qreal fullPie = 360; + qreal total = 0; + foreach (qreal value, m_data) + total += value; + + m_chartSize = m_parentItem->boundingRect(); + qreal angle = 0; + // TODO: no need to create new slices in case size changed; we should re-use the existing ones + foreach (qreal value, m_data) { + qreal span = value / total * fullPie; + PieSlice *slice = new PieSlice(QColor(), angle, span, m_parentItem->boundingRect()); + slice->setParentItem(m_parentItem); + m_slices.append(slice); + angle += span; + } - QGraphicsItem *parentItem = qobject_cast(parent()); - Q_ASSERT(parentItem); - m_chartSize = parentItem->boundingRect(); - qreal angle = 0; - // TODO: no need to create new slices in case size changed; we should re-use the existing ones - foreach (qreal value, m_data) { - qreal span = value / total * fullPie; - PieSlice *slice = new PieSlice(QColor(), angle, span, parentItem->boundingRect()); - slice->setParentItem(parentItem); - m_slices.append(slice); - angle += span; + setTheme(m_chartTheme); + resizeSlices(m_chartSize); } - resizeSlices(m_chartSize); return true; } -void QPieSeries::setSliceColor(int index, QColor color) +void QPieSeriesPrivate::setPos(const QPointF & pos) { - if (index >= 0 && index < m_slices.count()) - m_slices.at(index)->m_color = color; + // TODO } -QColor QPieSeries::sliceColor(int index) +void QPieSeriesPrivate::resize(const QSize &size) { - if (index >= 0 && index < m_slices.count()) - return m_slices.at(index)->m_color; - else - return QColor(); + // TODO: allow user setting the size? + // TODO: allow user defining the margins? + m_chartSize = QRect(0, 0, size.width(), size.height()); + resizeSlices(m_chartSize); } -int QPieSeries::sliceCount() +void QPieSeriesPrivate::setTheme(ChartTheme *theme) { - return m_slices.count(); + if (theme) { + m_chartTheme = theme; + for (int i(0); i < m_slices.count(); i++) + m_slices.at(i)->m_theme = theme->themeForSeries(); + } } -void QPieSeries::chartSizeChanged(QRectF chartRect) +void QPieSeriesPrivate::setPlotDomain(const PlotDomain& plotDomain) { - // TODO: allow user setting the size? - // TODO: allow user defining the margins? - m_chartSize = chartRect; - resizeSlices(m_chartSize); + // TODO } -void QPieSeries::resizeSlices(QRectF rect) +void QPieSeriesPrivate::resizeSlices(QRectF rect) { QRectF tempRect = rect; if (tempRect.width() < tempRect.height()) { @@ -86,25 +88,25 @@ void QPieSeries::resizeSlices(QRectF rect) } switch (m_position) { - case PiePositionTopLeft: { + case QPieSeries::PiePositionTopLeft: { tempRect.setHeight(tempRect.height() / 2); tempRect.setWidth(tempRect.height()); tempRect.moveCenter(QPointF(rect.center().x() / 2, rect.center().y() / 2)); break; } - case PiePositionTopRight: { + case QPieSeries::PiePositionTopRight: { tempRect.setHeight(tempRect.height() / 2); tempRect.setWidth(tempRect.height()); tempRect.moveCenter(QPointF((rect.center().x() / 2) * 3, rect.center().y() / 2)); break; } - case PiePositionBottomLeft: { + case QPieSeries::PiePositionBottomLeft: { tempRect.setHeight(tempRect.height() / 2); tempRect.setWidth(tempRect.height()); tempRect.moveCenter(QPointF(rect.center().x() / 2, (rect.center().y() / 2) * 3)); break; } - case PiePositionBottomRight: { + case QPieSeries::PiePositionBottomRight: { tempRect.setHeight(tempRect.height() / 2); tempRect.setWidth(tempRect.height()); tempRect.moveCenter(QPointF((rect.center().x() / 2) * 3, (rect.center().y() / 2) * 3)); @@ -118,23 +120,65 @@ void QPieSeries::resizeSlices(QRectF rect) slice->m_rect = tempRect; } +QPieSeries::QPieSeries(QGraphicsObject *parent) : + QChartSeries(parent), + d(new QPieSeriesPrivate()) +{ + QGraphicsItem *parentItem = qobject_cast(parent); + if (parentItem) + d->m_parentItem = parentItem; +} + +QPieSeries::~QPieSeries() +{ + delete d; +} + +bool QPieSeries::setData(QList data) +{ + return d->setData(data); +} + +void QPieSeries::setSliceColor(int index, QColor color) +{ + if (index >= 0 && index < d->m_slices.count()) + d->m_slices.at(index)->m_color = color; +} + +QColor QPieSeries::sliceColor(int index) +{ + if (index >= 0 && index < d->m_slices.count()) + return d->m_slices.at(index)->m_color; + else + return QColor(); +} + +int QPieSeries::sliceCount() +{ + return d->m_slices.count(); +} + void QPieSeries::setSizeFactor(qreal factor) { if (factor > 0.0) - m_sizeFactor = factor; - resizeSlices(m_chartSize); + d->m_sizeFactor = factor; + d->resizeSlices(d->m_chartSize); // Initiate update via the parent graphics item // TODO: potential issue: what if this function is called from the parent context? - QGraphicsItem *parentItem = qobject_cast(parent()); - Q_ASSERT(parentItem); - parentItem->update(); + if (d->m_parentItem) + d->m_parentItem->update(); +} + +qreal QPieSeries::sizeFactor() +{ + return d->m_sizeFactor; } void QPieSeries::setPosition(PiePosition position) { - m_position = position; - resizeSlices(m_chartSize); + d->m_position = position; + d->resizeSlices(d->m_chartSize); // Initiate update via the parent graphics item // TODO: potential issue: what if this function is called from the parent context? diff --git a/src/qpieseries.h b/src/qpieseries.h index 5dda1de..01ad966 100644 --- a/src/qpieseries.h +++ b/src/qpieseries.h @@ -8,6 +8,7 @@ class QGraphicsObject; QTCOMMERCIALCHART_BEGIN_NAMESPACE +class QPieSeriesPrivate; class PieSlice; class QTCOMMERCIALCHART_EXPORT QPieSeries : public QChartSeries @@ -37,23 +38,14 @@ public: QColor sliceColor(int index); int sliceCount(); void setSizeFactor(qreal sizeFactor); - qreal sizeFactor() { return m_sizeFactor; } + qreal sizeFactor(); void setPosition(PiePosition position); -public Q_SLOTS: - void chartSizeChanged(QRectF rect); - private: - void resizeSlices(QRectF rect); - //Q_DECLARE_PRIVATE(QPieSeries) + Q_DECLARE_PRIVATE(QPieSeries) Q_DISABLE_COPY(QPieSeries) friend class QChart; - // TODO: move the followin to internal impl - QList m_data; - QList m_slices; - QRectF m_chartSize; - qreal m_sizeFactor; - PiePosition m_position; + QPieSeriesPrivate *const d; }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/qpieseries_p.h b/src/qpieseries_p.h new file mode 100644 index 0000000..4d380cc --- /dev/null +++ b/src/qpieseries_p.h @@ -0,0 +1,40 @@ +#ifndef PIESERIESPRIVATE_H +#define PIESERIESPRIVATE_H + +#include "chartitemcontrol.h" +#include "qpieseries.h" +#include +#include + +class QGraphicsItem; +QTCOMMERCIALCHART_BEGIN_NAMESPACE +class PieSlice; + +class QPieSeriesPrivate : public ChartItemControl +{ +public: + // TODO: use a generic data class instead of x and y + QPieSeriesPrivate(); + ~QPieSeriesPrivate(); + +public: // from ChartItemControl + void setPos(const QPointF & pos); + void resize(const QSize &size); + void setTheme(ChartTheme *theme); + void setPlotDomain(const PlotDomain& data); + +public: + bool setData(QList data); + void resizeSlices(QRectF rect); + QGraphicsItem *m_parentItem; + QList m_data; + QList m_slices; + QRectF m_chartSize; + qreal m_sizeFactor; + QPieSeries::PiePosition m_position; + ChartTheme *m_chartTheme; +}; + +QTCOMMERCIALCHART_END_NAMESPACE + +#endif // PIESERIESPRIVATE_H diff --git a/src/qscatterseries.cpp b/src/qscatterseries.cpp index 3c712af..3a0bf4f 100644 --- a/src/qscatterseries.cpp +++ b/src/qscatterseries.cpp @@ -39,14 +39,19 @@ QRectF QScatterSeriesPrivate::boundingRect() const void QScatterSeriesPrivate::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { - QPen pen = painter->pen(); - QBrush brush = pen.brush(); - // TODO: The opacity should be user definable... + // TODO: The opacity should be user definable? //brush.setColor(QColor(255, 82, 0, 100)); - brush.setColor(m_markerColor); - pen.setBrush(brush); - pen.setWidth(4); - painter->setPen(pen); + if (m_markerColor.isValid()) { + QPen pen = painter->pen(); + QBrush brush = pen.brush(); + brush.setColor(m_markerColor); + pen.setBrush(brush); + pen.setWidth(4); + painter->setPen(pen); + } + else + painter->setPen(m_theme.markerPen); +// brush.setColor(m_theme..lineColor); // TODO: m_scenex and m_sceny are left empty during construction -> we would need a resize // event right after construction or maybe given a size during initialization @@ -57,6 +62,26 @@ void QScatterSeriesPrivate::paint(QPainter *painter, const QStyleOptionGraphicsI } } +void QScatterSeriesPrivate::setPos(const QPointF & pos) +{ + // TODO +} + +void QScatterSeriesPrivate::resize(const QSize &size) +{ + resize(QRect(0, 0, size.width(), size.height())); +} + +void QScatterSeriesPrivate::setTheme(ChartTheme *theme) +{ + m_theme = theme->themeForSeries(); +} + +void QScatterSeriesPrivate::setPlotDomain(const PlotDomain& plotDomain) +{ + // TODO +} + QScatterSeries::QScatterSeries(QObject *parent) : QChartSeries(parent), d(new QScatterSeriesPrivate(qobject_cast (parent))) @@ -74,14 +99,6 @@ bool QScatterSeries::setData(QList x, QList y) return true; } -void QScatterSeries::chartSizeChanged(QRectF rect) -{ - // Recalculate scatter data point locations on the scene -// d->transform().reset(); -// d->transform().translate(); - d->resize(rect); -} - void QScatterSeries::setMarkerColor(QColor color) { d->m_markerColor = color; diff --git a/src/qscatterseries.h b/src/qscatterseries.h index 3140b58..5afee55 100644 --- a/src/qscatterseries.h +++ b/src/qscatterseries.h @@ -21,7 +21,6 @@ public: // from QChartSeries bool setData(QList x, QList y); public Q_SLOTS: - void chartSizeChanged(QRectF rect); // TODO: also affects opacity of the marker...? To be documented void setMarkerColor(QColor color); QColor markerColor(); diff --git a/src/qscatterseries_p.h b/src/qscatterseries_p.h index 18bb986..6f8b6c0 100644 --- a/src/qscatterseries_p.h +++ b/src/qscatterseries_p.h @@ -2,6 +2,8 @@ #define QSCATTERSERIESPRIVATE_H #include "qchartseries.h" +#include "charttheme_p.h" +#include "chartitemcontrol.h" #include QTCOMMERCIALCHART_BEGIN_NAMESPACE @@ -9,16 +11,22 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE /*! * The PIMPL class of QScatterSeries. */ -class QScatterSeriesPrivate : public QGraphicsItem +class QScatterSeriesPrivate : public QGraphicsItem, public ChartItemControl { public: QScatterSeriesPrivate(QGraphicsItem *parent); public: // from QGraphicsItem + void setPos(const QPointF & pos); void resize(QRectF rect); QRectF boundingRect() const; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); +public: // from ChartItemControl + void resize(const QSize &size); + void setTheme(ChartTheme *theme); + void setPlotDomain(const PlotDomain& data); + public: // TODO: use the chart data class instead of list of x and y values? QList m_x; @@ -28,8 +36,9 @@ public: QList m_scenex; QList m_sceney; QColor m_markerColor; + SeriesTheme m_theme; }; QTCOMMERCIALCHART_END_NAMESPACE -#endif // QSCATTERSERIES_H +#endif // QSCATTERSERIESPRIVATE_H diff --git a/src/src.pro b/src/src.pro index 15f6655..22d04c8 100644 --- a/src/src.pro +++ b/src/src.pro @@ -30,16 +30,18 @@ SOURCES += \ pieslice.cpp \ qchartview.cpp \ qchartseries.cpp \ - qchartaxis.cpp + qchartaxis.cpp \ + charttheme.cpp PRIVATE_HEADERS += \ xylinechart/xylinechartitem_p.h \ plotdomain_p.h \ qscatterseries_p.h \ + qpieseries_p.h \ pieslice.h \ axisitem_p.h \ - chartitem_p.h - + charttheme_p.h + PUBLIC_HEADERS += \ qchartseries.h \ qscatterseries.h \ @@ -57,7 +59,8 @@ PUBLIC_HEADERS += \ qchartview.h \ qchartaxis.h -HEADERS += $$PUBLIC_HEADERS +HEADERS += $$PUBLIC_HEADERS \ + chartitemcontrol.h HEADERS += $$PRIVATE_HEADERS INCLUDEPATH += xylinechart \ @@ -97,3 +100,11 @@ unix:QMAKE_DISTCLEAN += -r $$CHART_BUILD_HEADER_DIR $$CHART_BUILD_LIB_DIR win32:QMAKE_DISTCLEAN += /Q $$CHART_BUILD_HEADER_DIR $$CHART_BUILD_LIB_DIR + + + + + + + + diff --git a/src/xylinechart/xylinechartitem.cpp b/src/xylinechart/xylinechartitem.cpp index e307fa7..770fd74 100644 --- a/src/xylinechart/xylinechartitem.cpp +++ b/src/xylinechart/xylinechartitem.cpp @@ -7,19 +7,33 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE -XYLineChartItem::XYLineChartItem(QXYChartSeries* series,QGraphicsItem *parent):ChartItem(parent), -m_series(series), -m_pathItem(new QGraphicsPathItem(this)) +XYLineChartItem::XYLineChartItem(QXYChartSeries* series,QGraphicsItem *parent) : + QGraphicsItem(parent), + m_series(series), + m_pathItem(new QGraphicsPathItem(this)) { setFlags(QGraphicsItem::ItemClipsChildrenToShape); } -void XYLineChartItem::setSize(const QSize& size) +void XYLineChartItem::setPos(const QPointF & pos) { - m_rect=QRect(0,0,size.width(),size.height()); + QGraphicsItem::setPos(pos); +} + +void XYLineChartItem::resize(const QSize &size) +{ + m_rect = QRect(0, 0, size.width(), size.height()); prepareGeometryChange(); updateGeometry(); +} +void XYLineChartItem::setTheme(ChartTheme *theme) +{ + if (theme) { + m_theme = theme->themeForSeries(); + prepareGeometryChange(); + updateGeometry(); + } } void XYLineChartItem::setPlotDomain(const PlotDomain& data) @@ -59,7 +73,7 @@ void XYLineChartItem::updateGeometry() } m_pathItem->setPath(path); - m_pathItem->setPen(m_series->pen()); + m_pathItem->setPen(m_theme.linePen); m_pathItem->setBrush(Qt::NoBrush); } diff --git a/src/xylinechart/xylinechartitem_p.h b/src/xylinechart/xylinechartitem_p.h index b8fe1a7..8fb3663 100644 --- a/src/xylinechart/xylinechartitem_p.h +++ b/src/xylinechart/xylinechartitem_p.h @@ -2,13 +2,15 @@ #define XYLINECHARTITEM_H #include "qchartglobal.h" -#include "chartitem_p.h" +#include "chartitemcontrol.h" +#include "charttheme_p.h" +#include QTCOMMERCIALCHART_BEGIN_NAMESPACE class QXYChartSeries; -class XYLineChartItem : public ChartItem +class XYLineChartItem : public QGraphicsItem, public ChartItemControl { public: @@ -19,8 +21,11 @@ public: QRectF boundingRect() const; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){}; // virtual QPainterPath shape() const; - //from ChartItem - void setSize(const QSize& size); + +public: // from ChartItemControl + void setPos(const QPointF & pos); + void resize(const QSize &size); + void setTheme(ChartTheme *theme); void setPlotDomain(const PlotDomain& data); private: @@ -32,6 +37,7 @@ private: QXYChartSeries* m_series; PlotDomain m_plotDomain; QGraphicsPathItem *m_pathItem; + SeriesTheme m_theme; }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/test/test.pro b/test/test.pro index 22ca591..e273839 100644 --- a/test/test.pro +++ b/test/test.pro @@ -1,2 +1,5 @@ TEMPLATE = subdirs SUBDIRS += chartwidgettest + + +