diff --git a/src/areachart/areachart.pri b/src/areachart/areachart.pri index 1ac078e..af5fa60 100644 --- a/src/areachart/areachart.pri +++ b/src/areachart/areachart.pri @@ -2,13 +2,12 @@ INCLUDEPATH += $$PWD DEPENDPATH += $$PWD SOURCES += \ - #$$PWD/areachartanimationitem.cpp \ $$PWD/areachartitem.cpp \ $$PWD/qareaseries.cpp PRIVATE_HEADERS += \ $$PWD/areachartitem_p.h \ -# $$PWD/linechartanimationitem_p.h + $$PWD/qareaseries_p.h PUBLIC_HEADERS += \ $$PWD/qareaseries.h \ No newline at end of file diff --git a/src/areachart/areachartitem.cpp b/src/areachart/areachartitem.cpp index 69cbc5c..af30ea3 100644 --- a/src/areachart/areachartitem.cpp +++ b/src/areachart/areachartitem.cpp @@ -20,6 +20,7 @@ #include "areachartitem_p.h" #include "qareaseries.h" +#include "qareaseries_p.h" #include "qlineseries.h" #include "chartpresenter_p.h" #include @@ -42,7 +43,7 @@ AreaChartItem::AreaChartItem(QAreaSeries *areaSeries, ChartPresenter *presenter) if (m_series->lowerSeries()) m_lower = new AreaBoundItem(this,m_series->lowerSeries()); - connect(areaSeries,SIGNAL(updated()),this,SLOT(handleUpdated())); + connect(m_series->d_func(),SIGNAL(updated()),this,SLOT(handleUpdated())); connect(this,SIGNAL(clicked(const QPointF&)),areaSeries,SIGNAL(clicked(const QPointF&))); handleUpdated(); diff --git a/src/areachart/qareaseries.cpp b/src/areachart/qareaseries.cpp index 9894b24..82ac740 100644 --- a/src/areachart/qareaseries.cpp +++ b/src/areachart/qareaseries.cpp @@ -19,6 +19,7 @@ ****************************************************************************/ #include "qareaseries.h" +#include "qareaseries_p.h" #include "qlineseries.h" QTCOMMERCIALCHART_BEGIN_NAMESPACE @@ -99,10 +100,7 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE When series object is added to QChartView or QChart instance ownerships is transfered. */ QAreaSeries::QAreaSeries(QLineSeries *upperSeries, QLineSeries *lowerSeries) - : QSeries(upperSeries), - m_upperSeries(upperSeries), - m_lowerSeries(lowerSeries), - m_pointsVisible(false) + : QSeries(*new QAreaSeriesPrivate(upperSeries,lowerSeries,this),upperSeries) { } @@ -114,38 +112,100 @@ QAreaSeries::~QAreaSeries() { } + +QSeries::QSeriesType QAreaSeries::type() const +{ + return QSeries::SeriesTypeArea; +} + +QLineSeries* QAreaSeries::upperSeries() const +{ + Q_D(const QAreaSeries); + return d->m_upperSeries; +} + +QLineSeries* QAreaSeries::lowerSeries() const +{ + Q_D(const QAreaSeries); + return d->m_lowerSeries; +} + /*! Sets \a pen used for drawing area outline. */ void QAreaSeries::setPen(const QPen &pen) { - if (m_pen != pen) { - m_pen = pen; - emit updated(); + Q_D(QAreaSeries); + if (d->m_pen != pen) { + d->m_pen = pen; + emit d->updated(); } } +QPen QAreaSeries::pen() const +{ + Q_D(const QAreaSeries); + return d->m_pen; +} + /*! Sets \a brush used for filling the area. */ void QAreaSeries::setBrush(const QBrush &brush) { - if (m_brush != brush) { - m_brush = brush; - emit updated(); + Q_D(QAreaSeries); + if (d->m_brush != brush) { + d->m_brush = brush; + emit d->updated(); } } + +QBrush QAreaSeries::brush() const +{ + Q_D(const QAreaSeries); + return d->m_brush; +} /*! Sets if data points are \a visible and should be drawn on line. */ void QAreaSeries::setPointsVisible(bool visible) { - if (m_pointsVisible != visible) { - m_pointsVisible = visible; - emit updated(); + Q_D(QAreaSeries); + if (d->m_pointsVisible != visible) { + d->m_pointsVisible = visible; + emit d->updated(); } } +bool QAreaSeries::pointsVisible() const +{ + Q_D(const QAreaSeries); + return d->m_pointsVisible; +} + +bool QAreaSeries::setModel(QAbstractItemModel* model) +{ + Q_UNUSED(model); + qWarning()<<"Not implemented"; + return false; +} + +QAbstractItemModel* QAreaSeries::model() const +{ + return 0; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +QAreaSeriesPrivate::QAreaSeriesPrivate(QLineSeries *upperSeries, QLineSeries *lowerSeries,QAreaSeries* q):QSeriesPrivate(q), + m_upperSeries(upperSeries), + m_lowerSeries(lowerSeries), + m_pointsVisible(false) +{ + +}; + #include "moc_qareaseries.cpp" +#include "moc_qareaseries_p.cpp" QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/areachart/qareaseries.h b/src/areachart/qareaseries.h index 9144a56..033b4ed 100644 --- a/src/areachart/qareaseries.h +++ b/src/areachart/qareaseries.h @@ -28,6 +28,7 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE class QLineSeries; +class QAreaSeriesPrivate; class QTCOMMERCIALCHART_EXPORT QAreaSeries : public QSeries { @@ -36,32 +37,33 @@ public: QAreaSeries(QLineSeries *upperSeries, QLineSeries *lowerSeries = 0); virtual ~QAreaSeries(); -public: // from QChartSeries - virtual QSeriesType type() const { return QSeries::SeriesTypeArea; } +public: + QSeries::QSeriesType type() const; - QLineSeries* upperSeries() const { return m_upperSeries; } - QLineSeries* lowerSeries() const { return m_lowerSeries; } + QLineSeries* upperSeries() const; + QLineSeries* lowerSeries() const; void setPen(const QPen &pen); - QPen pen() const { return m_pen;} + QPen pen() const; void setBrush(const QBrush &brush); - QBrush brush() const { return m_brush;} + QBrush brush() const; void setPointsVisible(bool visible); - bool pointsVisible() const { return m_pointsVisible; } + bool pointsVisible() const; + + bool setModel(QAbstractItemModel* model); + QAbstractItemModel* model() const; Q_SIGNALS: - void updated(); void clicked(const QPointF &point); void selected(); private: - QBrush m_brush; - QPen m_pen; - QLineSeries* m_upperSeries; - QLineSeries* m_lowerSeries; - bool m_pointsVisible; + Q_DECLARE_PRIVATE(QAreaSeries); + Q_DISABLE_COPY(QAreaSeries); + friend class AreaLegendMarker; + friend class AreaChartItem; }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/areachart/qareaseries_p.h b/src/areachart/qareaseries_p.h new file mode 100644 index 0000000..20a2c7e --- /dev/null +++ b/src/areachart/qareaseries_p.h @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** 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 QAREASERIES_P_H_ +#define QAREASERIES_P_H_ + +#include "qseries_p.h" + +QTCOMMERCIALCHART_BEGIN_NAMESPACE + +class QAreaSeries; + +class QAreaSeriesPrivate: public QSeriesPrivate +{ + Q_OBJECT + +public: + QAreaSeriesPrivate(QLineSeries *upperSeries, QLineSeries *lowerSeries,QAreaSeries* q); + +Q_SIGNALS: + void updated(); + +public: + QBrush m_brush; + QPen m_pen; + QLineSeries* m_upperSeries; + QLineSeries* m_lowerSeries; + bool m_pointsVisible; + + friend class QAreaSeries; +}; + +QTCOMMERCIALCHART_END_NAMESPACE + +#endif diff --git a/src/barchart/barchart.pri b/src/barchart/barchart.pri index ac25d9e..26bd1a5 100644 --- a/src/barchart/barchart.pri +++ b/src/barchart/barchart.pri @@ -20,8 +20,8 @@ PRIVATE_HEADERS += \ $$PWD/percentbarchartitem_p.h \ $$PWD/stackedbarchartitem_p.h \ $$PWD/barlabel_p.h \ - $$PWD/qbarsetprivate_p.h \ - $$PWD/qbarseriesprivate_p.h + $$PWD/qbarset_p.h \ + $$PWD/qbarseries_p.h PUBLIC_HEADERS += \ $$PWD/qbarseries.h \ diff --git a/src/barchart/qbarseries.cpp b/src/barchart/qbarseries.cpp index 5db1334..3a827b0 100644 --- a/src/barchart/qbarseries.cpp +++ b/src/barchart/qbarseries.cpp @@ -18,324 +18,17 @@ ** ****************************************************************************/ -#include #include "qbarseries.h" +#include "qbarseries_p.h" #include "qbarset.h" +#include "qbarset_p.h" #include "barchartmodel_p.h" -#include "qbarseriesprivate_p.h" -#include "qbarsetprivate_p.h" + #include #include QTCOMMERCIALCHART_BEGIN_NAMESPACE -QBarSeriesPrivate::QBarSeriesPrivate(QBarCategories categories, QBarSeries *parent) : QObject(parent), - q_ptr(parent), - m_internalModel(new BarChartModel(categories,this)) -{ - m_model = 0; - m_mapCategories = -1; - m_mapBarBottom = -1; - m_mapBarTop = -1; - m_mapFirst = 0; - m_mapCount = 0; - m_mapOrientation = Qt::Vertical; -} - -void QBarSeriesPrivate::appendBarSet(QBarSet *set) -{ - m_internalModel->appendBarSet(set); -// connect(set, SIGNAL(clicked(QString,Qt::MouseButtons)), this, SLOT(barsetClicked(QString,Qt::MouseButtons))); -// connect(set, SIGNAL(valueChanged()), this, SLOT(barsetChanged())); - emit restructuredBars(); -} - -void QBarSeriesPrivate::removeBarSet(QBarSet *set) -{ -// disconnect(set, SIGNAL(clicked(QString,Qt::MouseButtons)), this, SLOT(barsetClicked(QString,Qt::MouseButtons))); - m_internalModel->removeBarSet(set); - emit restructuredBars(); -} -void QBarSeriesPrivate::appendBarSets(QList sets) -{ - foreach (QBarSet* barset, sets) { - m_internalModel->appendBarSet(barset); - connect(barset, SIGNAL(clicked(QString,Qt::MouseButtons)), this, SLOT(barsetClicked(QString,Qt::MouseButtons))); - connect(barset, SIGNAL(valueChanged()), this, SLOT(barsetChanged())); - } - emit restructuredBars(); -} - -void QBarSeriesPrivate::removeBarSets(QList sets) -{ - foreach (QBarSet* barset, sets) { - disconnect(barset, SIGNAL(clicked(QString,Qt::MouseButtons)), this, SLOT(barsetClicked(QString,Qt::MouseButtons))); - m_internalModel->removeBarSet(barset); - } - emit restructuredBars(); -} - -void QBarSeriesPrivate::insertBarSet(int i, QBarSet *set) -{ - m_internalModel->insertBarSet(i, set); - // emit barsetChanged(); -} - -void QBarSeriesPrivate::insertCategory(int i, QString category) -{ - m_internalModel->insertCategory(i, category); -} - -void QBarSeriesPrivate::removeCategory(int i) -{ - m_internalModel->removeCategory(i); -} - -int QBarSeriesPrivate::barsetCount() const -{ - // if(m_model) - // return m_mapBarTop - m_mapBarBottom; - // else - return m_internalModel->barsetCount(); -} - -int QBarSeriesPrivate::categoryCount() const -{ - return m_internalModel->categoryCount(); -} - -QList QBarSeriesPrivate::barSets() const -{ - return m_internalModel->barSets(); -} - -QBarSet* QBarSeriesPrivate::barsetAt(int index) -{ - return m_internalModel->barsetAt(index); -} - -QString QBarSeriesPrivate::categoryName(int category) -{ - return m_internalModel->categoryName(category); -} - -void QBarSeriesPrivate::setToolTipEnabled(bool enabled) -{ - // TODO: what if we add sets after call to this function? Those sets won't have tooltip enabled. - if (enabled) { - for (int i=0; ibarsetCount(); i++) { - QBarSet *set = m_internalModel->barsetAt(i); - connect(set, SIGNAL(showToolTip(QPoint,QString)), this, SIGNAL(showToolTip(QPoint,QString))); - } - } else { - for (int i=0; ibarsetCount(); i++) { - QBarSet *set = m_internalModel->barsetAt(i); - disconnect(set, SIGNAL(showToolTip(QPoint,QString)), this, SIGNAL(showToolTip(QPoint,QString))); - } - } -} - -void QBarSeriesPrivate::barsetClicked(QString category, Qt::MouseButtons button) -{ - emit clicked(qobject_cast(sender()), category, button); -} - -qreal QBarSeriesPrivate::min() -{ - return m_internalModel->min(); -} - -qreal QBarSeriesPrivate::max() -{ - return m_internalModel->max(); -} - -qreal QBarSeriesPrivate::valueAt(int set, int category) -{ - return m_internalModel->valueAt(set, category); -} - -qreal QBarSeriesPrivate::percentageAt(int set, int category) -{ - return m_internalModel->percentageAt(set, category); -} - -qreal QBarSeriesPrivate::categorySum(int category) -{ - return m_internalModel->categorySum(category); -} - -qreal QBarSeriesPrivate::absoluteCategorySum(int category) -{ - return m_internalModel->absoluteCategorySum(category); -} - -qreal QBarSeriesPrivate::maxCategorySum() -{ - return m_internalModel->maxCategorySum(); -} - -BarChartModel& QBarSeriesPrivate::modelInternal() -{ - return *m_internalModel; -} - -bool QBarSeriesPrivate::setModel(QAbstractItemModel *model) -{ - // disconnect signals from old model - if(m_model) - { - disconnect(m_model, 0, this, 0); - m_mapCategories = -1; - m_mapBarBottom = -1; - m_mapBarTop = -1; - m_mapFirst = 0; - m_mapCount = 0; - m_mapOrientation = Qt::Vertical; - } - - // set new model - if(model) - { - m_model = model; - return true; - } - else - { - m_model = 0; - return false; - } -} - -void QBarSeriesPrivate::setModelMapping(int categories, int bottomBoundry, int topBoundry, Qt::Orientation orientation) -{ - if (!m_model) - return; - - m_mapCategories = categories; - m_mapBarBottom = bottomBoundry; - m_mapBarTop = topBoundry; -// m_mapFirst = 1; - m_mapOrientation = orientation; - - // connect the signals - if (m_mapOrientation == Qt::Vertical) { - m_mapCount = m_model->rowCount() - m_mapFirst; - connect(m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)), - this, SLOT(modelUpdated(QModelIndex, QModelIndex))); - connect(m_model,SIGNAL(rowsInserted(QModelIndex, int, int)), - this, SLOT(modelDataAdded(QModelIndex,int,int))); - connect(m_model, SIGNAL(rowsRemoved(QModelIndex, int, int)), - this, SLOT(modelDataRemoved(QModelIndex,int,int))); - } else { - m_mapCount = m_model->columnCount() - m_mapFirst; - connect(m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)), - this, SLOT(modelUpdated(QModelIndex, QModelIndex))); - connect(m_model,SIGNAL(columnsInserted(QModelIndex, int, int)), - this, SLOT(modelDataAdded(QModelIndex,int,int))); - connect(m_model, SIGNAL(columnsRemoved(QModelIndex, int, int)), - this, SLOT(modelDataRemoved(QModelIndex,int,int))); - } - - // create the initial bars - delete m_internalModel; - if (m_mapOrientation == Qt::Vertical) { - QStringList categories; - for (int k = m_mapFirst; k < m_mapFirst + m_mapCount; k++) - categories << m_model->data(m_model->index(k, m_mapCategories), Qt::DisplayRole).toString(); - m_internalModel = new BarChartModel(categories, this); - - for (int i = m_mapBarBottom; i <= m_mapBarTop; i++) { - QBarSet* barSet = new QBarSet(QString("Column: %1").arg(i + 1)); - for(int m = m_mapFirst; m < m_mapFirst + m_mapCount; m++) - *barSet << m_model->data(m_model->index(m, i), Qt::DisplayRole).toDouble(); - appendBarSet(barSet); - } - } else { - QStringList categories; - for (int k = m_mapFirst; k < m_mapFirst + m_mapCount; k++) - categories << m_model->data(m_model->index(m_mapCategories, k), Qt::DisplayRole).toString(); - m_internalModel = new BarChartModel(categories, this); - - for (int i = m_mapBarBottom; i <= m_mapBarTop; i++) { - QBarSet* barSet = new QBarSet(QString("Row: %1").arg(i + 1)); - for(int m = m_mapFirst; m < m_mapFirst + m_mapCount; m++) - *barSet << m_model->data(m_model->index(i, m), Qt::DisplayRole).toDouble(); - appendBarSet(barSet); - } - } -} - -void QBarSeriesPrivate::modelUpdated(QModelIndex topLeft, QModelIndex bottomRight) -{ - Q_UNUSED(bottomRight) - - if (m_mapOrientation == Qt::Vertical) - { - // model update is relevant to BarSeries if the change was made to the part of the model that was mapped to BarSeries - if (topLeft.column() >= m_mapBarBottom && topLeft.column() <= m_mapBarTop && topLeft.row() >= m_mapFirst && topLeft.row() < m_mapFirst + m_mapCount) - barsetAt(topLeft.column() - m_mapBarBottom)->setValue(topLeft.row() - m_mapFirst, m_model->data(topLeft, Qt::DisplayRole).toDouble()); - } - else - { - // model update is relevant to BarSeries if the change was made to the part of the model that was mapped to BarSeries - if (topLeft.row() >= m_mapBarBottom && topLeft.row() <= m_mapBarTop && topLeft.column() >= m_mapFirst && topLeft.column() < m_mapFirst + m_mapCount) - barsetAt(topLeft.row() - m_mapBarBottom)->setValue(topLeft.column() - m_mapFirst, m_model->data(topLeft, Qt::DisplayRole).toDouble()); - } -} - -void QBarSeriesPrivate::modelDataAdded(QModelIndex /*parent*/, int start, int /*end*/) -{ - if (m_mapOrientation == Qt::Vertical) { - insertCategory(start - m_mapFirst, QString("Row: %1").arg(start + 1)); - for (int i = 0; i <= m_mapBarTop - m_mapBarBottom; i++) { - barsetAt(i)->insertValue(start - m_mapFirst, m_model->data(m_model->index(start, i), Qt::DisplayRole).toDouble()); - } - } else { - insertCategory(start - m_mapFirst, QString("Column: %1").arg(start + 1)); - for (int i = 0; i <= m_mapBarTop - m_mapBarBottom; i++) { - barsetAt(i)->insertValue(start - m_mapFirst, m_model->data(m_model->index(i, start), Qt::DisplayRole).toDouble()); - } - } - emit restructuredBars(); -} - -void QBarSeriesPrivate::modelDataRemoved(QModelIndex parent, int start, int end) -{ - Q_UNUSED(parent) - Q_UNUSED(end) - - removeCategory(start - m_mapFirst); - for (int i = 0; i <= m_mapBarTop - m_mapBarBottom; i++) - { - barsetAt(i)->removeValue(start - m_mapFirst); - } - emit restructuredBars(); -} - -void QBarSeriesPrivate::barsetChanged() -{ - emit updatedBars(); -} - -QBarCategories QBarSeriesPrivate::categories() const -{ - QBarCategories categories; - int count = m_internalModel->categoryCount(); - for (int i=1; i <= count; i++) { - categories.insert(i, m_internalModel->categoryName(i - 1)); - } - return categories; -} - -void QBarSeriesPrivate::setLabelsVisible(bool visible) -{ - foreach (QBarSet* s, barSets()) { - s->setLabelsVisible(visible); - } -} - - /*! \class QBarSeries \brief part of QtCommercial chart API. @@ -364,17 +57,15 @@ void QBarSeriesPrivate::setLabelsVisible(bool visible) Constructs empty QBarSeries. Parameter \a categories defines the categories for chart. QBarSeries is QObject which is a child of a \a parent. */ -QBarSeries::QBarSeries(QBarCategories categories, QObject *parent) : QSeries(parent), - d_ptr(new QBarSeriesPrivate(categories, this)) -// m_internalModel(new BarChartModel(categories, this)) + +QBarSeries::QBarSeries(QBarCategories categories, QObject *parent) : QSeries(*new QBarSeriesPrivate(categories, this),parent) +{ + +} + +QSeries::QSeriesType QBarSeries::type() const { -// m_model = 0; -// m_mapCategories = -1; -// m_mapBarBottom = -1; -// m_mapBarTop = -1; -// m_mapFirst = 0; -// m_mapCount = 0; -// m_mapOrientation = Qt::Vertical; + return QSeries::SeriesTypeBar; } /*! @@ -385,15 +76,10 @@ QBarSeries::QBarSeries(QBarCategories categories, QObject *parent) : QSeries(par void QBarSeries::appendBarSet(QBarSet *set) { Q_D(QBarSeries); - connect(&QBarSetPrivate::pimpl(set), SIGNAL(clicked(QString,Qt::MouseButtons)), d_ptr, SLOT(barsetClicked(QString,Qt::MouseButtons))); - connect(&QBarSetPrivate::pimpl(set), SIGNAL(valueChanged()), d_ptr, SLOT(barsetChanged())); - d->appendBarSet(set); - /* - m_internalModel->appendBarSet(set); - connect(set, SIGNAL(clicked(QString,Qt::MouseButtons)), this, SLOT(barsetClicked(QString,Qt::MouseButtons))); - connect(set, SIGNAL(valueChanged()), this, SLOT(barsetChanged())); - emit restructuredBars(); - */ + d->m_internalModel->appendBarSet(set); + QObject::connect(set->d_ptr.data(), SIGNAL(clicked(QString,Qt::MouseButtons)), d, SLOT(barsetClicked(QString,Qt::MouseButtons))); + QObject::connect(set->d_ptr.data(), SIGNAL(valueChanged()), d, SLOT(barsetChanged())); + emit d->restructuredBars(); } /*! @@ -404,13 +90,9 @@ void QBarSeries::appendBarSet(QBarSet *set) void QBarSeries::removeBarSet(QBarSet *set) { Q_D(QBarSeries); - disconnect(&QBarSetPrivate::pimpl(set), SIGNAL(clicked(QString,Qt::MouseButtons)), d_ptr, SLOT(barsetClicked(QString,Qt::MouseButtons))); - d->removeBarSet(set); - /* - disconnect(set, SIGNAL(clicked(QString,Qt::MouseButtons)), this, SLOT(barsetClicked(QString,Qt::MouseButtons))); - m_internalModel->removeBarSet(set); - emit restructuredBars(); - */ + QObject::disconnect(set->d_ptr.data(), SIGNAL(clicked(QString,Qt::MouseButtons)), d, SLOT(barsetClicked(QString,Qt::MouseButtons))); + d->m_internalModel->removeBarSet(set); + emit d->restructuredBars(); } /*! @@ -421,15 +103,13 @@ void QBarSeries::removeBarSet(QBarSet *set) void QBarSeries::appendBarSets(QList sets) { Q_D(QBarSeries); - d->appendBarSets(sets); - /* foreach (QBarSet* barset, sets) { - m_internalModel->appendBarSet(barset); - connect(barset, SIGNAL(clicked(QString,Qt::MouseButtons)), this, SLOT(barsetClicked(QString,Qt::MouseButtons))); - connect(barset, SIGNAL(valueChanged()), this, SLOT(barsetChanged())); + d->m_internalModel->appendBarSet(barset); + QObject::connect(barset, SIGNAL(clicked(QString,Qt::MouseButtons)), this, SLOT(barsetClicked(QString,Qt::MouseButtons))); + QObject::connect(barset, SIGNAL(valueChanged()), this, SLOT(barsetChanged())); } - emit restructuredBars(); - */ + emit d->restructuredBars(); + } /*! @@ -440,14 +120,12 @@ void QBarSeries::appendBarSets(QList sets) void QBarSeries::removeBarSets(QList sets) { Q_D(QBarSeries); - d->removeBarSets(sets); - /* + foreach (QBarSet* barset, sets) { - disconnect(barset, SIGNAL(clicked(QString,Qt::MouseButtons)), this, SLOT(barsetClicked(QString,Qt::MouseButtons))); - m_internalModel->removeBarSet(barset); + QObject::disconnect(barset, SIGNAL(clicked(QString,Qt::MouseButtons)), this, SLOT(barsetClicked(QString,Qt::MouseButtons))); + d->m_internalModel->removeBarSet(barset); } - emit restructuredBars(); - */ + emit d->restructuredBars(); } /*! @@ -457,11 +135,8 @@ void QBarSeries::removeBarSets(QList sets) void QBarSeries::insertBarSet(int i, QBarSet *set) { Q_D(QBarSeries); - d->insertBarSet(i,set); - /* - m_internalModel->insertBarSet(i, set); - // emit barsetChanged(); - */ + d->m_internalModel->insertBarSet(i, set); + emit d->barsetChanged(); } /*! @@ -472,8 +147,7 @@ void QBarSeries::insertBarSet(int i, QBarSet *set) void QBarSeries::insertCategory(int i, QString category) { Q_D(QBarSeries); - d->insertCategory(i,category); - //m_internalModel->insertCategory(i, category); + d->m_internalModel->insertCategory(i, category); } /*! @@ -483,8 +157,7 @@ void QBarSeries::insertCategory(int i, QString category) void QBarSeries::removeCategory(int i) { Q_D(QBarSeries); - d->removeCategory(i); - //m_internalModel->removeCategory(i); + d->m_internalModel->removeCategory(i); } /*! @@ -493,13 +166,13 @@ void QBarSeries::removeCategory(int i) int QBarSeries::barsetCount() const { Q_D(const QBarSeries); - return d->barsetCount(); /* // if(m_model) // return m_mapBarTop - m_mapBarBottom; // else - return m_internalModel->barsetCount(); + */ + return d->m_internalModel->barsetCount(); } /*! @@ -508,8 +181,7 @@ int QBarSeries::barsetCount() const int QBarSeries::categoryCount() const { Q_D(const QBarSeries); - return d->categoryCount(); -// return m_internalModel->categoryCount(); + return d->m_internalModel->categoryCount(); } /*! @@ -518,8 +190,7 @@ int QBarSeries::categoryCount() const QList QBarSeries::barSets() const { Q_D(const QBarSeries); - return d->barSets(); -// return m_internalModel->barSets(); + return d->m_internalModel->barSets(); } /*! @@ -842,15 +513,14 @@ void QBarSeries::barsetChanged() QBarCategories QBarSeries::categories() const { Q_D(const QBarSeries); - return d->categories(); -/* + QBarCategories categories; - int count = m_internalModel->categoryCount(); + int count = d->m_internalModel->categoryCount(); for (int i=1; i <= count; i++) { - categories.insert(i, m_internalModel->categoryName(i - 1)); + categories.insert(i, d->m_internalModel->categoryName(i - 1)); } return categories; -*/ + } /*! @@ -858,17 +528,240 @@ QBarCategories QBarSeries::categories() const */ void QBarSeries::setLabelsVisible(bool visible) { - Q_D(QBarSeries); - d->setLabelsVisible(visible); -/* foreach (QBarSet* s, barSets()) { s->setLabelsVisible(visible); } -*/ } +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +QBarSeriesPrivate::QBarSeriesPrivate(QBarCategories categories, QBarSeries *q) : QSeriesPrivate(q), + m_internalModel(new BarChartModel(categories,this)), + m_model(0), + m_mapCategories(-1), + m_mapBarBottom(-1), + m_mapBarTop(-1), + m_mapFirst(0), + m_mapCount(0), + m_mapOrientation(Qt::Vertical) +{ +} + +QBarSet* QBarSeriesPrivate::barsetAt(int index) +{ + return m_internalModel->barsetAt(index); +} + +QString QBarSeriesPrivate::categoryName(int category) +{ + return m_internalModel->categoryName(category); +} + +void QBarSeriesPrivate::setToolTipEnabled(bool enabled) +{ + // TODO: what if we add sets after call to this function? Those sets won't have tooltip enabled. + if (enabled) { + for (int i=0; ibarsetCount(); i++) { + QBarSet *set = m_internalModel->barsetAt(i); + connect(set, SIGNAL(showToolTip(QPoint,QString)), this, SIGNAL(showToolTip(QPoint,QString))); + } + } else { + for (int i=0; ibarsetCount(); i++) { + QBarSet *set = m_internalModel->barsetAt(i); + disconnect(set, SIGNAL(showToolTip(QPoint,QString)), this, SIGNAL(showToolTip(QPoint,QString))); + } + } +} + +void QBarSeriesPrivate::barsetClicked(QString category, Qt::MouseButtons button) +{ + emit clicked(qobject_cast(sender()), category, button); +} + +qreal QBarSeriesPrivate::min() +{ + return m_internalModel->min(); +} + +qreal QBarSeriesPrivate::max() +{ + return m_internalModel->max(); +} + +qreal QBarSeriesPrivate::valueAt(int set, int category) +{ + return m_internalModel->valueAt(set, category); +} + +qreal QBarSeriesPrivate::percentageAt(int set, int category) +{ + return m_internalModel->percentageAt(set, category); +} + +qreal QBarSeriesPrivate::categorySum(int category) +{ + return m_internalModel->categorySum(category); +} + +qreal QBarSeriesPrivate::absoluteCategorySum(int category) +{ + return m_internalModel->absoluteCategorySum(category); +} + +qreal QBarSeriesPrivate::maxCategorySum() +{ + return m_internalModel->maxCategorySum(); +} + +BarChartModel& QBarSeriesPrivate::modelInternal() +{ + return *m_internalModel; +} + +bool QBarSeriesPrivate::setModel(QAbstractItemModel *model) +{ + // disconnect signals from old model + if(m_model) + { + disconnect(m_model, 0, this, 0); + m_mapCategories = -1; + m_mapBarBottom = -1; + m_mapBarTop = -1; + m_mapFirst = 0; + m_mapCount = 0; + m_mapOrientation = Qt::Vertical; + } + + // set new model + if(model) + { + m_model = model; + return true; + } + else + { + m_model = 0; + return false; + } +} + +void QBarSeriesPrivate::setModelMapping(int categories, int bottomBoundry, int topBoundry, Qt::Orientation orientation) +{ + Q_Q(QBarSeries); + + if (!m_model) + return; + + m_mapCategories = categories; + m_mapBarBottom = bottomBoundry; + m_mapBarTop = topBoundry; +// m_mapFirst = 1; + m_mapOrientation = orientation; + + // connect the signals + if (m_mapOrientation == Qt::Vertical) { + m_mapCount = m_model->rowCount() - m_mapFirst; + connect(m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)), + this, SLOT(modelUpdated(QModelIndex, QModelIndex))); + connect(m_model,SIGNAL(rowsInserted(QModelIndex, int, int)), + this, SLOT(modelDataAdded(QModelIndex,int,int))); + connect(m_model, SIGNAL(rowsRemoved(QModelIndex, int, int)), + this, SLOT(modelDataRemoved(QModelIndex,int,int))); + } else { + m_mapCount = m_model->columnCount() - m_mapFirst; + connect(m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)), + this, SLOT(modelUpdated(QModelIndex, QModelIndex))); + connect(m_model,SIGNAL(columnsInserted(QModelIndex, int, int)), + this, SLOT(modelDataAdded(QModelIndex,int,int))); + connect(m_model, SIGNAL(columnsRemoved(QModelIndex, int, int)), + this, SLOT(modelDataRemoved(QModelIndex,int,int))); + } + + // create the initial bars + delete m_internalModel; + if (m_mapOrientation == Qt::Vertical) { + QStringList categories; + for (int k = m_mapFirst; k < m_mapFirst + m_mapCount; k++) + categories << m_model->data(m_model->index(k, m_mapCategories), Qt::DisplayRole).toString(); + m_internalModel = new BarChartModel(categories, this); + + for (int i = m_mapBarBottom; i <= m_mapBarTop; i++) { + QBarSet* barSet = new QBarSet(QString("Column: %1").arg(i + 1)); + for(int m = m_mapFirst; m < m_mapFirst + m_mapCount; m++) + *barSet << m_model->data(m_model->index(m, i), Qt::DisplayRole).toDouble(); + q->appendBarSet(barSet); + } + } else { + QStringList categories; + for (int k = m_mapFirst; k < m_mapFirst + m_mapCount; k++) + categories << m_model->data(m_model->index(m_mapCategories, k), Qt::DisplayRole).toString(); + m_internalModel = new BarChartModel(categories, this); + + for (int i = m_mapBarBottom; i <= m_mapBarTop; i++) { + QBarSet* barSet = new QBarSet(QString("Row: %1").arg(i + 1)); + for(int m = m_mapFirst; m < m_mapFirst + m_mapCount; m++) + *barSet << m_model->data(m_model->index(i, m), Qt::DisplayRole).toDouble(); + q->appendBarSet(barSet); + } + } +} + +void QBarSeriesPrivate::modelUpdated(QModelIndex topLeft, QModelIndex bottomRight) +{ + Q_UNUSED(bottomRight) + + if (m_mapOrientation == Qt::Vertical) + { + // model update is relevant to BarSeries if the change was made to the part of the model that was mapped to BarSeries + if (topLeft.column() >= m_mapBarBottom && topLeft.column() <= m_mapBarTop && topLeft.row() >= m_mapFirst && topLeft.row() < m_mapFirst + m_mapCount) + barsetAt(topLeft.column() - m_mapBarBottom)->setValue(topLeft.row() - m_mapFirst, m_model->data(topLeft, Qt::DisplayRole).toDouble()); + } + else + { + // model update is relevant to BarSeries if the change was made to the part of the model that was mapped to BarSeries + if (topLeft.row() >= m_mapBarBottom && topLeft.row() <= m_mapBarTop && topLeft.column() >= m_mapFirst && topLeft.column() < m_mapFirst + m_mapCount) + barsetAt(topLeft.row() - m_mapBarBottom)->setValue(topLeft.column() - m_mapFirst, m_model->data(topLeft, Qt::DisplayRole).toDouble()); + } +} + +void QBarSeriesPrivate::modelDataAdded(QModelIndex /*parent*/, int start, int /*end*/) +{ + Q_Q(QBarSeries); + + if (m_mapOrientation == Qt::Vertical) { + q->insertCategory(start - m_mapFirst, QString("Row: %1").arg(start + 1)); + for (int i = 0; i <= m_mapBarTop - m_mapBarBottom; i++) { + barsetAt(i)->insertValue(start - m_mapFirst, m_model->data(m_model->index(start, i), Qt::DisplayRole).toDouble()); + } + } else { + q->insertCategory(start - m_mapFirst, QString("Column: %1").arg(start + 1)); + for (int i = 0; i <= m_mapBarTop - m_mapBarBottom; i++) { + barsetAt(i)->insertValue(start - m_mapFirst, m_model->data(m_model->index(i, start), Qt::DisplayRole).toDouble()); + } + } + emit restructuredBars(); +} + +void QBarSeriesPrivate::modelDataRemoved(QModelIndex parent, int start, int end) +{ + Q_Q(QBarSeries); + Q_UNUSED(parent) + Q_UNUSED(end) + + q->removeCategory(start - m_mapFirst); + for (int i = 0; i <= m_mapBarTop - m_mapBarBottom; i++) + { + barsetAt(i)->removeValue(start - m_mapFirst); + } + emit restructuredBars(); +} + +void QBarSeriesPrivate::barsetChanged() +{ + emit updatedBars(); +} #include "moc_qbarseries.cpp" -#include "moc_qbarseriesprivate_p.cpp" +#include "moc_qbarseries_p.cpp" QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/barchart/qbarseries.h b/src/barchart/qbarseries.h index 020e5d2..d65acd3 100644 --- a/src/barchart/qbarseries.h +++ b/src/barchart/qbarseries.h @@ -42,7 +42,7 @@ class QTCOMMERCIALCHART_EXPORT QBarSeries : public QSeries public: QBarSeries(QStringList categories, QObject *parent = 0); - virtual QSeriesType type() const { return QSeries::SeriesTypeBar; } + QSeries::QSeriesType type() const; void appendBarSet(QBarSet *set); // Takes ownership of set void removeBarSet(QBarSet *set); // Releases ownership, doesn't delete set @@ -104,7 +104,6 @@ private Q_SLOTS: void barsetChanged(); protected: - QBarSeriesPrivate * const d_ptr; Q_DECLARE_PRIVATE(QBarSeries) Q_DISABLE_COPY(QBarSeries) diff --git a/src/barchart/qbarseriesprivate_p.h b/src/barchart/qbarseries_p.h similarity index 74% rename from src/barchart/qbarseriesprivate_p.h rename to src/barchart/qbarseries_p.h index 8fe5065..49658cf 100644 --- a/src/barchart/qbarseriesprivate_p.h +++ b/src/barchart/qbarseries_p.h @@ -1,7 +1,8 @@ -#ifndef QBARSERIESPRIVATE_P_H -#define QBARSERIESPRIVATE_P_H +#ifndef QBARSERIES_P_H +#define QBARSERIES_P_H #include "qbarseries.h" +#include "qseries_p.h" #include #include @@ -9,36 +10,12 @@ class QModelIndex; QTCOMMERCIALCHART_BEGIN_NAMESPACE -typedef QStringList QBarCategories; - -class QBarSeries; -class QBarSet; -class BarChartModel; -class BarCategory; - // Container for series -class QBarSeriesPrivate : public QObject +class QBarSeriesPrivate : public QSeriesPrivate { Q_OBJECT - Q_DECLARE_PUBLIC(QBarSeries) public: - QBarSeriesPrivate(QStringList categories, QBarSeries *parent); - - virtual QSeries::QSeriesType type() const { return QSeries::SeriesTypeBar; } - - void appendBarSet(QBarSet *set); // Takes ownership of set - void removeBarSet(QBarSet *set); // Releases ownership, doesn't delete set - void appendBarSets(QList sets); - void removeBarSets(QList sets); - void insertBarSet(int i, QBarSet *set); - void insertCategory(int i, QString category); - void removeCategory(int i); - int barsetCount() const; - int categoryCount() const; - QList barSets() const; - QBarCategories categories() const; - - void setLabelsVisible(bool visible = true); + QBarSeriesPrivate(QBarCategories categories, QBarSeries *parent); bool setModel(QAbstractItemModel *model); void setModelMapping(int categories, int bottomBoundry, int topBoundry, Qt::Orientation orientation = Qt::Vertical); @@ -54,12 +31,6 @@ public: qreal maxCategorySum(); BarChartModel& modelInternal(); - static QBarSeriesPrivate &data(QBarSeries *barseries) - { - Q_ASSERT(barseries); - return *barseries->d_ptr; - } - Q_SIGNALS: void clicked(QBarSet *barset, QString category, Qt::MouseButtons button); // Up to user of api, what to do with these signals void selected(); @@ -79,8 +50,6 @@ private Q_SLOTS: void barsetChanged(); protected: - QBarSeries * const q_ptr; - BarChartModel *m_internalModel; // TODO: this may change... current "2 models" situation doesn't look good. QAbstractItemModel* m_model; int m_mapCategories; @@ -89,6 +58,8 @@ protected: int m_mapFirst; int m_mapCount; Qt::Orientation m_mapOrientation; +private: + Q_DECLARE_PUBLIC(QBarSeries) }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/barchart/qbarset.cpp b/src/barchart/qbarset.cpp index 972a2e3..816961c 100644 --- a/src/barchart/qbarset.cpp +++ b/src/barchart/qbarset.cpp @@ -19,157 +19,11 @@ ****************************************************************************/ #include "qbarset.h" -#include "qbarsetprivate_p.h" -//#include +#include "qbarset_p.h" #include QTCOMMERCIALCHART_BEGIN_NAMESPACE - -QBarSetPrivate::QBarSetPrivate(QString name, QBarSet *parent) : QObject(parent), - q_ptr(parent), - m_name(name), - m_labelsVisible(false) -{ - -} - -QBarSetPrivate::~QBarSetPrivate() -{ - -} - -void QBarSetPrivate::setName(QString name) -{ - m_name = name; -} - -QString QBarSetPrivate::name() const -{ - return m_name; -} - -QBarSetPrivate& QBarSetPrivate::operator << (const qreal &value) -{ - m_values.append(value); - emit structureChanged(); - return *this; -} - -void QBarSetPrivate::insertValue(int i, qreal value) -{ - m_values.insert(i, value); -} - -void QBarSetPrivate::removeValue(int i) -{ - m_values.removeAt(i); -} - -int QBarSetPrivate::count() const -{ - return m_values.count(); -} - -qreal QBarSetPrivate::valueAt(int index) const -{ - return m_values.at(index); -} - -void QBarSetPrivate::setValue(int index, qreal value) -{ - m_values.replace(index,value); - emit valueChanged(); -} - -qreal QBarSetPrivate::sum() const -{ - qreal sum(0); - for (int i=0; i < m_values.count(); i++) { - sum += m_values.at(i); - } - return sum; -} - -void QBarSetPrivate::setPen(const QPen &pen) -{ - m_pen = pen; - emit valueChanged(); -} - -QPen QBarSetPrivate::pen() const -{ - return m_pen; -} - -void QBarSetPrivate::setBrush(const QBrush &brush) -{ - m_brush = brush; - emit valueChanged(); -} - -QBrush QBarSetPrivate::brush() const -{ - return m_brush; -} - -void QBarSetPrivate::setLabelPen(const QPen &pen) -{ - m_labelPen = pen; - emit valueChanged(); -} - -QPen QBarSetPrivate::labelPen() const -{ - return m_labelPen; -} - -void QBarSetPrivate::setLabelBrush(const QBrush &brush) -{ - m_labelBrush = brush; - emit valueChanged(); -} - -QBrush QBarSetPrivate::labelBrush() const -{ - return m_labelBrush; -} - -void QBarSetPrivate::setLabelFont(const QFont &font) -{ - m_labelFont = font; - emit valueChanged(); -} - -QFont QBarSetPrivate::labelFont() const -{ - return m_labelFont; -} - -void QBarSetPrivate::setLabelsVisible(bool visible) -{ - m_labelsVisible = visible; - emit labelsVisibleChanged(visible); -} - -bool QBarSetPrivate::labelsVisible() const -{ - return m_labelsVisible; -} - -void QBarSetPrivate::barHoverEnterEvent(QPoint pos) -{ - emit showToolTip(pos, m_name); - emit hoverEnter(pos); -} - -void QBarSetPrivate::barHoverLeaveEvent() -{ - // Emit signal to user of charts - emit hoverLeave(); -} - - /*! \class QBarSet \brief part of QtCommercial chart API. @@ -223,8 +77,7 @@ QBarSet::QBarSet(QString name, QObject *parent) */ void QBarSet::setName(QString name) { - Q_D(QBarSet); - d->setName(name); + d_ptr->m_name = name; } /*! @@ -232,8 +85,7 @@ void QBarSet::setName(QString name) */ QString QBarSet::name() const { - Q_D(const QBarSet); - return d->name(); + return d_ptr->m_name; } /*! @@ -241,13 +93,9 @@ QString QBarSet::name() const */ QBarSet& QBarSet::operator << (const qreal &value) { - Q_D(QBarSet); - d->operator <<(value); + d_ptr->m_values.append(value); + emit d_ptr->structureChanged(); return *this; - -// m_values.append(value); -// emit structureChanged(); -// return *this; } /*! @@ -257,9 +105,7 @@ QBarSet& QBarSet::operator << (const qreal &value) */ void QBarSet::insertValue(int i, qreal value) { - Q_D(QBarSet); - d->insertValue(i,value); -// m_values.insert(i, value); + d_ptr->m_values.insert(i, value); } /*! @@ -268,9 +114,7 @@ void QBarSet::insertValue(int i, qreal value) */ void QBarSet::removeValue(int i) { - Q_D(QBarSet); - d->removeValue(i); -// m_values.removeAt(i); + d_ptr->m_values.removeAt(i); } /*! @@ -278,9 +122,7 @@ void QBarSet::removeValue(int i) */ int QBarSet::count() const { - Q_D(const QBarSet); - return d->count(); -// return m_values.count(); + return d_ptr->m_values.count(); } /*! @@ -288,9 +130,7 @@ int QBarSet::count() const */ qreal QBarSet::valueAt(int index) const { - Q_D(const QBarSet); - return d->valueAt(index); -// return m_values.at(index); + return d_ptr->m_values.at(index); } /*! @@ -298,10 +138,8 @@ qreal QBarSet::valueAt(int index) const */ void QBarSet::setValue(int index, qreal value) { - Q_D(QBarSet); - d->setValue(index,value); -// m_values.replace(index,value); -// emit valueChanged(); + d_ptr->m_values.replace(index,value); + emit d_ptr->valueChanged(); } /*! @@ -309,15 +147,11 @@ void QBarSet::setValue(int index, qreal value) */ qreal QBarSet::sum() const { - Q_D(const QBarSet); - return d->sum(); -/* qreal total(0); - for (int i=0; i < m_values.count(); i++) { - total += m_values.at(i); + for (int i=0; i < d_ptr->m_values.count(); i++) { + total += d_ptr->m_values.at(i); } return total; -*/ } /*! @@ -325,10 +159,10 @@ qreal QBarSet::sum() const */ void QBarSet::setPen(const QPen &pen) { - Q_D(QBarSet); - d->setPen(pen); -// m_pen = pen; -// emit valueChanged(); + if(d_ptr->m_pen!=pen){ + d_ptr->m_pen = pen; + emit d_ptr->valueChanged(); + } } /*! @@ -336,9 +170,7 @@ void QBarSet::setPen(const QPen &pen) */ QPen QBarSet::pen() const { - Q_D(const QBarSet); - return d->pen(); -// return m_pen; + return d_ptr->m_pen; } /*! @@ -346,10 +178,10 @@ QPen QBarSet::pen() const */ void QBarSet::setBrush(const QBrush &brush) { - Q_D(QBarSet); - d->setBrush(brush); -// m_brush = brush; -// emit valueChanged(); + if(d_ptr->m_brush!=brush){ + d_ptr->m_brush = brush; + emit d_ptr->valueChanged(); + } } /*! @@ -357,9 +189,7 @@ void QBarSet::setBrush(const QBrush &brush) */ QBrush QBarSet::brush() const { - Q_D(const QBarSet); - return d->brush(); -// return m_brush; + return d_ptr->m_brush; } /*! @@ -367,10 +197,10 @@ QBrush QBarSet::brush() const */ void QBarSet::setLabelPen(const QPen &pen) { - Q_D(QBarSet); - d->setLabelPen(pen); -// m_labelPen = pen; -// emit valueChanged(); + if(d_ptr->m_labelPen!=pen){ + d_ptr->m_labelPen = pen; + emit d_ptr->valueChanged(); + } } /*! @@ -378,9 +208,7 @@ void QBarSet::setLabelPen(const QPen &pen) */ QPen QBarSet::labelPen() const { - Q_D(const QBarSet); - return d->labelPen(); -// return m_labelPen; + return d_ptr->m_labelPen; } /*! @@ -388,10 +216,10 @@ QPen QBarSet::labelPen() const */ void QBarSet::setLabelBrush(const QBrush &brush) { - Q_D(QBarSet); - d->setLabelBrush(brush); -// m_labelBrush = brush; -// emit valueChanged(); + if(d_ptr->m_labelBrush!=brush){ + d_ptr->m_labelBrush = brush; + emit d_ptr->valueChanged(); + } } /*! @@ -399,9 +227,7 @@ void QBarSet::setLabelBrush(const QBrush &brush) */ QBrush QBarSet::labelBrush() const { - Q_D(const QBarSet); - return d->labelBrush(); -// return m_labelBrush; + return d_ptr->m_labelBrush; } /*! @@ -409,10 +235,11 @@ QBrush QBarSet::labelBrush() const */ void QBarSet::setLabelFont(const QFont &font) { - Q_D(QBarSet); - d->setLabelFont(font); -// m_labelFont = font; -// emit valueChanged(); + if(d_ptr->m_labelFont!=font) { + d_ptr->m_labelFont = font; + emit d_ptr->valueChanged(); + } + } /*! @@ -420,9 +247,7 @@ void QBarSet::setLabelFont(const QFont &font) */ QFont QBarSet::labelFont() const { - Q_D(const QBarSet); - return d->labelFont(); -// return m_labelFont; + return d_ptr->m_labelFont; } /*! @@ -431,10 +256,10 @@ QFont QBarSet::labelFont() const void QBarSet::setLabelsVisible(bool visible) { - Q_D(QBarSet); - d->setLabelsVisible(visible); -// m_labelsVisible = visible; -// emit labelsVisibleChanged(visible); + if(d_ptr->m_labelsVisible!=visible) { + d_ptr->m_labelsVisible = visible; + emit d_ptr->labelsVisibleChanged(visible); + } } /*! @@ -442,9 +267,7 @@ void QBarSet::setLabelsVisible(bool visible) */ bool QBarSet::labelsVisible() const { - Q_D(const QBarSet); - return d->labelsVisible(); -// return m_labelsVisible; + return d_ptr->m_labelsVisible; } /* @@ -461,7 +284,38 @@ void QBarSet::barHoverLeaveEvent() emit hoverLeave(); } */ + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +QBarSetPrivate::QBarSetPrivate(QString name, QBarSet *parent) : QObject(parent), + q_ptr(parent), + m_name(name), + m_labelsVisible(false) +{ + +} + +QBarSetPrivate::~QBarSetPrivate() +{ + +} + + +//TODO: fixme , refactor it and get rid of it +void QBarSetPrivate::barHoverEnterEvent(QPoint pos) +{ + emit showToolTip(pos, m_name); + emit hoverEnter(pos); +} + +//TODO: fixme , refactor it and get rid of it +void QBarSetPrivate::barHoverLeaveEvent() +{ + // Emit signal to user of charts + emit hoverLeave(); +} + #include "moc_qbarset.cpp" -#include "moc_qbarsetprivate_p.cpp" +#include "moc_qbarset_p.cpp" QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/barchart/qbarset.h b/src/barchart/qbarset.h index f0df1ca..91bfb7a 100644 --- a/src/barchart/qbarset.h +++ b/src/barchart/qbarset.h @@ -32,6 +32,7 @@ class QBarSetPrivate; class QTCOMMERCIALCHART_EXPORT QBarSet : public QObject { Q_OBJECT + public: QBarSet(QString name, QObject *parent = 0); @@ -66,37 +67,11 @@ public: Q_SIGNALS: void clicked(QString category, Qt::MouseButtons button); // Clicked and hover signals exposed to user - // TODO: TO PIMPL ---> -// void structureChanged(); -// void valueChanged(); -// void hoverEnter(QPoint pos); -// void hoverLeave(); -// void showToolTip(QPoint pos, QString tip); // Private signal -// void labelsVisibleChanged(bool visible); - // <--- TO PIMPL - -public Q_SLOTS: - // These are for internal communication - // TODO: TO PIMPL ---> -// void barHoverEnterEvent(QPoint pos); -// void barHoverLeaveEvent(); - // <--- TO PIMPL - private: - QBarSetPrivate * const d_ptr; - Q_DECLARE_PRIVATE(QBarSet) + QScopedPointer d_ptr; Q_DISABLE_COPY(QBarSet) -/* - QString m_name; - QList m_values; // TODO: replace with map (category, value) - QMap m_mappedValues; - QPen m_pen; - QBrush m_brush; - QPen m_labelPen; - QBrush m_labelBrush; - QFont m_labelFont; - bool m_labelsVisible; -*/ + friend class QBarSeries; + }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/barchart/qbarsetprivate_p.h b/src/barchart/qbarset_p.h similarity index 67% rename from src/barchart/qbarsetprivate_p.h rename to src/barchart/qbarset_p.h index 2819337..3c3ca05 100644 --- a/src/barchart/qbarsetprivate_p.h +++ b/src/barchart/qbarset_p.h @@ -1,5 +1,5 @@ -#ifndef QBARSETPRIVATE_P_H -#define QBARSETPRIVATE_P_H +#ifndef QBARSET_P_H +#define QBARSET_P_H #include "qbarset.h" @@ -8,46 +8,11 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE class QBarSetPrivate : public QObject { Q_OBJECT - Q_DECLARE_PUBLIC(QBarSet) public: QBarSetPrivate(QString name, QBarSet *parent); ~QBarSetPrivate(); - void setName(QString name); - QString name() const; - QBarSetPrivate& operator << (const qreal &value); // appends new value to set - void insertValue(int i, qreal value); - void removeValue(int i); - int count() const; - qreal valueAt(int index) const; - void setValue(int index, qreal value); - qreal sum() const; - - void setPen(const QPen &pen); - QPen pen() const; - - void setBrush(const QBrush &brush); - QBrush brush() const; - - void setLabelPen(const QPen &pen); - QPen labelPen() const; - - void setLabelBrush(const QBrush &brush); - QBrush labelBrush() const; - - void setLabelFont(const QFont &font); - QFont labelFont() const; - - void setLabelsVisible(bool visible = true); - bool labelsVisible() const; - - static QBarSetPrivate &pimpl(QBarSet *barset) - { - Q_ASSERT(barset); - return *barset->d_ptr; - } - Q_SIGNALS: void clicked(QString category, Qt::MouseButtons button); void structureChanged(); @@ -63,7 +28,6 @@ public Q_SLOTS: public: QBarSet * const q_ptr; - QString m_name; QList m_values; // TODO: replace with map (category, value) QMap m_mappedValues; @@ -73,6 +37,8 @@ public: QBrush m_labelBrush; QFont m_labelFont; bool m_labelsVisible; + + friend class QBarSet; }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/barchart/qpercentbarseries.cpp b/src/barchart/qpercentbarseries.cpp index 3a1fd43..d0abd6d 100644 --- a/src/barchart/qpercentbarseries.cpp +++ b/src/barchart/qpercentbarseries.cpp @@ -50,6 +50,11 @@ QPercentBarSeries::QPercentBarSeries(QStringList categories, QObject *parent) { } +QSeries::QSeriesType QPercentBarSeries::type() const +{ + return QSeries::SeriesTypePercentBar; +} + #include "moc_qpercentbarseries.cpp" QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/barchart/qpercentbarseries.h b/src/barchart/qpercentbarseries.h index d71c9d4..34cf198 100644 --- a/src/barchart/qpercentbarseries.h +++ b/src/barchart/qpercentbarseries.h @@ -31,7 +31,7 @@ class QTCOMMERCIALCHART_EXPORT QPercentBarSeries : public QBarSeries Q_OBJECT public: QPercentBarSeries(QStringList categories, QObject *parent = 0); - virtual QSeriesType type() const { return QSeries::SeriesTypePercentBar; } + QSeries::QSeriesType type() const; }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/barchart/qstackedbarseries.cpp b/src/barchart/qstackedbarseries.cpp index a13ba61..857ad24 100644 --- a/src/barchart/qstackedbarseries.cpp +++ b/src/barchart/qstackedbarseries.cpp @@ -50,6 +50,11 @@ QStackedBarSeries::QStackedBarSeries(QStringList categories, QObject *parent) { } +QSeries::QSeriesType QStackedBarSeries::type() const +{ + return QSeries::SeriesTypeStackedBar; +} + #include "moc_qstackedbarseries.cpp" QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/barchart/qstackedbarseries.h b/src/barchart/qstackedbarseries.h index 742edd8..b5531d6 100644 --- a/src/barchart/qstackedbarseries.h +++ b/src/barchart/qstackedbarseries.h @@ -31,7 +31,7 @@ class QTCOMMERCIALCHART_EXPORT QStackedBarSeries : public QBarSeries Q_OBJECT public: QStackedBarSeries(QStringList categories, QObject *parent = 0); - virtual QSeriesType type() const { return QSeries::SeriesTypeStackedBar; } + QSeries::QSeriesType type() const; }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/legendmarker.cpp b/src/legendmarker.cpp index 0418b12..6d72b23 100644 --- a/src/legendmarker.cpp +++ b/src/legendmarker.cpp @@ -19,13 +19,15 @@ ****************************************************************************/ #include "legendmarker_p.h" +#include "qxyseries.h" +#include "qxyseries_p.h" #include "qlegend.h" #include "qbarseries.h" #include "qpieseries.h" -#include -#include -#include -#include +#include "qpieslice.h" +#include "qbarset.h" +#include "qareaseries.h" +#include "qareaseries_p.h" #include #include #include @@ -120,7 +122,7 @@ AreaLegendMarker::AreaLegendMarker(QAreaSeries *series,QLegend *legend) : Legend m_series(series) { QObject::connect(this, SIGNAL(selected()), series, SIGNAL(selected())); - QObject::connect(series,SIGNAL(updated()), this, SLOT(updated())); + QObject::connect(series->d_func(),SIGNAL(updated()), this, SLOT(updated())); updated(); } @@ -169,7 +171,7 @@ XYLegendMarker::XYLegendMarker(QXYSeries *series, QLegend *legend) : LegendMarke m_series(series) { QObject::connect(this, SIGNAL(selected()), series, SIGNAL(selected())); - QObject::connect(series,SIGNAL(updated()), this, SLOT(updated())); + QObject::connect(series->d_func(),SIGNAL(updated()), this, SLOT(updated())); updated(); } diff --git a/src/linechart/linechart.pri b/src/linechart/linechart.pri index 82f0226..573b23d 100644 --- a/src/linechart/linechart.pri +++ b/src/linechart/linechart.pri @@ -6,7 +6,8 @@ SOURCES += \ $$PWD/qlineseries.cpp PRIVATE_HEADERS += \ - $$PWD/linechartitem_p.h + $$PWD/linechartitem_p.h \ + $$PWD/qlineseries_p.h PUBLIC_HEADERS += \ $$PWD/qlineseries.h \ No newline at end of file diff --git a/src/linechart/linechartitem.cpp b/src/linechart/linechartitem.cpp index a059329..998d93e 100644 --- a/src/linechart/linechartitem.cpp +++ b/src/linechart/linechartitem.cpp @@ -20,6 +20,7 @@ #include "linechartitem_p.h" #include "qlineseries.h" +#include "qlineseries_p.h" #include "chartpresenter_p.h" #include @@ -33,7 +34,7 @@ m_series(series), m_pointsVisible(false) { setZValue(ChartPresenter::LineChartZValue); - QObject::connect(series,SIGNAL(updated()),this,SLOT(handleUpdated())); + QObject::connect(series->d_func(),SIGNAL(updated()),this,SLOT(handleUpdated())); handleUpdated(); } diff --git a/src/linechart/qlineseries.cpp b/src/linechart/qlineseries.cpp index ba25b17..fa3db77 100644 --- a/src/linechart/qlineseries.cpp +++ b/src/linechart/qlineseries.cpp @@ -19,6 +19,7 @@ ****************************************************************************/ #include "qlineseries.h" +#include "qlineseries_p.h" QTCOMMERCIALCHART_BEGIN_NAMESPACE @@ -59,8 +60,12 @@ 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. */ -QLineSeries::QLineSeries(QObject *parent) : QXYSeries(parent), - m_pointsVisible(false) +QLineSeries::QLineSeries(QObject *parent) : QXYSeries(*new QLineSeriesPrivate(this),parent) +{ + +} + +QLineSeries::QLineSeries(QLineSeriesPrivate &d,QObject *parent) : QXYSeries (d,parent) { } @@ -72,28 +77,28 @@ QLineSeries::~QLineSeries() { } -/*! - Sets if data points are \a visible and should be drawn on line. -*/ -void QLineSeries::setPointsVisible(bool visible) +QSeries::QSeriesType QLineSeries::type() const { - if (m_pointsVisible != visible){ - m_pointsVisible = visible; - emit QXYSeries::updated(); - } + return QSeries::SeriesTypeLine; } - +/* QDebug operator<< (QDebug debug, const QLineSeries series) { - Q_ASSERT(series.m_x.size() == series.m_y.size()); - - int size = series.m_x.size(); - + Q_ASSERT(series.d_func()->m_x.size() == series.d_func()->m_y.size()); + int size = series.d_func()->m_x.size(); for (int i=0; im_x.at(i) << ','<< series.d_func()->m_y.at(i) << ") "; } return debug.space(); } +*/ + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +QLineSeriesPrivate::QLineSeriesPrivate(QLineSeries* q):QXYSeriesPrivate(q) +{ + +}; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/linechart/qlineseries.h b/src/linechart/qlineseries.h index 7bbf033..d8d0f64 100644 --- a/src/linechart/qlineseries.h +++ b/src/linechart/qlineseries.h @@ -27,20 +27,23 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE +class QLineSeriesPrivate; + class QTCOMMERCIALCHART_EXPORT QLineSeries : public QXYSeries { public: - QLineSeries(QObject *parent=0); - virtual ~QLineSeries(); + explicit QLineSeries(QObject *parent=0); + ~QLineSeries(); + + QSeries::QSeriesType type() const; - void setPointsVisible(bool visible); - bool pointsVisible() const {return m_pointsVisible;} +protected: + QLineSeries(QLineSeriesPrivate &d,QObject *parent = 0); -public: // from QChartSeries - virtual QSeriesType type() const {return QSeries::SeriesTypeLine;} - friend QDebug operator<< (QDebug d, const QLineSeries series); private: - bool m_pointsVisible; + Q_DECLARE_PRIVATE(QLineSeries); + Q_DISABLE_COPY(QLineSeries); + friend class LineChartItem; }; diff --git a/src/linechart/qlineseries_p.h b/src/linechart/qlineseries_p.h new file mode 100644 index 0000000..0c5fa53 --- /dev/null +++ b/src/linechart/qlineseries_p.h @@ -0,0 +1,46 @@ +/**************************************************************************** +** +** 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 QLINESERIES_P_H_ +#define QLINESERIES_P_H_ + +#include "qxyseries_p.h" + +QTCOMMERCIALCHART_BEGIN_NAMESPACE + + +struct QLineSeriesPrivate: public QXYSeriesPrivate +{ + QLineSeriesPrivate(QLineSeries* q); + +}; + +QTCOMMERCIALCHART_END_NAMESPACE + +#endif diff --git a/src/piechart/piechart.pri b/src/piechart/piechart.pri index 15242b3..65a19c1 100644 --- a/src/piechart/piechart.pri +++ b/src/piechart/piechart.pri @@ -11,7 +11,7 @@ PRIVATE_HEADERS += \ $$PWD/pieslicedata_p.h \ $$PWD/piechartitem_p.h \ $$PWD/piesliceitem_p.h \ - $$PWD/qpieseriesprivate_p.h + $$PWD/qpieseries_p.h PUBLIC_HEADERS += \ $$PWD/qpieseries.h \ diff --git a/src/piechart/qpieseries.cpp b/src/piechart/qpieseries.cpp index 4bc2281..b99950b 100644 --- a/src/piechart/qpieseries.cpp +++ b/src/piechart/qpieseries.cpp @@ -19,7 +19,7 @@ ****************************************************************************/ #include "qpieseries.h" -#include "qpieseriesprivate_p.h" +#include "qpieseries_p.h" #include "qpieslice.h" #include "pieslicedata_p.h" #include @@ -27,191 +27,6 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE -QPieSeriesPrivate::QPieSeriesPrivate(QPieSeries *parent) - :QObject(parent), - q_ptr(parent), - m_pieRelativeHorPos(0.5), - m_pieRelativeVerPos(0.5), - m_pieRelativeSize(0.7), - m_pieStartAngle(0), - m_pieEndAngle(360), - m_total(0), - m_mapValues(0), - m_mapLabels(0), - m_mapOrientation(Qt::Horizontal) -{ - -} - -QPieSeriesPrivate::~QPieSeriesPrivate() -{ - -} - -void QPieSeriesPrivate::updateDerivativeData() -{ - m_total = 0; - - // nothing to do? - if (m_slices.count() == 0) - return; - - // calculate total - foreach (QPieSlice* s, m_slices) - m_total += s->value(); - - // nothing to show.. - if (qFuzzyIsNull(m_total)) - return; - - // update slice attributes - qreal sliceAngle = m_pieStartAngle; - qreal pieSpan = m_pieEndAngle - m_pieStartAngle; - QVector changed; - foreach (QPieSlice* s, m_slices) { - - PieSliceData data = PieSliceData::data(s); - data.m_percentage = s->value() / m_total; - data.m_angleSpan = pieSpan * data.m_percentage; - data.m_startAngle = sliceAngle; - sliceAngle += data.m_angleSpan; - - if (PieSliceData::data(s) != data) { - PieSliceData::data(s) = data; - changed << s; - } - } - - // emit signals - foreach (QPieSlice* s, changed) - PieSliceData::data(s).emitChangedSignal(s); -} - -void QPieSeriesPrivate::sliceChanged() -{ - Q_ASSERT(m_slices.contains(qobject_cast(sender()))); - updateDerivativeData(); -} - -void QPieSeriesPrivate::sliceClicked(Qt::MouseButtons buttons) -{ - QPieSlice* slice = qobject_cast(sender()); - Q_ASSERT(m_slices.contains(slice)); - Q_Q(QPieSeries); - emit q->clicked(slice, buttons); -} - -void QPieSeriesPrivate::sliceHoverEnter() -{ - QPieSlice* slice = qobject_cast(sender()); - Q_ASSERT(m_slices.contains(slice)); - Q_Q(QPieSeries); - emit q->hoverEnter(slice); -} - -void QPieSeriesPrivate::sliceHoverLeave() -{ - QPieSlice* slice = qobject_cast(sender()); - Q_ASSERT(m_slices.contains(slice)); - Q_Q(QPieSeries); - emit q->hoverLeave(slice); -} - -void QPieSeriesPrivate::modelUpdated(QModelIndex topLeft, QModelIndex bottomRight) -{ - Q_UNUSED(bottomRight) - Q_Q(QPieSeries); - - if (m_mapOrientation == Qt::Vertical) - { - if (topLeft.column() == m_mapValues) - if (m_mapValues == m_mapLabels) - { - m_slices.at(topLeft.row())->setValue(q->m_model->data(topLeft, Qt::DisplayRole).toDouble()); - m_slices.at(topLeft.row())->setLabel(q->m_model->data(topLeft, Qt::DisplayRole).toString()); - } - else - { - m_slices.at(topLeft.row())->setValue(q->m_model->data(topLeft, Qt::DisplayRole).toDouble()); - } - else if (topLeft.column() == m_mapLabels) - m_slices.at(topLeft.row())->setLabel(q->m_model->data(topLeft, Qt::DisplayRole).toString()); - } - else - { - if (topLeft.row() == m_mapValues) - if (m_mapValues == m_mapLabels) - { - m_slices.at(topLeft.column())->setValue(q->m_model->data(topLeft, Qt::DisplayRole).toDouble()); - m_slices.at(topLeft.column())->setLabel(q->m_model->data(topLeft, Qt::DisplayRole).toString()); - } - else - { - m_slices.at(topLeft.column())->setValue(q->m_model->data(topLeft, Qt::DisplayRole).toDouble()); - } - else if (topLeft.row() == m_mapLabels) - m_slices.at(topLeft.column())->setLabel(q->m_model->data(topLeft, Qt::DisplayRole).toString()); - } -} - -void QPieSeriesPrivate::modelDataAdded(QModelIndex parent, int start, int end) -{ - Q_UNUSED(parent) - Q_UNUSED(end) - Q_Q(QPieSeries); - - QPieSlice* newSlice = new QPieSlice; - newSlice->setLabelVisible(true); - if (m_mapOrientation == Qt::Vertical) - { - newSlice->setValue(q->m_model->data(q->m_model->index(start, m_mapValues), Qt::DisplayRole).toDouble()); - newSlice->setLabel(q->m_model->data(q->m_model->index(start, m_mapLabels), Qt::DisplayRole).toString()); - } - else - { - newSlice->setValue(q->m_model->data(q->m_model->index(m_mapValues, start), Qt::DisplayRole).toDouble()); - newSlice->setLabel(q->m_model->data(q->m_model->index(m_mapLabels, start), Qt::DisplayRole).toString()); - } - - q->insert(start, newSlice); -} - -void QPieSeriesPrivate::modelDataRemoved(QModelIndex parent, int start, int end) -{ - Q_UNUSED(parent) - Q_UNUSED(end) - Q_Q(QPieSeries); - q->remove(m_slices.at(start)); -} - -bool QPieSeriesPrivate::setRealValue(qreal &value, qreal newValue, qreal max, qreal min) -{ - // Remove rounding errors - qreal roundedValue = newValue; - if (qFuzzyIsNull(min) && qFuzzyIsNull(newValue)) - roundedValue = 0.0; - else if (qFuzzyCompare(newValue, max)) - roundedValue = max; - else if (qFuzzyCompare(newValue, min)) - roundedValue = min; - - // Check if the position is valid after removing the rounding errors - if (roundedValue < min || roundedValue > max) { - qWarning("QPieSeries: Illegal value"); - return false; - } - - if (!qFuzzyIsNull(value - roundedValue)) { - value = roundedValue; - return true; - } - - // The change was so small it is considered a rounding error - return false; -} - - - /*! \class QPieSeries \brief Pie series API for QtCommercial Charts @@ -289,8 +104,7 @@ bool QPieSeriesPrivate::setRealValue(qreal &value, qreal newValue, qreal max, qr Constructs a series object which is a child of \a parent. */ QPieSeries::QPieSeries(QObject *parent) : - QSeries(parent), - d_ptr(new QPieSeriesPrivate(this)) + QSeries(*new QPieSeriesPrivate(this),parent) { } @@ -636,9 +450,9 @@ bool QPieSeries::setModel(QAbstractItemModel* model) { Q_D(QPieSeries); // disconnect signals from old model - if(m_model) + if(d->m_model) { - disconnect(m_model, 0, this, 0); + disconnect(d->m_model, 0, this, 0); d->m_mapValues = -1; d->m_mapLabels = -1; d->m_mapOrientation = Qt::Vertical; @@ -647,12 +461,12 @@ bool QPieSeries::setModel(QAbstractItemModel* model) // set new model if(model) { - m_model = model; + d->m_model = model; return true; } else { - m_model = 0; + d->m_model = 0; return false; } } @@ -668,7 +482,7 @@ void QPieSeries::setModelMapping(int modelValuesLine, int modelLabelsLine, Qt::O { Q_D(QPieSeries); - if (m_model == 0) + if (d->m_model == 0) return; d->m_mapValues = modelValuesLine; @@ -677,26 +491,211 @@ void QPieSeries::setModelMapping(int modelValuesLine, int modelLabelsLine, Qt::O // connect the signals if (d->m_mapOrientation == Qt::Vertical) { - connect(m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), d, SLOT(modelUpdated(QModelIndex, QModelIndex))); - connect(m_model, SIGNAL(rowsInserted(QModelIndex, int, int)), d, SLOT(modelDataAdded(QModelIndex,int,int))); - connect(m_model, SIGNAL(rowsRemoved(QModelIndex, int, int)), d, SLOT(modelDataRemoved(QModelIndex,int,int))); + connect(d->m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), d, SLOT(modelUpdated(QModelIndex, QModelIndex))); + connect(d->m_model, SIGNAL(rowsInserted(QModelIndex, int, int)), d, SLOT(modelDataAdded(QModelIndex,int,int))); + connect(d->m_model, SIGNAL(rowsRemoved(QModelIndex, int, int)), d, SLOT(modelDataRemoved(QModelIndex,int,int))); } else { - connect(m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), d, SLOT(modelUpdated(QModelIndex, QModelIndex))); - connect(m_model, SIGNAL(columnsInserted(QModelIndex, int, int)), d, SLOT(modelDataAdded(QModelIndex,int,int))); - connect(m_model, SIGNAL(columnsRemoved(QModelIndex, int, int)), d, SLOT(modelDataRemoved(QModelIndex,int,int))); + connect(d->m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), d, SLOT(modelUpdated(QModelIndex, QModelIndex))); + connect(d->m_model, SIGNAL(columnsInserted(QModelIndex, int, int)), d, SLOT(modelDataAdded(QModelIndex,int,int))); + connect(d->m_model, SIGNAL(columnsRemoved(QModelIndex, int, int)), d, SLOT(modelDataRemoved(QModelIndex,int,int))); } // create the initial slices set if (d->m_mapOrientation == Qt::Vertical) { - for (int i = 0; i < m_model->rowCount(); i++) - append(m_model->data(m_model->index(i, d->m_mapValues), Qt::DisplayRole).toDouble(), m_model->data(m_model->index(i, d->m_mapLabels), Qt::DisplayRole).toString()); + for (int i = 0; i < d->m_model->rowCount(); i++) + append(d->m_model->data(d->m_model->index(i, d->m_mapValues), Qt::DisplayRole).toDouble(), d->m_model->data(d->m_model->index(i, d->m_mapLabels), Qt::DisplayRole).toString()); } else { - for (int i = 0; i < m_model->columnCount(); i++) - append(m_model->data(m_model->index(d->m_mapValues, i), Qt::DisplayRole).toDouble(), m_model->data(m_model->index(d->m_mapLabels, i), Qt::DisplayRole).toString()); + for (int i = 0; i < d->m_model->columnCount(); i++) + append(d->m_model->data(d->m_model->index(d->m_mapValues, i), Qt::DisplayRole).toDouble(), d->m_model->data(d->m_model->index(d->m_mapLabels, i), Qt::DisplayRole).toString()); } } +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +QPieSeriesPrivate::QPieSeriesPrivate(QPieSeries *parent) + :QSeriesPrivate(parent), + m_pieRelativeHorPos(0.5), + m_pieRelativeVerPos(0.5), + m_pieRelativeSize(0.7), + m_pieStartAngle(0), + m_pieEndAngle(360), + m_total(0), + m_mapValues(0), + m_mapLabels(0), + m_mapOrientation(Qt::Horizontal) +{ + +} + +QPieSeriesPrivate::~QPieSeriesPrivate() +{ + +} + +void QPieSeriesPrivate::updateDerivativeData() +{ + m_total = 0; + + // nothing to do? + if (m_slices.count() == 0) + return; + + // calculate total + foreach (QPieSlice* s, m_slices) + m_total += s->value(); + + // nothing to show.. + if (qFuzzyIsNull(m_total)) + return; + + // update slice attributes + qreal sliceAngle = m_pieStartAngle; + qreal pieSpan = m_pieEndAngle - m_pieStartAngle; + QVector changed; + foreach (QPieSlice* s, m_slices) { + + PieSliceData data = PieSliceData::data(s); + data.m_percentage = s->value() / m_total; + data.m_angleSpan = pieSpan * data.m_percentage; + data.m_startAngle = sliceAngle; + sliceAngle += data.m_angleSpan; + + if (PieSliceData::data(s) != data) { + PieSliceData::data(s) = data; + changed << s; + } + } + + // emit signals + foreach (QPieSlice* s, changed) + PieSliceData::data(s).emitChangedSignal(s); +} + +void QPieSeriesPrivate::sliceChanged() +{ + Q_ASSERT(m_slices.contains(qobject_cast(sender()))); + updateDerivativeData(); +} + +void QPieSeriesPrivate::sliceClicked(Qt::MouseButtons buttons) +{ + QPieSlice* slice = qobject_cast(sender()); + Q_ASSERT(m_slices.contains(slice)); + Q_Q(QPieSeries); + emit q->clicked(slice, buttons); +} + +void QPieSeriesPrivate::sliceHoverEnter() +{ + QPieSlice* slice = qobject_cast(sender()); + Q_ASSERT(m_slices.contains(slice)); + Q_Q(QPieSeries); + emit q->hoverEnter(slice); +} + +void QPieSeriesPrivate::sliceHoverLeave() +{ + QPieSlice* slice = qobject_cast(sender()); + Q_ASSERT(m_slices.contains(slice)); + Q_Q(QPieSeries); + emit q->hoverLeave(slice); +} + +void QPieSeriesPrivate::modelUpdated(QModelIndex topLeft, QModelIndex bottomRight) +{ + Q_UNUSED(bottomRight) + + if (m_mapOrientation == Qt::Vertical) + { + if (topLeft.column() == m_mapValues) + if (m_mapValues == m_mapLabels) + { + m_slices.at(topLeft.row())->setValue(m_model->data(topLeft, Qt::DisplayRole).toDouble()); + m_slices.at(topLeft.row())->setLabel(m_model->data(topLeft, Qt::DisplayRole).toString()); + } + else + { + m_slices.at(topLeft.row())->setValue(m_model->data(topLeft, Qt::DisplayRole).toDouble()); + } + else if (topLeft.column() == m_mapLabels) + m_slices.at(topLeft.row())->setLabel(m_model->data(topLeft, Qt::DisplayRole).toString()); + } + else + { + if (topLeft.row() == m_mapValues) + if (m_mapValues == m_mapLabels) + { + m_slices.at(topLeft.column())->setValue(m_model->data(topLeft, Qt::DisplayRole).toDouble()); + m_slices.at(topLeft.column())->setLabel(m_model->data(topLeft, Qt::DisplayRole).toString()); + } + else + { + m_slices.at(topLeft.column())->setValue(m_model->data(topLeft, Qt::DisplayRole).toDouble()); + } + else if (topLeft.row() == m_mapLabels) + m_slices.at(topLeft.column())->setLabel(m_model->data(topLeft, Qt::DisplayRole).toString()); + } +} + +void QPieSeriesPrivate::modelDataAdded(QModelIndex parent, int start, int end) +{ + Q_UNUSED(parent) + Q_UNUSED(end) + Q_Q(QPieSeries); + + QPieSlice* newSlice = new QPieSlice; + newSlice->setLabelVisible(true); + if (m_mapOrientation == Qt::Vertical) + { + newSlice->setValue(m_model->data(m_model->index(start, m_mapValues), Qt::DisplayRole).toDouble()); + newSlice->setLabel(m_model->data(m_model->index(start, m_mapLabels), Qt::DisplayRole).toString()); + } + else + { + newSlice->setValue(m_model->data(m_model->index(m_mapValues, start), Qt::DisplayRole).toDouble()); + newSlice->setLabel(m_model->data(m_model->index(m_mapLabels, start), Qt::DisplayRole).toString()); + } + + q->insert(start, newSlice); +} + +void QPieSeriesPrivate::modelDataRemoved(QModelIndex parent, int start, int end) +{ + Q_UNUSED(parent) + Q_UNUSED(end) + Q_Q(QPieSeries); + q->remove(m_slices.at(start)); +} + +bool QPieSeriesPrivate::setRealValue(qreal &value, qreal newValue, qreal max, qreal min) +{ + // Remove rounding errors + qreal roundedValue = newValue; + if (qFuzzyIsNull(min) && qFuzzyIsNull(newValue)) + roundedValue = 0.0; + else if (qFuzzyCompare(newValue, max)) + roundedValue = max; + else if (qFuzzyCompare(newValue, min)) + roundedValue = min; + + // Check if the position is valid after removing the rounding errors + if (roundedValue < min || roundedValue > max) { + qWarning("QPieSeries: Illegal value"); + return false; + } + + if (!qFuzzyIsNull(value - roundedValue)) { + value = roundedValue; + return true; + } + + // The change was so small it is considered a rounding error + return false; +} + + #include "moc_qpieseries.cpp" -#include "moc_qpieseriesprivate_p.cpp" +#include "moc_qpieseries_p.cpp" QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/piechart/qpieseries.h b/src/piechart/qpieseries.h index cb5b058..62c6d93 100644 --- a/src/piechart/qpieseries.h +++ b/src/piechart/qpieseries.h @@ -92,7 +92,6 @@ Q_SIGNALS: void pieSizeChanged(); private: - QPieSeriesPrivate * const d_ptr; Q_DECLARE_PRIVATE(QPieSeries) Q_DISABLE_COPY(QPieSeries) }; diff --git a/src/piechart/qpieseriesprivate_p.h b/src/piechart/qpieseries_p.h similarity index 90% rename from src/piechart/qpieseriesprivate_p.h rename to src/piechart/qpieseries_p.h index 422d4fa..eb20108 100644 --- a/src/piechart/qpieseriesprivate_p.h +++ b/src/piechart/qpieseries_p.h @@ -18,19 +18,19 @@ ** ****************************************************************************/ -#ifndef QPIESERIESPRIVATE_P_H -#define QPIESERIESPRIVATE_P_H +#ifndef QPIESERIES_P_H +#define QPIESERIES_P_H #include "qpieseries.h" +#include "qseries_p.h" class QModelIndex; QTCOMMERCIALCHART_BEGIN_NAMESPACE -class QPieSeriesPrivate : public QObject +class QPieSeriesPrivate : public QSeriesPrivate { Q_OBJECT - Q_DECLARE_PUBLIC(QPieSeries) public: QPieSeriesPrivate(QPieSeries *parent); @@ -49,8 +49,6 @@ public Q_SLOTS: bool setRealValue(qreal &value, qreal newValue, qreal max, qreal min = 0.0); public: - QPieSeries * const q_ptr; - QList m_slices; qreal m_pieRelativeHorPos; qreal m_pieRelativeVerPos; @@ -63,8 +61,10 @@ public: int m_mapValues; int m_mapLabels; Qt::Orientation m_mapOrientation; +private: + Q_DECLARE_PUBLIC(QPieSeries) }; QTCOMMERCIALCHART_END_NAMESPACE -#endif // QPIESERIESPRIVATE_P_H +#endif // QPIESERIES_P_H diff --git a/src/qseries.cpp b/src/qseries.cpp index 53d391b..a88a894 100644 --- a/src/qseries.cpp +++ b/src/qseries.cpp @@ -19,6 +19,9 @@ ****************************************************************************/ #include "qseries.h" +#include "qseries_p.h" + +QTCOMMERCIALCHART_BEGIN_NAMESPACE /*! \class QSeries @@ -93,5 +96,55 @@ \sa setName() */ -QTCOMMERCIALCHART_USE_NAMESPACE +QSeries::QSeries(QObject *parent) : QObject(parent), +d_ptr(new QSeriesPrivate(this)) +{ + +} + +QSeries::QSeries(QSeriesPrivate &d,QObject *parent) : QObject(parent), +d_ptr(&d) +{ + +} + +QSeries::~QSeries() +{ + +} + +QAbstractItemModel* QSeries::model() const +{ + return d_ptr->m_model; +} + +void QSeries::setName(const QString& name) +{ + d_ptr->m_name = name; +} + +QString QSeries::name() const +{ + return d_ptr->m_name; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +QSeriesPrivate::QSeriesPrivate(QSeries* q): q_ptr(q),m_model(0) +{ + +} + +QSeriesPrivate::~QSeriesPrivate() +{ + +} + + + + #include "moc_qseries.cpp" + +QTCOMMERCIALCHART_END_NAMESPACE + + diff --git a/src/qseries.h b/src/qseries.h index 6cd1fc7..340a0d5 100644 --- a/src/qseries.h +++ b/src/qseries.h @@ -29,10 +29,13 @@ class QAbstractItemModel; QTCOMMERCIALCHART_BEGIN_NAMESPACE +class QSeriesPrivate; + class QTCOMMERCIALCHART_EXPORT QSeries : public QObject { Q_OBJECT Q_PROPERTY(QString name READ name WRITE setName) + Q_ENUMS(QSeriesType) public: enum QSeriesType { @@ -47,23 +50,20 @@ public: }; protected: - QSeries(QObject *parent = 0) : QObject(parent) {m_model = 0;} + QSeries(QObject *parent = 0); + QSeries(QSeriesPrivate &d,QObject *parent = 0); public: - virtual ~QSeries() {} + ~QSeries(); virtual QSeriesType type() const = 0; // TODO - virtual bool setModel(QAbstractItemModel* /*model*/) { return false; } - QAbstractItemModel* model() const { return m_model; } - - void setName(QString name) { m_name = name; } - QString name() const { return m_name; } + virtual bool setModel(QAbstractItemModel* model) = 0; + QAbstractItemModel* model() const; + void setName(const QString& name); + QString name() const; protected: - QAbstractItemModel* m_model; - -private: - QString m_name; + QScopedPointer d_ptr; }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/qseries_p.h b/src/qseries_p.h new file mode 100644 index 0000000..ce4cbcf --- /dev/null +++ b/src/qseries_p.h @@ -0,0 +1,50 @@ +/**************************************************************************** +** +** 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 QSERIES_P_H_ +#define QSERIES_P_H_ + +#include "qseries.h" + +class QAbstractItemModel; + +QTCOMMERCIALCHART_BEGIN_NAMESPACE + +struct QSeriesPrivate : public QObject +{ + QSeriesPrivate(QSeries *q); + virtual ~QSeriesPrivate(); + QSeries *q_ptr; + QAbstractItemModel* m_model; + QString m_name; +}; + +QTCOMMERCIALCHART_END_NAMESPACE + +#endif diff --git a/src/scatterseries/qscatterseries.cpp b/src/scatterseries/qscatterseries.cpp index bf7284a..1ef521b 100644 --- a/src/scatterseries/qscatterseries.cpp +++ b/src/scatterseries/qscatterseries.cpp @@ -19,7 +19,7 @@ ****************************************************************************/ #include "qscatterseries.h" -#include "qchart.h" +#include "qscatterseries_p.h" /*! \class QScatterSeries @@ -62,10 +62,7 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE /*! Constructs a series object which is a child of \a parent. */ -QScatterSeries::QScatterSeries(QObject *parent) : - QXYSeries(parent), - m_shape(QScatterSeries::MarkerShapeCircle), - m_size(15.0) +QScatterSeries::QScatterSeries(QObject *parent) : QXYSeries(*new QScatterSeriesPrivate(this),parent) { } @@ -76,12 +73,18 @@ QScatterSeries::~QScatterSeries() { } +QSeries::QSeriesType QScatterSeries::type() const +{ + return QSeries::SeriesTypeScatter; +} + /*! Returns the shape used for drawing markers. */ QScatterSeries::MarkerShape QScatterSeries::shape() const { - return m_shape; + Q_D(const QScatterSeries); + return d->m_shape; } /*! @@ -90,9 +93,10 @@ QScatterSeries::MarkerShape QScatterSeries::shape() const */ void QScatterSeries::setShape(MarkerShape shape) { - if (m_shape != shape) { - m_shape = shape; - emit QXYSeries::updated(); + Q_D(QScatterSeries); + if (d->m_shape != shape) { + d->m_shape = shape; + emit d->updated(); } } @@ -101,7 +105,8 @@ void QScatterSeries::setShape(MarkerShape shape) */ qreal QScatterSeries::size() const { - return m_size; + Q_D(const QScatterSeries); + return d->m_size; } /*! @@ -109,10 +114,22 @@ qreal QScatterSeries::size() const */ void QScatterSeries::setSize(qreal size) { - if (!qFuzzyIsNull(m_size - size)) { - m_size = size; - emit updated(); + Q_D(QScatterSeries); + + if (!qFuzzyIsNull(d->m_size - size)) { + d->m_size = size; + emit d->updated(); } } +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +QScatterSeriesPrivate::QScatterSeriesPrivate(QScatterSeries* q):QXYSeriesPrivate(q), + m_shape(QScatterSeries::MarkerShapeCircle), + m_size(15.0) +{ + +}; + + QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/scatterseries/qscatterseries.h b/src/scatterseries/qscatterseries.h index c1d9b5a..09bed80 100644 --- a/src/scatterseries/qscatterseries.h +++ b/src/scatterseries/qscatterseries.h @@ -25,6 +25,7 @@ #include QTCOMMERCIALCHART_BEGIN_NAMESPACE + class QScatterSeriesPrivate; class QTCOMMERCIALCHART_EXPORT QScatterSeries : public QXYSeries @@ -37,21 +38,21 @@ public: }; public: - QScatterSeries(QObject *parent = 0); + explicit QScatterSeries(QObject *parent = 0); ~QScatterSeries(); -public: // from QChartSeries - QSeriesType type() const { return QSeries::SeriesTypeScatter; } + QSeries::QSeriesType type() const; -public: MarkerShape shape() const; void setShape(MarkerShape shape); qreal size() const; void setSize(qreal size); private: - MarkerShape m_shape; - qreal m_size; + Q_DECLARE_PRIVATE(QScatterSeries); + Q_DISABLE_COPY(QScatterSeries); + friend class ScatterChartItem; + }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/scatterseries/qscatterseries_p.h b/src/scatterseries/qscatterseries_p.h new file mode 100644 index 0000000..2e56460 --- /dev/null +++ b/src/scatterseries/qscatterseries_p.h @@ -0,0 +1,48 @@ +/**************************************************************************** +** +** 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 QSCATTERSERIES_P_H_ +#define QSCATTERSERIES_P_H_ + +#include "qxyseries_p.h" + +QTCOMMERCIALCHART_BEGIN_NAMESPACE + +struct QScatterSeriesPrivate: public QXYSeriesPrivate +{ + QScatterSeriesPrivate(QScatterSeries* q); + + QScatterSeries::MarkerShape m_shape; + qreal m_size; + +}; + +QTCOMMERCIALCHART_END_NAMESPACE + +#endif diff --git a/src/scatterseries/scatter.pri b/src/scatterseries/scatter.pri index 05b3363..fcbd119 100644 --- a/src/scatterseries/scatter.pri +++ b/src/scatterseries/scatter.pri @@ -6,7 +6,8 @@ SOURCES += \ $$PWD/scatterchartitem.cpp PRIVATE_HEADERS += \ - $$PWD/scatterchartitem_p.h + $$PWD/scatterchartitem_p.h \ + $$PWD/qscatterseries_p.h PUBLIC_HEADERS += \ $$PWD/qscatterseries.h diff --git a/src/scatterseries/scatterchartitem.cpp b/src/scatterseries/scatterchartitem.cpp index fb7e4f3..1c9b4fc 100644 --- a/src/scatterseries/scatterchartitem.cpp +++ b/src/scatterseries/scatterchartitem.cpp @@ -20,6 +20,7 @@ #include "scatterchartitem_p.h" #include "qscatterseries.h" +#include "qscatterseries_p.h" #include "chartpresenter_p.h" #include #include @@ -34,7 +35,7 @@ ScatterChartItem::ScatterChartItem(QScatterSeries *series, ChartPresenter *prese m_size(15) { - QObject::connect(m_series,SIGNAL(updated()), this, SLOT(handleUpdated())); + QObject::connect(m_series->d_func(),SIGNAL(updated()), this, SLOT(handleUpdated())); setZValue(ChartPresenter::ScatterSeriesZValue); setFlags(QGraphicsItem::ItemClipsChildrenToShape); diff --git a/src/splinechart/qsplineseries.cpp b/src/splinechart/qsplineseries.cpp index e59deae..f34ed07 100644 --- a/src/splinechart/qsplineseries.cpp +++ b/src/splinechart/qsplineseries.cpp @@ -19,6 +19,7 @@ ****************************************************************************/ #include "qsplineseries.h" +#include "qsplineseries_p.h" /*! \class QSplineSeries @@ -46,32 +47,57 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE */ QSplineSeries::QSplineSeries(QObject *parent) : - QLineSeries(parent) + QLineSeries(*new QSplineSeriesPrivate(this),parent) { - connect(this,SIGNAL(pointAdded(int)), this, SLOT(updateControlPoints())); - connect(this,SIGNAL(pointRemoved(int)), this, SLOT(updateControlPoints())); - connect(this,SIGNAL(pointReplaced(int)), this, SLOT(updateControlPoints())); } +QSeries::QSeriesType QSplineSeries::type() const +{ + return QSeries::SeriesTypeSpline; +} + +QPointF QSplineSeries::controlPoint(int index) const +{ + Q_D(const QSplineSeries); + return d->m_controlPoints[index]; +} + +void QSplineSeries::setModelMappingRange(int first, int count) +{ + Q_D(QSplineSeries); + QLineSeries::setModelMappingRange(first, count); + d->calculateControlPoints(); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +QSplineSeriesPrivate::QSplineSeriesPrivate(QSplineSeries* q):QLineSeriesPrivate(q) +{ + QObject::connect(this,SIGNAL(pointAdded(int)), this, SLOT(updateControlPoints())); + QObject::connect(this,SIGNAL(pointRemoved(int)), this, SLOT(updateControlPoints())); + QObject::connect(this,SIGNAL(pointReplaced(int)), this, SLOT(updateControlPoints())); +}; + /*! \internal Calculates control points which are needed by QPainterPath.cubicTo function to draw the cubic Bezier cureve between two points. */ -void QSplineSeries::calculateControlPoints() +void QSplineSeriesPrivate::calculateControlPoints() { + Q_Q(QSplineSeries); // Based on http://www.codeproject.com/Articles/31859/Draw-a-Smooth-Curve-through-a-Set-of-2D-Points-wit // CPOL License - int n = count() - 1; + int n = q->count() - 1; if (n == 1) { // Special case: Bezier curve should be a straight line. // firstControlPoints = new Point[1]; // 3P1 = 2P0 + P3 - m_controlPoints.append(QPointF((2 * x(0) + x(1)) / 3, (2 * y(0) + y(1)) / 3)); + m_controlPoints.append(QPointF((2 * q->x(0) + q->x(1)) / 3, (2 * q->y(0) + q->y(1)) / 3)); // P2 = 2P1 P0 - m_controlPoints.append(QPointF(2 * m_controlPoints[0].x() - x(0), 2 * m_controlPoints[0].y() - y(0))); + m_controlPoints.append(QPointF(2 * m_controlPoints[0].x() - q->x(0), 2 * m_controlPoints[0].y() - q->y(0))); return; } @@ -89,22 +115,22 @@ void QSplineSeries::calculateControlPoints() // | 0 0 0 0 0 0 0 0 ... 0 2 7 | | P1_n | | 8 * P(n-1) + Pn | // QList rhs; - rhs.append(x(0) + 2 * x(1)); + rhs.append(q->x(0) + 2 * q->x(1)); // Set right hand side X values for (int i = 1; i < n - 1; ++i) - rhs.append(4 * x(i) + 2 * x(i + 1)); + rhs.append(4 * q->x(i) + 2 * q->x(i + 1)); - rhs.append((8 * x(n - 1) + x(n)) / 2.0); + rhs.append((8 * q->x(n - 1) + q->x(n)) / 2.0); // Get first control points X-values QList xControl = getFirstControlPoints(rhs); - rhs[0] = y(0) + 2 * y(1); + rhs[0] = q->y(0) + 2 * q->y(1); // Set right hand side Y values for (int i = 1; i < n - 1; ++i) - rhs[i] = 4 * y(i) + 2 * y(i + 1); + rhs[i] = 4 * q->y(i) + 2 * q->y(i + 1); - rhs[n - 1] = (8 * y(n - 1) + y(n)) / 2.0; + rhs[n - 1] = (8 * q->y(n - 1) + q->y(n)) / 2.0; // Get first control points Y-values QList yControl = getFirstControlPoints(rhs); @@ -114,16 +140,16 @@ void QSplineSeries::calculateControlPoints() m_controlPoints.append(QPointF(xControl[i], yControl[i])); // Second control point if (i < n - 1) - m_controlPoints.append(QPointF(2 * x(i + 1) - xControl[i + 1], 2 * y(i + 1) - yControl[i + 1])); + m_controlPoints.append(QPointF(2 * q->x(i + 1) - xControl[i + 1], 2 * q->y(i + 1) - yControl[i + 1])); else - m_controlPoints.append(QPointF((x(n) + xControl[n - 1]) / 2, (y(n) + yControl[n - 1]) / 2)); + m_controlPoints.append(QPointF((q->x(n) + xControl[n - 1]) / 2, (q->y(n) + yControl[n - 1]) / 2)); } } /*! \internal */ -QList QSplineSeries::getFirstControlPoints(QList rhs) +QList QSplineSeriesPrivate::getFirstControlPoints(QList rhs) { QList x; // Solution vector. QList tmp; // Temp workspace. @@ -147,9 +173,10 @@ QList QSplineSeries::getFirstControlPoints(QList rhs) \internal Updates the control points, besed on currently avaiable knots. */ -void QSplineSeries::updateControlPoints() +void QSplineSeriesPrivate::updateControlPoints() { - if (count() > 1) { + Q_Q(QSplineSeries); + if (q->count() > 1) { m_controlPoints.clear(); calculateControlPoints(); } @@ -187,12 +214,8 @@ void QSplineSeries::updateControlPoints() then all the items following \a first item in a model are used. \sa setModel(), setModelMapping() */ -void QSplineSeries::setModelMappingRange(int first, int count) -{ - QLineSeries::setModelMappingRange(first, count); - calculateControlPoints(); -} #include "moc_qsplineseries.cpp" +#include "moc_qsplineseries_p.cpp" QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/splinechart/qsplineseries.h b/src/splinechart/qsplineseries.h index cd07175..c9e11a2 100644 --- a/src/splinechart/qsplineseries.h +++ b/src/splinechart/qsplineseries.h @@ -29,30 +29,23 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE +class QSplineSeriesPrivate; + class QTCOMMERCIALCHART_EXPORT QSplineSeries : public QLineSeries { Q_OBJECT public: QSplineSeries(QObject *parent = 0); - QSeriesType type() const {return QSeries::SeriesTypeSpline;} - - QPointF controlPoint(int index) const {return m_controlPoints[index];} -// bool setModel(QAbstractItemModel *model); + QSeries::QSeriesType type() const; -// void setModelMapping(int modelX, int modelY, Qt::Orientation orientation = Qt::Vertical); + QPointF controlPoint(int index) const; void setModelMappingRange(int first, int count); private: - void calculateControlPoints(); - QList getFirstControlPoints(QList rhs); - -private Q_SLOTS: - void updateControlPoints(); - -private: - QList m_controlPoints; - + Q_DECLARE_PRIVATE(QSplineSeries); + Q_DISABLE_COPY(QSplineSeries); + friend class SplineChartItem; }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/splinechart/qsplineseries_p.h b/src/splinechart/qsplineseries_p.h new file mode 100644 index 0000000..381b286 --- /dev/null +++ b/src/splinechart/qsplineseries_p.h @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** 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 QSPLINESERIES_P_H_ +#define QSPLINESERIES_P_H_ + +#include "qlineseries_p.h" + +QTCOMMERCIALCHART_BEGIN_NAMESPACE + + +class QSplineSeriesPrivate: public QLineSeriesPrivate +{ + Q_OBJECT +public: + QSplineSeriesPrivate(QSplineSeries* q); + void calculateControlPoints(); + QList getFirstControlPoints(QList rhs); + +public Q_SLOTS: + void updateControlPoints(); +public: + QList m_controlPoints; +private: + Q_DECLARE_PUBLIC(QSplineSeries) +}; + +QTCOMMERCIALCHART_END_NAMESPACE + +#endif diff --git a/src/splinechart/splinechart.pri b/src/splinechart/splinechart.pri index de44901..4038685 100644 --- a/src/splinechart/splinechart.pri +++ b/src/splinechart/splinechart.pri @@ -6,7 +6,8 @@ SOURCES += \ $$PWD/splinechartitem.cpp PRIVATE_HEADERS += \ - $$PWD/splinechartitem_p.h + $$PWD/splinechartitem_p.h \ + $$PWD/qsplineseries_p.h PUBLIC_HEADERS += \ $$PWD/qsplineseries.h diff --git a/src/splinechart/splinechartitem.cpp b/src/splinechart/splinechartitem.cpp index 9d9a9a0..6d6fd3f 100644 --- a/src/splinechart/splinechartitem.cpp +++ b/src/splinechart/splinechartitem.cpp @@ -19,6 +19,7 @@ ****************************************************************************/ #include "splinechartitem_p.h" +#include "qsplineseries_p.h" #include "chartpresenter_p.h" #include "chartanimator_p.h" #include @@ -31,7 +32,7 @@ SplineChartItem::SplineChartItem(QSplineSeries *series, ChartPresenter *presente m_pointsVisible(false) { setZValue(ChartPresenter::LineChartZValue); - QObject::connect(series,SIGNAL(updated()),this,SLOT(handleUpdated())); + QObject::connect(m_series->d_func(),SIGNAL(updated()),this,SLOT(handleUpdated())); handleUpdated(); } diff --git a/src/src.pro b/src/src.pro index f165034..306835e 100644 --- a/src/src.pro +++ b/src/src.pro @@ -32,7 +32,8 @@ PRIVATE_HEADERS += \ $$PWD/chartconfig_p.h \ $$PWD/qchart_p.h \ $$PWD/qchartview_p.h \ - $$PWD/scroller_p.h + $$PWD/scroller_p.h \ + $$PWD/qseries_p.h PUBLIC_HEADERS += \ $$PWD/qchart.h \ $$PWD/qchartglobal.h \ diff --git a/src/xychart/qxyseries.cpp b/src/xychart/qxyseries.cpp index d3abccf..9272468 100644 --- a/src/xychart/qxyseries.cpp +++ b/src/xychart/qxyseries.cpp @@ -19,6 +19,7 @@ ****************************************************************************/ #include "qxyseries.h" +#include "qxyseries_p.h" #include QTCOMMERCIALCHART_BEGIN_NAMESPACE @@ -82,15 +83,14 @@ 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(parent) +QXYSeries::QXYSeries(QObject *parent):QSeries(*new QXYSeriesPrivate(this),parent) { - m_mapX = -1; - m_mapY = -1; - m_mapFirst = 0; - m_mapCount = 0; - m_mapLimited = false; - m_mapOrientation = Qt::Vertical; - // m_mapYOrientation = Qt::Vertical; + +} + +QXYSeries::QXYSeries(QXYSeriesPrivate &d,QObject *parent):QSeries(d,parent) +{ + } /*! Destroys the object. Series added to QChartView or QChart instances are owned by those, @@ -105,10 +105,11 @@ QXYSeries::~QXYSeries() */ void QXYSeries::append(qreal x,qreal y) { - Q_ASSERT(m_x.size() == m_y.size()); - m_x<m_x.size() == d->m_y.size()); + d->m_x<m_y<pointAdded(d->m_x.size()-1); } /*! @@ -136,10 +137,11 @@ void QXYSeries::append(const QList points) */ void QXYSeries::replace(qreal x,qreal y) { - int index = m_x.indexOf(x); - m_x[index] = x; - m_y[index] = y; - emit pointReplaced(index); + Q_D(QXYSeries); + int index = d->m_x.indexOf(x); + d->m_x[index] = x; + d->m_y[index] = y; + emit d->pointReplaced(index); } /*! @@ -156,14 +158,15 @@ void QXYSeries::replace(const QPointF &point) */ void QXYSeries::remove(qreal x) { - int index = m_x.indexOf(x); + Q_D(QXYSeries); + int index = d->m_x.indexOf(x); if (index == -1) return; - m_x.remove(index); - m_y.remove(index); + d->m_x.remove(index); + d->m_y.remove(index); - emit pointRemoved(index); + emit d->pointRemoved(index); } /*! @@ -171,16 +174,17 @@ void QXYSeries::remove(qreal x) */ void QXYSeries::remove(qreal x,qreal y) { + Q_D(QXYSeries); int index =-1; do { - index = m_x.indexOf(x,index+1); - } while (index !=-1 && m_y.at(index)!=y); + index = d->m_x.indexOf(x,index+1); + } while (index !=-1 && d->m_y.at(index)!=y); if (index==-1) return; - m_x.remove(index); - m_y.remove(index); - emit pointRemoved(index); + d->m_x.remove(index); + d->m_y.remove(index); + emit d->pointRemoved(index); } /*! @@ -196,8 +200,9 @@ void QXYSeries::remove(const QPointF &point) */ void QXYSeries::removeAll() { - m_x.clear(); - m_y.clear(); + Q_D(QXYSeries); + d->m_x.clear(); + d->m_y.clear(); } /*! @@ -205,16 +210,17 @@ void QXYSeries::removeAll() */ qreal QXYSeries::x(int pos) const { - if (m_model) { - if (m_mapOrientation == Qt::Vertical) + Q_D(const QXYSeries); + if (d->m_model) { + if (d->m_mapOrientation == Qt::Vertical) // consecutive data is read from model's column - return m_model->data(m_model->index(pos + m_mapFirst, m_mapX), Qt::DisplayRole).toDouble(); + return d->m_model->data(d->m_model->index(pos + d->m_mapFirst, d->m_mapX), Qt::DisplayRole).toDouble(); else // consecutive data is read from model's row - return m_model->data(m_model->index(m_mapX, pos + m_mapFirst), Qt::DisplayRole).toDouble(); + return d->m_model->data(d->m_model->index(d->m_mapX, pos + d->m_mapFirst), Qt::DisplayRole).toDouble(); } else { // model is not specified, return the data from series' internal data store - return m_x.at(pos); + return d->m_x.at(pos); } } @@ -223,16 +229,17 @@ qreal QXYSeries::x(int pos) const */ qreal QXYSeries::y(int pos) const { - if (m_model) { - if (m_mapOrientation == Qt::Vertical) + Q_D(const QXYSeries); + if (d->m_model) { + if (d->m_mapOrientation == Qt::Vertical) // consecutive data is read from model's column - return m_model->data(m_model->index(pos + m_mapFirst, m_mapY), Qt::DisplayRole).toDouble(); + return d->m_model->data(d->m_model->index(pos + d->m_mapFirst, d->m_mapY), Qt::DisplayRole).toDouble(); else // consecutive data is read from model's row - return m_model->data(m_model->index(m_mapY, pos + m_mapFirst), Qt::DisplayRole).toDouble(); + return d->m_model->data(d->m_model->index(d->m_mapY, pos + d->m_mapFirst), Qt::DisplayRole).toDouble(); } else { // model is not specified, return the data from series' internal data store - return m_y.at(pos); + return d->m_y.at(pos); } } @@ -241,28 +248,30 @@ qreal QXYSeries::y(int pos) const */ int QXYSeries::count() const { - Q_ASSERT(m_x.size() == m_y.size()); + Q_D(const QXYSeries); + + Q_ASSERT(d->m_x.size() == d->m_y.size()); - if (m_model) { - if (m_mapOrientation == Qt::Vertical) { + if (d->m_model) { + if (d->m_mapOrientation == Qt::Vertical) { // data is in a column. Return the number of mapped items if the model's column have enough items // or the number of items that can be mapped - if (m_mapLimited) - return qMin(m_mapCount, qMax(m_model->rowCount() - m_mapFirst, 0)); + if (d->m_mapLimited) + return qMin(d->m_mapCount, qMax(d->m_model->rowCount() - d->m_mapFirst, 0)); else - return qMax(m_model->rowCount() - m_mapFirst, 0); + return qMax(d->m_model->rowCount() - d->m_mapFirst, 0); } else { // data is in a row. Return the number of mapped items if the model's row have enough items // or the number of items that can be mapped - if (m_mapLimited) - return qMin(m_mapCount, qMax(m_model->columnCount() - m_mapFirst, 0)); + if (d->m_mapLimited) + return qMin(d->m_mapCount, qMax(d->m_model->columnCount() - d->m_mapFirst, 0)); else - return qMax(m_model->columnCount() - m_mapFirst, 0); + return qMax(d->m_model->columnCount() - d->m_mapFirst, 0); } } // model is not specified, return the number of points in the series internal data store - return m_x.size(); + return d->m_x.size(); } /*! @@ -270,9 +279,10 @@ int QXYSeries::count() const */ QList QXYSeries::data() { + Q_D(QXYSeries); QList data; - for (int i(0); i < m_x.count() && i < m_y.count(); i++) - data.append(QPointF(m_x.at(i), m_y.at(i))); + for (int i(0); i < d->m_x.count() && i < d->m_y.count(); i++) + data.append(QPointF(d->m_x.at(i), d->m_y.at(i))); return data; } @@ -284,12 +294,19 @@ QList QXYSeries::data() */ void QXYSeries::setPen(const QPen &pen) { - if (pen != m_pen) { - m_pen = pen; - emit updated(); + Q_D(QXYSeries); + if (d->m_pen!=pen) { + d->m_pen = pen; + emit d->updated(); } } +QPen QXYSeries::pen() const +{ + Q_D(const QXYSeries); + return d->m_pen; +} + /*! Sets \a brush used for drawing points on the chart. If the brush is not defined, brush from chart theme setting is used. @@ -297,12 +314,39 @@ void QXYSeries::setPen(const QPen &pen) */ void QXYSeries::setBrush(const QBrush &brush) { - if (brush != m_brush) { - m_brush = brush; - emit updated(); + Q_D(QXYSeries); + if (d->m_brush!=brush) { + d->m_brush = brush; + emit d->updated(); } } +QBrush QXYSeries::brush() const +{ + Q_D(const QXYSeries); + return d->m_brush; +} + + +/*! + Sets if data points are \a visible and should be drawn on line. +*/ +void QXYSeries::setPointsVisible(bool visible) +{ + Q_D(QXYSeries); + if (d->m_pointsVisible != visible){ + d->m_pointsVisible = visible; + emit d->updated(); + } +} + + +bool QXYSeries::pointsVisible() const +{ + Q_D(const QXYSeries); + return d->m_pointsVisible; +} + /*! Stream operator for adding a data \a point to the series. @@ -332,13 +376,13 @@ QXYSeries& QXYSeries::operator<< (const QList points) void QXYSeries::modelUpdated(QModelIndex topLeft, QModelIndex bottomRight) { Q_UNUSED(bottomRight) - - if (m_mapOrientation == Qt::Vertical) { - if (topLeft.row() >= m_mapFirst && (!m_mapLimited || topLeft.row() < m_mapFirst + m_mapCount)) - emit pointReplaced(topLeft.row() - m_mapFirst); + Q_D(QXYSeries); + if (d->m_mapOrientation == Qt::Vertical) { + if (topLeft.row() >= d->m_mapFirst && (!d->m_mapLimited || topLeft.row() < d->m_mapFirst + d->m_mapCount)) + emit d->pointReplaced(topLeft.row() - d->m_mapFirst); } else { - if (topLeft.column() >= m_mapFirst && (!m_mapLimited || topLeft.column() < m_mapFirst + m_mapCount)) - emit pointReplaced(topLeft.column() - m_mapFirst); + if (topLeft.column() >= d->m_mapFirst && (!d->m_mapLimited || topLeft.column() < d->m_mapFirst + d->m_mapCount)) + emit d->pointReplaced(topLeft.column() - d->m_mapFirst); } } @@ -349,9 +393,9 @@ void QXYSeries::modelDataAboutToBeAdded(QModelIndex parent, int start, int end) { Q_UNUSED(parent) // Q_UNUSED(end) - - if (m_mapLimited) { - if (start >= m_mapFirst + m_mapCount) { + Q_D(QXYSeries); + if (d->m_mapLimited) { + if (start >= d->m_mapFirst + d->m_mapCount) { // the added data is below mapped area // therefore it has no relevance return; @@ -362,10 +406,10 @@ void QXYSeries::modelDataAboutToBeAdded(QModelIndex parent, int start, int end) // if the number of items currently is equal the m_mapCount then some needs to be removed from xychartitem // internal storage before new ones can be added - int itemsToRemove = qMin(count() - qMax(start - m_mapFirst, 0), end - start + 1); - if (m_mapCount == count()) { + int itemsToRemove = qMin(count() - qMax(start - d->m_mapFirst, 0), end - start + 1); + if (d->m_mapCount == count()) { for (int i = 0; i < itemsToRemove; i++) - emit pointRemoved(qMin(end, count()) - i); + emit d->pointRemoved(qMin(end, count()) - i); } } } else { @@ -382,9 +426,9 @@ void QXYSeries::modelDataAdded(QModelIndex parent, int start, int end) { Q_UNUSED(parent) // Q_UNUSED(end) - - if (m_mapLimited) { - if (start >= m_mapFirst + m_mapCount) { + Q_D(QXYSeries); + if (d->m_mapLimited) { + if (start >= d->m_mapFirst + d->m_mapCount) { // the added data is below mapped area // therefore it has no relevance return; @@ -392,16 +436,16 @@ void QXYSeries::modelDataAdded(QModelIndex parent, int start, int end) // the added data is in the mapped area or before it // update needed if (count() > 0) { - int toBeAdded = qMin(m_mapCount - (start - m_mapFirst), end - start + 1); + int toBeAdded = qMin(d->m_mapCount - (start - d->m_mapFirst), end - start + 1); for (int i = 0; i < toBeAdded; i++) - if (start + i >= m_mapFirst) - emit pointAdded(start + i); + if (start + i >= d->m_mapFirst) + emit d->pointAdded(start + i); } } } else { // map is not limited (it included all the items starting from m_mapFirst till the end of model) for (int i = 0; i < end - start + 1; i++) - emit pointAdded(start + i); + emit d->pointAdded(start + i); } } @@ -412,9 +456,9 @@ void QXYSeries::modelDataAboutToBeRemoved(QModelIndex parent, int start, int end { Q_UNUSED(parent) // Q_UNUSED(end) - - if (m_mapLimited) { - if (start >= m_mapFirst + m_mapCount) { + Q_D(QXYSeries); + if (d->m_mapLimited) { + if (start >= d->m_mapFirst + d->m_mapCount) { // the removed data is below mapped area // therefore it has no relevance return; @@ -426,14 +470,14 @@ void QXYSeries::modelDataAboutToBeRemoved(QModelIndex parent, int start, int end // the number equals the number of items that are removed and that lay before // or in the mapped area. Items that lay beyond the map do not count // the max is the current number of items in storage (count()) - int itemsToRemove = qMin(count(), qMin(end, m_mapFirst + m_mapCount - 1) - start + 1); + int itemsToRemove = qMin(count(), qMin(end, d->m_mapFirst + d->m_mapCount - 1) - start + 1); for (int i = 0; i < itemsToRemove; i++) - emit pointRemoved(start); + emit d->pointRemoved(start); } } else { // map is not limited (it included all the items starting from m_mapFirst till the end of model) for (int i = 0; i < end - start + 1; i++) - emit pointRemoved(start); + emit d->pointRemoved(start); } } @@ -442,14 +486,15 @@ void QXYSeries::modelDataAboutToBeRemoved(QModelIndex parent, int start, int end */ void QXYSeries::modelDataRemoved(QModelIndex parent, int start, int end) { + Q_UNUSED(parent) Q_UNUSED(end) - + Q_D(QXYSeries); // how many items there were before data was removed // int oldCount = count() - 1; - if (m_mapLimited) { - if (start >= m_mapFirst + m_mapCount) { + if (d->m_mapLimited) { + if (start >= d->m_mapFirst + d->m_mapCount) { // the removed data is below mapped area // therefore it has no relevance return; @@ -457,18 +502,18 @@ void QXYSeries::modelDataRemoved(QModelIndex parent, int start, int end) // if the current items count in the whole model is bigger than the index of the last item // that was removed than it means there are some extra items available - int removedItemsCount = qMin(count(), qMin(end, m_mapFirst + m_mapCount - 1) - start + 1); + int removedItemsCount = qMin(count(), qMin(end, d->m_mapFirst + d->m_mapCount - 1) - start + 1); int extraItemsAvailable = 0; - if (m_mapOrientation == Qt::Vertical) { - extraItemsAvailable = qMax(m_model->rowCount() + (end - start + 1) - qMax(end + 1, m_mapFirst + m_mapCount), 0); + if (d->m_mapOrientation == Qt::Vertical) { + extraItemsAvailable = qMax(d->m_model->rowCount() + (end - start + 1) - qMax(end + 1, d->m_mapFirst + d->m_mapCount), 0); } else { - extraItemsAvailable = qMax(m_model->columnCount() + (end - start + 1) - qMax(end + 1, m_mapFirst + m_mapCount), 0); + extraItemsAvailable = qMax(d->m_model->columnCount() + (end - start + 1) - qMax(end + 1, d->m_mapFirst + d->m_mapCount), 0); } // if there are excess items available (below the mapped area) use them to repopulate mapped area int toBeAdded = qMin(extraItemsAvailable, removedItemsCount); for (int k = 0; k < toBeAdded; k++) - emit pointAdded(m_mapFirst + m_mapCount - removedItemsCount + k); + emit d->pointAdded(d->m_mapFirst + d->m_mapCount - removedItemsCount + k); } } else { // data was removed from XYSeries interal storage. Nothing more to do @@ -480,25 +525,26 @@ void QXYSeries::modelDataRemoved(QModelIndex parent, int start, int end) Sets the \a model to be used as a data source \sa setModelMapping(), setModelMappingRange() */ -bool QXYSeries::setModel(QAbstractItemModel *model) { - +bool QXYSeries::setModel(QAbstractItemModel *model) +{ + Q_D(QXYSeries); // disconnect signals from old model - if (m_model) { - disconnect(m_model, 0, this, 0); - m_mapX = -1; - m_mapY = -1; - m_mapFirst = 0; - m_mapCount = 0; - m_mapLimited = false; - m_mapOrientation = Qt::Vertical; + if (d->m_model) { + QObject::disconnect(d->m_model, 0, this, 0); + d->m_mapX = -1; + d->m_mapY = -1; + d->m_mapFirst = 0; + d->m_mapCount = 0; + d->m_mapLimited = false; + d->m_mapOrientation = Qt::Vertical; } // set new model if (model) { - m_model = model; + d->m_model = model; return true; } else { - m_model = 0; + d->m_model = 0; return false; } } @@ -512,24 +558,25 @@ bool QXYSeries::setModel(QAbstractItemModel *model) { */ void QXYSeries::setModelMapping(int modelX, int modelY, Qt::Orientation orientation) { - if (m_model == 0) + Q_D(QXYSeries); + if (d->m_model == 0) return; - m_mapX = modelX; - m_mapY = modelY; - m_mapFirst = 0; - m_mapOrientation = orientation; - if (m_mapOrientation == Qt::Vertical) { - connect(m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(modelUpdated(QModelIndex, QModelIndex))); - connect(m_model,SIGNAL(rowsAboutToBeInserted(QModelIndex, int, int)), this, SLOT(modelDataAboutToBeAdded(QModelIndex,int,int))); - connect(m_model,SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(modelDataAdded(QModelIndex,int,int))); - connect(m_model, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), this, SLOT(modelDataAboutToBeRemoved(QModelIndex,int,int))); - connect(m_model, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(modelDataRemoved(QModelIndex,int,int))); + d->m_mapX = modelX; + d->m_mapY = modelY; + d->m_mapFirst = 0; + d->m_mapOrientation = orientation; + if (d->m_mapOrientation == Qt::Vertical) { + connect(d->m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(modelUpdated(QModelIndex, QModelIndex))); + connect(d->m_model,SIGNAL(rowsAboutToBeInserted(QModelIndex, int, int)), this, SLOT(modelDataAboutToBeAdded(QModelIndex,int,int))); + connect(d->m_model,SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(modelDataAdded(QModelIndex,int,int))); + connect(d->m_model, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), this, SLOT(modelDataAboutToBeRemoved(QModelIndex,int,int))); + connect(d->m_model, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(modelDataRemoved(QModelIndex,int,int))); } else { - connect(m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(modelUpdated(QModelIndex, QModelIndex))); - connect(m_model,SIGNAL(columnsAboutToBeInserted(QModelIndex, int, int)), this, SLOT(modelDataAboutToBeAdded(QModelIndex,int,int))); - connect(m_model,SIGNAL(columnsInserted(QModelIndex, int, int)), this, SLOT(modelDataAdded(QModelIndex,int,int))); - connect(m_model, SIGNAL(columnsAboutToBeRemoved(QModelIndex, int, int)), this, SLOT(modelDataAboutToBeRemoved(QModelIndex,int,int))); - connect(m_model, SIGNAL(columnsRemoved(QModelIndex, int, int)), this, SLOT(modelDataRemoved(QModelIndex,int,int))); + connect(d->m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(modelUpdated(QModelIndex, QModelIndex))); + connect(d->m_model,SIGNAL(columnsAboutToBeInserted(QModelIndex, int, int)), this, SLOT(modelDataAboutToBeAdded(QModelIndex,int,int))); + connect(d->m_model,SIGNAL(columnsInserted(QModelIndex, int, int)), this, SLOT(modelDataAdded(QModelIndex,int,int))); + connect(d->m_model, SIGNAL(columnsAboutToBeRemoved(QModelIndex, int, int)), this, SLOT(modelDataAboutToBeRemoved(QModelIndex,int,int))); + connect(d->m_model, SIGNAL(columnsRemoved(QModelIndex, int, int)), this, SLOT(modelDataRemoved(QModelIndex,int,int))); } } @@ -543,15 +590,43 @@ void QXYSeries::setModelMapping(int modelX, int modelY, Qt::Orientation orientat */ void QXYSeries::setModelMappingRange(int first, int count) { - m_mapFirst = first; + Q_D(QXYSeries); + d->m_mapFirst = first; if (count == 0) { - m_mapLimited = false; + d->m_mapLimited = false; } else { - m_mapCount = count; - m_mapLimited = true; + d->m_mapCount = count; + d->m_mapLimited = true; } } +int QXYSeries::mapFirst() const +{ + Q_D(const QXYSeries); + return d->m_mapFirst; +} + +int QXYSeries::mapCount() const +{ + Q_D(const QXYSeries); + return d->m_mapCount; +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +QXYSeriesPrivate::QXYSeriesPrivate(QXYSeries *q): QSeriesPrivate(q), +m_mapX(-1), +m_mapY(-1), +m_mapFirst(0), +m_mapCount(0), +m_mapLimited(false), +m_mapOrientation( Qt::Vertical), +m_pointsVisible(false) +{ + +} + #include "moc_qxyseries.cpp" +#include "moc_qxyseries_p.cpp" QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/xychart/qxyseries.h b/src/xychart/qxyseries.h index 0c7862f..a6adbb5 100644 --- a/src/xychart/qxyseries.h +++ b/src/xychart/qxyseries.h @@ -30,12 +30,15 @@ class QModelIndex; QTCOMMERCIALCHART_BEGIN_NAMESPACE +class QXYSeriesPrivate; + class QTCOMMERCIALCHART_EXPORT QXYSeries : public QSeries { Q_OBJECT protected: - QXYSeries(QObject *parent = 0); - virtual ~QXYSeries(); + explicit QXYSeries(QObject *parent = 0); + explicit QXYSeries(QXYSeriesPrivate &d,QObject *parent = 0); + ~QXYSeries(); public: void append(qreal x, qreal y); @@ -57,16 +60,20 @@ public: QXYSeries& operator << (const QList points); void setPen(const QPen &pen); - QPen pen() const {return m_pen;} + QPen pen() const; + void setBrush(const QBrush &brush); - QBrush brush() const {return m_brush;} + QBrush brush() const; + + void setPointsVisible(bool visible); + bool pointsVisible() const; bool setModel(QAbstractItemModel *model); virtual void setModelMapping(int modelX, int modelY, Qt::Orientation orientation = Qt::Vertical); virtual void setModelMappingRange(int first, int count = 0); - int mapFirst() const { return m_mapFirst; } - int mapCount() const { return m_mapCount; } + int mapFirst() const; + int mapCount() const; private Q_SLOTS: void modelUpdated(QModelIndex topLeft, QModelIndex bottomRight); @@ -78,25 +85,12 @@ private Q_SLOTS: Q_SIGNALS: void clicked(const QPointF &point); void selected(); - void updated(); - void pointReplaced(int index); - void pointRemoved(int index); - void pointAdded(int index); -protected: - QVector m_x; - QVector m_y; - - QPen m_pen; - QBrush m_brush; - - int m_mapX; - int m_mapY; - int m_mapFirst; - int m_mapCount; - bool m_mapLimited; - Qt::Orientation m_mapOrientation; - int tempItemsRemoved; +private: + Q_DECLARE_PRIVATE(QXYSeries); + Q_DISABLE_COPY(QXYSeries); + friend class XYLegendMarker; + friend class XYChartItem; }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/xychart/qxyseries_p.h b/src/xychart/qxyseries_p.h new file mode 100644 index 0000000..036a3c4 --- /dev/null +++ b/src/xychart/qxyseries_p.h @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** 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 QXYSERIES_P_H_ +#define QXYSERIES_P_H_ + +#include "qseries_p.h" + +QTCOMMERCIALCHART_BEGIN_NAMESPACE + +class QXYSeries; + +class QXYSeriesPrivate: public QSeriesPrivate +{ + Q_OBJECT + +public: + QXYSeriesPrivate(QXYSeries* q); + +Q_SIGNALS: + void updated(); + void pointReplaced(int index); + void pointRemoved(int index); + void pointAdded(int index); +public: + QVector m_x; + QVector m_y; + + QPen m_pen; + QBrush m_brush; + + int m_mapX; + int m_mapY; + int m_mapFirst; + int m_mapCount; + bool m_mapLimited; + Qt::Orientation m_mapOrientation; + int tempItemsRemoved; + bool m_pointsVisible; + + friend class QScatterSeries; + friend class QXYSeries; +}; + +QTCOMMERCIALCHART_END_NAMESPACE + +#endif diff --git a/src/xychart/xychart.pri b/src/xychart/xychart.pri index ee2164d..101e53a 100644 --- a/src/xychart/xychart.pri +++ b/src/xychart/xychart.pri @@ -6,7 +6,8 @@ SOURCES += \ $$PWD/qxyseries.cpp PRIVATE_HEADERS += \ - $$PWD/xychartitem_p.h + $$PWD/xychartitem_p.h \ + $$PWD/qxyseries_p.h PUBLIC_HEADERS += \ diff --git a/src/xychart/xychartitem.cpp b/src/xychart/xychartitem.cpp index 2ae2d4c..043579a 100644 --- a/src/xychart/xychartitem.cpp +++ b/src/xychart/xychartitem.cpp @@ -20,6 +20,7 @@ #include "xychartitem_p.h" #include "qxyseries.h" +#include "qxyseries_p.h" #include "chartpresenter_p.h" #include "chartanimator_p.h" #include @@ -37,9 +38,9 @@ XYChartItem::XYChartItem(QXYSeries *series, ChartPresenter *presenter):ChartItem m_maxY(0), m_series(series) { - connect(series,SIGNAL(pointReplaced(int)),this,SLOT(handlePointReplaced(int))); - connect(series,SIGNAL(pointAdded(int)),this,SLOT(handlePointAdded(int))); - connect(series,SIGNAL(pointRemoved(int)),this,SLOT(handlePointRemoved(int))); + connect(series->d_func(),SIGNAL(pointReplaced(int)),this,SLOT(handlePointReplaced(int))); + connect(series->d_func(),SIGNAL(pointAdded(int)),this,SLOT(handlePointAdded(int))); + connect(series->d_func(),SIGNAL(pointRemoved(int)),this,SLOT(handlePointRemoved(int))); connect(this,SIGNAL(clicked(const QPointF&)),series,SIGNAL(clicked(const QPointF&))); } @@ -123,7 +124,7 @@ void XYChartItem::handlePointAdded(int index) update(); } void XYChartItem::handlePointRemoved(int index) -{ +{ QVector points = m_points; if (m_series->model()) { if (index < m_series->mapFirst())