diff --git a/src/areachart/qareaseries.cpp b/src/areachart/qareaseries.cpp index 142b3f33..3e28da8c 100644 --- a/src/areachart/qareaseries.cpp +++ b/src/areachart/qareaseries.cpp @@ -21,6 +21,11 @@ #include "qareaseries.h" #include "qareaseries_p.h" #include "qlineseries.h" +#include "areachartitem_p.h" +#include "domain_p.h" +#include "chartdataset_p.h" +#include "charttheme_p.h" +#include "chartanimator_p.h" QTCOMMERCIALCHART_BEGIN_NAMESPACE @@ -205,6 +210,57 @@ QAreaSeriesPrivate::QAreaSeriesPrivate(QLineSeries *upperSeries, QLineSeries *lo }; +void QAreaSeriesPrivate::scaleDomain(Domain& domain) +{ + Q_Q(QAreaSeries); + + qreal minX(domain.minX()); + qreal minY(domain.minY()); + qreal maxX(domain.maxX()); + qreal maxY(domain.maxY()); + int tickXCount(domain.tickXCount()); + int tickYCount(domain.tickYCount()); + + QLineSeries* upperSeries = q->upperSeries(); + QLineSeries* lowerSeries = q->lowerSeries(); + + for (int i = 0; i < upperSeries->count(); i++) + { + qreal x = upperSeries->x(i); + qreal y = upperSeries->y(i); + minX = qMin(minX, x); + minY = qMin(minY, y); + maxX = qMax(maxX, x); + maxY = qMax(maxY, y); + } + if(lowerSeries) { + for (int i = 0; i < lowerSeries->count(); i++) + { + qreal x = lowerSeries->x(i); + qreal y = lowerSeries->y(i); + minX = qMin(minX, x); + minY = qMin(minY, y); + maxX = qMax(maxX, x); + maxY = qMax(maxY, y); + }} + + domain.setRangeX(minX,maxX,tickXCount); + domain.setRangeY(minY,maxY,tickYCount); +} + +Chart* QAreaSeriesPrivate::createGraphics(ChartPresenter* presenter) +{ + Q_Q(QAreaSeries); + + AreaChartItem* area = new AreaChartItem(q,presenter); + if(presenter->animationOptions().testFlag(QChart::SeriesAnimations)) { + presenter->animator()->addAnimation(area->upperLineItem()); + if(q->lowerSeries()) presenter->animator()->addAnimation(area->lowerLineItem()); + } + presenter->chartTheme()->decorate(q, presenter->dataSet()->seriesIndex(q)); + return area; +} + #include "moc_qareaseries.cpp" #include "moc_qareaseries_p.cpp" diff --git a/src/areachart/qareaseries_p.h b/src/areachart/qareaseries_p.h index 20a2c7e9..e5bffd4d 100644 --- a/src/areachart/qareaseries_p.h +++ b/src/areachart/qareaseries_p.h @@ -43,17 +43,20 @@ class QAreaSeriesPrivate: public QSeriesPrivate public: QAreaSeriesPrivate(QLineSeries *upperSeries, QLineSeries *lowerSeries,QAreaSeries* q); + void scaleDomain(Domain& domain); + Chart* createGraphics(ChartPresenter* presenter); + Q_SIGNALS: void updated(); -public: +protected: QBrush m_brush; QPen m_pen; QLineSeries* m_upperSeries; QLineSeries* m_lowerSeries; bool m_pointsVisible; - - friend class QAreaSeries; +private: + Q_DECLARE_PUBLIC(QAreaSeries); }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/barchart/barchart.pri b/src/barchart/barchart.pri index 26bd1a58..fed2ba29 100644 --- a/src/barchart/barchart.pri +++ b/src/barchart/barchart.pri @@ -21,7 +21,9 @@ PRIVATE_HEADERS += \ $$PWD/stackedbarchartitem_p.h \ $$PWD/barlabel_p.h \ $$PWD/qbarset_p.h \ - $$PWD/qbarseries_p.h + $$PWD/qbarseries_p.h \ + $$PWD/qstackedbarseries_p.h\ + $$PWD/qpercentbarseries_p.h PUBLIC_HEADERS += \ $$PWD/qbarseries.h \ diff --git a/src/barchart/qbarseries.cpp b/src/barchart/qbarseries.cpp index 3a827b09..70558612 100644 --- a/src/barchart/qbarseries.cpp +++ b/src/barchart/qbarseries.cpp @@ -23,6 +23,10 @@ #include "qbarset.h" #include "qbarset_p.h" #include "barchartmodel_p.h" +#include "domain_p.h" +#include "chartdataset_p.h" +#include "charttheme_p.h" +#include "chartanimator_p.h" #include #include @@ -63,6 +67,11 @@ QBarSeries::QBarSeries(QBarCategories categories, QObject *parent) : QSeries(*ne } +QBarSeries::QBarSeries(QBarSeriesPrivate &d,QObject *parent) : QSeries(d,parent) +{ + +} + QSeries::QSeriesType QBarSeries::type() const { return QSeries::SeriesTypeBar; @@ -761,6 +770,41 @@ void QBarSeriesPrivate::barsetChanged() emit updatedBars(); } +void QBarSeriesPrivate::scaleDomain(Domain& domain) +{ + Q_Q(QBarSeries); + qreal minX(domain.minX()); + qreal minY(domain.minY()); + qreal maxX(domain.maxX()); + qreal maxY(domain.maxY()); + int tickXCount(domain.tickXCount()); + int tickYCount(domain.tickYCount()); + + qreal x = q->categoryCount(); + qreal y = q->max(); + minX = qMin(minX, x); + minY = qMin(minY, y); + maxX = qMax(maxX, x); + maxY = qMax(maxY, y); + tickXCount = x+1; + + domain.setRangeX(minX,maxX,tickXCount); + domain.setRangeY(minY,maxY,tickYCount); +} + +Chart* QBarSeriesPrivate::createGraphics(ChartPresenter* presenter) +{ + Q_Q(QBarSeries); + + BarChartItem* bar = new BarChartItem(q,presenter); + if(presenter->animationOptions().testFlag(QChart::SeriesAnimations)) { + presenter->animator()->addAnimation(bar); + } + presenter->chartTheme()->decorate(q, presenter->dataSet()->seriesIndex(q)); + return bar; + +} + #include "moc_qbarseries.cpp" #include "moc_qbarseries_p.cpp" diff --git a/src/barchart/qbarseries.h b/src/barchart/qbarseries.h index d65acd33..326cc225 100644 --- a/src/barchart/qbarseries.h +++ b/src/barchart/qbarseries.h @@ -40,7 +40,7 @@ class QTCOMMERCIALCHART_EXPORT QBarSeries : public QSeries { Q_OBJECT public: - QBarSeries(QStringList categories, QObject *parent = 0); + QBarSeries(QBarCategories categories, QObject *parent = 0); QSeries::QSeriesType type() const; @@ -77,6 +77,9 @@ public: BarChartModel& modelInternal(); // <--- TO PIMPL +protected: + explicit QBarSeries(QBarSeriesPrivate &d,QObject *parent = 0); + Q_SIGNALS: void clicked(QBarSet *barset, QString category, Qt::MouseButtons button); // Up to user of api, what to do with these signals void selected(); diff --git a/src/barchart/qbarseries_p.h b/src/barchart/qbarseries_p.h index 49658cf8..db644d71 100644 --- a/src/barchart/qbarseries_p.h +++ b/src/barchart/qbarseries_p.h @@ -17,6 +17,9 @@ class QBarSeriesPrivate : public QSeriesPrivate public: QBarSeriesPrivate(QBarCategories categories, QBarSeries *parent); + void scaleDomain(Domain& domain); + Chart* createGraphics(ChartPresenter* presenter); + bool setModel(QAbstractItemModel *model); void setModelMapping(int categories, int bottomBoundry, int topBoundry, Qt::Orientation orientation = Qt::Vertical); diff --git a/src/barchart/qpercentbarseries.cpp b/src/barchart/qpercentbarseries.cpp index d0abd6d3..6aee276b 100644 --- a/src/barchart/qpercentbarseries.cpp +++ b/src/barchart/qpercentbarseries.cpp @@ -19,6 +19,12 @@ ****************************************************************************/ #include "qpercentbarseries.h" +#include "qpercentbarseries_p.h" +#include "percentbarchartitem_p.h" +#include "chartdataset_p.h" +#include "charttheme_p.h" +#include "chartanimator_p.h" + QTCOMMERCIALCHART_BEGIN_NAMESPACE @@ -45,8 +51,8 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE Constructs empty QPercentBarSeries. Parameter \a categories defines the categories for chart. QPercentBarSeries is QObject which is a child of a \a parent. */ -QPercentBarSeries::QPercentBarSeries(QStringList categories, QObject *parent) - : QBarSeries(categories, parent) +QPercentBarSeries::QPercentBarSeries(QBarCategories categories, QObject *parent) + : QBarSeries(*new QPercentBarSeriesPrivate(categories,this), parent) { } @@ -55,6 +61,47 @@ QSeries::QSeriesType QPercentBarSeries::type() const return QSeries::SeriesTypePercentBar; } +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +QPercentBarSeriesPrivate::QPercentBarSeriesPrivate(QBarCategories categories, QPercentBarSeries *q) : QBarSeriesPrivate(categories,q) +{ + +} + +void QPercentBarSeriesPrivate::scaleDomain(Domain& domain) +{ + Q_Q(QPercentBarSeries); + qreal minX(domain.minX()); + qreal minY(domain.minY()); + qreal maxX(domain.maxX()); + qreal maxY(domain.maxY()); + int tickXCount(domain.tickXCount()); + int tickYCount(domain.tickYCount()); + + qreal x = q->categoryCount(); + minX = qMin(minX, x); + maxX = qMax(maxX, x); + minY = 0; + maxY = 100; + tickXCount = x+1; + + domain.setRangeX(minX,maxX,tickXCount); + domain.setRangeY(minY,maxY,tickYCount); +} + + +Chart* QPercentBarSeriesPrivate::createGraphics(ChartPresenter* presenter) +{ + Q_Q(QPercentBarSeries); + + PercentBarChartItem* bar = new PercentBarChartItem(q,presenter); + if(presenter->animationOptions().testFlag(QChart::SeriesAnimations)) { + presenter->animator()->addAnimation(bar); + } + presenter->chartTheme()->decorate(q, presenter->dataSet()->seriesIndex(q)); + return bar; +} + #include "moc_qpercentbarseries.cpp" QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/barchart/qpercentbarseries.h b/src/barchart/qpercentbarseries.h index 34cf1989..a6874dc7 100644 --- a/src/barchart/qpercentbarseries.h +++ b/src/barchart/qpercentbarseries.h @@ -30,7 +30,7 @@ class QTCOMMERCIALCHART_EXPORT QPercentBarSeries : public QBarSeries { Q_OBJECT public: - QPercentBarSeries(QStringList categories, QObject *parent = 0); + QPercentBarSeries(QBarCategories categories, QObject *parent = 0); QSeries::QSeriesType type() const; }; diff --git a/src/barchart/qpercentbarseries_p.h b/src/barchart/qpercentbarseries_p.h new file mode 100644 index 00000000..01e205ba --- /dev/null +++ b/src/barchart/qpercentbarseries_p.h @@ -0,0 +1,52 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +// W A R N I N G +// ------------- +// +// This file is not part of the QtCommercial Chart API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef QPERCENTBARSERIES_P_H_ +#define QPERCENTBARSERIES_P_H_ + +#include "qbarseries_p.h" +#include "domain_p.h" + +QTCOMMERCIALCHART_BEGIN_NAMESPACE + + +class QPercentBarSeriesPrivate: public QBarSeriesPrivate +{ +public: + QPercentBarSeriesPrivate(QBarCategories categories,QPercentBarSeries* q); + void scaleDomain(Domain& domain); + Chart* createGraphics(ChartPresenter* presenter); + +private: + Q_DECLARE_PUBLIC(QPercentBarSeries) +}; + +QTCOMMERCIALCHART_END_NAMESPACE + +#endif diff --git a/src/barchart/qstackedbarseries.cpp b/src/barchart/qstackedbarseries.cpp index 857ad244..88edbfed 100644 --- a/src/barchart/qstackedbarseries.cpp +++ b/src/barchart/qstackedbarseries.cpp @@ -19,6 +19,11 @@ ****************************************************************************/ #include "qstackedbarseries.h" +#include "qstackedbarseries_p.h" +#include "stackedbarchartitem_p.h" +#include "chartdataset_p.h" +#include "charttheme_p.h" +#include "chartanimator_p.h" QTCOMMERCIALCHART_BEGIN_NAMESPACE @@ -45,8 +50,8 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE Constructs empty QStackedBarSeries. Parameter \a categories defines the categories for chart. QStackedBarSeries is QObject which is a child of a \a parent. */ -QStackedBarSeries::QStackedBarSeries(QStringList categories, QObject *parent) - : QBarSeries(categories, parent) +QStackedBarSeries::QStackedBarSeries(QBarCategories categories, QObject *parent) + : QBarSeries(*new QStackedBarSeriesPrivate(categories,this), parent) { } @@ -55,6 +60,48 @@ QSeries::QSeriesType QStackedBarSeries::type() const return QSeries::SeriesTypeStackedBar; } +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +QStackedBarSeriesPrivate::QStackedBarSeriesPrivate(QBarCategories categories, QStackedBarSeries *q) : QBarSeriesPrivate(categories,q) +{ + +} + +void QStackedBarSeriesPrivate::scaleDomain(Domain& domain) +{ + Q_Q(QStackedBarSeries); + qreal minX(domain.minX()); + qreal minY(domain.minY()); + qreal maxX(domain.maxX()); + qreal maxY(domain.maxY()); + int tickXCount(domain.tickXCount()); + int tickYCount(domain.tickYCount()); + + qreal x = q->categoryCount(); + qreal y = q->maxCategorySum(); + minX = qMin(minX, x); + minY = qMin(minY, y); + maxX = qMax(maxX, x); + maxY = qMax(maxY, y); + tickXCount = x+1; + + domain.setRangeX(minX,maxX,tickXCount); + domain.setRangeY(minY,maxY,tickYCount); +} + + +Chart* QStackedBarSeriesPrivate::createGraphics(ChartPresenter* presenter) +{ + Q_Q(QStackedBarSeries); + + StackedBarChartItem* bar = new StackedBarChartItem(q,presenter); + if(presenter->animationOptions().testFlag(QChart::SeriesAnimations)) { + presenter->animator()->addAnimation(bar); + } + presenter->chartTheme()->decorate(q, presenter->dataSet()->seriesIndex(q)); + return bar; +} + #include "moc_qstackedbarseries.cpp" QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/barchart/qstackedbarseries.h b/src/barchart/qstackedbarseries.h index b5531d69..df3263d7 100644 --- a/src/barchart/qstackedbarseries.h +++ b/src/barchart/qstackedbarseries.h @@ -30,7 +30,7 @@ class QTCOMMERCIALCHART_EXPORT QStackedBarSeries : public QBarSeries { Q_OBJECT public: - QStackedBarSeries(QStringList categories, QObject *parent = 0); + QStackedBarSeries(QBarCategories categories, QObject *parent = 0); QSeries::QSeriesType type() const; }; diff --git a/src/barchart/qstackedbarseries_p.h b/src/barchart/qstackedbarseries_p.h new file mode 100644 index 00000000..332e9ea5 --- /dev/null +++ b/src/barchart/qstackedbarseries_p.h @@ -0,0 +1,52 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +// W A R N I N G +// ------------- +// +// This file is not part of the QtCommercial Chart API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef QSTACKEDBARSERIES_P_H_ +#define QSTACKEDBARSERIES_P_H_ + +#include "qbarseries_p.h" +#include "domain_p.h" + +QTCOMMERCIALCHART_BEGIN_NAMESPACE + + +class QStackedBarSeriesPrivate: public QBarSeriesPrivate +{ +public: + QStackedBarSeriesPrivate(QBarCategories categories,QStackedBarSeries* q); + Chart* createGraphics(ChartPresenter* presenter); + void scaleDomain(Domain& domain); + +private: + Q_DECLARE_PUBLIC(QStackedBarSeries) +}; + +QTCOMMERCIALCHART_END_NAMESPACE + +#endif diff --git a/src/chartdataset.cpp b/src/chartdataset.cpp index 77bce9bf..b5182a51 100644 --- a/src/chartdataset.cpp +++ b/src/chartdataset.cpp @@ -21,6 +21,7 @@ #include "chartdataset_p.h" #include "qchartaxis.h" //series +#include "qseries_p.h" #include "qlineseries.h" #include "qareaseries.h" #include "qbarseries.h" @@ -81,7 +82,19 @@ void ChartDataSet::addSeries(QSeries* series, QChartAxis *axisY) m_axisXInitialized=true; } - calculateDomain(series,domain); + series->d_ptr->scaleDomain(*domain); + + if(series->type() == QSeries::SeriesTypeBar || series->type() == QSeries::SeriesTypeStackedBar || series->type() == QSeries::SeriesTypePercentBar) + { + QBarSeries* barSeries = static_cast(series); + setupCategories(barSeries); + } + + if (series->type()== QSeries::SeriesTypePie && m_seriesAxisMap.count()==0) + { + axisX()->hide(); + this->axisY()->hide(); + } m_seriesAxisMap.insert(series,axisY); @@ -160,122 +173,6 @@ void ChartDataSet::removeAllSeries() } -//to be removed with PIMPL -void ChartDataSet::calculateDomain(QSeries* series,Domain* domain) -{ - qreal minX(domain->minX()); - qreal minY(domain->minY()); - qreal maxX(domain->maxX()); - qreal maxY(domain->maxY()); - int tickXCount(domain->tickXCount()); - int tickYCount(domain->tickYCount()); - - - switch(series->type()) - { - case QSeries::SeriesTypeLine: - case QSeries::SeriesTypeSpline: - case QSeries::SeriesTypeScatter: - { - - QXYSeries* xySeries = static_cast(series); - - for (int i = 0; i < xySeries->count(); i++) - { - qreal x = xySeries->x(i); - qreal y = xySeries->y(i); - minX = qMin(minX, x); - minY = qMin(minY, y); - maxX = qMax(maxX, x); - maxY = qMax(maxY, y); - } - break; - } - case QSeries::SeriesTypeArea: { - - QAreaSeries* areaSeries = static_cast(series); - QLineSeries* upperSeries = areaSeries->upperSeries(); - QLineSeries* lowerSeries = areaSeries->lowerSeries(); - - for (int i = 0; i < upperSeries->count(); i++) - { - qreal x = upperSeries->x(i); - qreal y = upperSeries->y(i); - minX = qMin(minX, x); - minY = qMin(minY, y); - maxX = qMax(maxX, x); - maxY = qMax(maxY, y); - } - if(lowerSeries) { - for (int i = 0; i < lowerSeries->count(); i++) - { - qreal x = lowerSeries->x(i); - qreal y = lowerSeries->y(i); - minX = qMin(minX, x); - minY = qMin(minY, y); - maxX = qMax(maxX, x); - maxY = qMax(maxY, y); - }} - break; - } - case QSeries::SeriesTypeBar: { - - QBarSeries* barSeries = static_cast(series); - qreal x = barSeries->categoryCount(); - qreal y = barSeries->max(); - minX = qMin(minX, x); - minY = qMin(minY, y); - maxX = qMax(maxX, x); - maxY = qMax(maxY, y); - tickXCount = x+1; - setupCategories(barSeries); - break; - } - case QSeries::SeriesTypeStackedBar: { - - QStackedBarSeries* stackedBarSeries = static_cast(series); - qreal x = stackedBarSeries->categoryCount(); - qreal y = stackedBarSeries->maxCategorySum(); - minX = qMin(minX, x); - minY = qMin(minY, y); - maxX = qMax(maxX, x); - maxY = qMax(maxY, y); - tickXCount = x+1; - setupCategories(stackedBarSeries); - break; - } - case QSeries::SeriesTypePercentBar: { - - QPercentBarSeries* percentBarSeries = static_cast(series); - qreal x = percentBarSeries->categoryCount(); - minX = qMin(minX, x); - maxX = qMax(maxX, x); - minY = 0; - maxY = 100; - tickXCount = x+1; - setupCategories(percentBarSeries); - break; - } - - case QSeries::SeriesTypePie: { - //QPieSeries *pieSeries = static_cast(series); - // TODO: domain stuff - break; - } - - - default: { - qDebug()<<__FUNCTION__<<"type" << series->type()<<"not supported"; - return; - } - - } - - domain->setRangeX(minX,maxX,tickXCount); - domain->setRangeY(minY,maxY,tickYCount); -} - - void ChartDataSet::setupCategories(QBarSeries* series) { QChartAxisCategories* categories = axisX()->categories(); diff --git a/src/chartpresenter.cpp b/src/chartpresenter.cpp index 8b789d9b..7d30979c 100644 --- a/src/chartpresenter.cpp +++ b/src/chartpresenter.cpp @@ -25,25 +25,10 @@ #include "chartdataset_p.h" #include "charttheme_p.h" #include "chartanimator_p.h" -//series -#include "qbarseries.h" -#include "qstackedbarseries.h" -#include "qpercentbarseries.h" -#include "qlineseries.h" +#include "qseries_p.h" #include "qareaseries.h" -#include "qpieseries.h" -#include "qscatterseries.h" -#include "qsplineseries.h" -//items #include "axisitem_p.h" #include "areachartitem_p.h" -#include "barchartitem_p.h" -#include "stackedbarchartitem_p.h" -#include "percentbarchartitem_p.h" -#include "linechartitem_p.h" -#include "piechartitem_p.h" -#include "scatterchartitem_p.h" -#include "splinechartitem_p.h" QTCOMMERCIALCHART_BEGIN_NAMESPACE @@ -54,7 +39,6 @@ ChartPresenter::ChartPresenter(QChart* chart,ChartDataSet* dataset):QObject(char m_chartTheme(0), m_chartRect(QRectF(QPoint(0,0),m_chart->size())), m_options(QChart::NoAnimation), - m_themeForce(false), m_minLeftMargin(0), m_minBottomMargin(0), m_backgroundItem(0), @@ -135,14 +119,14 @@ void ChartPresenter::handleAxisAdded(QChartAxis* axis,Domain* domain) } if(axis==m_dataset->axisX()){ - m_chartTheme->decorate(axis,true,m_themeForce); + m_chartTheme->decorate(axis,true); QObject::connect(domain,SIGNAL(rangeXChanged(qreal,qreal,int)),item,SLOT(handleRangeChanged(qreal,qreal,int))); //initialize item->handleRangeChanged(domain->minX(),domain->maxX(),domain->tickXCount()); } else{ - m_chartTheme->decorate(axis,false,m_themeForce); + m_chartTheme->decorate(axis,false); QObject::connect(domain,SIGNAL(rangeYChanged(qreal,qreal,int)),item,SLOT(handleRangeChanged(qreal,qreal,int))); //initialize item->handleRangeChanged(domain->minY(),domain->maxY(),domain->tickYCount()); @@ -165,133 +149,14 @@ void ChartPresenter::handleAxisRemoved(QChartAxis* axis) void ChartPresenter::handleSeriesAdded(QSeries* series,Domain* domain) { - Chart *item = 0 ; - - switch(series->type()) - { - case QSeries::SeriesTypeLine: { - - QLineSeries* lineSeries = static_cast(series); - LineChartItem* line = new LineChartItem(lineSeries,this); - if(m_options.testFlag(QChart::SeriesAnimations)) { - m_animator->addAnimation(line); - } - m_chartTheme->decorate(lineSeries, m_dataset->seriesIndex(series),m_themeForce); - QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),line,SLOT(handleGeometryChanged(const QRectF&))); - QObject::connect(domain,SIGNAL(domainChanged(qreal,qreal,qreal,qreal)),line,SLOT(handleDomainChanged(qreal,qreal,qreal,qreal))); - item = line; - break; - } - - case QSeries::SeriesTypeArea: { - - QAreaSeries* areaSeries = static_cast(series); - AreaChartItem* area = new AreaChartItem(areaSeries,this); - if(m_options.testFlag(QChart::SeriesAnimations)) { - m_animator->addAnimation(area->upperLineItem()); - if(areaSeries->lowerSeries()) m_animator->addAnimation(area->lowerLineItem()); - } - m_chartTheme->decorate(areaSeries, m_dataset->seriesIndex(series),m_themeForce); - QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),area,SLOT(handleGeometryChanged(const QRectF&))); - QObject::connect(domain,SIGNAL(domainChanged(qreal,qreal,qreal,qreal)),area,SLOT(handleDomainChanged(qreal,qreal,qreal,qreal))); - item=area; - break; - } - - case QSeries::SeriesTypeBar: { - QBarSeries* barSeries = static_cast(series); - BarChartItem* bar = new BarChartItem(barSeries,this); - if(m_options.testFlag(QChart::SeriesAnimations)) { - m_animator->addAnimation(bar); - } - m_chartTheme->decorate(barSeries, m_dataset->seriesIndex(barSeries),m_themeForce); - QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),bar,SLOT(handleGeometryChanged(const QRectF&))); - QObject::connect(domain,SIGNAL(domainChanged(qreal,qreal,qreal,qreal)),bar,SLOT(handleDomainChanged(qreal,qreal,qreal,qreal))); - item=bar; - break; - } - - case QSeries::SeriesTypeStackedBar: { - QStackedBarSeries* stackedBarSeries = static_cast(series); - StackedBarChartItem* bar = new StackedBarChartItem(stackedBarSeries,this); - if(m_options.testFlag(QChart::SeriesAnimations)) { - m_animator->addAnimation(bar); - } - m_chartTheme->decorate(stackedBarSeries, m_dataset->seriesIndex(stackedBarSeries),m_themeForce); - QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),bar,SLOT(handleGeometryChanged(const QRectF&))); - QObject::connect(domain,SIGNAL(domainChanged(qreal,qreal,qreal,qreal)),bar,SLOT(handleDomainChanged(qreal,qreal,qreal,qreal))); - item=bar; - break; - } - - case QSeries::SeriesTypePercentBar: { - QPercentBarSeries* percentBarSeries = static_cast(series); - PercentBarChartItem* bar = new PercentBarChartItem(percentBarSeries,this); - if(m_options.testFlag(QChart::SeriesAnimations)) { - m_animator->addAnimation(bar); - } - m_chartTheme->decorate(percentBarSeries, m_dataset->seriesIndex(percentBarSeries),m_themeForce); - QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),bar,SLOT(handleGeometryChanged(const QRectF&))); - QObject::connect(domain,SIGNAL(domainChanged(qreal,qreal,qreal,qreal)),bar,SLOT(handleDomainChanged(qreal,qreal,qreal,qreal))); - item=bar; - break; - } - - case QSeries::SeriesTypeScatter: { - - QScatterSeries *scatterSeries = static_cast(series); - ScatterChartItem *scatter = new ScatterChartItem(scatterSeries,this); - if(m_options.testFlag(QChart::SeriesAnimations)) { - m_animator->addAnimation(scatter); - } - m_chartTheme->decorate(scatterSeries, m_dataset->seriesIndex(series),m_themeForce); - QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),scatter,SLOT(handleGeometryChanged(const QRectF&))); - QObject::connect(domain,SIGNAL(domainChanged(qreal,qreal,qreal,qreal)),scatter,SLOT(handleDomainChanged(qreal,qreal,qreal,qreal))); - item = scatter; - break; - } - - case QSeries::SeriesTypePie: { - QPieSeries *pieSeries = static_cast(series); - PieChartItem* pie = new PieChartItem(pieSeries, this); - if(m_options.testFlag(QChart::SeriesAnimations)) { - m_animator->addAnimation(pie); - } - m_chartTheme->decorate(pieSeries, m_dataset->seriesIndex(series),m_themeForce); - QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),pie,SLOT(handleGeometryChanged(const QRectF&))); - QObject::connect(domain,SIGNAL(domainChanged(qreal,qreal,qreal,qreal)),pie,SLOT(handleDomainChanged(qreal,qreal,qreal,qreal))); - // Hide all from background when there is only piechart - // TODO: refactor this ugly code... should be one setting for this - if (m_chartItems.count() == 0) { - m_chart->axisX()->hide(); - m_chart->axisY()->hide(); - } - item=pie; - break; - } - - case QSeries::SeriesTypeSpline: { - QSplineSeries* splineSeries = static_cast(series); - SplineChartItem* spline = new SplineChartItem(splineSeries, this); - if(m_options.testFlag(QChart::SeriesAnimations)) { - m_animator->addAnimation(spline); - } - m_chartTheme->decorate(splineSeries, m_dataset->seriesIndex(series),m_themeForce); - QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),spline,SLOT(handleGeometryChanged(const QRectF&))); - QObject::connect(domain,SIGNAL(domainChanged(qreal,qreal,qreal,qreal)),spline,SLOT(handleDomainChanged(qreal,qreal,qreal,qreal))); - item=spline; - break; - } - default: { - qDebug()<< "Series type" << series->type() << "not implemented."; - break; - } - } - - //initialize - item->handleDomainChanged(domain->minX(),domain->maxX(),domain->minY(),domain->maxY()); - if(m_chartRect.isValid()) item->handleGeometryChanged(m_chartRect); - m_chartItems.insert(series,item); + Chart *item = series->d_ptr->createGraphics(this); + Q_ASSERT(item); + QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&))); + QObject::connect(domain,SIGNAL(domainChanged(qreal,qreal,qreal,qreal)),item,SLOT(handleDomainChanged(qreal,qreal,qreal,qreal))); + //initialize + item->handleDomainChanged(domain->minX(),domain->maxX(),domain->minY(),domain->maxY()); + if(m_chartRect.isValid()) item->handleGeometryChanged(m_chartRect); + m_chartItems.insert(series,item); } void ChartPresenter::handleSeriesRemoved(QSeries* series) @@ -315,10 +180,10 @@ void ChartPresenter::setTheme(QChart::ChartTheme theme,bool force) { if(m_chartTheme && m_chartTheme->id() == theme) return; delete m_chartTheme; - m_themeForce = force; m_chartTheme = ChartTheme::createTheme(theme); - m_chartTheme->decorate(m_chart,m_themeForce); - m_chartTheme->decorate(m_chart->legend(),m_themeForce); + m_chartTheme->setForced(force); + m_chartTheme->decorate(m_chart); + m_chartTheme->decorate(m_chart->legend()); resetAllElements(); } diff --git a/src/chartpresenter_p.h b/src/chartpresenter_p.h index 187a5240..e0f60a46 100644 --- a/src/chartpresenter_p.h +++ b/src/chartpresenter_p.h @@ -107,7 +107,6 @@ private: QRectF m_rect; QRectF m_chartRect; QChart::AnimationOptions m_options; - bool m_themeForce; qreal m_minLeftMargin; qreal m_minBottomMargin; public: //TODO: fixme diff --git a/src/charttheme.cpp b/src/charttheme.cpp index c56a94a6..c9498701 100644 --- a/src/charttheme.cpp +++ b/src/charttheme.cpp @@ -69,7 +69,8 @@ ChartTheme::ChartTheme(QChart::ChartTheme id) : m_backgroundShadesPen(Qt::NoPen), m_backgroundShadesBrush(Qt::NoBrush), m_backgroundShades(BackgroundShadesNone), - m_gridLinePen(QPen(QRgb(0x000000))) + m_gridLinePen(QPen(QRgb(0x000000))), + m_force(false) { m_id = id; qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); @@ -98,60 +99,60 @@ ChartTheme* ChartTheme::createTheme(QChart::ChartTheme theme) } } -void ChartTheme::decorate(QChart* chart,bool force) +void ChartTheme::decorate(QChart* chart) { QBrush brush; - if(brush == chart->backgroundBrush() || force) + if(brush == chart->backgroundBrush() || m_force) chart->setBackgroundBrush(m_chartBackgroundGradient); chart->setTitleFont(m_masterFont); chart->setTitleBrush(m_titleBrush); } -void ChartTheme::decorate(QLegend* legend,bool force) +void ChartTheme::decorate(QLegend* legend) { QPen pen; QBrush brush; - if (pen == legend->pen() || force){ + if (pen == legend->pen() || m_force){ legend->setPen(Qt::NoPen); } - if (brush == legend->brush() || force) { + if (brush == legend->brush() || m_force) { legend->setBrush(m_chartBackgroundGradient); } } -void ChartTheme::decorate(QAreaSeries* series, int index,bool force) +void ChartTheme::decorate(QAreaSeries* series, int index) { QPen pen; QBrush brush; - if (pen == series->pen() || force){ + if (pen == series->pen() || m_force){ pen.setColor(colorAt(m_seriesGradients.at(index % m_seriesGradients.size()), 0.0)); pen.setWidthF(2); series->setPen(pen); } - if (brush == series->brush() || force) { + if (brush == series->brush() || m_force) { QBrush brush(m_seriesColors.at(index % m_seriesColors.size())); series->setBrush(brush); } } -void ChartTheme::decorate(QLineSeries* series,int index,bool force) +void ChartTheme::decorate(QLineSeries* series,int index) { QPen pen; - if(pen == series->pen() || force ){ + if(pen == series->pen() || m_force ){ pen.setColor(m_seriesColors.at(index%m_seriesColors.size())); pen.setWidthF(2); series->setPen(pen); } } -void ChartTheme::decorate(QBarSeries* series, int index, bool force) +void ChartTheme::decorate(QBarSeries* series, int index) { QBrush brush; QPen pen; @@ -176,7 +177,7 @@ void ChartTheme::decorate(QBarSeries* series, int index, bool force) takeAtPos += step; takeAtPos -= (int) takeAtPos; } - if (brush == sets.at(i)->brush() || force ) + if (brush == sets.at(i)->brush() || m_force ) sets.at(i)->setBrush(colorAt(m_seriesGradients.at(colorIndex), takeAtPos)); // Pick label color from the opposite end of the gradient. @@ -186,31 +187,31 @@ void ChartTheme::decorate(QBarSeries* series, int index, bool force) else sets.at(i)->setLabelBrush(colorAt(m_seriesGradients.at(index % m_seriesGradients.size()), 0)); - if (pen == sets.at(i)->pen() || force) { + if (pen == sets.at(i)->pen() || m_force) { QColor c = colorAt(m_seriesGradients.at(index % m_seriesGradients.size()), 0.0); sets.at(i)->setPen(c); } } } -void ChartTheme::decorate(QScatterSeries* series, int index,bool force) +void ChartTheme::decorate(QScatterSeries* series, int index) { QPen pen; QBrush brush; - if (pen == series->pen() || force) { + if (pen == series->pen() || m_force) { pen.setColor(colorAt(m_seriesGradients.at(index % m_seriesGradients.size()), 0.0)); pen.setWidthF(2); series->setPen(pen); } - if (brush == series->brush() || force) { + if (brush == series->brush() || m_force) { QBrush brush(m_seriesColors.at(index % m_seriesColors.size())); series->setBrush(brush); } } -void ChartTheme::decorate(QPieSeries* series, int index, bool force) +void ChartTheme::decorate(QPieSeries* series, int index) { for (int i(0); i < series->slices().count(); i++) { @@ -224,22 +225,22 @@ void ChartTheme::decorate(QPieSeries* series, int index, bool force) QPieSlice *s = series->slices().at(i); PieSliceData data = PieSliceData::data(s); - if (data.m_slicePen.isThemed() || force) { + if (data.m_slicePen.isThemed() || m_force) { data.m_slicePen = penColor; data.m_slicePen.setThemed(true); } - if (data.m_sliceBrush.isThemed() || force) { + if (data.m_sliceBrush.isThemed() || m_force) { data.m_sliceBrush = brushColor; data.m_sliceBrush.setThemed(true); } - if (data.m_labelPen.isThemed() || force) { + if (data.m_labelPen.isThemed() || m_force) { data.m_labelPen = QPen(m_titleBrush.color()); data.m_labelPen.setThemed(true); } - if (data.m_labelFont.isThemed() || force) { + if (data.m_labelFont.isThemed() || m_force) { data.m_labelFont = m_labelFont; data.m_labelFont.setThemed(true); } @@ -251,17 +252,17 @@ void ChartTheme::decorate(QPieSeries* series, int index, bool force) } } -void ChartTheme::decorate(QSplineSeries* series, int index, bool force) +void ChartTheme::decorate(QSplineSeries* series, int index) { QPen pen; - if(pen == series->pen() || force){ + if(pen == series->pen() || m_force){ pen.setColor(m_seriesColors.at(index%m_seriesColors.size())); pen.setWidthF(2); series->setPen(pen); } } -void ChartTheme::decorate(QChartAxis* axis,bool axisX, bool force) +void ChartTheme::decorate(QChartAxis* axis,bool axisX) { QPen pen; QBrush brush; @@ -269,25 +270,25 @@ void ChartTheme::decorate(QChartAxis* axis,bool axisX, bool force) if (axis->isAxisVisible()) { - if(brush == axis->labelsBrush() || force){ + if(brush == axis->labelsBrush() || m_force){ axis->setLabelsBrush(m_axisLabelBrush); } - if(pen == axis->labelsPen() || force){ + if(pen == axis->labelsPen() || m_force){ axis->setLabelsPen(Qt::NoPen); // NoPen for performance reasons } - if (axis->shadesVisible() || force) { + if (axis->shadesVisible() || m_force) { - if(brush == axis->shadesBrush() || force){ + if(brush == axis->shadesBrush() || m_force){ axis->setShadesBrush(m_backgroundShadesBrush); } - if(pen == axis->shadesPen() || force){ + if(pen == axis->shadesPen() || m_force){ axis->setShadesPen(m_backgroundShadesPen); } - if(force && (m_backgroundShades == BackgroundShadesBoth + if( m_force && (m_backgroundShades == BackgroundShadesBoth || (m_backgroundShades == BackgroundShadesVertical && axisX) || (m_backgroundShades == BackgroundShadesHorizontal && !axisX))){ axis->setShadesVisible(true); @@ -295,15 +296,15 @@ void ChartTheme::decorate(QChartAxis* axis,bool axisX, bool force) } } - if(pen == axis->axisPen() || force){ + if(pen == axis->axisPen() || m_force){ axis->setAxisPen(m_axisLinePen); } - if(pen == axis->gridLinePen() || force){ + if(pen == axis->gridLinePen() || m_force){ axis->setGridLinePen(m_gridLinePen); } - if(font == axis->labelsFont() || force){ + if(font == axis->labelsFont() || m_force){ axis->setLabelsFont(m_labelFont); } } @@ -389,4 +390,9 @@ QColor ChartTheme::colorAt(const QGradient &gradient, qreal pos) return colorAt(prev.second, next.second, relativePos); } +void ChartTheme::setForced(bool enabled) +{ + m_force=enabled; +} + QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/charttheme_p.h b/src/charttheme_p.h index b25890e2..2741028b 100644 --- a/src/charttheme_p.h +++ b/src/charttheme_p.h @@ -62,15 +62,17 @@ protected: public: static ChartTheme* createTheme(QChart::ChartTheme theme); QChart::ChartTheme id() const {return m_id;} - void decorate(QChart* chart,bool force = true); - void decorate(QLegend* legend,bool force = true); - void decorate(QBarSeries* series, int index,bool force = true); - void decorate(QLineSeries* series, int index,bool force = true); - void decorate(QAreaSeries* series, int index,bool force = true); - void decorate(QScatterSeries* series, int index,bool force = true); - void decorate(QPieSeries* series, int index,bool force = true); - void decorate(QSplineSeries* series, int index,bool force = true); - void decorate(QChartAxis* axis, bool axisX,bool force = true); + void decorate(QChart* chart); + void decorate(QLegend* legend); + void decorate(QBarSeries* series, int index); + void decorate(QLineSeries* series, int index); + void decorate(QAreaSeries* series, int index); + void decorate(QScatterSeries* series, int index); + void decorate(QPieSeries* series, int index); + void decorate(QSplineSeries* series, int index); + void decorate(QChartAxis* axis, bool axisX); + void setForced(bool enabled); + bool isForced() { return m_force; } public: // utils void generateSeriesGradients(); @@ -92,6 +94,7 @@ protected: QBrush m_backgroundShadesBrush; BackgroundShadesMode m_backgroundShades; QPen m_gridLinePen; + bool m_force; }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/linechart/qlineseries.cpp b/src/linechart/qlineseries.cpp index fa3db77e..ec7eaf8a 100644 --- a/src/linechart/qlineseries.cpp +++ b/src/linechart/qlineseries.cpp @@ -20,6 +20,10 @@ #include "qlineseries.h" #include "qlineseries_p.h" +#include "linechartitem_p.h" +#include "chartdataset_p.h" +#include "charttheme_p.h" +#include "chartanimator_p.h" QTCOMMERCIALCHART_BEGIN_NAMESPACE @@ -101,4 +105,15 @@ QLineSeriesPrivate::QLineSeriesPrivate(QLineSeries* q):QXYSeriesPrivate(q) }; +Chart* QLineSeriesPrivate::createGraphics(ChartPresenter* presenter) +{ + Q_Q(QLineSeries); + LineChartItem* line = new LineChartItem(q,presenter); + if(presenter->animationOptions().testFlag(QChart::SeriesAnimations)) { + presenter->animator()->addAnimation(line); + } + presenter->chartTheme()->decorate(q, presenter->dataSet()->seriesIndex(q)); + return line; +} + QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/linechart/qlineseries_p.h b/src/linechart/qlineseries_p.h index 0c5fa533..5ac29cf3 100644 --- a/src/linechart/qlineseries_p.h +++ b/src/linechart/qlineseries_p.h @@ -35,9 +35,13 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE -struct QLineSeriesPrivate: public QXYSeriesPrivate +class QLineSeriesPrivate: public QXYSeriesPrivate { +public: QLineSeriesPrivate(QLineSeries* q); + Chart* createGraphics(ChartPresenter* presenter); +private: + Q_DECLARE_PUBLIC(QLineSeries); }; diff --git a/src/piechart/piechartitem.cpp b/src/piechart/piechartitem.cpp index 3e954e28..15403ca2 100644 --- a/src/piechart/piechartitem.cpp +++ b/src/piechart/piechartitem.cpp @@ -70,7 +70,7 @@ void PieChartItem::handleSlicesAdded(QList slices) { bool isEmpty = m_slices.isEmpty(); - presenter()->chartTheme()->decorate(m_series, presenter()->dataSet()->seriesIndex(m_series), false); + presenter()->chartTheme()->decorate(m_series, presenter()->dataSet()->seriesIndex(m_series)); foreach (QPieSlice *s, slices) { PieSliceItem* item = new PieSliceItem(this); @@ -91,7 +91,7 @@ void PieChartItem::handleSlicesAdded(QList slices) void PieChartItem::handleSlicesRemoved(QList slices) { - presenter()->chartTheme()->decorate(m_series, presenter()->dataSet()->seriesIndex(m_series), false); + presenter()->chartTheme()->decorate(m_series, presenter()->dataSet()->seriesIndex(m_series)); foreach (QPieSlice *s, slices) { if (animator()) diff --git a/src/piechart/qpieseries.cpp b/src/piechart/qpieseries.cpp index 29551a46..1f7a713b 100644 --- a/src/piechart/qpieseries.cpp +++ b/src/piechart/qpieseries.cpp @@ -22,6 +22,9 @@ #include "qpieseries_p.h" #include "qpieslice.h" #include "pieslicedata_p.h" +#include "chartdataset_p.h" +#include "charttheme_p.h" +#include "chartanimator_p.h" #include #include @@ -694,6 +697,24 @@ bool QPieSeriesPrivate::setRealValue(qreal &value, qreal newValue, qreal max, qr return false; } +void QPieSeriesPrivate::scaleDomain(Domain& domain) +{ + Q_UNUSED(domain); +#ifndef QT_NO_DEBUG + qWarning() << __FILE__<<__FUNCTION__<<"not implemented"; +#endif +} + +Chart* QPieSeriesPrivate::createGraphics(ChartPresenter* presenter) +{ + Q_Q(QPieSeries); + PieChartItem* pie = new PieChartItem(q,presenter); + if(presenter->animationOptions().testFlag(QChart::SeriesAnimations)) { + presenter->animator()->addAnimation(pie); + } + presenter->chartTheme()->decorate(q, presenter->dataSet()->seriesIndex(q)); + return pie; +} #include "moc_qpieseries.cpp" #include "moc_qpieseries_p.cpp" diff --git a/src/piechart/qpieseries_p.h b/src/piechart/qpieseries_p.h index 66fc53dc..e2ee3f11 100644 --- a/src/piechart/qpieseries_p.h +++ b/src/piechart/qpieseries_p.h @@ -36,6 +36,9 @@ public: QPieSeriesPrivate(QPieSeries *parent); ~QPieSeriesPrivate(); + void scaleDomain(Domain& domain); + Chart* createGraphics(ChartPresenter* presenter); + void updateDerivativeData(); public Q_SLOTS: diff --git a/src/qseries.cpp b/src/qseries.cpp index a32aa1c6..eafdcbd7 100644 --- a/src/qseries.cpp +++ b/src/qseries.cpp @@ -96,12 +96,6 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE \sa setName() */ -QSeries::QSeries(QObject *parent) : QObject(parent), -d_ptr(new QSeriesPrivate(this)) -{ - -} - QSeries::QSeries(QSeriesPrivate &d,QObject *parent) : QObject(parent), d_ptr(&d) { diff --git a/src/qseries.h b/src/qseries.h index 340a0d54..c3038ca1 100644 --- a/src/qseries.h +++ b/src/qseries.h @@ -50,7 +50,6 @@ public: }; protected: - QSeries(QObject *parent = 0); QSeries(QSeriesPrivate &d,QObject *parent = 0); public: @@ -64,6 +63,8 @@ public: protected: QScopedPointer d_ptr; + friend class ChartDataSet; + friend class ChartPresenter; }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/qseries_p.h b/src/qseries_p.h index ce4cbcfc..bbb3bba3 100644 --- a/src/qseries_p.h +++ b/src/qseries_p.h @@ -36,13 +36,25 @@ class QAbstractItemModel; QTCOMMERCIALCHART_BEGIN_NAMESPACE -struct QSeriesPrivate : public QObject +class Domain; +class ChartPresenter; +class Chart; + +class QSeriesPrivate : public QObject { +public: QSeriesPrivate(QSeries *q); - virtual ~QSeriesPrivate(); + ~QSeriesPrivate(); + + virtual void scaleDomain(Domain& domain) = 0; + virtual Chart* createGraphics(ChartPresenter* presenter) = 0; + +protected: QSeries *q_ptr; - QAbstractItemModel* m_model; + QAbstractItemModel *m_model; QString m_name; + + friend class QSeries; }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/scatterseries/qscatterseries.cpp b/src/scatterseries/qscatterseries.cpp index 1ef521bd..230ba278 100644 --- a/src/scatterseries/qscatterseries.cpp +++ b/src/scatterseries/qscatterseries.cpp @@ -20,6 +20,10 @@ #include "qscatterseries.h" #include "qscatterseries_p.h" +#include "scatterchartitem_p.h" +#include "chartdataset_p.h" +#include "charttheme_p.h" +#include "chartanimator_p.h" /*! \class QScatterSeries @@ -131,5 +135,16 @@ QScatterSeriesPrivate::QScatterSeriesPrivate(QScatterSeries* q):QXYSeriesPrivate }; +Chart* QScatterSeriesPrivate::createGraphics(ChartPresenter* presenter) +{ + Q_Q(QScatterSeries); + ScatterChartItem *scatter = new ScatterChartItem(q,presenter); + if(presenter->animationOptions().testFlag(QChart::SeriesAnimations)) { + presenter->animator()->addAnimation(scatter); + } + presenter->chartTheme()->decorate(q, presenter->dataSet()->seriesIndex(q)); + return scatter; +} + QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/scatterseries/qscatterseries_p.h b/src/scatterseries/qscatterseries_p.h index 2e564603..635b3124 100644 --- a/src/scatterseries/qscatterseries_p.h +++ b/src/scatterseries/qscatterseries_p.h @@ -34,12 +34,16 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE -struct QScatterSeriesPrivate: public QXYSeriesPrivate +class QScatterSeriesPrivate: public QXYSeriesPrivate { +public: QScatterSeriesPrivate(QScatterSeries* q); + Chart* createGraphics(ChartPresenter* presenter); +private: QScatterSeries::MarkerShape m_shape; qreal m_size; + Q_DECLARE_PUBLIC(QScatterSeries); }; diff --git a/src/splinechart/qsplineseries.cpp b/src/splinechart/qsplineseries.cpp index f34ed07a..3a25e7e0 100644 --- a/src/splinechart/qsplineseries.cpp +++ b/src/splinechart/qsplineseries.cpp @@ -20,6 +20,10 @@ #include "qsplineseries.h" #include "qsplineseries_p.h" +#include "splinechartitem_p.h" +#include "chartdataset_p.h" +#include "charttheme_p.h" +#include "chartanimator_p.h" /*! \class QSplineSeries @@ -215,6 +219,17 @@ void QSplineSeriesPrivate::updateControlPoints() \sa setModel(), setModelMapping() */ +Chart* QSplineSeriesPrivate::createGraphics(ChartPresenter* presenter) +{ + Q_Q(QSplineSeries); + SplineChartItem* spline = new SplineChartItem(q,presenter); + if(presenter->animationOptions().testFlag(QChart::SeriesAnimations)) { + presenter->animator()->addAnimation(spline); + } + presenter->chartTheme()->decorate(q, presenter->dataSet()->seriesIndex(q)); + return spline; +} + #include "moc_qsplineseries.cpp" #include "moc_qsplineseries_p.cpp" diff --git a/src/splinechart/qsplineseries_p.h b/src/splinechart/qsplineseries_p.h index 381b2867..d2180cf4 100644 --- a/src/splinechart/qsplineseries_p.h +++ b/src/splinechart/qsplineseries_p.h @@ -39,6 +39,7 @@ class QSplineSeriesPrivate: public QLineSeriesPrivate { Q_OBJECT public: + Chart* createGraphics(ChartPresenter* presenter); QSplineSeriesPrivate(QSplineSeries* q); void calculateControlPoints(); QList getFirstControlPoints(QList rhs); diff --git a/src/xychart/qxyseries.cpp b/src/xychart/qxyseries.cpp index 9b687992..c44c7729 100644 --- a/src/xychart/qxyseries.cpp +++ b/src/xychart/qxyseries.cpp @@ -20,6 +20,7 @@ #include "qxyseries.h" #include "qxyseries_p.h" +#include "domain_p.h" #include QTCOMMERCIALCHART_BEGIN_NAMESPACE @@ -83,11 +84,6 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE Constructs empty series object which is a child of \a parent. When series object is added to QChartView or QChart instance ownerships is transfered. */ -QXYSeries::QXYSeries(QObject *parent):QSeries(*new QXYSeriesPrivate(this),parent) -{ - -} - QXYSeries::QXYSeries(QXYSeriesPrivate &d,QObject *parent):QSeries(d,parent) { @@ -626,6 +622,30 @@ m_pointsVisible(false) } +void QXYSeriesPrivate::scaleDomain(Domain& domain) +{ + qreal minX(domain.minX()); + qreal minY(domain.minY()); + qreal maxX(domain.maxX()); + qreal maxY(domain.maxY()); + int tickXCount(domain.tickXCount()); + int tickYCount(domain.tickYCount()); + + Q_Q(QXYSeries); + for (int i = 0; i < q->count(); i++) + { + qreal x = q->x(i); + qreal y = q->y(i); + minX = qMin(minX, x); + minY = qMin(minY, y); + maxX = qMax(maxX, x); + maxY = qMax(maxY, y); + } + + domain.setRangeX(minX,maxX,tickXCount); + domain.setRangeY(minY,maxY,tickYCount); +} + #include "moc_qxyseries.cpp" #include "moc_qxyseries_p.cpp" diff --git a/src/xychart/qxyseries.h b/src/xychart/qxyseries.h index a6adbb59..717f8f9a 100644 --- a/src/xychart/qxyseries.h +++ b/src/xychart/qxyseries.h @@ -36,7 +36,6 @@ class QTCOMMERCIALCHART_EXPORT QXYSeries : public QSeries { Q_OBJECT protected: - explicit QXYSeries(QObject *parent = 0); explicit QXYSeries(QXYSeriesPrivate &d,QObject *parent = 0); ~QXYSeries(); diff --git a/src/xychart/qxyseries_p.h b/src/xychart/qxyseries_p.h index 036a3c4f..724845ca 100644 --- a/src/xychart/qxyseries_p.h +++ b/src/xychart/qxyseries_p.h @@ -43,12 +43,15 @@ class QXYSeriesPrivate: public QSeriesPrivate public: QXYSeriesPrivate(QXYSeries* q); + void scaleDomain(Domain& domain); + Q_SIGNALS: void updated(); void pointReplaced(int index); void pointRemoved(int index); void pointAdded(int index); -public: + +protected: QVector m_x; QVector m_y; @@ -64,8 +67,10 @@ public: int tempItemsRemoved; bool m_pointsVisible; +private: + Q_DECLARE_PUBLIC(QXYSeries); friend class QScatterSeries; - friend class QXYSeries; + }; QTCOMMERCIALCHART_END_NAMESPACE