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 + + +