##// END OF EJS Templates
Adds big fat pimpl to series classes...
Michal Klocek -
r938:43d9ec405aa3
parent child
Show More
@@ -0,0 +1,61
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Digia Plc
4 ** All rights reserved.
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 **
7 ** This file is part of the Qt Commercial Charts Add-on.
8 **
9 ** $QT_BEGIN_LICENSE$
10 ** Licensees holding valid Qt Commercial licenses may use this file in
11 ** accordance with the Qt Commercial License Agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.
14 **
15 ** If you have questions regarding the use of this file, please use
16 ** contact form at http://qt.digia.com
17 ** $QT_END_LICENSE$
18 **
19 ****************************************************************************/
20
21 // W A R N I N G
22 // -------------
23 //
24 // This file is not part of the QtCommercial Chart API. It exists purely as an
25 // implementation detail. This header file may change from version to
26 // version without notice, or even be removed.
27 //
28 // We mean it.
29
30 #ifndef QAREASERIES_P_H_
31 #define QAREASERIES_P_H_
32
33 #include "qseries_p.h"
34
35 QTCOMMERCIALCHART_BEGIN_NAMESPACE
36
37 class QAreaSeries;
38
39 class QAreaSeriesPrivate: public QSeriesPrivate
40 {
41 Q_OBJECT
42
43 public:
44 QAreaSeriesPrivate(QLineSeries *upperSeries, QLineSeries *lowerSeries,QAreaSeries* q);
45
46 Q_SIGNALS:
47 void updated();
48
49 public:
50 QBrush m_brush;
51 QPen m_pen;
52 QLineSeries* m_upperSeries;
53 QLineSeries* m_lowerSeries;
54 bool m_pointsVisible;
55
56 friend class QAreaSeries;
57 };
58
59 QTCOMMERCIALCHART_END_NAMESPACE
60
61 #endif
@@ -0,0 +1,46
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Digia Plc
4 ** All rights reserved.
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 **
7 ** This file is part of the Qt Commercial Charts Add-on.
8 **
9 ** $QT_BEGIN_LICENSE$
10 ** Licensees holding valid Qt Commercial licenses may use this file in
11 ** accordance with the Qt Commercial License Agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.
14 **
15 ** If you have questions regarding the use of this file, please use
16 ** contact form at http://qt.digia.com
17 ** $QT_END_LICENSE$
18 **
19 ****************************************************************************/
20
21 // W A R N I N G
22 // -------------
23 //
24 // This file is not part of the QtCommercial Chart API. It exists purely as an
25 // implementation detail. This header file may change from version to
26 // version without notice, or even be removed.
27 //
28 // We mean it.
29
30 #ifndef QLINESERIES_P_H_
31 #define QLINESERIES_P_H_
32
33 #include "qxyseries_p.h"
34
35 QTCOMMERCIALCHART_BEGIN_NAMESPACE
36
37
38 struct QLineSeriesPrivate: public QXYSeriesPrivate
39 {
40 QLineSeriesPrivate(QLineSeries* q);
41
42 };
43
44 QTCOMMERCIALCHART_END_NAMESPACE
45
46 #endif
@@ -0,0 +1,50
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Digia Plc
4 ** All rights reserved.
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 **
7 ** This file is part of the Qt Commercial Charts Add-on.
8 **
9 ** $QT_BEGIN_LICENSE$
10 ** Licensees holding valid Qt Commercial licenses may use this file in
11 ** accordance with the Qt Commercial License Agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.
14 **
15 ** If you have questions regarding the use of this file, please use
16 ** contact form at http://qt.digia.com
17 ** $QT_END_LICENSE$
18 **
19 ****************************************************************************/
20
21 // W A R N I N G
22 // -------------
23 //
24 // This file is not part of the QtCommercial Chart API. It exists purely as an
25 // implementation detail. This header file may change from version to
26 // version without notice, or even be removed.
27 //
28 // We mean it.
29
30 #ifndef QSERIES_P_H_
31 #define QSERIES_P_H_
32
33 #include "qseries.h"
34
35 class QAbstractItemModel;
36
37 QTCOMMERCIALCHART_BEGIN_NAMESPACE
38
39 struct QSeriesPrivate : public QObject
40 {
41 QSeriesPrivate(QSeries *q);
42 virtual ~QSeriesPrivate();
43 QSeries *q_ptr;
44 QAbstractItemModel* m_model;
45 QString m_name;
46 };
47
48 QTCOMMERCIALCHART_END_NAMESPACE
49
50 #endif
@@ -0,0 +1,48
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Digia Plc
4 ** All rights reserved.
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 **
7 ** This file is part of the Qt Commercial Charts Add-on.
8 **
9 ** $QT_BEGIN_LICENSE$
10 ** Licensees holding valid Qt Commercial licenses may use this file in
11 ** accordance with the Qt Commercial License Agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.
14 **
15 ** If you have questions regarding the use of this file, please use
16 ** contact form at http://qt.digia.com
17 ** $QT_END_LICENSE$
18 **
19 ****************************************************************************/
20
21 // W A R N I N G
22 // -------------
23 //
24 // This file is not part of the QtCommercial Chart API. It exists purely as an
25 // implementation detail. This header file may change from version to
26 // version without notice, or even be removed.
27 //
28 // We mean it.
29
30 #ifndef QSCATTERSERIES_P_H_
31 #define QSCATTERSERIES_P_H_
32
33 #include "qxyseries_p.h"
34
35 QTCOMMERCIALCHART_BEGIN_NAMESPACE
36
37 struct QScatterSeriesPrivate: public QXYSeriesPrivate
38 {
39 QScatterSeriesPrivate(QScatterSeries* q);
40
41 QScatterSeries::MarkerShape m_shape;
42 qreal m_size;
43
44 };
45
46 QTCOMMERCIALCHART_END_NAMESPACE
47
48 #endif
@@ -0,0 +1,56
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Digia Plc
4 ** All rights reserved.
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 **
7 ** This file is part of the Qt Commercial Charts Add-on.
8 **
9 ** $QT_BEGIN_LICENSE$
10 ** Licensees holding valid Qt Commercial licenses may use this file in
11 ** accordance with the Qt Commercial License Agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.
14 **
15 ** If you have questions regarding the use of this file, please use
16 ** contact form at http://qt.digia.com
17 ** $QT_END_LICENSE$
18 **
19 ****************************************************************************/
20
21 // W A R N I N G
22 // -------------
23 //
24 // This file is not part of the QtCommercial Chart API. It exists purely as an
25 // implementation detail. This header file may change from version to
26 // version without notice, or even be removed.
27 //
28 // We mean it.
29
30 #ifndef QSPLINESERIES_P_H_
31 #define QSPLINESERIES_P_H_
32
33 #include "qlineseries_p.h"
34
35 QTCOMMERCIALCHART_BEGIN_NAMESPACE
36
37
38 class QSplineSeriesPrivate: public QLineSeriesPrivate
39 {
40 Q_OBJECT
41 public:
42 QSplineSeriesPrivate(QSplineSeries* q);
43 void calculateControlPoints();
44 QList<qreal> getFirstControlPoints(QList<qreal> rhs);
45
46 public Q_SLOTS:
47 void updateControlPoints();
48 public:
49 QList<QPointF> m_controlPoints;
50 private:
51 Q_DECLARE_PUBLIC(QSplineSeries)
52 };
53
54 QTCOMMERCIALCHART_END_NAMESPACE
55
56 #endif
@@ -0,0 +1,73
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Digia Plc
4 ** All rights reserved.
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 **
7 ** This file is part of the Qt Commercial Charts Add-on.
8 **
9 ** $QT_BEGIN_LICENSE$
10 ** Licensees holding valid Qt Commercial licenses may use this file in
11 ** accordance with the Qt Commercial License Agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.
14 **
15 ** If you have questions regarding the use of this file, please use
16 ** contact form at http://qt.digia.com
17 ** $QT_END_LICENSE$
18 **
19 ****************************************************************************/
20
21 // W A R N I N G
22 // -------------
23 //
24 // This file is not part of the QtCommercial Chart API. It exists purely as an
25 // implementation detail. This header file may change from version to
26 // version without notice, or even be removed.
27 //
28 // We mean it.
29
30 #ifndef QXYSERIES_P_H_
31 #define QXYSERIES_P_H_
32
33 #include "qseries_p.h"
34
35 QTCOMMERCIALCHART_BEGIN_NAMESPACE
36
37 class QXYSeries;
38
39 class QXYSeriesPrivate: public QSeriesPrivate
40 {
41 Q_OBJECT
42
43 public:
44 QXYSeriesPrivate(QXYSeries* q);
45
46 Q_SIGNALS:
47 void updated();
48 void pointReplaced(int index);
49 void pointRemoved(int index);
50 void pointAdded(int index);
51 public:
52 QVector<qreal> m_x;
53 QVector<qreal> m_y;
54
55 QPen m_pen;
56 QBrush m_brush;
57
58 int m_mapX;
59 int m_mapY;
60 int m_mapFirst;
61 int m_mapCount;
62 bool m_mapLimited;
63 Qt::Orientation m_mapOrientation;
64 int tempItemsRemoved;
65 bool m_pointsVisible;
66
67 friend class QScatterSeries;
68 friend class QXYSeries;
69 };
70
71 QTCOMMERCIALCHART_END_NAMESPACE
72
73 #endif
@@ -2,13 +2,12 INCLUDEPATH += $$PWD
2 DEPENDPATH += $$PWD
2 DEPENDPATH += $$PWD
3
3
4 SOURCES += \
4 SOURCES += \
5 #$$PWD/areachartanimationitem.cpp \
6 $$PWD/areachartitem.cpp \
5 $$PWD/areachartitem.cpp \
7 $$PWD/qareaseries.cpp
6 $$PWD/qareaseries.cpp
8
7
9 PRIVATE_HEADERS += \
8 PRIVATE_HEADERS += \
10 $$PWD/areachartitem_p.h \
9 $$PWD/areachartitem_p.h \
11 # $$PWD/linechartanimationitem_p.h
10 $$PWD/qareaseries_p.h
12
11
13 PUBLIC_HEADERS += \
12 PUBLIC_HEADERS += \
14 $$PWD/qareaseries.h No newline at end of file
13 $$PWD/qareaseries.h
@@ -20,6 +20,7
20
20
21 #include "areachartitem_p.h"
21 #include "areachartitem_p.h"
22 #include "qareaseries.h"
22 #include "qareaseries.h"
23 #include "qareaseries_p.h"
23 #include "qlineseries.h"
24 #include "qlineseries.h"
24 #include "chartpresenter_p.h"
25 #include "chartpresenter_p.h"
25 #include <QPainter>
26 #include <QPainter>
@@ -42,7 +43,7 AreaChartItem::AreaChartItem(QAreaSeries *areaSeries, ChartPresenter *presenter)
42 if (m_series->lowerSeries())
43 if (m_series->lowerSeries())
43 m_lower = new AreaBoundItem(this,m_series->lowerSeries());
44 m_lower = new AreaBoundItem(this,m_series->lowerSeries());
44
45
45 connect(areaSeries,SIGNAL(updated()),this,SLOT(handleUpdated()));
46 connect(m_series->d_func(),SIGNAL(updated()),this,SLOT(handleUpdated()));
46 connect(this,SIGNAL(clicked(const QPointF&)),areaSeries,SIGNAL(clicked(const QPointF&)));
47 connect(this,SIGNAL(clicked(const QPointF&)),areaSeries,SIGNAL(clicked(const QPointF&)));
47
48
48 handleUpdated();
49 handleUpdated();
@@ -19,6 +19,7
19 ****************************************************************************/
19 ****************************************************************************/
20
20
21 #include "qareaseries.h"
21 #include "qareaseries.h"
22 #include "qareaseries_p.h"
22 #include "qlineseries.h"
23 #include "qlineseries.h"
23
24
24 QTCOMMERCIALCHART_BEGIN_NAMESPACE
25 QTCOMMERCIALCHART_BEGIN_NAMESPACE
@@ -99,10 +100,7 QTCOMMERCIALCHART_BEGIN_NAMESPACE
99 When series object is added to QChartView or QChart instance ownerships is transfered.
100 When series object is added to QChartView or QChart instance ownerships is transfered.
100 */
101 */
101 QAreaSeries::QAreaSeries(QLineSeries *upperSeries, QLineSeries *lowerSeries)
102 QAreaSeries::QAreaSeries(QLineSeries *upperSeries, QLineSeries *lowerSeries)
102 : QSeries(upperSeries),
103 : QSeries(*new QAreaSeriesPrivate(upperSeries,lowerSeries,this),upperSeries)
103 m_upperSeries(upperSeries),
104 m_lowerSeries(lowerSeries),
105 m_pointsVisible(false)
106 {
104 {
107 }
105 }
108
106
@@ -114,38 +112,100 QAreaSeries::~QAreaSeries()
114 {
112 {
115 }
113 }
116
114
115
116 QSeries::QSeriesType QAreaSeries::type() const
117 {
118 return QSeries::SeriesTypeArea;
119 }
120
121 QLineSeries* QAreaSeries::upperSeries() const
122 {
123 Q_D(const QAreaSeries);
124 return d->m_upperSeries;
125 }
126
127 QLineSeries* QAreaSeries::lowerSeries() const
128 {
129 Q_D(const QAreaSeries);
130 return d->m_lowerSeries;
131 }
132
117 /*!
133 /*!
118 Sets \a pen used for drawing area outline.
134 Sets \a pen used for drawing area outline.
119 */
135 */
120 void QAreaSeries::setPen(const QPen &pen)
136 void QAreaSeries::setPen(const QPen &pen)
121 {
137 {
122 if (m_pen != pen) {
138 Q_D(QAreaSeries);
123 m_pen = pen;
139 if (d->m_pen != pen) {
124 emit updated();
140 d->m_pen = pen;
141 emit d->updated();
125 }
142 }
126 }
143 }
127
144
145 QPen QAreaSeries::pen() const
146 {
147 Q_D(const QAreaSeries);
148 return d->m_pen;
149 }
150
128 /*!
151 /*!
129 Sets \a brush used for filling the area.
152 Sets \a brush used for filling the area.
130 */
153 */
131 void QAreaSeries::setBrush(const QBrush &brush)
154 void QAreaSeries::setBrush(const QBrush &brush)
132 {
155 {
133 if (m_brush != brush) {
156 Q_D(QAreaSeries);
134 m_brush = brush;
157 if (d->m_brush != brush) {
135 emit updated();
158 d->m_brush = brush;
159 emit d->updated();
136 }
160 }
137 }
161 }
162
163 QBrush QAreaSeries::brush() const
164 {
165 Q_D(const QAreaSeries);
166 return d->m_brush;
167 }
138 /*!
168 /*!
139 Sets if data points are \a visible and should be drawn on line.
169 Sets if data points are \a visible and should be drawn on line.
140 */
170 */
141 void QAreaSeries::setPointsVisible(bool visible)
171 void QAreaSeries::setPointsVisible(bool visible)
142 {
172 {
143 if (m_pointsVisible != visible) {
173 Q_D(QAreaSeries);
144 m_pointsVisible = visible;
174 if (d->m_pointsVisible != visible) {
145 emit updated();
175 d->m_pointsVisible = visible;
176 emit d->updated();
146 }
177 }
147 }
178 }
148
179
180 bool QAreaSeries::pointsVisible() const
181 {
182 Q_D(const QAreaSeries);
183 return d->m_pointsVisible;
184 }
185
186 bool QAreaSeries::setModel(QAbstractItemModel* model)
187 {
188 Q_UNUSED(model);
189 qWarning()<<"Not implemented";
190 return false;
191 }
192
193 QAbstractItemModel* QAreaSeries::model() const
194 {
195 return 0;
196 }
197
198 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
199
200 QAreaSeriesPrivate::QAreaSeriesPrivate(QLineSeries *upperSeries, QLineSeries *lowerSeries,QAreaSeries* q):QSeriesPrivate(q),
201 m_upperSeries(upperSeries),
202 m_lowerSeries(lowerSeries),
203 m_pointsVisible(false)
204 {
205
206 };
207
149 #include "moc_qareaseries.cpp"
208 #include "moc_qareaseries.cpp"
209 #include "moc_qareaseries_p.cpp"
150
210
151 QTCOMMERCIALCHART_END_NAMESPACE
211 QTCOMMERCIALCHART_END_NAMESPACE
@@ -28,6 +28,7
28
28
29 QTCOMMERCIALCHART_BEGIN_NAMESPACE
29 QTCOMMERCIALCHART_BEGIN_NAMESPACE
30 class QLineSeries;
30 class QLineSeries;
31 class QAreaSeriesPrivate;
31
32
32 class QTCOMMERCIALCHART_EXPORT QAreaSeries : public QSeries
33 class QTCOMMERCIALCHART_EXPORT QAreaSeries : public QSeries
33 {
34 {
@@ -36,32 +37,33 public:
36 QAreaSeries(QLineSeries *upperSeries, QLineSeries *lowerSeries = 0);
37 QAreaSeries(QLineSeries *upperSeries, QLineSeries *lowerSeries = 0);
37 virtual ~QAreaSeries();
38 virtual ~QAreaSeries();
38
39
39 public: // from QChartSeries
40 public:
40 virtual QSeriesType type() const { return QSeries::SeriesTypeArea; }
41 QSeries::QSeriesType type() const;
41
42
42 QLineSeries* upperSeries() const { return m_upperSeries; }
43 QLineSeries* upperSeries() const;
43 QLineSeries* lowerSeries() const { return m_lowerSeries; }
44 QLineSeries* lowerSeries() const;
44
45
45 void setPen(const QPen &pen);
46 void setPen(const QPen &pen);
46 QPen pen() const { return m_pen;}
47 QPen pen() const;
47
48
48 void setBrush(const QBrush &brush);
49 void setBrush(const QBrush &brush);
49 QBrush brush() const { return m_brush;}
50 QBrush brush() const;
50
51
51 void setPointsVisible(bool visible);
52 void setPointsVisible(bool visible);
52 bool pointsVisible() const { return m_pointsVisible; }
53 bool pointsVisible() const;
54
55 bool setModel(QAbstractItemModel* model);
56 QAbstractItemModel* model() const;
53
57
54 Q_SIGNALS:
58 Q_SIGNALS:
55 void updated();
56 void clicked(const QPointF &point);
59 void clicked(const QPointF &point);
57 void selected();
60 void selected();
58
61
59 private:
62 private:
60 QBrush m_brush;
63 Q_DECLARE_PRIVATE(QAreaSeries);
61 QPen m_pen;
64 Q_DISABLE_COPY(QAreaSeries);
62 QLineSeries* m_upperSeries;
65 friend class AreaLegendMarker;
63 QLineSeries* m_lowerSeries;
66 friend class AreaChartItem;
64 bool m_pointsVisible;
65 };
67 };
66
68
67 QTCOMMERCIALCHART_END_NAMESPACE
69 QTCOMMERCIALCHART_END_NAMESPACE
@@ -20,8 +20,8 PRIVATE_HEADERS += \
20 $$PWD/percentbarchartitem_p.h \
20 $$PWD/percentbarchartitem_p.h \
21 $$PWD/stackedbarchartitem_p.h \
21 $$PWD/stackedbarchartitem_p.h \
22 $$PWD/barlabel_p.h \
22 $$PWD/barlabel_p.h \
23 $$PWD/qbarsetprivate_p.h \
23 $$PWD/qbarset_p.h \
24 $$PWD/qbarseriesprivate_p.h
24 $$PWD/qbarseries_p.h
25
25
26 PUBLIC_HEADERS += \
26 PUBLIC_HEADERS += \
27 $$PWD/qbarseries.h \
27 $$PWD/qbarseries.h \
This diff has been collapsed as it changes many lines, (641 lines changed) Show them Hide them
@@ -18,324 +18,17
18 **
18 **
19 ****************************************************************************/
19 ****************************************************************************/
20
20
21 #include <QDebug>
22 #include "qbarseries.h"
21 #include "qbarseries.h"
22 #include "qbarseries_p.h"
23 #include "qbarset.h"
23 #include "qbarset.h"
24 #include "qbarset_p.h"
24 #include "barchartmodel_p.h"
25 #include "barchartmodel_p.h"
25 #include "qbarseriesprivate_p.h"
26
26 #include "qbarsetprivate_p.h"
27 #include <QAbstractItemModel>
27 #include <QAbstractItemModel>
28 #include <QModelIndex>
28 #include <QModelIndex>
29
29
30 QTCOMMERCIALCHART_BEGIN_NAMESPACE
30 QTCOMMERCIALCHART_BEGIN_NAMESPACE
31
31
32 QBarSeriesPrivate::QBarSeriesPrivate(QBarCategories categories, QBarSeries *parent) : QObject(parent),
33 q_ptr(parent),
34 m_internalModel(new BarChartModel(categories,this))
35 {
36 m_model = 0;
37 m_mapCategories = -1;
38 m_mapBarBottom = -1;
39 m_mapBarTop = -1;
40 m_mapFirst = 0;
41 m_mapCount = 0;
42 m_mapOrientation = Qt::Vertical;
43 }
44
45 void QBarSeriesPrivate::appendBarSet(QBarSet *set)
46 {
47 m_internalModel->appendBarSet(set);
48 // connect(set, SIGNAL(clicked(QString,Qt::MouseButtons)), this, SLOT(barsetClicked(QString,Qt::MouseButtons)));
49 // connect(set, SIGNAL(valueChanged()), this, SLOT(barsetChanged()));
50 emit restructuredBars();
51 }
52
53 void QBarSeriesPrivate::removeBarSet(QBarSet *set)
54 {
55 // disconnect(set, SIGNAL(clicked(QString,Qt::MouseButtons)), this, SLOT(barsetClicked(QString,Qt::MouseButtons)));
56 m_internalModel->removeBarSet(set);
57 emit restructuredBars();
58 }
59 void QBarSeriesPrivate::appendBarSets(QList<QBarSet* > sets)
60 {
61 foreach (QBarSet* barset, sets) {
62 m_internalModel->appendBarSet(barset);
63 connect(barset, SIGNAL(clicked(QString,Qt::MouseButtons)), this, SLOT(barsetClicked(QString,Qt::MouseButtons)));
64 connect(barset, SIGNAL(valueChanged()), this, SLOT(barsetChanged()));
65 }
66 emit restructuredBars();
67 }
68
69 void QBarSeriesPrivate::removeBarSets(QList<QBarSet* > sets)
70 {
71 foreach (QBarSet* barset, sets) {
72 disconnect(barset, SIGNAL(clicked(QString,Qt::MouseButtons)), this, SLOT(barsetClicked(QString,Qt::MouseButtons)));
73 m_internalModel->removeBarSet(barset);
74 }
75 emit restructuredBars();
76 }
77
78 void QBarSeriesPrivate::insertBarSet(int i, QBarSet *set)
79 {
80 m_internalModel->insertBarSet(i, set);
81 // emit barsetChanged();
82 }
83
84 void QBarSeriesPrivate::insertCategory(int i, QString category)
85 {
86 m_internalModel->insertCategory(i, category);
87 }
88
89 void QBarSeriesPrivate::removeCategory(int i)
90 {
91 m_internalModel->removeCategory(i);
92 }
93
94 int QBarSeriesPrivate::barsetCount() const
95 {
96 // if(m_model)
97 // return m_mapBarTop - m_mapBarBottom;
98 // else
99 return m_internalModel->barsetCount();
100 }
101
102 int QBarSeriesPrivate::categoryCount() const
103 {
104 return m_internalModel->categoryCount();
105 }
106
107 QList<QBarSet*> QBarSeriesPrivate::barSets() const
108 {
109 return m_internalModel->barSets();
110 }
111
112 QBarSet* QBarSeriesPrivate::barsetAt(int index)
113 {
114 return m_internalModel->barsetAt(index);
115 }
116
117 QString QBarSeriesPrivate::categoryName(int category)
118 {
119 return m_internalModel->categoryName(category);
120 }
121
122 void QBarSeriesPrivate::setToolTipEnabled(bool enabled)
123 {
124 // TODO: what if we add sets after call to this function? Those sets won't have tooltip enabled.
125 if (enabled) {
126 for (int i=0; i<m_internalModel->barsetCount(); i++) {
127 QBarSet *set = m_internalModel->barsetAt(i);
128 connect(set, SIGNAL(showToolTip(QPoint,QString)), this, SIGNAL(showToolTip(QPoint,QString)));
129 }
130 } else {
131 for (int i=0; i<m_internalModel->barsetCount(); i++) {
132 QBarSet *set = m_internalModel->barsetAt(i);
133 disconnect(set, SIGNAL(showToolTip(QPoint,QString)), this, SIGNAL(showToolTip(QPoint,QString)));
134 }
135 }
136 }
137
138 void QBarSeriesPrivate::barsetClicked(QString category, Qt::MouseButtons button)
139 {
140 emit clicked(qobject_cast<QBarSet*>(sender()), category, button);
141 }
142
143 qreal QBarSeriesPrivate::min()
144 {
145 return m_internalModel->min();
146 }
147
148 qreal QBarSeriesPrivate::max()
149 {
150 return m_internalModel->max();
151 }
152
153 qreal QBarSeriesPrivate::valueAt(int set, int category)
154 {
155 return m_internalModel->valueAt(set, category);
156 }
157
158 qreal QBarSeriesPrivate::percentageAt(int set, int category)
159 {
160 return m_internalModel->percentageAt(set, category);
161 }
162
163 qreal QBarSeriesPrivate::categorySum(int category)
164 {
165 return m_internalModel->categorySum(category);
166 }
167
168 qreal QBarSeriesPrivate::absoluteCategorySum(int category)
169 {
170 return m_internalModel->absoluteCategorySum(category);
171 }
172
173 qreal QBarSeriesPrivate::maxCategorySum()
174 {
175 return m_internalModel->maxCategorySum();
176 }
177
178 BarChartModel& QBarSeriesPrivate::modelInternal()
179 {
180 return *m_internalModel;
181 }
182
183 bool QBarSeriesPrivate::setModel(QAbstractItemModel *model)
184 {
185 // disconnect signals from old model
186 if(m_model)
187 {
188 disconnect(m_model, 0, this, 0);
189 m_mapCategories = -1;
190 m_mapBarBottom = -1;
191 m_mapBarTop = -1;
192 m_mapFirst = 0;
193 m_mapCount = 0;
194 m_mapOrientation = Qt::Vertical;
195 }
196
197 // set new model
198 if(model)
199 {
200 m_model = model;
201 return true;
202 }
203 else
204 {
205 m_model = 0;
206 return false;
207 }
208 }
209
210 void QBarSeriesPrivate::setModelMapping(int categories, int bottomBoundry, int topBoundry, Qt::Orientation orientation)
211 {
212 if (!m_model)
213 return;
214
215 m_mapCategories = categories;
216 m_mapBarBottom = bottomBoundry;
217 m_mapBarTop = topBoundry;
218 // m_mapFirst = 1;
219 m_mapOrientation = orientation;
220
221 // connect the signals
222 if (m_mapOrientation == Qt::Vertical) {
223 m_mapCount = m_model->rowCount() - m_mapFirst;
224 connect(m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)),
225 this, SLOT(modelUpdated(QModelIndex, QModelIndex)));
226 connect(m_model,SIGNAL(rowsInserted(QModelIndex, int, int)),
227 this, SLOT(modelDataAdded(QModelIndex,int,int)));
228 connect(m_model, SIGNAL(rowsRemoved(QModelIndex, int, int)),
229 this, SLOT(modelDataRemoved(QModelIndex,int,int)));
230 } else {
231 m_mapCount = m_model->columnCount() - m_mapFirst;
232 connect(m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)),
233 this, SLOT(modelUpdated(QModelIndex, QModelIndex)));
234 connect(m_model,SIGNAL(columnsInserted(QModelIndex, int, int)),
235 this, SLOT(modelDataAdded(QModelIndex,int,int)));
236 connect(m_model, SIGNAL(columnsRemoved(QModelIndex, int, int)),
237 this, SLOT(modelDataRemoved(QModelIndex,int,int)));
238 }
239
240 // create the initial bars
241 delete m_internalModel;
242 if (m_mapOrientation == Qt::Vertical) {
243 QStringList categories;
244 for (int k = m_mapFirst; k < m_mapFirst + m_mapCount; k++)
245 categories << m_model->data(m_model->index(k, m_mapCategories), Qt::DisplayRole).toString();
246 m_internalModel = new BarChartModel(categories, this);
247
248 for (int i = m_mapBarBottom; i <= m_mapBarTop; i++) {
249 QBarSet* barSet = new QBarSet(QString("Column: %1").arg(i + 1));
250 for(int m = m_mapFirst; m < m_mapFirst + m_mapCount; m++)
251 *barSet << m_model->data(m_model->index(m, i), Qt::DisplayRole).toDouble();
252 appendBarSet(barSet);
253 }
254 } else {
255 QStringList categories;
256 for (int k = m_mapFirst; k < m_mapFirst + m_mapCount; k++)
257 categories << m_model->data(m_model->index(m_mapCategories, k), Qt::DisplayRole).toString();
258 m_internalModel = new BarChartModel(categories, this);
259
260 for (int i = m_mapBarBottom; i <= m_mapBarTop; i++) {
261 QBarSet* barSet = new QBarSet(QString("Row: %1").arg(i + 1));
262 for(int m = m_mapFirst; m < m_mapFirst + m_mapCount; m++)
263 *barSet << m_model->data(m_model->index(i, m), Qt::DisplayRole).toDouble();
264 appendBarSet(barSet);
265 }
266 }
267 }
268
269 void QBarSeriesPrivate::modelUpdated(QModelIndex topLeft, QModelIndex bottomRight)
270 {
271 Q_UNUSED(bottomRight)
272
273 if (m_mapOrientation == Qt::Vertical)
274 {
275 // model update is relevant to BarSeries if the change was made to the part of the model that was mapped to BarSeries
276 if (topLeft.column() >= m_mapBarBottom && topLeft.column() <= m_mapBarTop && topLeft.row() >= m_mapFirst && topLeft.row() < m_mapFirst + m_mapCount)
277 barsetAt(topLeft.column() - m_mapBarBottom)->setValue(topLeft.row() - m_mapFirst, m_model->data(topLeft, Qt::DisplayRole).toDouble());
278 }
279 else
280 {
281 // model update is relevant to BarSeries if the change was made to the part of the model that was mapped to BarSeries
282 if (topLeft.row() >= m_mapBarBottom && topLeft.row() <= m_mapBarTop && topLeft.column() >= m_mapFirst && topLeft.column() < m_mapFirst + m_mapCount)
283 barsetAt(topLeft.row() - m_mapBarBottom)->setValue(topLeft.column() - m_mapFirst, m_model->data(topLeft, Qt::DisplayRole).toDouble());
284 }
285 }
286
287 void QBarSeriesPrivate::modelDataAdded(QModelIndex /*parent*/, int start, int /*end*/)
288 {
289 if (m_mapOrientation == Qt::Vertical) {
290 insertCategory(start - m_mapFirst, QString("Row: %1").arg(start + 1));
291 for (int i = 0; i <= m_mapBarTop - m_mapBarBottom; i++) {
292 barsetAt(i)->insertValue(start - m_mapFirst, m_model->data(m_model->index(start, i), Qt::DisplayRole).toDouble());
293 }
294 } else {
295 insertCategory(start - m_mapFirst, QString("Column: %1").arg(start + 1));
296 for (int i = 0; i <= m_mapBarTop - m_mapBarBottom; i++) {
297 barsetAt(i)->insertValue(start - m_mapFirst, m_model->data(m_model->index(i, start), Qt::DisplayRole).toDouble());
298 }
299 }
300 emit restructuredBars();
301 }
302
303 void QBarSeriesPrivate::modelDataRemoved(QModelIndex parent, int start, int end)
304 {
305 Q_UNUSED(parent)
306 Q_UNUSED(end)
307
308 removeCategory(start - m_mapFirst);
309 for (int i = 0; i <= m_mapBarTop - m_mapBarBottom; i++)
310 {
311 barsetAt(i)->removeValue(start - m_mapFirst);
312 }
313 emit restructuredBars();
314 }
315
316 void QBarSeriesPrivate::barsetChanged()
317 {
318 emit updatedBars();
319 }
320
321 QBarCategories QBarSeriesPrivate::categories() const
322 {
323 QBarCategories categories;
324 int count = m_internalModel->categoryCount();
325 for (int i=1; i <= count; i++) {
326 categories.insert(i, m_internalModel->categoryName(i - 1));
327 }
328 return categories;
329 }
330
331 void QBarSeriesPrivate::setLabelsVisible(bool visible)
332 {
333 foreach (QBarSet* s, barSets()) {
334 s->setLabelsVisible(visible);
335 }
336 }
337
338
339 /*!
32 /*!
340 \class QBarSeries
33 \class QBarSeries
341 \brief part of QtCommercial chart API.
34 \brief part of QtCommercial chart API.
@@ -364,17 +57,15 void QBarSeriesPrivate::setLabelsVisible(bool visible)
364 Constructs empty QBarSeries. Parameter \a categories defines the categories for chart.
57 Constructs empty QBarSeries. Parameter \a categories defines the categories for chart.
365 QBarSeries is QObject which is a child of a \a parent.
58 QBarSeries is QObject which is a child of a \a parent.
366 */
59 */
367 QBarSeries::QBarSeries(QBarCategories categories, QObject *parent) : QSeries(parent),
60
368 d_ptr(new QBarSeriesPrivate(categories, this))
61 QBarSeries::QBarSeries(QBarCategories categories, QObject *parent) : QSeries(*new QBarSeriesPrivate(categories, this),parent)
369 // m_internalModel(new BarChartModel(categories, this))
62 {
63
64 }
65
66 QSeries::QSeriesType QBarSeries::type() const
370 {
67 {
371 // m_model = 0;
68 return QSeries::SeriesTypeBar;
372 // m_mapCategories = -1;
373 // m_mapBarBottom = -1;
374 // m_mapBarTop = -1;
375 // m_mapFirst = 0;
376 // m_mapCount = 0;
377 // m_mapOrientation = Qt::Vertical;
378 }
69 }
379
70
380 /*!
71 /*!
@@ -385,15 +76,10 QBarSeries::QBarSeries(QBarCategories categories, QObject *parent) : QSeries(par
385 void QBarSeries::appendBarSet(QBarSet *set)
76 void QBarSeries::appendBarSet(QBarSet *set)
386 {
77 {
387 Q_D(QBarSeries);
78 Q_D(QBarSeries);
388 connect(&QBarSetPrivate::pimpl(set), SIGNAL(clicked(QString,Qt::MouseButtons)), d_ptr, SLOT(barsetClicked(QString,Qt::MouseButtons)));
79 d->m_internalModel->appendBarSet(set);
389 connect(&QBarSetPrivate::pimpl(set), SIGNAL(valueChanged()), d_ptr, SLOT(barsetChanged()));
80 QObject::connect(set->d_ptr.data(), SIGNAL(clicked(QString,Qt::MouseButtons)), d, SLOT(barsetClicked(QString,Qt::MouseButtons)));
390 d->appendBarSet(set);
81 QObject::connect(set->d_ptr.data(), SIGNAL(valueChanged()), d, SLOT(barsetChanged()));
391 /*
82 emit d->restructuredBars();
392 m_internalModel->appendBarSet(set);
393 connect(set, SIGNAL(clicked(QString,Qt::MouseButtons)), this, SLOT(barsetClicked(QString,Qt::MouseButtons)));
394 connect(set, SIGNAL(valueChanged()), this, SLOT(barsetChanged()));
395 emit restructuredBars();
396 */
397 }
83 }
398
84
399 /*!
85 /*!
@@ -404,13 +90,9 void QBarSeries::appendBarSet(QBarSet *set)
404 void QBarSeries::removeBarSet(QBarSet *set)
90 void QBarSeries::removeBarSet(QBarSet *set)
405 {
91 {
406 Q_D(QBarSeries);
92 Q_D(QBarSeries);
407 disconnect(&QBarSetPrivate::pimpl(set), SIGNAL(clicked(QString,Qt::MouseButtons)), d_ptr, SLOT(barsetClicked(QString,Qt::MouseButtons)));
93 QObject::disconnect(set->d_ptr.data(), SIGNAL(clicked(QString,Qt::MouseButtons)), d, SLOT(barsetClicked(QString,Qt::MouseButtons)));
408 d->removeBarSet(set);
94 d->m_internalModel->removeBarSet(set);
409 /*
95 emit d->restructuredBars();
410 disconnect(set, SIGNAL(clicked(QString,Qt::MouseButtons)), this, SLOT(barsetClicked(QString,Qt::MouseButtons)));
411 m_internalModel->removeBarSet(set);
412 emit restructuredBars();
413 */
414 }
96 }
415
97
416 /*!
98 /*!
@@ -421,15 +103,13 void QBarSeries::removeBarSet(QBarSet *set)
421 void QBarSeries::appendBarSets(QList<QBarSet* > sets)
103 void QBarSeries::appendBarSets(QList<QBarSet* > sets)
422 {
104 {
423 Q_D(QBarSeries);
105 Q_D(QBarSeries);
424 d->appendBarSets(sets);
425 /*
426 foreach (QBarSet* barset, sets) {
106 foreach (QBarSet* barset, sets) {
427 m_internalModel->appendBarSet(barset);
107 d->m_internalModel->appendBarSet(barset);
428 connect(barset, SIGNAL(clicked(QString,Qt::MouseButtons)), this, SLOT(barsetClicked(QString,Qt::MouseButtons)));
108 QObject::connect(barset, SIGNAL(clicked(QString,Qt::MouseButtons)), this, SLOT(barsetClicked(QString,Qt::MouseButtons)));
429 connect(barset, SIGNAL(valueChanged()), this, SLOT(barsetChanged()));
109 QObject::connect(barset, SIGNAL(valueChanged()), this, SLOT(barsetChanged()));
430 }
110 }
431 emit restructuredBars();
111 emit d->restructuredBars();
432 */
112
433 }
113 }
434
114
435 /*!
115 /*!
@@ -440,14 +120,12 void QBarSeries::appendBarSets(QList<QBarSet* > sets)
440 void QBarSeries::removeBarSets(QList<QBarSet* > sets)
120 void QBarSeries::removeBarSets(QList<QBarSet* > sets)
441 {
121 {
442 Q_D(QBarSeries);
122 Q_D(QBarSeries);
443 d->removeBarSets(sets);
123
444 /*
445 foreach (QBarSet* barset, sets) {
124 foreach (QBarSet* barset, sets) {
446 disconnect(barset, SIGNAL(clicked(QString,Qt::MouseButtons)), this, SLOT(barsetClicked(QString,Qt::MouseButtons)));
125 QObject::disconnect(barset, SIGNAL(clicked(QString,Qt::MouseButtons)), this, SLOT(barsetClicked(QString,Qt::MouseButtons)));
447 m_internalModel->removeBarSet(barset);
126 d->m_internalModel->removeBarSet(barset);
448 }
127 }
449 emit restructuredBars();
128 emit d->restructuredBars();
450 */
451 }
129 }
452
130
453 /*!
131 /*!
@@ -457,11 +135,8 void QBarSeries::removeBarSets(QList<QBarSet* > sets)
457 void QBarSeries::insertBarSet(int i, QBarSet *set)
135 void QBarSeries::insertBarSet(int i, QBarSet *set)
458 {
136 {
459 Q_D(QBarSeries);
137 Q_D(QBarSeries);
460 d->insertBarSet(i,set);
138 d->m_internalModel->insertBarSet(i, set);
461 /*
139 emit d->barsetChanged();
462 m_internalModel->insertBarSet(i, set);
463 // emit barsetChanged();
464 */
465 }
140 }
466
141
467 /*!
142 /*!
@@ -472,8 +147,7 void QBarSeries::insertBarSet(int i, QBarSet *set)
472 void QBarSeries::insertCategory(int i, QString category)
147 void QBarSeries::insertCategory(int i, QString category)
473 {
148 {
474 Q_D(QBarSeries);
149 Q_D(QBarSeries);
475 d->insertCategory(i,category);
150 d->m_internalModel->insertCategory(i, category);
476 //m_internalModel->insertCategory(i, category);
477 }
151 }
478
152
479 /*!
153 /*!
@@ -483,8 +157,7 void QBarSeries::insertCategory(int i, QString category)
483 void QBarSeries::removeCategory(int i)
157 void QBarSeries::removeCategory(int i)
484 {
158 {
485 Q_D(QBarSeries);
159 Q_D(QBarSeries);
486 d->removeCategory(i);
160 d->m_internalModel->removeCategory(i);
487 //m_internalModel->removeCategory(i);
488 }
161 }
489
162
490 /*!
163 /*!
@@ -493,13 +166,13 void QBarSeries::removeCategory(int i)
493 int QBarSeries::barsetCount() const
166 int QBarSeries::barsetCount() const
494 {
167 {
495 Q_D(const QBarSeries);
168 Q_D(const QBarSeries);
496 return d->barsetCount();
497 /*
169 /*
498 // if(m_model)
170 // if(m_model)
499 // return m_mapBarTop - m_mapBarBottom;
171 // return m_mapBarTop - m_mapBarBottom;
500 // else
172 // else
501 return m_internalModel->barsetCount();
173
502 */
174 */
175 return d->m_internalModel->barsetCount();
503 }
176 }
504
177
505 /*!
178 /*!
@@ -508,8 +181,7 int QBarSeries::barsetCount() const
508 int QBarSeries::categoryCount() const
181 int QBarSeries::categoryCount() const
509 {
182 {
510 Q_D(const QBarSeries);
183 Q_D(const QBarSeries);
511 return d->categoryCount();
184 return d->m_internalModel->categoryCount();
512 // return m_internalModel->categoryCount();
513 }
185 }
514
186
515 /*!
187 /*!
@@ -518,8 +190,7 int QBarSeries::categoryCount() const
518 QList<QBarSet*> QBarSeries::barSets() const
190 QList<QBarSet*> QBarSeries::barSets() const
519 {
191 {
520 Q_D(const QBarSeries);
192 Q_D(const QBarSeries);
521 return d->barSets();
193 return d->m_internalModel->barSets();
522 // return m_internalModel->barSets();
523 }
194 }
524
195
525 /*!
196 /*!
@@ -842,15 +513,14 void QBarSeries::barsetChanged()
842 QBarCategories QBarSeries::categories() const
513 QBarCategories QBarSeries::categories() const
843 {
514 {
844 Q_D(const QBarSeries);
515 Q_D(const QBarSeries);
845 return d->categories();
516
846 /*
847 QBarCategories categories;
517 QBarCategories categories;
848 int count = m_internalModel->categoryCount();
518 int count = d->m_internalModel->categoryCount();
849 for (int i=1; i <= count; i++) {
519 for (int i=1; i <= count; i++) {
850 categories.insert(i, m_internalModel->categoryName(i - 1));
520 categories.insert(i, d->m_internalModel->categoryName(i - 1));
851 }
521 }
852 return categories;
522 return categories;
853 */
523
854 }
524 }
855
525
856 /*!
526 /*!
@@ -858,17 +528,240 QBarCategories QBarSeries::categories() const
858 */
528 */
859 void QBarSeries::setLabelsVisible(bool visible)
529 void QBarSeries::setLabelsVisible(bool visible)
860 {
530 {
861 Q_D(QBarSeries);
862 d->setLabelsVisible(visible);
863 /*
864 foreach (QBarSet* s, barSets()) {
531 foreach (QBarSet* s, barSets()) {
865 s->setLabelsVisible(visible);
532 s->setLabelsVisible(visible);
866 }
533 }
867 */
868 }
534 }
869
535
536 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
537
538 QBarSeriesPrivate::QBarSeriesPrivate(QBarCategories categories, QBarSeries *q) : QSeriesPrivate(q),
539 m_internalModel(new BarChartModel(categories,this)),
540 m_model(0),
541 m_mapCategories(-1),
542 m_mapBarBottom(-1),
543 m_mapBarTop(-1),
544 m_mapFirst(0),
545 m_mapCount(0),
546 m_mapOrientation(Qt::Vertical)
547 {
548 }
549
550 QBarSet* QBarSeriesPrivate::barsetAt(int index)
551 {
552 return m_internalModel->barsetAt(index);
553 }
554
555 QString QBarSeriesPrivate::categoryName(int category)
556 {
557 return m_internalModel->categoryName(category);
558 }
559
560 void QBarSeriesPrivate::setToolTipEnabled(bool enabled)
561 {
562 // TODO: what if we add sets after call to this function? Those sets won't have tooltip enabled.
563 if (enabled) {
564 for (int i=0; i<m_internalModel->barsetCount(); i++) {
565 QBarSet *set = m_internalModel->barsetAt(i);
566 connect(set, SIGNAL(showToolTip(QPoint,QString)), this, SIGNAL(showToolTip(QPoint,QString)));
567 }
568 } else {
569 for (int i=0; i<m_internalModel->barsetCount(); i++) {
570 QBarSet *set = m_internalModel->barsetAt(i);
571 disconnect(set, SIGNAL(showToolTip(QPoint,QString)), this, SIGNAL(showToolTip(QPoint,QString)));
572 }
573 }
574 }
575
576 void QBarSeriesPrivate::barsetClicked(QString category, Qt::MouseButtons button)
577 {
578 emit clicked(qobject_cast<QBarSet*>(sender()), category, button);
579 }
580
581 qreal QBarSeriesPrivate::min()
582 {
583 return m_internalModel->min();
584 }
585
586 qreal QBarSeriesPrivate::max()
587 {
588 return m_internalModel->max();
589 }
590
591 qreal QBarSeriesPrivate::valueAt(int set, int category)
592 {
593 return m_internalModel->valueAt(set, category);
594 }
595
596 qreal QBarSeriesPrivate::percentageAt(int set, int category)
597 {
598 return m_internalModel->percentageAt(set, category);
599 }
600
601 qreal QBarSeriesPrivate::categorySum(int category)
602 {
603 return m_internalModel->categorySum(category);
604 }
605
606 qreal QBarSeriesPrivate::absoluteCategorySum(int category)
607 {
608 return m_internalModel->absoluteCategorySum(category);
609 }
610
611 qreal QBarSeriesPrivate::maxCategorySum()
612 {
613 return m_internalModel->maxCategorySum();
614 }
615
616 BarChartModel& QBarSeriesPrivate::modelInternal()
617 {
618 return *m_internalModel;
619 }
620
621 bool QBarSeriesPrivate::setModel(QAbstractItemModel *model)
622 {
623 // disconnect signals from old model
624 if(m_model)
625 {
626 disconnect(m_model, 0, this, 0);
627 m_mapCategories = -1;
628 m_mapBarBottom = -1;
629 m_mapBarTop = -1;
630 m_mapFirst = 0;
631 m_mapCount = 0;
632 m_mapOrientation = Qt::Vertical;
633 }
634
635 // set new model
636 if(model)
637 {
638 m_model = model;
639 return true;
640 }
641 else
642 {
643 m_model = 0;
644 return false;
645 }
646 }
647
648 void QBarSeriesPrivate::setModelMapping(int categories, int bottomBoundry, int topBoundry, Qt::Orientation orientation)
649 {
650 Q_Q(QBarSeries);
651
652 if (!m_model)
653 return;
654
655 m_mapCategories = categories;
656 m_mapBarBottom = bottomBoundry;
657 m_mapBarTop = topBoundry;
658 // m_mapFirst = 1;
659 m_mapOrientation = orientation;
660
661 // connect the signals
662 if (m_mapOrientation == Qt::Vertical) {
663 m_mapCount = m_model->rowCount() - m_mapFirst;
664 connect(m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)),
665 this, SLOT(modelUpdated(QModelIndex, QModelIndex)));
666 connect(m_model,SIGNAL(rowsInserted(QModelIndex, int, int)),
667 this, SLOT(modelDataAdded(QModelIndex,int,int)));
668 connect(m_model, SIGNAL(rowsRemoved(QModelIndex, int, int)),
669 this, SLOT(modelDataRemoved(QModelIndex,int,int)));
670 } else {
671 m_mapCount = m_model->columnCount() - m_mapFirst;
672 connect(m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)),
673 this, SLOT(modelUpdated(QModelIndex, QModelIndex)));
674 connect(m_model,SIGNAL(columnsInserted(QModelIndex, int, int)),
675 this, SLOT(modelDataAdded(QModelIndex,int,int)));
676 connect(m_model, SIGNAL(columnsRemoved(QModelIndex, int, int)),
677 this, SLOT(modelDataRemoved(QModelIndex,int,int)));
678 }
679
680 // create the initial bars
681 delete m_internalModel;
682 if (m_mapOrientation == Qt::Vertical) {
683 QStringList categories;
684 for (int k = m_mapFirst; k < m_mapFirst + m_mapCount; k++)
685 categories << m_model->data(m_model->index(k, m_mapCategories), Qt::DisplayRole).toString();
686 m_internalModel = new BarChartModel(categories, this);
687
688 for (int i = m_mapBarBottom; i <= m_mapBarTop; i++) {
689 QBarSet* barSet = new QBarSet(QString("Column: %1").arg(i + 1));
690 for(int m = m_mapFirst; m < m_mapFirst + m_mapCount; m++)
691 *barSet << m_model->data(m_model->index(m, i), Qt::DisplayRole).toDouble();
692 q->appendBarSet(barSet);
693 }
694 } else {
695 QStringList categories;
696 for (int k = m_mapFirst; k < m_mapFirst + m_mapCount; k++)
697 categories << m_model->data(m_model->index(m_mapCategories, k), Qt::DisplayRole).toString();
698 m_internalModel = new BarChartModel(categories, this);
699
700 for (int i = m_mapBarBottom; i <= m_mapBarTop; i++) {
701 QBarSet* barSet = new QBarSet(QString("Row: %1").arg(i + 1));
702 for(int m = m_mapFirst; m < m_mapFirst + m_mapCount; m++)
703 *barSet << m_model->data(m_model->index(i, m), Qt::DisplayRole).toDouble();
704 q->appendBarSet(barSet);
705 }
706 }
707 }
708
709 void QBarSeriesPrivate::modelUpdated(QModelIndex topLeft, QModelIndex bottomRight)
710 {
711 Q_UNUSED(bottomRight)
712
713 if (m_mapOrientation == Qt::Vertical)
714 {
715 // model update is relevant to BarSeries if the change was made to the part of the model that was mapped to BarSeries
716 if (topLeft.column() >= m_mapBarBottom && topLeft.column() <= m_mapBarTop && topLeft.row() >= m_mapFirst && topLeft.row() < m_mapFirst + m_mapCount)
717 barsetAt(topLeft.column() - m_mapBarBottom)->setValue(topLeft.row() - m_mapFirst, m_model->data(topLeft, Qt::DisplayRole).toDouble());
718 }
719 else
720 {
721 // model update is relevant to BarSeries if the change was made to the part of the model that was mapped to BarSeries
722 if (topLeft.row() >= m_mapBarBottom && topLeft.row() <= m_mapBarTop && topLeft.column() >= m_mapFirst && topLeft.column() < m_mapFirst + m_mapCount)
723 barsetAt(topLeft.row() - m_mapBarBottom)->setValue(topLeft.column() - m_mapFirst, m_model->data(topLeft, Qt::DisplayRole).toDouble());
724 }
725 }
726
727 void QBarSeriesPrivate::modelDataAdded(QModelIndex /*parent*/, int start, int /*end*/)
728 {
729 Q_Q(QBarSeries);
730
731 if (m_mapOrientation == Qt::Vertical) {
732 q->insertCategory(start - m_mapFirst, QString("Row: %1").arg(start + 1));
733 for (int i = 0; i <= m_mapBarTop - m_mapBarBottom; i++) {
734 barsetAt(i)->insertValue(start - m_mapFirst, m_model->data(m_model->index(start, i), Qt::DisplayRole).toDouble());
735 }
736 } else {
737 q->insertCategory(start - m_mapFirst, QString("Column: %1").arg(start + 1));
738 for (int i = 0; i <= m_mapBarTop - m_mapBarBottom; i++) {
739 barsetAt(i)->insertValue(start - m_mapFirst, m_model->data(m_model->index(i, start), Qt::DisplayRole).toDouble());
740 }
741 }
742 emit restructuredBars();
743 }
744
745 void QBarSeriesPrivate::modelDataRemoved(QModelIndex parent, int start, int end)
746 {
747 Q_Q(QBarSeries);
748 Q_UNUSED(parent)
749 Q_UNUSED(end)
750
751 q->removeCategory(start - m_mapFirst);
752 for (int i = 0; i <= m_mapBarTop - m_mapBarBottom; i++)
753 {
754 barsetAt(i)->removeValue(start - m_mapFirst);
755 }
756 emit restructuredBars();
757 }
758
759 void QBarSeriesPrivate::barsetChanged()
760 {
761 emit updatedBars();
762 }
870
763
871 #include "moc_qbarseries.cpp"
764 #include "moc_qbarseries.cpp"
872 #include "moc_qbarseriesprivate_p.cpp"
765 #include "moc_qbarseries_p.cpp"
873
766
874 QTCOMMERCIALCHART_END_NAMESPACE
767 QTCOMMERCIALCHART_END_NAMESPACE
@@ -42,7 +42,7 class QTCOMMERCIALCHART_EXPORT QBarSeries : public QSeries
42 public:
42 public:
43 QBarSeries(QStringList categories, QObject *parent = 0);
43 QBarSeries(QStringList categories, QObject *parent = 0);
44
44
45 virtual QSeriesType type() const { return QSeries::SeriesTypeBar; }
45 QSeries::QSeriesType type() const;
46
46
47 void appendBarSet(QBarSet *set); // Takes ownership of set
47 void appendBarSet(QBarSet *set); // Takes ownership of set
48 void removeBarSet(QBarSet *set); // Releases ownership, doesn't delete set
48 void removeBarSet(QBarSet *set); // Releases ownership, doesn't delete set
@@ -104,7 +104,6 private Q_SLOTS:
104 void barsetChanged();
104 void barsetChanged();
105
105
106 protected:
106 protected:
107 QBarSeriesPrivate * const d_ptr;
108 Q_DECLARE_PRIVATE(QBarSeries)
107 Q_DECLARE_PRIVATE(QBarSeries)
109 Q_DISABLE_COPY(QBarSeries)
108 Q_DISABLE_COPY(QBarSeries)
110
109
@@ -1,7 +1,8
1 #ifndef QBARSERIESPRIVATE_P_H
1 #ifndef QBARSERIES_P_H
2 #define QBARSERIESPRIVATE_P_H
2 #define QBARSERIES_P_H
3
3
4 #include "qbarseries.h"
4 #include "qbarseries.h"
5 #include "qseries_p.h"
5 #include <QStringList>
6 #include <QStringList>
6 #include <QSeries>
7 #include <QSeries>
7
8
@@ -9,36 +10,12 class QModelIndex;
9
10
10 QTCOMMERCIALCHART_BEGIN_NAMESPACE
11 QTCOMMERCIALCHART_BEGIN_NAMESPACE
11
12
12 typedef QStringList QBarCategories;
13
14 class QBarSeries;
15 class QBarSet;
16 class BarChartModel;
17 class BarCategory;
18
19 // Container for series
13 // Container for series
20 class QBarSeriesPrivate : public QObject
14 class QBarSeriesPrivate : public QSeriesPrivate
21 {
15 {
22 Q_OBJECT
16 Q_OBJECT
23 Q_DECLARE_PUBLIC(QBarSeries)
24 public:
17 public:
25 QBarSeriesPrivate(QStringList categories, QBarSeries *parent);
18 QBarSeriesPrivate(QBarCategories categories, QBarSeries *parent);
26
27 virtual QSeries::QSeriesType type() const { return QSeries::SeriesTypeBar; }
28
29 void appendBarSet(QBarSet *set); // Takes ownership of set
30 void removeBarSet(QBarSet *set); // Releases ownership, doesn't delete set
31 void appendBarSets(QList<QBarSet* > sets);
32 void removeBarSets(QList<QBarSet* > sets);
33 void insertBarSet(int i, QBarSet *set);
34 void insertCategory(int i, QString category);
35 void removeCategory(int i);
36 int barsetCount() const;
37 int categoryCount() const;
38 QList<QBarSet*> barSets() const;
39 QBarCategories categories() const;
40
41 void setLabelsVisible(bool visible = true);
42
19
43 bool setModel(QAbstractItemModel *model);
20 bool setModel(QAbstractItemModel *model);
44 void setModelMapping(int categories, int bottomBoundry, int topBoundry, Qt::Orientation orientation = Qt::Vertical);
21 void setModelMapping(int categories, int bottomBoundry, int topBoundry, Qt::Orientation orientation = Qt::Vertical);
@@ -54,12 +31,6 public:
54 qreal maxCategorySum();
31 qreal maxCategorySum();
55 BarChartModel& modelInternal();
32 BarChartModel& modelInternal();
56
33
57 static QBarSeriesPrivate &data(QBarSeries *barseries)
58 {
59 Q_ASSERT(barseries);
60 return *barseries->d_ptr;
61 }
62
63 Q_SIGNALS:
34 Q_SIGNALS:
64 void clicked(QBarSet *barset, QString category, Qt::MouseButtons button); // Up to user of api, what to do with these signals
35 void clicked(QBarSet *barset, QString category, Qt::MouseButtons button); // Up to user of api, what to do with these signals
65 void selected();
36 void selected();
@@ -79,8 +50,6 private Q_SLOTS:
79 void barsetChanged();
50 void barsetChanged();
80
51
81 protected:
52 protected:
82 QBarSeries * const q_ptr;
83
84 BarChartModel *m_internalModel; // TODO: this may change... current "2 models" situation doesn't look good.
53 BarChartModel *m_internalModel; // TODO: this may change... current "2 models" situation doesn't look good.
85 QAbstractItemModel* m_model;
54 QAbstractItemModel* m_model;
86 int m_mapCategories;
55 int m_mapCategories;
@@ -89,6 +58,8 protected:
89 int m_mapFirst;
58 int m_mapFirst;
90 int m_mapCount;
59 int m_mapCount;
91 Qt::Orientation m_mapOrientation;
60 Qt::Orientation m_mapOrientation;
61 private:
62 Q_DECLARE_PUBLIC(QBarSeries)
92 };
63 };
93
64
94 QTCOMMERCIALCHART_END_NAMESPACE
65 QTCOMMERCIALCHART_END_NAMESPACE
@@ -19,157 +19,11
19 ****************************************************************************/
19 ****************************************************************************/
20
20
21 #include "qbarset.h"
21 #include "qbarset.h"
22 #include "qbarsetprivate_p.h"
22 #include "qbarset_p.h"
23 //#include <QDebug>
24 #include <QToolTip>
23 #include <QToolTip>
25
24
26 QTCOMMERCIALCHART_BEGIN_NAMESPACE
25 QTCOMMERCIALCHART_BEGIN_NAMESPACE
27
26
28
29 QBarSetPrivate::QBarSetPrivate(QString name, QBarSet *parent) : QObject(parent),
30 q_ptr(parent),
31 m_name(name),
32 m_labelsVisible(false)
33 {
34
35 }
36
37 QBarSetPrivate::~QBarSetPrivate()
38 {
39
40 }
41
42 void QBarSetPrivate::setName(QString name)
43 {
44 m_name = name;
45 }
46
47 QString QBarSetPrivate::name() const
48 {
49 return m_name;
50 }
51
52 QBarSetPrivate& QBarSetPrivate::operator << (const qreal &value)
53 {
54 m_values.append(value);
55 emit structureChanged();
56 return *this;
57 }
58
59 void QBarSetPrivate::insertValue(int i, qreal value)
60 {
61 m_values.insert(i, value);
62 }
63
64 void QBarSetPrivate::removeValue(int i)
65 {
66 m_values.removeAt(i);
67 }
68
69 int QBarSetPrivate::count() const
70 {
71 return m_values.count();
72 }
73
74 qreal QBarSetPrivate::valueAt(int index) const
75 {
76 return m_values.at(index);
77 }
78
79 void QBarSetPrivate::setValue(int index, qreal value)
80 {
81 m_values.replace(index,value);
82 emit valueChanged();
83 }
84
85 qreal QBarSetPrivate::sum() const
86 {
87 qreal sum(0);
88 for (int i=0; i < m_values.count(); i++) {
89 sum += m_values.at(i);
90 }
91 return sum;
92 }
93
94 void QBarSetPrivate::setPen(const QPen &pen)
95 {
96 m_pen = pen;
97 emit valueChanged();
98 }
99
100 QPen QBarSetPrivate::pen() const
101 {
102 return m_pen;
103 }
104
105 void QBarSetPrivate::setBrush(const QBrush &brush)
106 {
107 m_brush = brush;
108 emit valueChanged();
109 }
110
111 QBrush QBarSetPrivate::brush() const
112 {
113 return m_brush;
114 }
115
116 void QBarSetPrivate::setLabelPen(const QPen &pen)
117 {
118 m_labelPen = pen;
119 emit valueChanged();
120 }
121
122 QPen QBarSetPrivate::labelPen() const
123 {
124 return m_labelPen;
125 }
126
127 void QBarSetPrivate::setLabelBrush(const QBrush &brush)
128 {
129 m_labelBrush = brush;
130 emit valueChanged();
131 }
132
133 QBrush QBarSetPrivate::labelBrush() const
134 {
135 return m_labelBrush;
136 }
137
138 void QBarSetPrivate::setLabelFont(const QFont &font)
139 {
140 m_labelFont = font;
141 emit valueChanged();
142 }
143
144 QFont QBarSetPrivate::labelFont() const
145 {
146 return m_labelFont;
147 }
148
149 void QBarSetPrivate::setLabelsVisible(bool visible)
150 {
151 m_labelsVisible = visible;
152 emit labelsVisibleChanged(visible);
153 }
154
155 bool QBarSetPrivate::labelsVisible() const
156 {
157 return m_labelsVisible;
158 }
159
160 void QBarSetPrivate::barHoverEnterEvent(QPoint pos)
161 {
162 emit showToolTip(pos, m_name);
163 emit hoverEnter(pos);
164 }
165
166 void QBarSetPrivate::barHoverLeaveEvent()
167 {
168 // Emit signal to user of charts
169 emit hoverLeave();
170 }
171
172
173 /*!
27 /*!
174 \class QBarSet
28 \class QBarSet
175 \brief part of QtCommercial chart API.
29 \brief part of QtCommercial chart API.
@@ -223,8 +77,7 QBarSet::QBarSet(QString name, QObject *parent)
223 */
77 */
224 void QBarSet::setName(QString name)
78 void QBarSet::setName(QString name)
225 {
79 {
226 Q_D(QBarSet);
80 d_ptr->m_name = name;
227 d->setName(name);
228 }
81 }
229
82
230 /*!
83 /*!
@@ -232,8 +85,7 void QBarSet::setName(QString name)
232 */
85 */
233 QString QBarSet::name() const
86 QString QBarSet::name() const
234 {
87 {
235 Q_D(const QBarSet);
88 return d_ptr->m_name;
236 return d->name();
237 }
89 }
238
90
239 /*!
91 /*!
@@ -241,13 +93,9 QString QBarSet::name() const
241 */
93 */
242 QBarSet& QBarSet::operator << (const qreal &value)
94 QBarSet& QBarSet::operator << (const qreal &value)
243 {
95 {
244 Q_D(QBarSet);
96 d_ptr->m_values.append(value);
245 d->operator <<(value);
97 emit d_ptr->structureChanged();
246 return *this;
98 return *this;
247
248 // m_values.append(value);
249 // emit structureChanged();
250 // return *this;
251 }
99 }
252
100
253 /*!
101 /*!
@@ -257,9 +105,7 QBarSet& QBarSet::operator << (const qreal &value)
257 */
105 */
258 void QBarSet::insertValue(int i, qreal value)
106 void QBarSet::insertValue(int i, qreal value)
259 {
107 {
260 Q_D(QBarSet);
108 d_ptr->m_values.insert(i, value);
261 d->insertValue(i,value);
262 // m_values.insert(i, value);
263 }
109 }
264
110
265 /*!
111 /*!
@@ -268,9 +114,7 void QBarSet::insertValue(int i, qreal value)
268 */
114 */
269 void QBarSet::removeValue(int i)
115 void QBarSet::removeValue(int i)
270 {
116 {
271 Q_D(QBarSet);
117 d_ptr->m_values.removeAt(i);
272 d->removeValue(i);
273 // m_values.removeAt(i);
274 }
118 }
275
119
276 /*!
120 /*!
@@ -278,9 +122,7 void QBarSet::removeValue(int i)
278 */
122 */
279 int QBarSet::count() const
123 int QBarSet::count() const
280 {
124 {
281 Q_D(const QBarSet);
125 return d_ptr->m_values.count();
282 return d->count();
283 // return m_values.count();
284 }
126 }
285
127
286 /*!
128 /*!
@@ -288,9 +130,7 int QBarSet::count() const
288 */
130 */
289 qreal QBarSet::valueAt(int index) const
131 qreal QBarSet::valueAt(int index) const
290 {
132 {
291 Q_D(const QBarSet);
133 return d_ptr->m_values.at(index);
292 return d->valueAt(index);
293 // return m_values.at(index);
294 }
134 }
295
135
296 /*!
136 /*!
@@ -298,10 +138,8 qreal QBarSet::valueAt(int index) const
298 */
138 */
299 void QBarSet::setValue(int index, qreal value)
139 void QBarSet::setValue(int index, qreal value)
300 {
140 {
301 Q_D(QBarSet);
141 d_ptr->m_values.replace(index,value);
302 d->setValue(index,value);
142 emit d_ptr->valueChanged();
303 // m_values.replace(index,value);
304 // emit valueChanged();
305 }
143 }
306
144
307 /*!
145 /*!
@@ -309,15 +147,11 void QBarSet::setValue(int index, qreal value)
309 */
147 */
310 qreal QBarSet::sum() const
148 qreal QBarSet::sum() const
311 {
149 {
312 Q_D(const QBarSet);
313 return d->sum();
314 /*
315 qreal total(0);
150 qreal total(0);
316 for (int i=0; i < m_values.count(); i++) {
151 for (int i=0; i < d_ptr->m_values.count(); i++) {
317 total += m_values.at(i);
152 total += d_ptr->m_values.at(i);
318 }
153 }
319 return total;
154 return total;
320 */
321 }
155 }
322
156
323 /*!
157 /*!
@@ -325,10 +159,10 qreal QBarSet::sum() const
325 */
159 */
326 void QBarSet::setPen(const QPen &pen)
160 void QBarSet::setPen(const QPen &pen)
327 {
161 {
328 Q_D(QBarSet);
162 if(d_ptr->m_pen!=pen){
329 d->setPen(pen);
163 d_ptr->m_pen = pen;
330 // m_pen = pen;
164 emit d_ptr->valueChanged();
331 // emit valueChanged();
165 }
332 }
166 }
333
167
334 /*!
168 /*!
@@ -336,9 +170,7 void QBarSet::setPen(const QPen &pen)
336 */
170 */
337 QPen QBarSet::pen() const
171 QPen QBarSet::pen() const
338 {
172 {
339 Q_D(const QBarSet);
173 return d_ptr->m_pen;
340 return d->pen();
341 // return m_pen;
342 }
174 }
343
175
344 /*!
176 /*!
@@ -346,10 +178,10 QPen QBarSet::pen() const
346 */
178 */
347 void QBarSet::setBrush(const QBrush &brush)
179 void QBarSet::setBrush(const QBrush &brush)
348 {
180 {
349 Q_D(QBarSet);
181 if(d_ptr->m_brush!=brush){
350 d->setBrush(brush);
182 d_ptr->m_brush = brush;
351 // m_brush = brush;
183 emit d_ptr->valueChanged();
352 // emit valueChanged();
184 }
353 }
185 }
354
186
355 /*!
187 /*!
@@ -357,9 +189,7 void QBarSet::setBrush(const QBrush &brush)
357 */
189 */
358 QBrush QBarSet::brush() const
190 QBrush QBarSet::brush() const
359 {
191 {
360 Q_D(const QBarSet);
192 return d_ptr->m_brush;
361 return d->brush();
362 // return m_brush;
363 }
193 }
364
194
365 /*!
195 /*!
@@ -367,10 +197,10 QBrush QBarSet::brush() const
367 */
197 */
368 void QBarSet::setLabelPen(const QPen &pen)
198 void QBarSet::setLabelPen(const QPen &pen)
369 {
199 {
370 Q_D(QBarSet);
200 if(d_ptr->m_labelPen!=pen){
371 d->setLabelPen(pen);
201 d_ptr->m_labelPen = pen;
372 // m_labelPen = pen;
202 emit d_ptr->valueChanged();
373 // emit valueChanged();
203 }
374 }
204 }
375
205
376 /*!
206 /*!
@@ -378,9 +208,7 void QBarSet::setLabelPen(const QPen &pen)
378 */
208 */
379 QPen QBarSet::labelPen() const
209 QPen QBarSet::labelPen() const
380 {
210 {
381 Q_D(const QBarSet);
211 return d_ptr->m_labelPen;
382 return d->labelPen();
383 // return m_labelPen;
384 }
212 }
385
213
386 /*!
214 /*!
@@ -388,10 +216,10 QPen QBarSet::labelPen() const
388 */
216 */
389 void QBarSet::setLabelBrush(const QBrush &brush)
217 void QBarSet::setLabelBrush(const QBrush &brush)
390 {
218 {
391 Q_D(QBarSet);
219 if(d_ptr->m_labelBrush!=brush){
392 d->setLabelBrush(brush);
220 d_ptr->m_labelBrush = brush;
393 // m_labelBrush = brush;
221 emit d_ptr->valueChanged();
394 // emit valueChanged();
222 }
395 }
223 }
396
224
397 /*!
225 /*!
@@ -399,9 +227,7 void QBarSet::setLabelBrush(const QBrush &brush)
399 */
227 */
400 QBrush QBarSet::labelBrush() const
228 QBrush QBarSet::labelBrush() const
401 {
229 {
402 Q_D(const QBarSet);
230 return d_ptr->m_labelBrush;
403 return d->labelBrush();
404 // return m_labelBrush;
405 }
231 }
406
232
407 /*!
233 /*!
@@ -409,10 +235,11 QBrush QBarSet::labelBrush() const
409 */
235 */
410 void QBarSet::setLabelFont(const QFont &font)
236 void QBarSet::setLabelFont(const QFont &font)
411 {
237 {
412 Q_D(QBarSet);
238 if(d_ptr->m_labelFont!=font) {
413 d->setLabelFont(font);
239 d_ptr->m_labelFont = font;
414 // m_labelFont = font;
240 emit d_ptr->valueChanged();
415 // emit valueChanged();
241 }
242
416 }
243 }
417
244
418 /*!
245 /*!
@@ -420,9 +247,7 void QBarSet::setLabelFont(const QFont &font)
420 */
247 */
421 QFont QBarSet::labelFont() const
248 QFont QBarSet::labelFont() const
422 {
249 {
423 Q_D(const QBarSet);
250 return d_ptr->m_labelFont;
424 return d->labelFont();
425 // return m_labelFont;
426 }
251 }
427
252
428 /*!
253 /*!
@@ -431,10 +256,10 QFont QBarSet::labelFont() const
431
256
432 void QBarSet::setLabelsVisible(bool visible)
257 void QBarSet::setLabelsVisible(bool visible)
433 {
258 {
434 Q_D(QBarSet);
259 if(d_ptr->m_labelsVisible!=visible) {
435 d->setLabelsVisible(visible);
260 d_ptr->m_labelsVisible = visible;
436 // m_labelsVisible = visible;
261 emit d_ptr->labelsVisibleChanged(visible);
437 // emit labelsVisibleChanged(visible);
262 }
438 }
263 }
439
264
440 /*!
265 /*!
@@ -442,9 +267,7 void QBarSet::setLabelsVisible(bool visible)
442 */
267 */
443 bool QBarSet::labelsVisible() const
268 bool QBarSet::labelsVisible() const
444 {
269 {
445 Q_D(const QBarSet);
270 return d_ptr->m_labelsVisible;
446 return d->labelsVisible();
447 // return m_labelsVisible;
448 }
271 }
449
272
450 /*
273 /*
@@ -461,7 +284,38 void QBarSet::barHoverLeaveEvent()
461 emit hoverLeave();
284 emit hoverLeave();
462 }
285 }
463 */
286 */
287
288 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
289
290 QBarSetPrivate::QBarSetPrivate(QString name, QBarSet *parent) : QObject(parent),
291 q_ptr(parent),
292 m_name(name),
293 m_labelsVisible(false)
294 {
295
296 }
297
298 QBarSetPrivate::~QBarSetPrivate()
299 {
300
301 }
302
303
304 //TODO: fixme , refactor it and get rid of it
305 void QBarSetPrivate::barHoverEnterEvent(QPoint pos)
306 {
307 emit showToolTip(pos, m_name);
308 emit hoverEnter(pos);
309 }
310
311 //TODO: fixme , refactor it and get rid of it
312 void QBarSetPrivate::barHoverLeaveEvent()
313 {
314 // Emit signal to user of charts
315 emit hoverLeave();
316 }
317
464 #include "moc_qbarset.cpp"
318 #include "moc_qbarset.cpp"
465 #include "moc_qbarsetprivate_p.cpp"
319 #include "moc_qbarset_p.cpp"
466
320
467 QTCOMMERCIALCHART_END_NAMESPACE
321 QTCOMMERCIALCHART_END_NAMESPACE
@@ -32,6 +32,7 class QBarSetPrivate;
32 class QTCOMMERCIALCHART_EXPORT QBarSet : public QObject
32 class QTCOMMERCIALCHART_EXPORT QBarSet : public QObject
33 {
33 {
34 Q_OBJECT
34 Q_OBJECT
35
35 public:
36 public:
36 QBarSet(QString name, QObject *parent = 0);
37 QBarSet(QString name, QObject *parent = 0);
37
38
@@ -66,37 +67,11 public:
66 Q_SIGNALS:
67 Q_SIGNALS:
67 void clicked(QString category, Qt::MouseButtons button); // Clicked and hover signals exposed to user
68 void clicked(QString category, Qt::MouseButtons button); // Clicked and hover signals exposed to user
68
69
69 // TODO: TO PIMPL --->
70 // void structureChanged();
71 // void valueChanged();
72 // void hoverEnter(QPoint pos);
73 // void hoverLeave();
74 // void showToolTip(QPoint pos, QString tip); // Private signal
75 // void labelsVisibleChanged(bool visible);
76 // <--- TO PIMPL
77
78 public Q_SLOTS:
79 // These are for internal communication
80 // TODO: TO PIMPL --->
81 // void barHoverEnterEvent(QPoint pos);
82 // void barHoverLeaveEvent();
83 // <--- TO PIMPL
84
85 private:
70 private:
86 QBarSetPrivate * const d_ptr;
71 QScopedPointer<QBarSetPrivate> d_ptr;
87 Q_DECLARE_PRIVATE(QBarSet)
88 Q_DISABLE_COPY(QBarSet)
72 Q_DISABLE_COPY(QBarSet)
89 /*
73 friend class QBarSeries;
90 QString m_name;
74
91 QList<qreal> m_values; // TODO: replace with map (category, value)
92 QMap<QString, qreal> m_mappedValues;
93 QPen m_pen;
94 QBrush m_brush;
95 QPen m_labelPen;
96 QBrush m_labelBrush;
97 QFont m_labelFont;
98 bool m_labelsVisible;
99 */
100 };
75 };
101
76
102 QTCOMMERCIALCHART_END_NAMESPACE
77 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,5 +1,5
1 #ifndef QBARSETPRIVATE_P_H
1 #ifndef QBARSET_P_H
2 #define QBARSETPRIVATE_P_H
2 #define QBARSET_P_H
3
3
4 #include "qbarset.h"
4 #include "qbarset.h"
5
5
@@ -8,46 +8,11 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8 class QBarSetPrivate : public QObject
8 class QBarSetPrivate : public QObject
9 {
9 {
10 Q_OBJECT
10 Q_OBJECT
11 Q_DECLARE_PUBLIC(QBarSet)
12
11
13 public:
12 public:
14 QBarSetPrivate(QString name, QBarSet *parent);
13 QBarSetPrivate(QString name, QBarSet *parent);
15 ~QBarSetPrivate();
14 ~QBarSetPrivate();
16
15
17 void setName(QString name);
18 QString name() const;
19 QBarSetPrivate& operator << (const qreal &value); // appends new value to set
20 void insertValue(int i, qreal value);
21 void removeValue(int i);
22 int count() const;
23 qreal valueAt(int index) const;
24 void setValue(int index, qreal value);
25 qreal sum() const;
26
27 void setPen(const QPen &pen);
28 QPen pen() const;
29
30 void setBrush(const QBrush &brush);
31 QBrush brush() const;
32
33 void setLabelPen(const QPen &pen);
34 QPen labelPen() const;
35
36 void setLabelBrush(const QBrush &brush);
37 QBrush labelBrush() const;
38
39 void setLabelFont(const QFont &font);
40 QFont labelFont() const;
41
42 void setLabelsVisible(bool visible = true);
43 bool labelsVisible() const;
44
45 static QBarSetPrivate &pimpl(QBarSet *barset)
46 {
47 Q_ASSERT(barset);
48 return *barset->d_ptr;
49 }
50
51 Q_SIGNALS:
16 Q_SIGNALS:
52 void clicked(QString category, Qt::MouseButtons button);
17 void clicked(QString category, Qt::MouseButtons button);
53 void structureChanged();
18 void structureChanged();
@@ -63,7 +28,6 public Q_SLOTS:
63
28
64 public:
29 public:
65 QBarSet * const q_ptr;
30 QBarSet * const q_ptr;
66
67 QString m_name;
31 QString m_name;
68 QList<qreal> m_values; // TODO: replace with map (category, value)
32 QList<qreal> m_values; // TODO: replace with map (category, value)
69 QMap<QString, qreal> m_mappedValues;
33 QMap<QString, qreal> m_mappedValues;
@@ -73,6 +37,8 public:
73 QBrush m_labelBrush;
37 QBrush m_labelBrush;
74 QFont m_labelFont;
38 QFont m_labelFont;
75 bool m_labelsVisible;
39 bool m_labelsVisible;
40
41 friend class QBarSet;
76 };
42 };
77
43
78 QTCOMMERCIALCHART_END_NAMESPACE
44 QTCOMMERCIALCHART_END_NAMESPACE
@@ -50,6 +50,11 QPercentBarSeries::QPercentBarSeries(QStringList categories, QObject *parent)
50 {
50 {
51 }
51 }
52
52
53 QSeries::QSeriesType QPercentBarSeries::type() const
54 {
55 return QSeries::SeriesTypePercentBar;
56 }
57
53 #include "moc_qpercentbarseries.cpp"
58 #include "moc_qpercentbarseries.cpp"
54
59
55 QTCOMMERCIALCHART_END_NAMESPACE
60 QTCOMMERCIALCHART_END_NAMESPACE
@@ -31,7 +31,7 class QTCOMMERCIALCHART_EXPORT QPercentBarSeries : public QBarSeries
31 Q_OBJECT
31 Q_OBJECT
32 public:
32 public:
33 QPercentBarSeries(QStringList categories, QObject *parent = 0);
33 QPercentBarSeries(QStringList categories, QObject *parent = 0);
34 virtual QSeriesType type() const { return QSeries::SeriesTypePercentBar; }
34 QSeries::QSeriesType type() const;
35 };
35 };
36
36
37 QTCOMMERCIALCHART_END_NAMESPACE
37 QTCOMMERCIALCHART_END_NAMESPACE
@@ -50,6 +50,11 QStackedBarSeries::QStackedBarSeries(QStringList categories, QObject *parent)
50 {
50 {
51 }
51 }
52
52
53 QSeries::QSeriesType QStackedBarSeries::type() const
54 {
55 return QSeries::SeriesTypeStackedBar;
56 }
57
53 #include "moc_qstackedbarseries.cpp"
58 #include "moc_qstackedbarseries.cpp"
54
59
55 QTCOMMERCIALCHART_END_NAMESPACE
60 QTCOMMERCIALCHART_END_NAMESPACE
@@ -31,7 +31,7 class QTCOMMERCIALCHART_EXPORT QStackedBarSeries : public QBarSeries
31 Q_OBJECT
31 Q_OBJECT
32 public:
32 public:
33 QStackedBarSeries(QStringList categories, QObject *parent = 0);
33 QStackedBarSeries(QStringList categories, QObject *parent = 0);
34 virtual QSeriesType type() const { return QSeries::SeriesTypeStackedBar; }
34 QSeries::QSeriesType type() const;
35 };
35 };
36
36
37 QTCOMMERCIALCHART_END_NAMESPACE
37 QTCOMMERCIALCHART_END_NAMESPACE
@@ -19,13 +19,15
19 ****************************************************************************/
19 ****************************************************************************/
20
20
21 #include "legendmarker_p.h"
21 #include "legendmarker_p.h"
22 #include "qxyseries.h"
23 #include "qxyseries_p.h"
22 #include "qlegend.h"
24 #include "qlegend.h"
23 #include "qbarseries.h"
25 #include "qbarseries.h"
24 #include "qpieseries.h"
26 #include "qpieseries.h"
25 #include <qpieslice.h>
27 #include "qpieslice.h"
26 #include <qbarset.h>
28 #include "qbarset.h"
27 #include <qxyseries.h>
29 #include "qareaseries.h"
28 #include <qareaseries.h>
30 #include "qareaseries_p.h"
29 #include <QPainter>
31 #include <QPainter>
30 #include <QGraphicsSceneEvent>
32 #include <QGraphicsSceneEvent>
31 #include <QGraphicsSimpleTextItem>
33 #include <QGraphicsSimpleTextItem>
@@ -120,7 +122,7 AreaLegendMarker::AreaLegendMarker(QAreaSeries *series,QLegend *legend) : Legend
120 m_series(series)
122 m_series(series)
121 {
123 {
122 QObject::connect(this, SIGNAL(selected()), series, SIGNAL(selected()));
124 QObject::connect(this, SIGNAL(selected()), series, SIGNAL(selected()));
123 QObject::connect(series,SIGNAL(updated()), this, SLOT(updated()));
125 QObject::connect(series->d_func(),SIGNAL(updated()), this, SLOT(updated()));
124 updated();
126 updated();
125 }
127 }
126
128
@@ -169,7 +171,7 XYLegendMarker::XYLegendMarker(QXYSeries *series, QLegend *legend) : LegendMarke
169 m_series(series)
171 m_series(series)
170 {
172 {
171 QObject::connect(this, SIGNAL(selected()), series, SIGNAL(selected()));
173 QObject::connect(this, SIGNAL(selected()), series, SIGNAL(selected()));
172 QObject::connect(series,SIGNAL(updated()), this, SLOT(updated()));
174 QObject::connect(series->d_func(),SIGNAL(updated()), this, SLOT(updated()));
173 updated();
175 updated();
174 }
176 }
175
177
@@ -6,7 +6,8 SOURCES += \
6 $$PWD/qlineseries.cpp
6 $$PWD/qlineseries.cpp
7
7
8 PRIVATE_HEADERS += \
8 PRIVATE_HEADERS += \
9 $$PWD/linechartitem_p.h
9 $$PWD/linechartitem_p.h \
10 $$PWD/qlineseries_p.h
10
11
11 PUBLIC_HEADERS += \
12 PUBLIC_HEADERS += \
12 $$PWD/qlineseries.h No newline at end of file
13 $$PWD/qlineseries.h
@@ -20,6 +20,7
20
20
21 #include "linechartitem_p.h"
21 #include "linechartitem_p.h"
22 #include "qlineseries.h"
22 #include "qlineseries.h"
23 #include "qlineseries_p.h"
23 #include "chartpresenter_p.h"
24 #include "chartpresenter_p.h"
24 #include <QPainter>
25 #include <QPainter>
25
26
@@ -33,7 +34,7 m_series(series),
33 m_pointsVisible(false)
34 m_pointsVisible(false)
34 {
35 {
35 setZValue(ChartPresenter::LineChartZValue);
36 setZValue(ChartPresenter::LineChartZValue);
36 QObject::connect(series,SIGNAL(updated()),this,SLOT(handleUpdated()));
37 QObject::connect(series->d_func(),SIGNAL(updated()),this,SLOT(handleUpdated()));
37 handleUpdated();
38 handleUpdated();
38 }
39 }
39
40
@@ -19,6 +19,7
19 ****************************************************************************/
19 ****************************************************************************/
20
20
21 #include "qlineseries.h"
21 #include "qlineseries.h"
22 #include "qlineseries_p.h"
22
23
23 QTCOMMERCIALCHART_BEGIN_NAMESPACE
24 QTCOMMERCIALCHART_BEGIN_NAMESPACE
24
25
@@ -59,8 +60,12 QTCOMMERCIALCHART_BEGIN_NAMESPACE
59 Constructs empty series object which is a child of \a parent.
60 Constructs empty series object which is a child of \a parent.
60 When series object is added to QChartView or QChart instance ownerships is transfered.
61 When series object is added to QChartView or QChart instance ownerships is transfered.
61 */
62 */
62 QLineSeries::QLineSeries(QObject *parent) : QXYSeries(parent),
63 QLineSeries::QLineSeries(QObject *parent) : QXYSeries(*new QLineSeriesPrivate(this),parent)
63 m_pointsVisible(false)
64 {
65
66 }
67
68 QLineSeries::QLineSeries(QLineSeriesPrivate &d,QObject *parent) : QXYSeries (d,parent)
64 {
69 {
65
70
66 }
71 }
@@ -72,28 +77,28 QLineSeries::~QLineSeries()
72 {
77 {
73 }
78 }
74
79
75 /*!
80 QSeries::QSeriesType QLineSeries::type() const
76 Sets if data points are \a visible and should be drawn on line.
77 */
78 void QLineSeries::setPointsVisible(bool visible)
79 {
81 {
80 if (m_pointsVisible != visible){
82 return QSeries::SeriesTypeLine;
81 m_pointsVisible = visible;
82 emit QXYSeries::updated();
83 }
84 }
83 }
85
84
86
85 /*
87 QDebug operator<< (QDebug debug, const QLineSeries series)
86 QDebug operator<< (QDebug debug, const QLineSeries series)
88 {
87 {
89 Q_ASSERT(series.m_x.size() == series.m_y.size());
88 Q_ASSERT(series.d_func()->m_x.size() == series.d_func()->m_y.size());
90
89 int size = series.d_func()->m_x.size();
91 int size = series.m_x.size();
92
93 for (int i=0; i<size; i++) {
90 for (int i=0; i<size; i++) {
94 debug.nospace() << "(" << series.m_x.at(i) << ','<< series.m_y.at(i) << ") ";
91 debug.nospace() << "(" << series.d_func()->m_x.at(i) << ','<< series.d_func()->m_y.at(i) << ") ";
95 }
92 }
96 return debug.space();
93 return debug.space();
97 }
94 }
95 */
96
97 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
98
99 QLineSeriesPrivate::QLineSeriesPrivate(QLineSeries* q):QXYSeriesPrivate(q)
100 {
101
102 };
98
103
99 QTCOMMERCIALCHART_END_NAMESPACE
104 QTCOMMERCIALCHART_END_NAMESPACE
@@ -27,20 +27,23
27
27
28 QTCOMMERCIALCHART_BEGIN_NAMESPACE
28 QTCOMMERCIALCHART_BEGIN_NAMESPACE
29
29
30 class QLineSeriesPrivate;
31
30 class QTCOMMERCIALCHART_EXPORT QLineSeries : public QXYSeries
32 class QTCOMMERCIALCHART_EXPORT QLineSeries : public QXYSeries
31 {
33 {
32 public:
34 public:
33 QLineSeries(QObject *parent=0);
35 explicit QLineSeries(QObject *parent=0);
34 virtual ~QLineSeries();
36 ~QLineSeries();
37
38 QSeries::QSeriesType type() const;
35
39
36 void setPointsVisible(bool visible);
40 protected:
37 bool pointsVisible() const {return m_pointsVisible;}
41 QLineSeries(QLineSeriesPrivate &d,QObject *parent = 0);
38
42
39 public: // from QChartSeries
40 virtual QSeriesType type() const {return QSeries::SeriesTypeLine;}
41 friend QDebug operator<< (QDebug d, const QLineSeries series);
42 private:
43 private:
43 bool m_pointsVisible;
44 Q_DECLARE_PRIVATE(QLineSeries);
45 Q_DISABLE_COPY(QLineSeries);
46 friend class LineChartItem;
44
47
45 };
48 };
46
49
@@ -11,7 +11,7 PRIVATE_HEADERS += \
11 $$PWD/pieslicedata_p.h \
11 $$PWD/pieslicedata_p.h \
12 $$PWD/piechartitem_p.h \
12 $$PWD/piechartitem_p.h \
13 $$PWD/piesliceitem_p.h \
13 $$PWD/piesliceitem_p.h \
14 $$PWD/qpieseriesprivate_p.h
14 $$PWD/qpieseries_p.h
15
15
16 PUBLIC_HEADERS += \
16 PUBLIC_HEADERS += \
17 $$PWD/qpieseries.h \
17 $$PWD/qpieseries.h \
@@ -19,7 +19,7
19 ****************************************************************************/
19 ****************************************************************************/
20
20
21 #include "qpieseries.h"
21 #include "qpieseries.h"
22 #include "qpieseriesprivate_p.h"
22 #include "qpieseries_p.h"
23 #include "qpieslice.h"
23 #include "qpieslice.h"
24 #include "pieslicedata_p.h"
24 #include "pieslicedata_p.h"
25 #include <QAbstractItemModel>
25 #include <QAbstractItemModel>
@@ -27,191 +27,6
27
27
28 QTCOMMERCIALCHART_BEGIN_NAMESPACE
28 QTCOMMERCIALCHART_BEGIN_NAMESPACE
29
29
30 QPieSeriesPrivate::QPieSeriesPrivate(QPieSeries *parent)
31 :QObject(parent),
32 q_ptr(parent),
33 m_pieRelativeHorPos(0.5),
34 m_pieRelativeVerPos(0.5),
35 m_pieRelativeSize(0.7),
36 m_pieStartAngle(0),
37 m_pieEndAngle(360),
38 m_total(0),
39 m_mapValues(0),
40 m_mapLabels(0),
41 m_mapOrientation(Qt::Horizontal)
42 {
43
44 }
45
46 QPieSeriesPrivate::~QPieSeriesPrivate()
47 {
48
49 }
50
51 void QPieSeriesPrivate::updateDerivativeData()
52 {
53 m_total = 0;
54
55 // nothing to do?
56 if (m_slices.count() == 0)
57 return;
58
59 // calculate total
60 foreach (QPieSlice* s, m_slices)
61 m_total += s->value();
62
63 // nothing to show..
64 if (qFuzzyIsNull(m_total))
65 return;
66
67 // update slice attributes
68 qreal sliceAngle = m_pieStartAngle;
69 qreal pieSpan = m_pieEndAngle - m_pieStartAngle;
70 QVector<QPieSlice*> changed;
71 foreach (QPieSlice* s, m_slices) {
72
73 PieSliceData data = PieSliceData::data(s);
74 data.m_percentage = s->value() / m_total;
75 data.m_angleSpan = pieSpan * data.m_percentage;
76 data.m_startAngle = sliceAngle;
77 sliceAngle += data.m_angleSpan;
78
79 if (PieSliceData::data(s) != data) {
80 PieSliceData::data(s) = data;
81 changed << s;
82 }
83 }
84
85 // emit signals
86 foreach (QPieSlice* s, changed)
87 PieSliceData::data(s).emitChangedSignal(s);
88 }
89
90 void QPieSeriesPrivate::sliceChanged()
91 {
92 Q_ASSERT(m_slices.contains(qobject_cast<QPieSlice *>(sender())));
93 updateDerivativeData();
94 }
95
96 void QPieSeriesPrivate::sliceClicked(Qt::MouseButtons buttons)
97 {
98 QPieSlice* slice = qobject_cast<QPieSlice *>(sender());
99 Q_ASSERT(m_slices.contains(slice));
100 Q_Q(QPieSeries);
101 emit q->clicked(slice, buttons);
102 }
103
104 void QPieSeriesPrivate::sliceHoverEnter()
105 {
106 QPieSlice* slice = qobject_cast<QPieSlice *>(sender());
107 Q_ASSERT(m_slices.contains(slice));
108 Q_Q(QPieSeries);
109 emit q->hoverEnter(slice);
110 }
111
112 void QPieSeriesPrivate::sliceHoverLeave()
113 {
114 QPieSlice* slice = qobject_cast<QPieSlice *>(sender());
115 Q_ASSERT(m_slices.contains(slice));
116 Q_Q(QPieSeries);
117 emit q->hoverLeave(slice);
118 }
119
120 void QPieSeriesPrivate::modelUpdated(QModelIndex topLeft, QModelIndex bottomRight)
121 {
122 Q_UNUSED(bottomRight)
123 Q_Q(QPieSeries);
124
125 if (m_mapOrientation == Qt::Vertical)
126 {
127 if (topLeft.column() == m_mapValues)
128 if (m_mapValues == m_mapLabels)
129 {
130 m_slices.at(topLeft.row())->setValue(q->m_model->data(topLeft, Qt::DisplayRole).toDouble());
131 m_slices.at(topLeft.row())->setLabel(q->m_model->data(topLeft, Qt::DisplayRole).toString());
132 }
133 else
134 {
135 m_slices.at(topLeft.row())->setValue(q->m_model->data(topLeft, Qt::DisplayRole).toDouble());
136 }
137 else if (topLeft.column() == m_mapLabels)
138 m_slices.at(topLeft.row())->setLabel(q->m_model->data(topLeft, Qt::DisplayRole).toString());
139 }
140 else
141 {
142 if (topLeft.row() == m_mapValues)
143 if (m_mapValues == m_mapLabels)
144 {
145 m_slices.at(topLeft.column())->setValue(q->m_model->data(topLeft, Qt::DisplayRole).toDouble());
146 m_slices.at(topLeft.column())->setLabel(q->m_model->data(topLeft, Qt::DisplayRole).toString());
147 }
148 else
149 {
150 m_slices.at(topLeft.column())->setValue(q->m_model->data(topLeft, Qt::DisplayRole).toDouble());
151 }
152 else if (topLeft.row() == m_mapLabels)
153 m_slices.at(topLeft.column())->setLabel(q->m_model->data(topLeft, Qt::DisplayRole).toString());
154 }
155 }
156
157 void QPieSeriesPrivate::modelDataAdded(QModelIndex parent, int start, int end)
158 {
159 Q_UNUSED(parent)
160 Q_UNUSED(end)
161 Q_Q(QPieSeries);
162
163 QPieSlice* newSlice = new QPieSlice;
164 newSlice->setLabelVisible(true);
165 if (m_mapOrientation == Qt::Vertical)
166 {
167 newSlice->setValue(q->m_model->data(q->m_model->index(start, m_mapValues), Qt::DisplayRole).toDouble());
168 newSlice->setLabel(q->m_model->data(q->m_model->index(start, m_mapLabels), Qt::DisplayRole).toString());
169 }
170 else
171 {
172 newSlice->setValue(q->m_model->data(q->m_model->index(m_mapValues, start), Qt::DisplayRole).toDouble());
173 newSlice->setLabel(q->m_model->data(q->m_model->index(m_mapLabels, start), Qt::DisplayRole).toString());
174 }
175
176 q->insert(start, newSlice);
177 }
178
179 void QPieSeriesPrivate::modelDataRemoved(QModelIndex parent, int start, int end)
180 {
181 Q_UNUSED(parent)
182 Q_UNUSED(end)
183 Q_Q(QPieSeries);
184 q->remove(m_slices.at(start));
185 }
186
187 bool QPieSeriesPrivate::setRealValue(qreal &value, qreal newValue, qreal max, qreal min)
188 {
189 // Remove rounding errors
190 qreal roundedValue = newValue;
191 if (qFuzzyIsNull(min) && qFuzzyIsNull(newValue))
192 roundedValue = 0.0;
193 else if (qFuzzyCompare(newValue, max))
194 roundedValue = max;
195 else if (qFuzzyCompare(newValue, min))
196 roundedValue = min;
197
198 // Check if the position is valid after removing the rounding errors
199 if (roundedValue < min || roundedValue > max) {
200 qWarning("QPieSeries: Illegal value");
201 return false;
202 }
203
204 if (!qFuzzyIsNull(value - roundedValue)) {
205 value = roundedValue;
206 return true;
207 }
208
209 // The change was so small it is considered a rounding error
210 return false;
211 }
212
213
214
215 /*!
30 /*!
216 \class QPieSeries
31 \class QPieSeries
217 \brief Pie series API for QtCommercial Charts
32 \brief Pie series API for QtCommercial Charts
@@ -289,8 +104,7 bool QPieSeriesPrivate::setRealValue(qreal &value, qreal newValue, qreal max, qr
289 Constructs a series object which is a child of \a parent.
104 Constructs a series object which is a child of \a parent.
290 */
105 */
291 QPieSeries::QPieSeries(QObject *parent) :
106 QPieSeries::QPieSeries(QObject *parent) :
292 QSeries(parent),
107 QSeries(*new QPieSeriesPrivate(this),parent)
293 d_ptr(new QPieSeriesPrivate(this))
294 {
108 {
295
109
296 }
110 }
@@ -636,9 +450,9 bool QPieSeries::setModel(QAbstractItemModel* model)
636 {
450 {
637 Q_D(QPieSeries);
451 Q_D(QPieSeries);
638 // disconnect signals from old model
452 // disconnect signals from old model
639 if(m_model)
453 if(d->m_model)
640 {
454 {
641 disconnect(m_model, 0, this, 0);
455 disconnect(d->m_model, 0, this, 0);
642 d->m_mapValues = -1;
456 d->m_mapValues = -1;
643 d->m_mapLabels = -1;
457 d->m_mapLabels = -1;
644 d->m_mapOrientation = Qt::Vertical;
458 d->m_mapOrientation = Qt::Vertical;
@@ -647,12 +461,12 bool QPieSeries::setModel(QAbstractItemModel* model)
647 // set new model
461 // set new model
648 if(model)
462 if(model)
649 {
463 {
650 m_model = model;
464 d->m_model = model;
651 return true;
465 return true;
652 }
466 }
653 else
467 else
654 {
468 {
655 m_model = 0;
469 d->m_model = 0;
656 return false;
470 return false;
657 }
471 }
658 }
472 }
@@ -668,7 +482,7 void QPieSeries::setModelMapping(int modelValuesLine, int modelLabelsLine, Qt::O
668 {
482 {
669 Q_D(QPieSeries);
483 Q_D(QPieSeries);
670
484
671 if (m_model == 0)
485 if (d->m_model == 0)
672 return;
486 return;
673
487
674 d->m_mapValues = modelValuesLine;
488 d->m_mapValues = modelValuesLine;
@@ -677,26 +491,211 void QPieSeries::setModelMapping(int modelValuesLine, int modelLabelsLine, Qt::O
677
491
678 // connect the signals
492 // connect the signals
679 if (d->m_mapOrientation == Qt::Vertical) {
493 if (d->m_mapOrientation == Qt::Vertical) {
680 connect(m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), d, SLOT(modelUpdated(QModelIndex, QModelIndex)));
494 connect(d->m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), d, SLOT(modelUpdated(QModelIndex, QModelIndex)));
681 connect(m_model, SIGNAL(rowsInserted(QModelIndex, int, int)), d, SLOT(modelDataAdded(QModelIndex,int,int)));
495 connect(d->m_model, SIGNAL(rowsInserted(QModelIndex, int, int)), d, SLOT(modelDataAdded(QModelIndex,int,int)));
682 connect(m_model, SIGNAL(rowsRemoved(QModelIndex, int, int)), d, SLOT(modelDataRemoved(QModelIndex,int,int)));
496 connect(d->m_model, SIGNAL(rowsRemoved(QModelIndex, int, int)), d, SLOT(modelDataRemoved(QModelIndex,int,int)));
683 } else {
497 } else {
684 connect(m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), d, SLOT(modelUpdated(QModelIndex, QModelIndex)));
498 connect(d->m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), d, SLOT(modelUpdated(QModelIndex, QModelIndex)));
685 connect(m_model, SIGNAL(columnsInserted(QModelIndex, int, int)), d, SLOT(modelDataAdded(QModelIndex,int,int)));
499 connect(d->m_model, SIGNAL(columnsInserted(QModelIndex, int, int)), d, SLOT(modelDataAdded(QModelIndex,int,int)));
686 connect(m_model, SIGNAL(columnsRemoved(QModelIndex, int, int)), d, SLOT(modelDataRemoved(QModelIndex,int,int)));
500 connect(d->m_model, SIGNAL(columnsRemoved(QModelIndex, int, int)), d, SLOT(modelDataRemoved(QModelIndex,int,int)));
687 }
501 }
688
502
689 // create the initial slices set
503 // create the initial slices set
690 if (d->m_mapOrientation == Qt::Vertical) {
504 if (d->m_mapOrientation == Qt::Vertical) {
691 for (int i = 0; i < m_model->rowCount(); i++)
505 for (int i = 0; i < d->m_model->rowCount(); i++)
692 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());
506 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());
693 } else {
507 } else {
694 for (int i = 0; i < m_model->columnCount(); i++)
508 for (int i = 0; i < d->m_model->columnCount(); i++)
695 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());
509 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());
696 }
510 }
697 }
511 }
698
512
513 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
514
515
516 QPieSeriesPrivate::QPieSeriesPrivate(QPieSeries *parent)
517 :QSeriesPrivate(parent),
518 m_pieRelativeHorPos(0.5),
519 m_pieRelativeVerPos(0.5),
520 m_pieRelativeSize(0.7),
521 m_pieStartAngle(0),
522 m_pieEndAngle(360),
523 m_total(0),
524 m_mapValues(0),
525 m_mapLabels(0),
526 m_mapOrientation(Qt::Horizontal)
527 {
528
529 }
530
531 QPieSeriesPrivate::~QPieSeriesPrivate()
532 {
533
534 }
535
536 void QPieSeriesPrivate::updateDerivativeData()
537 {
538 m_total = 0;
539
540 // nothing to do?
541 if (m_slices.count() == 0)
542 return;
543
544 // calculate total
545 foreach (QPieSlice* s, m_slices)
546 m_total += s->value();
547
548 // nothing to show..
549 if (qFuzzyIsNull(m_total))
550 return;
551
552 // update slice attributes
553 qreal sliceAngle = m_pieStartAngle;
554 qreal pieSpan = m_pieEndAngle - m_pieStartAngle;
555 QVector<QPieSlice*> changed;
556 foreach (QPieSlice* s, m_slices) {
557
558 PieSliceData data = PieSliceData::data(s);
559 data.m_percentage = s->value() / m_total;
560 data.m_angleSpan = pieSpan * data.m_percentage;
561 data.m_startAngle = sliceAngle;
562 sliceAngle += data.m_angleSpan;
563
564 if (PieSliceData::data(s) != data) {
565 PieSliceData::data(s) = data;
566 changed << s;
567 }
568 }
569
570 // emit signals
571 foreach (QPieSlice* s, changed)
572 PieSliceData::data(s).emitChangedSignal(s);
573 }
574
575 void QPieSeriesPrivate::sliceChanged()
576 {
577 Q_ASSERT(m_slices.contains(qobject_cast<QPieSlice *>(sender())));
578 updateDerivativeData();
579 }
580
581 void QPieSeriesPrivate::sliceClicked(Qt::MouseButtons buttons)
582 {
583 QPieSlice* slice = qobject_cast<QPieSlice *>(sender());
584 Q_ASSERT(m_slices.contains(slice));
585 Q_Q(QPieSeries);
586 emit q->clicked(slice, buttons);
587 }
588
589 void QPieSeriesPrivate::sliceHoverEnter()
590 {
591 QPieSlice* slice = qobject_cast<QPieSlice *>(sender());
592 Q_ASSERT(m_slices.contains(slice));
593 Q_Q(QPieSeries);
594 emit q->hoverEnter(slice);
595 }
596
597 void QPieSeriesPrivate::sliceHoverLeave()
598 {
599 QPieSlice* slice = qobject_cast<QPieSlice *>(sender());
600 Q_ASSERT(m_slices.contains(slice));
601 Q_Q(QPieSeries);
602 emit q->hoverLeave(slice);
603 }
604
605 void QPieSeriesPrivate::modelUpdated(QModelIndex topLeft, QModelIndex bottomRight)
606 {
607 Q_UNUSED(bottomRight)
608
609 if (m_mapOrientation == Qt::Vertical)
610 {
611 if (topLeft.column() == m_mapValues)
612 if (m_mapValues == m_mapLabels)
613 {
614 m_slices.at(topLeft.row())->setValue(m_model->data(topLeft, Qt::DisplayRole).toDouble());
615 m_slices.at(topLeft.row())->setLabel(m_model->data(topLeft, Qt::DisplayRole).toString());
616 }
617 else
618 {
619 m_slices.at(topLeft.row())->setValue(m_model->data(topLeft, Qt::DisplayRole).toDouble());
620 }
621 else if (topLeft.column() == m_mapLabels)
622 m_slices.at(topLeft.row())->setLabel(m_model->data(topLeft, Qt::DisplayRole).toString());
623 }
624 else
625 {
626 if (topLeft.row() == m_mapValues)
627 if (m_mapValues == m_mapLabels)
628 {
629 m_slices.at(topLeft.column())->setValue(m_model->data(topLeft, Qt::DisplayRole).toDouble());
630 m_slices.at(topLeft.column())->setLabel(m_model->data(topLeft, Qt::DisplayRole).toString());
631 }
632 else
633 {
634 m_slices.at(topLeft.column())->setValue(m_model->data(topLeft, Qt::DisplayRole).toDouble());
635 }
636 else if (topLeft.row() == m_mapLabels)
637 m_slices.at(topLeft.column())->setLabel(m_model->data(topLeft, Qt::DisplayRole).toString());
638 }
639 }
640
641 void QPieSeriesPrivate::modelDataAdded(QModelIndex parent, int start, int end)
642 {
643 Q_UNUSED(parent)
644 Q_UNUSED(end)
645 Q_Q(QPieSeries);
646
647 QPieSlice* newSlice = new QPieSlice;
648 newSlice->setLabelVisible(true);
649 if (m_mapOrientation == Qt::Vertical)
650 {
651 newSlice->setValue(m_model->data(m_model->index(start, m_mapValues), Qt::DisplayRole).toDouble());
652 newSlice->setLabel(m_model->data(m_model->index(start, m_mapLabels), Qt::DisplayRole).toString());
653 }
654 else
655 {
656 newSlice->setValue(m_model->data(m_model->index(m_mapValues, start), Qt::DisplayRole).toDouble());
657 newSlice->setLabel(m_model->data(m_model->index(m_mapLabels, start), Qt::DisplayRole).toString());
658 }
659
660 q->insert(start, newSlice);
661 }
662
663 void QPieSeriesPrivate::modelDataRemoved(QModelIndex parent, int start, int end)
664 {
665 Q_UNUSED(parent)
666 Q_UNUSED(end)
667 Q_Q(QPieSeries);
668 q->remove(m_slices.at(start));
669 }
670
671 bool QPieSeriesPrivate::setRealValue(qreal &value, qreal newValue, qreal max, qreal min)
672 {
673 // Remove rounding errors
674 qreal roundedValue = newValue;
675 if (qFuzzyIsNull(min) && qFuzzyIsNull(newValue))
676 roundedValue = 0.0;
677 else if (qFuzzyCompare(newValue, max))
678 roundedValue = max;
679 else if (qFuzzyCompare(newValue, min))
680 roundedValue = min;
681
682 // Check if the position is valid after removing the rounding errors
683 if (roundedValue < min || roundedValue > max) {
684 qWarning("QPieSeries: Illegal value");
685 return false;
686 }
687
688 if (!qFuzzyIsNull(value - roundedValue)) {
689 value = roundedValue;
690 return true;
691 }
692
693 // The change was so small it is considered a rounding error
694 return false;
695 }
696
697
699 #include "moc_qpieseries.cpp"
698 #include "moc_qpieseries.cpp"
700 #include "moc_qpieseriesprivate_p.cpp"
699 #include "moc_qpieseries_p.cpp"
701
700
702 QTCOMMERCIALCHART_END_NAMESPACE
701 QTCOMMERCIALCHART_END_NAMESPACE
@@ -92,7 +92,6 Q_SIGNALS:
92 void pieSizeChanged();
92 void pieSizeChanged();
93
93
94 private:
94 private:
95 QPieSeriesPrivate * const d_ptr;
96 Q_DECLARE_PRIVATE(QPieSeries)
95 Q_DECLARE_PRIVATE(QPieSeries)
97 Q_DISABLE_COPY(QPieSeries)
96 Q_DISABLE_COPY(QPieSeries)
98 };
97 };
@@ -18,19 +18,19
18 **
18 **
19 ****************************************************************************/
19 ****************************************************************************/
20
20
21 #ifndef QPIESERIESPRIVATE_P_H
21 #ifndef QPIESERIES_P_H
22 #define QPIESERIESPRIVATE_P_H
22 #define QPIESERIES_P_H
23
23
24 #include "qpieseries.h"
24 #include "qpieseries.h"
25 #include "qseries_p.h"
25
26
26 class QModelIndex;
27 class QModelIndex;
27
28
28 QTCOMMERCIALCHART_BEGIN_NAMESPACE
29 QTCOMMERCIALCHART_BEGIN_NAMESPACE
29
30
30 class QPieSeriesPrivate : public QObject
31 class QPieSeriesPrivate : public QSeriesPrivate
31 {
32 {
32 Q_OBJECT
33 Q_OBJECT
33 Q_DECLARE_PUBLIC(QPieSeries)
34
34
35 public:
35 public:
36 QPieSeriesPrivate(QPieSeries *parent);
36 QPieSeriesPrivate(QPieSeries *parent);
@@ -49,8 +49,6 public Q_SLOTS:
49 bool setRealValue(qreal &value, qreal newValue, qreal max, qreal min = 0.0);
49 bool setRealValue(qreal &value, qreal newValue, qreal max, qreal min = 0.0);
50
50
51 public:
51 public:
52 QPieSeries * const q_ptr;
53
54 QList<QPieSlice*> m_slices;
52 QList<QPieSlice*> m_slices;
55 qreal m_pieRelativeHorPos;
53 qreal m_pieRelativeHorPos;
56 qreal m_pieRelativeVerPos;
54 qreal m_pieRelativeVerPos;
@@ -63,8 +61,10 public:
63 int m_mapValues;
61 int m_mapValues;
64 int m_mapLabels;
62 int m_mapLabels;
65 Qt::Orientation m_mapOrientation;
63 Qt::Orientation m_mapOrientation;
64 private:
65 Q_DECLARE_PUBLIC(QPieSeries)
66 };
66 };
67
67
68 QTCOMMERCIALCHART_END_NAMESPACE
68 QTCOMMERCIALCHART_END_NAMESPACE
69
69
70 #endif // QPIESERIESPRIVATE_P_H
70 #endif // QPIESERIES_P_H
@@ -19,6 +19,9
19 ****************************************************************************/
19 ****************************************************************************/
20
20
21 #include "qseries.h"
21 #include "qseries.h"
22 #include "qseries_p.h"
23
24 QTCOMMERCIALCHART_BEGIN_NAMESPACE
22
25
23 /*!
26 /*!
24 \class QSeries
27 \class QSeries
@@ -93,5 +96,55
93 \sa setName()
96 \sa setName()
94 */
97 */
95
98
96 QTCOMMERCIALCHART_USE_NAMESPACE
99 QSeries::QSeries(QObject *parent) : QObject(parent),
100 d_ptr(new QSeriesPrivate(this))
101 {
102
103 }
104
105 QSeries::QSeries(QSeriesPrivate &d,QObject *parent) : QObject(parent),
106 d_ptr(&d)
107 {
108
109 }
110
111 QSeries::~QSeries()
112 {
113
114 }
115
116 QAbstractItemModel* QSeries::model() const
117 {
118 return d_ptr->m_model;
119 }
120
121 void QSeries::setName(const QString& name)
122 {
123 d_ptr->m_name = name;
124 }
125
126 QString QSeries::name() const
127 {
128 return d_ptr->m_name;
129 }
130
131 ///////////////////////////////////////////////////////////////////////////////////////////////////
132
133 QSeriesPrivate::QSeriesPrivate(QSeries* q): q_ptr(q),m_model(0)
134 {
135
136 }
137
138 QSeriesPrivate::~QSeriesPrivate()
139 {
140
141 }
142
143
144
145
97 #include "moc_qseries.cpp"
146 #include "moc_qseries.cpp"
147
148 QTCOMMERCIALCHART_END_NAMESPACE
149
150
@@ -29,10 +29,13 class QAbstractItemModel;
29
29
30 QTCOMMERCIALCHART_BEGIN_NAMESPACE
30 QTCOMMERCIALCHART_BEGIN_NAMESPACE
31
31
32 class QSeriesPrivate;
33
32 class QTCOMMERCIALCHART_EXPORT QSeries : public QObject
34 class QTCOMMERCIALCHART_EXPORT QSeries : public QObject
33 {
35 {
34 Q_OBJECT
36 Q_OBJECT
35 Q_PROPERTY(QString name READ name WRITE setName)
37 Q_PROPERTY(QString name READ name WRITE setName)
38 Q_ENUMS(QSeriesType)
36
39
37 public:
40 public:
38 enum QSeriesType {
41 enum QSeriesType {
@@ -47,23 +50,20 public:
47 };
50 };
48
51
49 protected:
52 protected:
50 QSeries(QObject *parent = 0) : QObject(parent) {m_model = 0;}
53 QSeries(QObject *parent = 0);
54 QSeries(QSeriesPrivate &d,QObject *parent = 0);
51
55
52 public:
56 public:
53 virtual ~QSeries() {}
57 ~QSeries();
54 virtual QSeriesType type() const = 0;
58 virtual QSeriesType type() const = 0;
55 // TODO
59 // TODO
56 virtual bool setModel(QAbstractItemModel* /*model*/) { return false; }
60 virtual bool setModel(QAbstractItemModel* model) = 0;
57 QAbstractItemModel* model() const { return m_model; }
61 QAbstractItemModel* model() const;
58
62 void setName(const QString& name);
59 void setName(QString name) { m_name = name; }
63 QString name() const;
60 QString name() const { return m_name; }
61
64
62 protected:
65 protected:
63 QAbstractItemModel* m_model;
66 QScopedPointer<QSeriesPrivate> d_ptr;
64
65 private:
66 QString m_name;
67 };
67 };
68
68
69 QTCOMMERCIALCHART_END_NAMESPACE
69 QTCOMMERCIALCHART_END_NAMESPACE
@@ -19,7 +19,7
19 ****************************************************************************/
19 ****************************************************************************/
20
20
21 #include "qscatterseries.h"
21 #include "qscatterseries.h"
22 #include "qchart.h"
22 #include "qscatterseries_p.h"
23
23
24 /*!
24 /*!
25 \class QScatterSeries
25 \class QScatterSeries
@@ -62,10 +62,7 QTCOMMERCIALCHART_BEGIN_NAMESPACE
62 /*!
62 /*!
63 Constructs a series object which is a child of \a parent.
63 Constructs a series object which is a child of \a parent.
64 */
64 */
65 QScatterSeries::QScatterSeries(QObject *parent) :
65 QScatterSeries::QScatterSeries(QObject *parent) : QXYSeries(*new QScatterSeriesPrivate(this),parent)
66 QXYSeries(parent),
67 m_shape(QScatterSeries::MarkerShapeCircle),
68 m_size(15.0)
69 {
66 {
70 }
67 }
71
68
@@ -76,12 +73,18 QScatterSeries::~QScatterSeries()
76 {
73 {
77 }
74 }
78
75
76 QSeries::QSeriesType QScatterSeries::type() const
77 {
78 return QSeries::SeriesTypeScatter;
79 }
80
79 /*!
81 /*!
80 Returns the shape used for drawing markers.
82 Returns the shape used for drawing markers.
81 */
83 */
82 QScatterSeries::MarkerShape QScatterSeries::shape() const
84 QScatterSeries::MarkerShape QScatterSeries::shape() const
83 {
85 {
84 return m_shape;
86 Q_D(const QScatterSeries);
87 return d->m_shape;
85 }
88 }
86
89
87 /*!
90 /*!
@@ -90,9 +93,10 QScatterSeries::MarkerShape QScatterSeries::shape() const
90 */
93 */
91 void QScatterSeries::setShape(MarkerShape shape)
94 void QScatterSeries::setShape(MarkerShape shape)
92 {
95 {
93 if (m_shape != shape) {
96 Q_D(QScatterSeries);
94 m_shape = shape;
97 if (d->m_shape != shape) {
95 emit QXYSeries::updated();
98 d->m_shape = shape;
99 emit d->updated();
96 }
100 }
97 }
101 }
98
102
@@ -101,7 +105,8 void QScatterSeries::setShape(MarkerShape shape)
101 */
105 */
102 qreal QScatterSeries::size() const
106 qreal QScatterSeries::size() const
103 {
107 {
104 return m_size;
108 Q_D(const QScatterSeries);
109 return d->m_size;
105 }
110 }
106
111
107 /*!
112 /*!
@@ -109,10 +114,22 qreal QScatterSeries::size() const
109 */
114 */
110 void QScatterSeries::setSize(qreal size)
115 void QScatterSeries::setSize(qreal size)
111 {
116 {
112 if (!qFuzzyIsNull(m_size - size)) {
117 Q_D(QScatterSeries);
113 m_size = size;
118
114 emit updated();
119 if (!qFuzzyIsNull(d->m_size - size)) {
120 d->m_size = size;
121 emit d->updated();
115 }
122 }
116 }
123 }
117
124
125 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
126
127 QScatterSeriesPrivate::QScatterSeriesPrivate(QScatterSeries* q):QXYSeriesPrivate(q),
128 m_shape(QScatterSeries::MarkerShapeCircle),
129 m_size(15.0)
130 {
131
132 };
133
134
118 QTCOMMERCIALCHART_END_NAMESPACE
135 QTCOMMERCIALCHART_END_NAMESPACE
@@ -25,6 +25,7
25 #include <qxyseries.h>
25 #include <qxyseries.h>
26
26
27 QTCOMMERCIALCHART_BEGIN_NAMESPACE
27 QTCOMMERCIALCHART_BEGIN_NAMESPACE
28
28 class QScatterSeriesPrivate;
29 class QScatterSeriesPrivate;
29
30
30 class QTCOMMERCIALCHART_EXPORT QScatterSeries : public QXYSeries
31 class QTCOMMERCIALCHART_EXPORT QScatterSeries : public QXYSeries
@@ -37,21 +38,21 public:
37 };
38 };
38
39
39 public:
40 public:
40 QScatterSeries(QObject *parent = 0);
41 explicit QScatterSeries(QObject *parent = 0);
41 ~QScatterSeries();
42 ~QScatterSeries();
42
43
43 public: // from QChartSeries
44 QSeries::QSeriesType type() const;
44 QSeriesType type() const { return QSeries::SeriesTypeScatter; }
45
45
46 public:
47 MarkerShape shape() const;
46 MarkerShape shape() const;
48 void setShape(MarkerShape shape);
47 void setShape(MarkerShape shape);
49 qreal size() const;
48 qreal size() const;
50 void setSize(qreal size);
49 void setSize(qreal size);
51
50
52 private:
51 private:
53 MarkerShape m_shape;
52 Q_DECLARE_PRIVATE(QScatterSeries);
54 qreal m_size;
53 Q_DISABLE_COPY(QScatterSeries);
54 friend class ScatterChartItem;
55
55 };
56 };
56
57
57 QTCOMMERCIALCHART_END_NAMESPACE
58 QTCOMMERCIALCHART_END_NAMESPACE
@@ -6,7 +6,8 SOURCES += \
6 $$PWD/scatterchartitem.cpp
6 $$PWD/scatterchartitem.cpp
7
7
8 PRIVATE_HEADERS += \
8 PRIVATE_HEADERS += \
9 $$PWD/scatterchartitem_p.h
9 $$PWD/scatterchartitem_p.h \
10 $$PWD/qscatterseries_p.h
10
11
11 PUBLIC_HEADERS += \
12 PUBLIC_HEADERS += \
12 $$PWD/qscatterseries.h
13 $$PWD/qscatterseries.h
@@ -20,6 +20,7
20
20
21 #include "scatterchartitem_p.h"
21 #include "scatterchartitem_p.h"
22 #include "qscatterseries.h"
22 #include "qscatterseries.h"
23 #include "qscatterseries_p.h"
23 #include "chartpresenter_p.h"
24 #include "chartpresenter_p.h"
24 #include <QPainter>
25 #include <QPainter>
25 #include <QGraphicsScene>
26 #include <QGraphicsScene>
@@ -34,7 +35,7 ScatterChartItem::ScatterChartItem(QScatterSeries *series, ChartPresenter *prese
34 m_size(15)
35 m_size(15)
35
36
36 {
37 {
37 QObject::connect(m_series,SIGNAL(updated()), this, SLOT(handleUpdated()));
38 QObject::connect(m_series->d_func(),SIGNAL(updated()), this, SLOT(handleUpdated()));
38
39
39 setZValue(ChartPresenter::ScatterSeriesZValue);
40 setZValue(ChartPresenter::ScatterSeriesZValue);
40 setFlags(QGraphicsItem::ItemClipsChildrenToShape);
41 setFlags(QGraphicsItem::ItemClipsChildrenToShape);
@@ -19,6 +19,7
19 ****************************************************************************/
19 ****************************************************************************/
20
20
21 #include "qsplineseries.h"
21 #include "qsplineseries.h"
22 #include "qsplineseries_p.h"
22
23
23 /*!
24 /*!
24 \class QSplineSeries
25 \class QSplineSeries
@@ -46,32 +47,57 QTCOMMERCIALCHART_BEGIN_NAMESPACE
46 */
47 */
47
48
48 QSplineSeries::QSplineSeries(QObject *parent) :
49 QSplineSeries::QSplineSeries(QObject *parent) :
49 QLineSeries(parent)
50 QLineSeries(*new QSplineSeriesPrivate(this),parent)
50 {
51 {
51 connect(this,SIGNAL(pointAdded(int)), this, SLOT(updateControlPoints()));
52 connect(this,SIGNAL(pointRemoved(int)), this, SLOT(updateControlPoints()));
53 connect(this,SIGNAL(pointReplaced(int)), this, SLOT(updateControlPoints()));
54 }
52 }
55
53
54 QSeries::QSeriesType QSplineSeries::type() const
55 {
56 return QSeries::SeriesTypeSpline;
57 }
58
59 QPointF QSplineSeries::controlPoint(int index) const
60 {
61 Q_D(const QSplineSeries);
62 return d->m_controlPoints[index];
63 }
64
65 void QSplineSeries::setModelMappingRange(int first, int count)
66 {
67 Q_D(QSplineSeries);
68 QLineSeries::setModelMappingRange(first, count);
69 d->calculateControlPoints();
70 }
71
72 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
73
74 QSplineSeriesPrivate::QSplineSeriesPrivate(QSplineSeries* q):QLineSeriesPrivate(q)
75 {
76 QObject::connect(this,SIGNAL(pointAdded(int)), this, SLOT(updateControlPoints()));
77 QObject::connect(this,SIGNAL(pointRemoved(int)), this, SLOT(updateControlPoints()));
78 QObject::connect(this,SIGNAL(pointReplaced(int)), this, SLOT(updateControlPoints()));
79 };
80
56 /*!
81 /*!
57 \internal
82 \internal
58 Calculates control points which are needed by QPainterPath.cubicTo function to draw the cubic Bezier cureve between two points.
83 Calculates control points which are needed by QPainterPath.cubicTo function to draw the cubic Bezier cureve between two points.
59 */
84 */
60 void QSplineSeries::calculateControlPoints()
85 void QSplineSeriesPrivate::calculateControlPoints()
61 {
86 {
62
87
88 Q_Q(QSplineSeries);
63 // Based on http://www.codeproject.com/Articles/31859/Draw-a-Smooth-Curve-through-a-Set-of-2D-Points-wit
89 // Based on http://www.codeproject.com/Articles/31859/Draw-a-Smooth-Curve-through-a-Set-of-2D-Points-wit
64 // CPOL License
90 // CPOL License
65
91
66 int n = count() - 1;
92 int n = q->count() - 1;
67 if (n == 1)
93 if (n == 1)
68 { // Special case: Bezier curve should be a straight line.
94 { // Special case: Bezier curve should be a straight line.
69 // firstControlPoints = new Point[1];
95 // firstControlPoints = new Point[1];
70 // 3P1 = 2P0 + P3
96 // 3P1 = 2P0 + P3
71 m_controlPoints.append(QPointF((2 * x(0) + x(1)) / 3, (2 * y(0) + y(1)) / 3));
97 m_controlPoints.append(QPointF((2 * q->x(0) + q->x(1)) / 3, (2 * q->y(0) + q->y(1)) / 3));
72
98
73 // P2 = 2P1 P0
99 // P2 = 2P1 P0
74 m_controlPoints.append(QPointF(2 * m_controlPoints[0].x() - x(0), 2 * m_controlPoints[0].y() - y(0)));
100 m_controlPoints.append(QPointF(2 * m_controlPoints[0].x() - q->x(0), 2 * m_controlPoints[0].y() - q->y(0)));
75 return;
101 return;
76 }
102 }
77
103
@@ -89,22 +115,22 void QSplineSeries::calculateControlPoints()
89 // | 0 0 0 0 0 0 0 0 ... 0 2 7 | | P1_n | | 8 * P(n-1) + Pn |
115 // | 0 0 0 0 0 0 0 0 ... 0 2 7 | | P1_n | | 8 * P(n-1) + Pn |
90 //
116 //
91 QList<qreal> rhs;
117 QList<qreal> rhs;
92 rhs.append(x(0) + 2 * x(1));
118 rhs.append(q->x(0) + 2 * q->x(1));
93
119
94 // Set right hand side X values
120 // Set right hand side X values
95 for (int i = 1; i < n - 1; ++i)
121 for (int i = 1; i < n - 1; ++i)
96 rhs.append(4 * x(i) + 2 * x(i + 1));
122 rhs.append(4 * q->x(i) + 2 * q->x(i + 1));
97
123
98 rhs.append((8 * x(n - 1) + x(n)) / 2.0);
124 rhs.append((8 * q->x(n - 1) + q->x(n)) / 2.0);
99 // Get first control points X-values
125 // Get first control points X-values
100 QList<qreal> xControl = getFirstControlPoints(rhs);
126 QList<qreal> xControl = getFirstControlPoints(rhs);
101 rhs[0] = y(0) + 2 * y(1);
127 rhs[0] = q->y(0) + 2 * q->y(1);
102
128
103 // Set right hand side Y values
129 // Set right hand side Y values
104 for (int i = 1; i < n - 1; ++i)
130 for (int i = 1; i < n - 1; ++i)
105 rhs[i] = 4 * y(i) + 2 * y(i + 1);
131 rhs[i] = 4 * q->y(i) + 2 * q->y(i + 1);
106
132
107 rhs[n - 1] = (8 * y(n - 1) + y(n)) / 2.0;
133 rhs[n - 1] = (8 * q->y(n - 1) + q->y(n)) / 2.0;
108 // Get first control points Y-values
134 // Get first control points Y-values
109 QList<qreal> yControl = getFirstControlPoints(rhs);
135 QList<qreal> yControl = getFirstControlPoints(rhs);
110
136
@@ -114,16 +140,16 void QSplineSeries::calculateControlPoints()
114 m_controlPoints.append(QPointF(xControl[i], yControl[i]));
140 m_controlPoints.append(QPointF(xControl[i], yControl[i]));
115 // Second control point
141 // Second control point
116 if (i < n - 1)
142 if (i < n - 1)
117 m_controlPoints.append(QPointF(2 * x(i + 1) - xControl[i + 1], 2 * y(i + 1) - yControl[i + 1]));
143 m_controlPoints.append(QPointF(2 * q->x(i + 1) - xControl[i + 1], 2 * q->y(i + 1) - yControl[i + 1]));
118 else
144 else
119 m_controlPoints.append(QPointF((x(n) + xControl[n - 1]) / 2, (y(n) + yControl[n - 1]) / 2));
145 m_controlPoints.append(QPointF((q->x(n) + xControl[n - 1]) / 2, (q->y(n) + yControl[n - 1]) / 2));
120 }
146 }
121 }
147 }
122
148
123 /*!
149 /*!
124 \internal
150 \internal
125 */
151 */
126 QList<qreal> QSplineSeries::getFirstControlPoints(QList<qreal> rhs)
152 QList<qreal> QSplineSeriesPrivate::getFirstControlPoints(QList<qreal> rhs)
127 {
153 {
128 QList<qreal> x; // Solution vector.
154 QList<qreal> x; // Solution vector.
129 QList<qreal> tmp; // Temp workspace.
155 QList<qreal> tmp; // Temp workspace.
@@ -147,9 +173,10 QList<qreal> QSplineSeries::getFirstControlPoints(QList<qreal> rhs)
147 \internal
173 \internal
148 Updates the control points, besed on currently avaiable knots.
174 Updates the control points, besed on currently avaiable knots.
149 */
175 */
150 void QSplineSeries::updateControlPoints()
176 void QSplineSeriesPrivate::updateControlPoints()
151 {
177 {
152 if (count() > 1) {
178 Q_Q(QSplineSeries);
179 if (q->count() > 1) {
153 m_controlPoints.clear();
180 m_controlPoints.clear();
154 calculateControlPoints();
181 calculateControlPoints();
155 }
182 }
@@ -187,12 +214,8 void QSplineSeries::updateControlPoints()
187 then all the items following \a first item in a model are used.
214 then all the items following \a first item in a model are used.
188 \sa setModel(), setModelMapping()
215 \sa setModel(), setModelMapping()
189 */
216 */
190 void QSplineSeries::setModelMappingRange(int first, int count)
191 {
192 QLineSeries::setModelMappingRange(first, count);
193 calculateControlPoints();
194 }
195
217
196 #include "moc_qsplineseries.cpp"
218 #include "moc_qsplineseries.cpp"
219 #include "moc_qsplineseries_p.cpp"
197
220
198 QTCOMMERCIALCHART_END_NAMESPACE
221 QTCOMMERCIALCHART_END_NAMESPACE
@@ -29,30 +29,23
29
29
30 QTCOMMERCIALCHART_BEGIN_NAMESPACE
30 QTCOMMERCIALCHART_BEGIN_NAMESPACE
31
31
32 class QSplineSeriesPrivate;
33
32 class QTCOMMERCIALCHART_EXPORT QSplineSeries : public QLineSeries
34 class QTCOMMERCIALCHART_EXPORT QSplineSeries : public QLineSeries
33 {
35 {
34 Q_OBJECT
36 Q_OBJECT
35 public:
37 public:
36
38
37 QSplineSeries(QObject *parent = 0);
39 QSplineSeries(QObject *parent = 0);
38 QSeriesType type() const {return QSeries::SeriesTypeSpline;}
40 QSeries::QSeriesType type() const;
39
40 QPointF controlPoint(int index) const {return m_controlPoints[index];}
41 // bool setModel(QAbstractItemModel *model);
42
41
43 // void setModelMapping(int modelX, int modelY, Qt::Orientation orientation = Qt::Vertical);
42 QPointF controlPoint(int index) const;
44 void setModelMappingRange(int first, int count);
43 void setModelMappingRange(int first, int count);
45
44
46 private:
45 private:
47 void calculateControlPoints();
46 Q_DECLARE_PRIVATE(QSplineSeries);
48 QList<qreal> getFirstControlPoints(QList<qreal> rhs);
47 Q_DISABLE_COPY(QSplineSeries);
49
48 friend class SplineChartItem;
50 private Q_SLOTS:
51 void updateControlPoints();
52
53 private:
54 QList<QPointF> m_controlPoints;
55
56 };
49 };
57
50
58 QTCOMMERCIALCHART_END_NAMESPACE
51 QTCOMMERCIALCHART_END_NAMESPACE
@@ -6,7 +6,8 SOURCES += \
6 $$PWD/splinechartitem.cpp
6 $$PWD/splinechartitem.cpp
7
7
8 PRIVATE_HEADERS += \
8 PRIVATE_HEADERS += \
9 $$PWD/splinechartitem_p.h
9 $$PWD/splinechartitem_p.h \
10 $$PWD/qsplineseries_p.h
10
11
11 PUBLIC_HEADERS += \
12 PUBLIC_HEADERS += \
12 $$PWD/qsplineseries.h
13 $$PWD/qsplineseries.h
@@ -19,6 +19,7
19 ****************************************************************************/
19 ****************************************************************************/
20
20
21 #include "splinechartitem_p.h"
21 #include "splinechartitem_p.h"
22 #include "qsplineseries_p.h"
22 #include "chartpresenter_p.h"
23 #include "chartpresenter_p.h"
23 #include "chartanimator_p.h"
24 #include "chartanimator_p.h"
24 #include <QPainter>
25 #include <QPainter>
@@ -31,7 +32,7 SplineChartItem::SplineChartItem(QSplineSeries *series, ChartPresenter *presente
31 m_pointsVisible(false)
32 m_pointsVisible(false)
32 {
33 {
33 setZValue(ChartPresenter::LineChartZValue);
34 setZValue(ChartPresenter::LineChartZValue);
34 QObject::connect(series,SIGNAL(updated()),this,SLOT(handleUpdated()));
35 QObject::connect(m_series->d_func(),SIGNAL(updated()),this,SLOT(handleUpdated()));
35 handleUpdated();
36 handleUpdated();
36 }
37 }
37
38
@@ -32,7 +32,8 PRIVATE_HEADERS += \
32 $$PWD/chartconfig_p.h \
32 $$PWD/chartconfig_p.h \
33 $$PWD/qchart_p.h \
33 $$PWD/qchart_p.h \
34 $$PWD/qchartview_p.h \
34 $$PWD/qchartview_p.h \
35 $$PWD/scroller_p.h
35 $$PWD/scroller_p.h \
36 $$PWD/qseries_p.h
36 PUBLIC_HEADERS += \
37 PUBLIC_HEADERS += \
37 $$PWD/qchart.h \
38 $$PWD/qchart.h \
38 $$PWD/qchartglobal.h \
39 $$PWD/qchartglobal.h \
@@ -19,6 +19,7
19 ****************************************************************************/
19 ****************************************************************************/
20
20
21 #include "qxyseries.h"
21 #include "qxyseries.h"
22 #include "qxyseries_p.h"
22 #include <QAbstractItemModel>
23 #include <QAbstractItemModel>
23
24
24 QTCOMMERCIALCHART_BEGIN_NAMESPACE
25 QTCOMMERCIALCHART_BEGIN_NAMESPACE
@@ -82,15 +83,14 QTCOMMERCIALCHART_BEGIN_NAMESPACE
82 Constructs empty series object which is a child of \a parent.
83 Constructs empty series object which is a child of \a parent.
83 When series object is added to QChartView or QChart instance ownerships is transfered.
84 When series object is added to QChartView or QChart instance ownerships is transfered.
84 */
85 */
85 QXYSeries::QXYSeries(QObject *parent):QSeries(parent)
86 QXYSeries::QXYSeries(QObject *parent):QSeries(*new QXYSeriesPrivate(this),parent)
86 {
87 {
87 m_mapX = -1;
88
88 m_mapY = -1;
89 }
89 m_mapFirst = 0;
90
90 m_mapCount = 0;
91 QXYSeries::QXYSeries(QXYSeriesPrivate &d,QObject *parent):QSeries(d,parent)
91 m_mapLimited = false;
92 {
92 m_mapOrientation = Qt::Vertical;
93
93 // m_mapYOrientation = Qt::Vertical;
94 }
94 }
95 /*!
95 /*!
96 Destroys the object. Series added to QChartView or QChart instances are owned by those,
96 Destroys the object. Series added to QChartView or QChart instances are owned by those,
@@ -105,10 +105,11 QXYSeries::~QXYSeries()
105 */
105 */
106 void QXYSeries::append(qreal x,qreal y)
106 void QXYSeries::append(qreal x,qreal y)
107 {
107 {
108 Q_ASSERT(m_x.size() == m_y.size());
108 Q_D(QXYSeries);
109 m_x<<x;
109 Q_ASSERT(d->m_x.size() == d->m_y.size());
110 m_y<<y;
110 d->m_x<<x;
111 emit pointAdded(m_x.size()-1);
111 d->m_y<<y;
112 emit d->pointAdded(d->m_x.size()-1);
112 }
113 }
113
114
114 /*!
115 /*!
@@ -136,10 +137,11 void QXYSeries::append(const QList<QPointF> points)
136 */
137 */
137 void QXYSeries::replace(qreal x,qreal y)
138 void QXYSeries::replace(qreal x,qreal y)
138 {
139 {
139 int index = m_x.indexOf(x);
140 Q_D(QXYSeries);
140 m_x[index] = x;
141 int index = d->m_x.indexOf(x);
141 m_y[index] = y;
142 d->m_x[index] = x;
142 emit pointReplaced(index);
143 d->m_y[index] = y;
144 emit d->pointReplaced(index);
143 }
145 }
144
146
145 /*!
147 /*!
@@ -156,14 +158,15 void QXYSeries::replace(const QPointF &point)
156 */
158 */
157 void QXYSeries::remove(qreal x)
159 void QXYSeries::remove(qreal x)
158 {
160 {
159 int index = m_x.indexOf(x);
161 Q_D(QXYSeries);
162 int index = d->m_x.indexOf(x);
160
163
161 if (index == -1) return;
164 if (index == -1) return;
162
165
163 m_x.remove(index);
166 d->m_x.remove(index);
164 m_y.remove(index);
167 d->m_y.remove(index);
165
168
166 emit pointRemoved(index);
169 emit d->pointRemoved(index);
167 }
170 }
168
171
169 /*!
172 /*!
@@ -171,16 +174,17 void QXYSeries::remove(qreal x)
171 */
174 */
172 void QXYSeries::remove(qreal x,qreal y)
175 void QXYSeries::remove(qreal x,qreal y)
173 {
176 {
177 Q_D(QXYSeries);
174 int index =-1;
178 int index =-1;
175 do {
179 do {
176 index = m_x.indexOf(x,index+1);
180 index = d->m_x.indexOf(x,index+1);
177 } while (index !=-1 && m_y.at(index)!=y);
181 } while (index !=-1 && d->m_y.at(index)!=y);
178
182
179 if (index==-1) return;
183 if (index==-1) return;
180
184
181 m_x.remove(index);
185 d->m_x.remove(index);
182 m_y.remove(index);
186 d->m_y.remove(index);
183 emit pointRemoved(index);
187 emit d->pointRemoved(index);
184 }
188 }
185
189
186 /*!
190 /*!
@@ -196,8 +200,9 void QXYSeries::remove(const QPointF &point)
196 */
200 */
197 void QXYSeries::removeAll()
201 void QXYSeries::removeAll()
198 {
202 {
199 m_x.clear();
203 Q_D(QXYSeries);
200 m_y.clear();
204 d->m_x.clear();
205 d->m_y.clear();
201 }
206 }
202
207
203 /*!
208 /*!
@@ -205,16 +210,17 void QXYSeries::removeAll()
205 */
210 */
206 qreal QXYSeries::x(int pos) const
211 qreal QXYSeries::x(int pos) const
207 {
212 {
208 if (m_model) {
213 Q_D(const QXYSeries);
209 if (m_mapOrientation == Qt::Vertical)
214 if (d->m_model) {
215 if (d->m_mapOrientation == Qt::Vertical)
210 // consecutive data is read from model's column
216 // consecutive data is read from model's column
211 return m_model->data(m_model->index(pos + m_mapFirst, m_mapX), Qt::DisplayRole).toDouble();
217 return d->m_model->data(d->m_model->index(pos + d->m_mapFirst, d->m_mapX), Qt::DisplayRole).toDouble();
212 else
218 else
213 // consecutive data is read from model's row
219 // consecutive data is read from model's row
214 return m_model->data(m_model->index(m_mapX, pos + m_mapFirst), Qt::DisplayRole).toDouble();
220 return d->m_model->data(d->m_model->index(d->m_mapX, pos + d->m_mapFirst), Qt::DisplayRole).toDouble();
215 } else {
221 } else {
216 // model is not specified, return the data from series' internal data store
222 // model is not specified, return the data from series' internal data store
217 return m_x.at(pos);
223 return d->m_x.at(pos);
218 }
224 }
219 }
225 }
220
226
@@ -223,16 +229,17 qreal QXYSeries::x(int pos) const
223 */
229 */
224 qreal QXYSeries::y(int pos) const
230 qreal QXYSeries::y(int pos) const
225 {
231 {
226 if (m_model) {
232 Q_D(const QXYSeries);
227 if (m_mapOrientation == Qt::Vertical)
233 if (d->m_model) {
234 if (d->m_mapOrientation == Qt::Vertical)
228 // consecutive data is read from model's column
235 // consecutive data is read from model's column
229 return m_model->data(m_model->index(pos + m_mapFirst, m_mapY), Qt::DisplayRole).toDouble();
236 return d->m_model->data(d->m_model->index(pos + d->m_mapFirst, d->m_mapY), Qt::DisplayRole).toDouble();
230 else
237 else
231 // consecutive data is read from model's row
238 // consecutive data is read from model's row
232 return m_model->data(m_model->index(m_mapY, pos + m_mapFirst), Qt::DisplayRole).toDouble();
239 return d->m_model->data(d->m_model->index(d->m_mapY, pos + d->m_mapFirst), Qt::DisplayRole).toDouble();
233 } else {
240 } else {
234 // model is not specified, return the data from series' internal data store
241 // model is not specified, return the data from series' internal data store
235 return m_y.at(pos);
242 return d->m_y.at(pos);
236 }
243 }
237 }
244 }
238
245
@@ -241,28 +248,30 qreal QXYSeries::y(int pos) const
241 */
248 */
242 int QXYSeries::count() const
249 int QXYSeries::count() const
243 {
250 {
244 Q_ASSERT(m_x.size() == m_y.size());
251 Q_D(const QXYSeries);
252
253 Q_ASSERT(d->m_x.size() == d->m_y.size());
245
254
246 if (m_model) {
255 if (d->m_model) {
247 if (m_mapOrientation == Qt::Vertical) {
256 if (d->m_mapOrientation == Qt::Vertical) {
248 // data is in a column. Return the number of mapped items if the model's column have enough items
257 // data is in a column. Return the number of mapped items if the model's column have enough items
249 // or the number of items that can be mapped
258 // or the number of items that can be mapped
250 if (m_mapLimited)
259 if (d->m_mapLimited)
251 return qMin(m_mapCount, qMax(m_model->rowCount() - m_mapFirst, 0));
260 return qMin(d->m_mapCount, qMax(d->m_model->rowCount() - d->m_mapFirst, 0));
252 else
261 else
253 return qMax(m_model->rowCount() - m_mapFirst, 0);
262 return qMax(d->m_model->rowCount() - d->m_mapFirst, 0);
254 } else {
263 } else {
255 // data is in a row. Return the number of mapped items if the model's row have enough items
264 // data is in a row. Return the number of mapped items if the model's row have enough items
256 // or the number of items that can be mapped
265 // or the number of items that can be mapped
257 if (m_mapLimited)
266 if (d->m_mapLimited)
258 return qMin(m_mapCount, qMax(m_model->columnCount() - m_mapFirst, 0));
267 return qMin(d->m_mapCount, qMax(d->m_model->columnCount() - d->m_mapFirst, 0));
259 else
268 else
260 return qMax(m_model->columnCount() - m_mapFirst, 0);
269 return qMax(d->m_model->columnCount() - d->m_mapFirst, 0);
261 }
270 }
262 }
271 }
263
272
264 // model is not specified, return the number of points in the series internal data store
273 // model is not specified, return the number of points in the series internal data store
265 return m_x.size();
274 return d->m_x.size();
266 }
275 }
267
276
268 /*!
277 /*!
@@ -270,9 +279,10 int QXYSeries::count() const
270 */
279 */
271 QList<QPointF> QXYSeries::data()
280 QList<QPointF> QXYSeries::data()
272 {
281 {
282 Q_D(QXYSeries);
273 QList<QPointF> data;
283 QList<QPointF> data;
274 for (int i(0); i < m_x.count() && i < m_y.count(); i++)
284 for (int i(0); i < d->m_x.count() && i < d->m_y.count(); i++)
275 data.append(QPointF(m_x.at(i), m_y.at(i)));
285 data.append(QPointF(d->m_x.at(i), d->m_y.at(i)));
276 return data;
286 return data;
277 }
287 }
278
288
@@ -284,12 +294,19 QList<QPointF> QXYSeries::data()
284 */
294 */
285 void QXYSeries::setPen(const QPen &pen)
295 void QXYSeries::setPen(const QPen &pen)
286 {
296 {
287 if (pen != m_pen) {
297 Q_D(QXYSeries);
288 m_pen = pen;
298 if (d->m_pen!=pen) {
289 emit updated();
299 d->m_pen = pen;
300 emit d->updated();
290 }
301 }
291 }
302 }
292
303
304 QPen QXYSeries::pen() const
305 {
306 Q_D(const QXYSeries);
307 return d->m_pen;
308 }
309
293 /*!
310 /*!
294 Sets \a brush used for drawing points on the chart. If the brush is not defined, brush
311 Sets \a brush used for drawing points on the chart. If the brush is not defined, brush
295 from chart theme setting is used.
312 from chart theme setting is used.
@@ -297,12 +314,39 void QXYSeries::setPen(const QPen &pen)
297 */
314 */
298 void QXYSeries::setBrush(const QBrush &brush)
315 void QXYSeries::setBrush(const QBrush &brush)
299 {
316 {
300 if (brush != m_brush) {
317 Q_D(QXYSeries);
301 m_brush = brush;
318 if (d->m_brush!=brush) {
302 emit updated();
319 d->m_brush = brush;
320 emit d->updated();
303 }
321 }
304 }
322 }
305
323
324 QBrush QXYSeries::brush() const
325 {
326 Q_D(const QXYSeries);
327 return d->m_brush;
328 }
329
330
331 /*!
332 Sets if data points are \a visible and should be drawn on line.
333 */
334 void QXYSeries::setPointsVisible(bool visible)
335 {
336 Q_D(QXYSeries);
337 if (d->m_pointsVisible != visible){
338 d->m_pointsVisible = visible;
339 emit d->updated();
340 }
341 }
342
343
344 bool QXYSeries::pointsVisible() const
345 {
346 Q_D(const QXYSeries);
347 return d->m_pointsVisible;
348 }
349
306
350
307 /*!
351 /*!
308 Stream operator for adding a data \a point to the series.
352 Stream operator for adding a data \a point to the series.
@@ -332,13 +376,13 QXYSeries& QXYSeries::operator<< (const QList<QPointF> points)
332 void QXYSeries::modelUpdated(QModelIndex topLeft, QModelIndex bottomRight)
376 void QXYSeries::modelUpdated(QModelIndex topLeft, QModelIndex bottomRight)
333 {
377 {
334 Q_UNUSED(bottomRight)
378 Q_UNUSED(bottomRight)
335
379 Q_D(QXYSeries);
336 if (m_mapOrientation == Qt::Vertical) {
380 if (d->m_mapOrientation == Qt::Vertical) {
337 if (topLeft.row() >= m_mapFirst && (!m_mapLimited || topLeft.row() < m_mapFirst + m_mapCount))
381 if (topLeft.row() >= d->m_mapFirst && (!d->m_mapLimited || topLeft.row() < d->m_mapFirst + d->m_mapCount))
338 emit pointReplaced(topLeft.row() - m_mapFirst);
382 emit d->pointReplaced(topLeft.row() - d->m_mapFirst);
339 } else {
383 } else {
340 if (topLeft.column() >= m_mapFirst && (!m_mapLimited || topLeft.column() < m_mapFirst + m_mapCount))
384 if (topLeft.column() >= d->m_mapFirst && (!d->m_mapLimited || topLeft.column() < d->m_mapFirst + d->m_mapCount))
341 emit pointReplaced(topLeft.column() - m_mapFirst);
385 emit d->pointReplaced(topLeft.column() - d->m_mapFirst);
342 }
386 }
343 }
387 }
344
388
@@ -349,9 +393,9 void QXYSeries::modelDataAboutToBeAdded(QModelIndex parent, int start, int end)
349 {
393 {
350 Q_UNUSED(parent)
394 Q_UNUSED(parent)
351 // Q_UNUSED(end)
395 // Q_UNUSED(end)
352
396 Q_D(QXYSeries);
353 if (m_mapLimited) {
397 if (d->m_mapLimited) {
354 if (start >= m_mapFirst + m_mapCount) {
398 if (start >= d->m_mapFirst + d->m_mapCount) {
355 // the added data is below mapped area
399 // the added data is below mapped area
356 // therefore it has no relevance
400 // therefore it has no relevance
357 return;
401 return;
@@ -362,10 +406,10 void QXYSeries::modelDataAboutToBeAdded(QModelIndex parent, int start, int end)
362 // if the number of items currently is equal the m_mapCount then some needs to be removed from xychartitem
406 // if the number of items currently is equal the m_mapCount then some needs to be removed from xychartitem
363 // internal storage before new ones can be added
407 // internal storage before new ones can be added
364
408
365 int itemsToRemove = qMin(count() - qMax(start - m_mapFirst, 0), end - start + 1);
409 int itemsToRemove = qMin(count() - qMax(start - d->m_mapFirst, 0), end - start + 1);
366 if (m_mapCount == count()) {
410 if (d->m_mapCount == count()) {
367 for (int i = 0; i < itemsToRemove; i++)
411 for (int i = 0; i < itemsToRemove; i++)
368 emit pointRemoved(qMin(end, count()) - i);
412 emit d->pointRemoved(qMin(end, count()) - i);
369 }
413 }
370 }
414 }
371 } else {
415 } else {
@@ -382,9 +426,9 void QXYSeries::modelDataAdded(QModelIndex parent, int start, int end)
382 {
426 {
383 Q_UNUSED(parent)
427 Q_UNUSED(parent)
384 // Q_UNUSED(end)
428 // Q_UNUSED(end)
385
429 Q_D(QXYSeries);
386 if (m_mapLimited) {
430 if (d->m_mapLimited) {
387 if (start >= m_mapFirst + m_mapCount) {
431 if (start >= d->m_mapFirst + d->m_mapCount) {
388 // the added data is below mapped area
432 // the added data is below mapped area
389 // therefore it has no relevance
433 // therefore it has no relevance
390 return;
434 return;
@@ -392,16 +436,16 void QXYSeries::modelDataAdded(QModelIndex parent, int start, int end)
392 // the added data is in the mapped area or before it
436 // the added data is in the mapped area or before it
393 // update needed
437 // update needed
394 if (count() > 0) {
438 if (count() > 0) {
395 int toBeAdded = qMin(m_mapCount - (start - m_mapFirst), end - start + 1);
439 int toBeAdded = qMin(d->m_mapCount - (start - d->m_mapFirst), end - start + 1);
396 for (int i = 0; i < toBeAdded; i++)
440 for (int i = 0; i < toBeAdded; i++)
397 if (start + i >= m_mapFirst)
441 if (start + i >= d->m_mapFirst)
398 emit pointAdded(start + i);
442 emit d->pointAdded(start + i);
399 }
443 }
400 }
444 }
401 } else {
445 } else {
402 // map is not limited (it included all the items starting from m_mapFirst till the end of model)
446 // map is not limited (it included all the items starting from m_mapFirst till the end of model)
403 for (int i = 0; i < end - start + 1; i++)
447 for (int i = 0; i < end - start + 1; i++)
404 emit pointAdded(start + i);
448 emit d->pointAdded(start + i);
405 }
449 }
406 }
450 }
407
451
@@ -412,9 +456,9 void QXYSeries::modelDataAboutToBeRemoved(QModelIndex parent, int start, int end
412 {
456 {
413 Q_UNUSED(parent)
457 Q_UNUSED(parent)
414 // Q_UNUSED(end)
458 // Q_UNUSED(end)
415
459 Q_D(QXYSeries);
416 if (m_mapLimited) {
460 if (d->m_mapLimited) {
417 if (start >= m_mapFirst + m_mapCount) {
461 if (start >= d->m_mapFirst + d->m_mapCount) {
418 // the removed data is below mapped area
462 // the removed data is below mapped area
419 // therefore it has no relevance
463 // therefore it has no relevance
420 return;
464 return;
@@ -426,14 +470,14 void QXYSeries::modelDataAboutToBeRemoved(QModelIndex parent, int start, int end
426 // the number equals the number of items that are removed and that lay before
470 // the number equals the number of items that are removed and that lay before
427 // or in the mapped area. Items that lay beyond the map do not count
471 // or in the mapped area. Items that lay beyond the map do not count
428 // the max is the current number of items in storage (count())
472 // the max is the current number of items in storage (count())
429 int itemsToRemove = qMin(count(), qMin(end, m_mapFirst + m_mapCount - 1) - start + 1);
473 int itemsToRemove = qMin(count(), qMin(end, d->m_mapFirst + d->m_mapCount - 1) - start + 1);
430 for (int i = 0; i < itemsToRemove; i++)
474 for (int i = 0; i < itemsToRemove; i++)
431 emit pointRemoved(start);
475 emit d->pointRemoved(start);
432 }
476 }
433 } else {
477 } else {
434 // map is not limited (it included all the items starting from m_mapFirst till the end of model)
478 // map is not limited (it included all the items starting from m_mapFirst till the end of model)
435 for (int i = 0; i < end - start + 1; i++)
479 for (int i = 0; i < end - start + 1; i++)
436 emit pointRemoved(start);
480 emit d->pointRemoved(start);
437 }
481 }
438 }
482 }
439
483
@@ -442,14 +486,15 void QXYSeries::modelDataAboutToBeRemoved(QModelIndex parent, int start, int end
442 */
486 */
443 void QXYSeries::modelDataRemoved(QModelIndex parent, int start, int end)
487 void QXYSeries::modelDataRemoved(QModelIndex parent, int start, int end)
444 {
488 {
489
445 Q_UNUSED(parent)
490 Q_UNUSED(parent)
446 Q_UNUSED(end)
491 Q_UNUSED(end)
447
492 Q_D(QXYSeries);
448 // how many items there were before data was removed
493 // how many items there were before data was removed
449 // int oldCount = count() - 1;
494 // int oldCount = count() - 1;
450
495
451 if (m_mapLimited) {
496 if (d->m_mapLimited) {
452 if (start >= m_mapFirst + m_mapCount) {
497 if (start >= d->m_mapFirst + d->m_mapCount) {
453 // the removed data is below mapped area
498 // the removed data is below mapped area
454 // therefore it has no relevance
499 // therefore it has no relevance
455 return;
500 return;
@@ -457,18 +502,18 void QXYSeries::modelDataRemoved(QModelIndex parent, int start, int end)
457 // if the current items count in the whole model is bigger than the index of the last item
502 // if the current items count in the whole model is bigger than the index of the last item
458 // that was removed than it means there are some extra items available
503 // that was removed than it means there are some extra items available
459
504
460 int removedItemsCount = qMin(count(), qMin(end, m_mapFirst + m_mapCount - 1) - start + 1);
505 int removedItemsCount = qMin(count(), qMin(end, d->m_mapFirst + d->m_mapCount - 1) - start + 1);
461 int extraItemsAvailable = 0;
506 int extraItemsAvailable = 0;
462 if (m_mapOrientation == Qt::Vertical) {
507 if (d->m_mapOrientation == Qt::Vertical) {
463 extraItemsAvailable = qMax(m_model->rowCount() + (end - start + 1) - qMax(end + 1, m_mapFirst + m_mapCount), 0);
508 extraItemsAvailable = qMax(d->m_model->rowCount() + (end - start + 1) - qMax(end + 1, d->m_mapFirst + d->m_mapCount), 0);
464 } else {
509 } else {
465 extraItemsAvailable = qMax(m_model->columnCount() + (end - start + 1) - qMax(end + 1, m_mapFirst + m_mapCount), 0);
510 extraItemsAvailable = qMax(d->m_model->columnCount() + (end - start + 1) - qMax(end + 1, d->m_mapFirst + d->m_mapCount), 0);
466 }
511 }
467
512
468 // if there are excess items available (below the mapped area) use them to repopulate mapped area
513 // if there are excess items available (below the mapped area) use them to repopulate mapped area
469 int toBeAdded = qMin(extraItemsAvailable, removedItemsCount);
514 int toBeAdded = qMin(extraItemsAvailable, removedItemsCount);
470 for (int k = 0; k < toBeAdded; k++)
515 for (int k = 0; k < toBeAdded; k++)
471 emit pointAdded(m_mapFirst + m_mapCount - removedItemsCount + k);
516 emit d->pointAdded(d->m_mapFirst + d->m_mapCount - removedItemsCount + k);
472 }
517 }
473 } else {
518 } else {
474 // data was removed from XYSeries interal storage. Nothing more to do
519 // data was removed from XYSeries interal storage. Nothing more to do
@@ -480,25 +525,26 void QXYSeries::modelDataRemoved(QModelIndex parent, int start, int end)
480 Sets the \a model to be used as a data source
525 Sets the \a model to be used as a data source
481 \sa setModelMapping(), setModelMappingRange()
526 \sa setModelMapping(), setModelMappingRange()
482 */
527 */
483 bool QXYSeries::setModel(QAbstractItemModel *model) {
528 bool QXYSeries::setModel(QAbstractItemModel *model)
484
529 {
530 Q_D(QXYSeries);
485 // disconnect signals from old model
531 // disconnect signals from old model
486 if (m_model) {
532 if (d->m_model) {
487 disconnect(m_model, 0, this, 0);
533 QObject::disconnect(d->m_model, 0, this, 0);
488 m_mapX = -1;
534 d->m_mapX = -1;
489 m_mapY = -1;
535 d->m_mapY = -1;
490 m_mapFirst = 0;
536 d->m_mapFirst = 0;
491 m_mapCount = 0;
537 d->m_mapCount = 0;
492 m_mapLimited = false;
538 d->m_mapLimited = false;
493 m_mapOrientation = Qt::Vertical;
539 d->m_mapOrientation = Qt::Vertical;
494 }
540 }
495
541
496 // set new model
542 // set new model
497 if (model) {
543 if (model) {
498 m_model = model;
544 d->m_model = model;
499 return true;
545 return true;
500 } else {
546 } else {
501 m_model = 0;
547 d->m_model = 0;
502 return false;
548 return false;
503 }
549 }
504 }
550 }
@@ -512,24 +558,25 bool QXYSeries::setModel(QAbstractItemModel *model) {
512 */
558 */
513 void QXYSeries::setModelMapping(int modelX, int modelY, Qt::Orientation orientation)
559 void QXYSeries::setModelMapping(int modelX, int modelY, Qt::Orientation orientation)
514 {
560 {
515 if (m_model == 0)
561 Q_D(QXYSeries);
562 if (d->m_model == 0)
516 return;
563 return;
517 m_mapX = modelX;
564 d->m_mapX = modelX;
518 m_mapY = modelY;
565 d->m_mapY = modelY;
519 m_mapFirst = 0;
566 d->m_mapFirst = 0;
520 m_mapOrientation = orientation;
567 d->m_mapOrientation = orientation;
521 if (m_mapOrientation == Qt::Vertical) {
568 if (d->m_mapOrientation == Qt::Vertical) {
522 connect(m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(modelUpdated(QModelIndex, QModelIndex)));
569 connect(d->m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(modelUpdated(QModelIndex, QModelIndex)));
523 connect(m_model,SIGNAL(rowsAboutToBeInserted(QModelIndex, int, int)), this, SLOT(modelDataAboutToBeAdded(QModelIndex,int,int)));
570 connect(d->m_model,SIGNAL(rowsAboutToBeInserted(QModelIndex, int, int)), this, SLOT(modelDataAboutToBeAdded(QModelIndex,int,int)));
524 connect(m_model,SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(modelDataAdded(QModelIndex,int,int)));
571 connect(d->m_model,SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(modelDataAdded(QModelIndex,int,int)));
525 connect(m_model, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), this, SLOT(modelDataAboutToBeRemoved(QModelIndex,int,int)));
572 connect(d->m_model, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), this, SLOT(modelDataAboutToBeRemoved(QModelIndex,int,int)));
526 connect(m_model, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(modelDataRemoved(QModelIndex,int,int)));
573 connect(d->m_model, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(modelDataRemoved(QModelIndex,int,int)));
527 } else {
574 } else {
528 connect(m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(modelUpdated(QModelIndex, QModelIndex)));
575 connect(d->m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(modelUpdated(QModelIndex, QModelIndex)));
529 connect(m_model,SIGNAL(columnsAboutToBeInserted(QModelIndex, int, int)), this, SLOT(modelDataAboutToBeAdded(QModelIndex,int,int)));
576 connect(d->m_model,SIGNAL(columnsAboutToBeInserted(QModelIndex, int, int)), this, SLOT(modelDataAboutToBeAdded(QModelIndex,int,int)));
530 connect(m_model,SIGNAL(columnsInserted(QModelIndex, int, int)), this, SLOT(modelDataAdded(QModelIndex,int,int)));
577 connect(d->m_model,SIGNAL(columnsInserted(QModelIndex, int, int)), this, SLOT(modelDataAdded(QModelIndex,int,int)));
531 connect(m_model, SIGNAL(columnsAboutToBeRemoved(QModelIndex, int, int)), this, SLOT(modelDataAboutToBeRemoved(QModelIndex,int,int)));
578 connect(d->m_model, SIGNAL(columnsAboutToBeRemoved(QModelIndex, int, int)), this, SLOT(modelDataAboutToBeRemoved(QModelIndex,int,int)));
532 connect(m_model, SIGNAL(columnsRemoved(QModelIndex, int, int)), this, SLOT(modelDataRemoved(QModelIndex,int,int)));
579 connect(d->m_model, SIGNAL(columnsRemoved(QModelIndex, int, int)), this, SLOT(modelDataRemoved(QModelIndex,int,int)));
533 }
580 }
534 }
581 }
535
582
@@ -543,15 +590,43 void QXYSeries::setModelMapping(int modelX, int modelY, Qt::Orientation orientat
543 */
590 */
544 void QXYSeries::setModelMappingRange(int first, int count)
591 void QXYSeries::setModelMappingRange(int first, int count)
545 {
592 {
546 m_mapFirst = first;
593 Q_D(QXYSeries);
594 d->m_mapFirst = first;
547 if (count == 0) {
595 if (count == 0) {
548 m_mapLimited = false;
596 d->m_mapLimited = false;
549 } else {
597 } else {
550 m_mapCount = count;
598 d->m_mapCount = count;
551 m_mapLimited = true;
599 d->m_mapLimited = true;
552 }
600 }
553 }
601 }
554
602
603 int QXYSeries::mapFirst() const
604 {
605 Q_D(const QXYSeries);
606 return d->m_mapFirst;
607 }
608
609 int QXYSeries::mapCount() const
610 {
611 Q_D(const QXYSeries);
612 return d->m_mapCount;
613 }
614
615 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
616
617 QXYSeriesPrivate::QXYSeriesPrivate(QXYSeries *q): QSeriesPrivate(q),
618 m_mapX(-1),
619 m_mapY(-1),
620 m_mapFirst(0),
621 m_mapCount(0),
622 m_mapLimited(false),
623 m_mapOrientation( Qt::Vertical),
624 m_pointsVisible(false)
625 {
626
627 }
628
555 #include "moc_qxyseries.cpp"
629 #include "moc_qxyseries.cpp"
630 #include "moc_qxyseries_p.cpp"
556
631
557 QTCOMMERCIALCHART_END_NAMESPACE
632 QTCOMMERCIALCHART_END_NAMESPACE
@@ -30,12 +30,15 class QModelIndex;
30
30
31 QTCOMMERCIALCHART_BEGIN_NAMESPACE
31 QTCOMMERCIALCHART_BEGIN_NAMESPACE
32
32
33 class QXYSeriesPrivate;
34
33 class QTCOMMERCIALCHART_EXPORT QXYSeries : public QSeries
35 class QTCOMMERCIALCHART_EXPORT QXYSeries : public QSeries
34 {
36 {
35 Q_OBJECT
37 Q_OBJECT
36 protected:
38 protected:
37 QXYSeries(QObject *parent = 0);
39 explicit QXYSeries(QObject *parent = 0);
38 virtual ~QXYSeries();
40 explicit QXYSeries(QXYSeriesPrivate &d,QObject *parent = 0);
41 ~QXYSeries();
39
42
40 public:
43 public:
41 void append(qreal x, qreal y);
44 void append(qreal x, qreal y);
@@ -57,16 +60,20 public:
57 QXYSeries& operator << (const QList<QPointF> points);
60 QXYSeries& operator << (const QList<QPointF> points);
58
61
59 void setPen(const QPen &pen);
62 void setPen(const QPen &pen);
60 QPen pen() const {return m_pen;}
63 QPen pen() const;
64
61 void setBrush(const QBrush &brush);
65 void setBrush(const QBrush &brush);
62 QBrush brush() const {return m_brush;}
66 QBrush brush() const;
67
68 void setPointsVisible(bool visible);
69 bool pointsVisible() const;
63
70
64 bool setModel(QAbstractItemModel *model);
71 bool setModel(QAbstractItemModel *model);
65
72
66 virtual void setModelMapping(int modelX, int modelY, Qt::Orientation orientation = Qt::Vertical);
73 virtual void setModelMapping(int modelX, int modelY, Qt::Orientation orientation = Qt::Vertical);
67 virtual void setModelMappingRange(int first, int count = 0);
74 virtual void setModelMappingRange(int first, int count = 0);
68 int mapFirst() const { return m_mapFirst; }
75 int mapFirst() const;
69 int mapCount() const { return m_mapCount; }
76 int mapCount() const;
70
77
71 private Q_SLOTS:
78 private Q_SLOTS:
72 void modelUpdated(QModelIndex topLeft, QModelIndex bottomRight);
79 void modelUpdated(QModelIndex topLeft, QModelIndex bottomRight);
@@ -78,25 +85,12 private Q_SLOTS:
78 Q_SIGNALS:
85 Q_SIGNALS:
79 void clicked(const QPointF &point);
86 void clicked(const QPointF &point);
80 void selected();
87 void selected();
81 void updated();
82 void pointReplaced(int index);
83 void pointRemoved(int index);
84 void pointAdded(int index);
85
88
86 protected:
89 private:
87 QVector<qreal> m_x;
90 Q_DECLARE_PRIVATE(QXYSeries);
88 QVector<qreal> m_y;
91 Q_DISABLE_COPY(QXYSeries);
89
92 friend class XYLegendMarker;
90 QPen m_pen;
93 friend class XYChartItem;
91 QBrush m_brush;
92
93 int m_mapX;
94 int m_mapY;
95 int m_mapFirst;
96 int m_mapCount;
97 bool m_mapLimited;
98 Qt::Orientation m_mapOrientation;
99 int tempItemsRemoved;
100 };
94 };
101
95
102 QTCOMMERCIALCHART_END_NAMESPACE
96 QTCOMMERCIALCHART_END_NAMESPACE
@@ -6,7 +6,8 SOURCES += \
6 $$PWD/qxyseries.cpp
6 $$PWD/qxyseries.cpp
7
7
8 PRIVATE_HEADERS += \
8 PRIVATE_HEADERS += \
9 $$PWD/xychartitem_p.h
9 $$PWD/xychartitem_p.h \
10 $$PWD/qxyseries_p.h
10
11
11
12
12 PUBLIC_HEADERS += \
13 PUBLIC_HEADERS += \
@@ -20,6 +20,7
20
20
21 #include "xychartitem_p.h"
21 #include "xychartitem_p.h"
22 #include "qxyseries.h"
22 #include "qxyseries.h"
23 #include "qxyseries_p.h"
23 #include "chartpresenter_p.h"
24 #include "chartpresenter_p.h"
24 #include "chartanimator_p.h"
25 #include "chartanimator_p.h"
25 #include <QPainter>
26 #include <QPainter>
@@ -37,9 +38,9 XYChartItem::XYChartItem(QXYSeries *series, ChartPresenter *presenter):ChartItem
37 m_maxY(0),
38 m_maxY(0),
38 m_series(series)
39 m_series(series)
39 {
40 {
40 connect(series,SIGNAL(pointReplaced(int)),this,SLOT(handlePointReplaced(int)));
41 connect(series->d_func(),SIGNAL(pointReplaced(int)),this,SLOT(handlePointReplaced(int)));
41 connect(series,SIGNAL(pointAdded(int)),this,SLOT(handlePointAdded(int)));
42 connect(series->d_func(),SIGNAL(pointAdded(int)),this,SLOT(handlePointAdded(int)));
42 connect(series,SIGNAL(pointRemoved(int)),this,SLOT(handlePointRemoved(int)));
43 connect(series->d_func(),SIGNAL(pointRemoved(int)),this,SLOT(handlePointRemoved(int)));
43 connect(this,SIGNAL(clicked(const QPointF&)),series,SIGNAL(clicked(const QPointF&)));
44 connect(this,SIGNAL(clicked(const QPointF&)),series,SIGNAL(clicked(const QPointF&)));
44 }
45 }
45
46
@@ -123,7 +124,7 void XYChartItem::handlePointAdded(int index)
123 update();
124 update();
124 }
125 }
125 void XYChartItem::handlePointRemoved(int index)
126 void XYChartItem::handlePointRemoved(int index)
126 {
127 {
127 QVector<QPointF> points = m_points;
128 QVector<QPointF> points = m_points;
128 if (m_series->model()) {
129 if (m_series->model()) {
129 if (index < m_series->mapFirst())
130 if (index < m_series->mapFirst())
General Comments 0
You need to be logged in to leave comments. Login now