@@ -0,0 +1,50 | |||||
|
1 | /**************************************************************************** | |||
|
2 | ** | |||
|
3 | ** Copyright (C) 2013 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 | #include "scatteranimation_p.h" | |||
|
22 | #include "scatterchartitem_p.h" | |||
|
23 | #include <QDebug> | |||
|
24 | ||||
|
25 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | |||
|
26 | ||||
|
27 | ScatterAnimation::ScatterAnimation(ScatterChartItem *item) | |||
|
28 | : XYAnimation(item) | |||
|
29 | { | |||
|
30 | } | |||
|
31 | ||||
|
32 | ScatterAnimation::~ScatterAnimation() | |||
|
33 | { | |||
|
34 | } | |||
|
35 | ||||
|
36 | void ScatterAnimation::updateState(QAbstractAnimation::State newState, QAbstractAnimation::State oldState) | |||
|
37 | { | |||
|
38 | XYAnimation::updateState(newState, oldState); | |||
|
39 | ||||
|
40 | if (oldState == QAbstractAnimation::Running && newState == QAbstractAnimation::Stopped | |||
|
41 | && animationType() == RemovePointAnimation) { | |||
|
42 | // Removing a point from scatter chart will keep extra marker item after animation stops. | |||
|
43 | // Also, if the removed point was not the last one in series, points after the removed one | |||
|
44 | // will report wrong coordinates when clicked. To fix these issues, update geometry after | |||
|
45 | // point removal animation has finished. | |||
|
46 | chartItem()->updateGeometry(); | |||
|
47 | } | |||
|
48 | } | |||
|
49 | ||||
|
50 | QTCOMMERCIALCHART_END_NAMESPACE |
@@ -0,0 +1,50 | |||||
|
1 | /**************************************************************************** | |||
|
2 | ** | |||
|
3 | ** Copyright (C) 2013 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 SCATTERANIMATION_P_H | |||
|
31 | #define SCATTERANIMATION_P_H | |||
|
32 | #include "xyanimation_p.h" | |||
|
33 | ||||
|
34 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | |||
|
35 | ||||
|
36 | class ScatterChartItem; | |||
|
37 | ||||
|
38 | class ScatterAnimation : public XYAnimation | |||
|
39 | { | |||
|
40 | public: | |||
|
41 | ScatterAnimation(ScatterChartItem *item); | |||
|
42 | ~ScatterAnimation(); | |||
|
43 | ||||
|
44 | protected: | |||
|
45 | void updateState(QAbstractAnimation::State newState, QAbstractAnimation::State oldState); | |||
|
46 | }; | |||
|
47 | ||||
|
48 | QTCOMMERCIALCHART_END_NAMESPACE | |||
|
49 | ||||
|
50 | #endif |
@@ -7,7 +7,8 SOURCES += \ | |||||
7 | $$PWD/pieanimation.cpp \ |
|
7 | $$PWD/pieanimation.cpp \ | |
8 | $$PWD/piesliceanimation.cpp \ |
|
8 | $$PWD/piesliceanimation.cpp \ | |
9 | $$PWD/splineanimation.cpp \ |
|
9 | $$PWD/splineanimation.cpp \ | |
10 | $$PWD/baranimation.cpp |
|
10 | $$PWD/baranimation.cpp \ | |
|
11 | $$PWD/scatteranimation.cpp | |||
11 |
|
12 | |||
12 | PRIVATE_HEADERS += \ |
|
13 | PRIVATE_HEADERS += \ | |
13 | $$PWD/axisanimation_p.h \ |
|
14 | $$PWD/axisanimation_p.h \ | |
@@ -16,4 +17,5 PRIVATE_HEADERS += \ | |||||
16 | $$PWD/pieanimation_p.h \ |
|
17 | $$PWD/pieanimation_p.h \ | |
17 | $$PWD/piesliceanimation_p.h \ |
|
18 | $$PWD/piesliceanimation_p.h \ | |
18 | $$PWD/splineanimation_p.h \ |
|
19 | $$PWD/splineanimation_p.h \ | |
19 | $$PWD/baranimation_p.h |
|
20 | $$PWD/baranimation_p.h \ | |
|
21 | $$PWD/scatteranimation_p.h |
@@ -77,9 +77,9 void SplineAnimation::setup(QVector<QPointF> &oldPoints, QVector<QPointF> &newPo | |||||
77 | m_newSpline.second.insert((index - 1) * 2, newPoints[index - 1]); |
|
77 | m_newSpline.second.insert((index - 1) * 2, newPoints[index - 1]); | |
78 | m_newSpline.second.insert((index - 1) * 2 + 1, newPoints[index - 1]); |
|
78 | m_newSpline.second.insert((index - 1) * 2 + 1, newPoints[index - 1]); | |
79 | } else { |
|
79 | } else { | |
80 |
m_newSpline.first.insert( |
|
80 | m_newSpline.first.insert(0, newPoints[index]); | |
81 |
m_newSpline.second.insert( |
|
81 | m_newSpline.second.insert(0, newPoints[index]); | |
82 |
m_newSpline.second.insert( |
|
82 | m_newSpline.second.insert(1, newPoints[index]); | |
83 | } |
|
83 | } | |
84 | m_index = index; |
|
84 | m_index = index; | |
85 | m_type = RemovePointAnimation; |
|
85 | m_type = RemovePointAnimation; | |
@@ -92,9 +92,9 void SplineAnimation::setup(QVector<QPointF> &oldPoints, QVector<QPointF> &newPo | |||||
92 | m_oldSpline.second.insert((index - 1) * 2, newPoints[index - 1]); |
|
92 | m_oldSpline.second.insert((index - 1) * 2, newPoints[index - 1]); | |
93 | m_oldSpline.second.insert((index - 1) * 2 + 1, newPoints[index - 1]); |
|
93 | m_oldSpline.second.insert((index - 1) * 2 + 1, newPoints[index - 1]); | |
94 | } else { |
|
94 | } else { | |
95 |
m_oldSpline.first.insert( |
|
95 | m_oldSpline.first.insert(0, newPoints[index]); | |
96 |
m_oldSpline.second.insert( |
|
96 | m_oldSpline.second.insert(0, newPoints[index]); | |
97 |
m_oldSpline.second.insert( |
|
97 | m_oldSpline.second.insert(1, newPoints[index]); | |
98 | } |
|
98 | } | |
99 | m_index = index; |
|
99 | m_index = index; | |
100 | m_type = AddPointAnimation; |
|
100 | m_type = AddPointAnimation; | |
@@ -186,9 +186,15 void SplineAnimation::updateState(QAbstractAnimation::State newState, QAbstractA | |||||
186 | if (oldState == QAbstractAnimation::Running && newState == QAbstractAnimation::Stopped) { |
|
186 | if (oldState == QAbstractAnimation::Running && newState == QAbstractAnimation::Stopped) { | |
187 | if (m_item->isDirty() && m_type == RemovePointAnimation) { |
|
187 | if (m_item->isDirty() && m_type == RemovePointAnimation) { | |
188 | if (!m_newSpline.first.isEmpty()) { |
|
188 | if (!m_newSpline.first.isEmpty()) { | |
189 |
|
|
189 | if (m_index) { | |
190 |
m_newSpline. |
|
190 | m_newSpline.first.remove(m_index); | |
191 | m_newSpline.second.remove((m_index - 1) * 2); |
|
191 | m_newSpline.second.remove((m_index - 1) * 2); | |
|
192 | m_newSpline.second.remove((m_index - 1) * 2); | |||
|
193 | } else { | |||
|
194 | m_newSpline.first.remove(0); | |||
|
195 | m_newSpline.second.remove(0); | |||
|
196 | m_newSpline.second.remove(0); | |||
|
197 | } | |||
192 | } |
|
198 | } | |
193 | m_item->setGeometryPoints(m_newSpline.first); |
|
199 | m_item->setGeometryPoints(m_newSpline.first); | |
194 | m_item->setControlGeometryPoints(m_newSpline.second); |
|
200 | m_item->setControlGeometryPoints(m_newSpline.second); |
@@ -51,6 +51,7 protected: | |||||
51 | QVariant interpolated(const QVariant &start, const QVariant &end, qreal progress) const; |
|
51 | QVariant interpolated(const QVariant &start, const QVariant &end, qreal progress) const; | |
52 | void updateCurrentValue(const QVariant &value); |
|
52 | void updateCurrentValue(const QVariant &value); | |
53 | void updateState(QAbstractAnimation::State newState, QAbstractAnimation::State oldState); |
|
53 | void updateState(QAbstractAnimation::State newState, QAbstractAnimation::State oldState); | |
|
54 | XYChart *chartItem() { return m_item; } | |||
54 | protected: |
|
55 | protected: | |
55 | Animation m_type; |
|
56 | Animation m_type; | |
56 | bool m_dirty; |
|
57 | bool m_dirty; |
@@ -23,6 +23,7 | |||||
23 | #include "scatterchartitem_p.h" |
|
23 | #include "scatterchartitem_p.h" | |
24 | #include "chartdataset_p.h" |
|
24 | #include "chartdataset_p.h" | |
25 | #include "charttheme_p.h" |
|
25 | #include "charttheme_p.h" | |
|
26 | #include "scatteranimation_p.h" | |||
26 |
|
27 | |||
27 | /*! |
|
28 | /*! | |
28 | \class QScatterSeries |
|
29 | \class QScatterSeries | |
@@ -282,6 +283,19 void QScatterSeriesPrivate::initializeTheme(int index, ChartTheme* theme, bool f | |||||
282 | } |
|
283 | } | |
283 | } |
|
284 | } | |
284 |
|
285 | |||
|
286 | void QScatterSeriesPrivate::initializeAnimations(QChart::AnimationOptions options) | |||
|
287 | { | |||
|
288 | ScatterChartItem *item = static_cast<ScatterChartItem *>(m_item.data()); | |||
|
289 | Q_ASSERT(item); | |||
|
290 | ||||
|
291 | if (options.testFlag(QChart::SeriesAnimations)) | |||
|
292 | item->setAnimation(new ScatterAnimation(item)); | |||
|
293 | else | |||
|
294 | item->setAnimation(0); | |||
|
295 | ||||
|
296 | QAbstractSeriesPrivate::initializeAnimations(options); | |||
|
297 | } | |||
|
298 | ||||
285 | #include "moc_qscatterseries.cpp" |
|
299 | #include "moc_qscatterseries.cpp" | |
286 |
|
300 | |||
287 | QTCOMMERCIALCHART_END_NAMESPACE |
|
301 | QTCOMMERCIALCHART_END_NAMESPACE |
@@ -40,6 +40,7 public: | |||||
40 | QScatterSeriesPrivate(QScatterSeries *q); |
|
40 | QScatterSeriesPrivate(QScatterSeries *q); | |
41 | void initializeGraphics(QGraphicsItem* parent); |
|
41 | void initializeGraphics(QGraphicsItem* parent); | |
42 | void initializeTheme(int index, ChartTheme* theme, bool forced = false); |
|
42 | void initializeTheme(int index, ChartTheme* theme, bool forced = false); | |
|
43 | void initializeAnimations(QtCommercialChart::QChart::AnimationOptions options); | |||
43 |
|
44 | |||
44 | private: |
|
45 | private: | |
45 | QScatterSeries::MarkerShape m_shape; |
|
46 | QScatterSeries::MarkerShape m_shape; |
@@ -133,13 +133,13 void ScatterChartItem::updateGeometry() | |||||
133 | QGraphicsItem *item = items.at(i); |
|
133 | QGraphicsItem *item = items.at(i); | |
134 | const QPointF &point = points.at(i); |
|
134 | const QPointF &point = points.at(i); | |
135 | const QRectF &rect = item->boundingRect(); |
|
135 | const QRectF &rect = item->boundingRect(); | |
136 |
// During remove |
|
136 | // During remove animation series may have different number of points, | |
137 | // so ensure we don't go over the index. Animation handling itself ensures that |
|
137 | // so ensure we don't go over the index. Animation handling itself ensures that | |
138 | // if there is actually no points in the series, then it won't generate a fake point, |
|
138 | // if there is actually no points in the series, then it won't generate a fake point, | |
139 | // so we can be assured there is always at least one point in m_series here. |
|
139 | // so we can be assured there is always at least one point in m_series here. | |
140 | // Note that marker map values can be technically incorrect during the animation, |
|
140 | // Note that marker map values can be technically incorrect during the animation, | |
141 | // if it was caused by an insert, but this shouldn't be a problem as the points are |
|
141 | // if it was caused by an insert, but this shouldn't be a problem as the points are | |
142 | // fake anyway. |
|
142 | // fake anyway. After remove animation stops, geometry is updated to correct one. | |
143 | m_markerMap[item] = m_series->at(qMin(seriesLastIndex, i)); |
|
143 | m_markerMap[item] = m_series->at(qMin(seriesLastIndex, i)); | |
144 | item->setPos(point.x() - rect.width() / 2, point.y() - rect.height() / 2); |
|
144 | item->setPos(point.x() - rect.width() / 2, point.y() - rect.height() / 2); | |
145 |
|
145 |
@@ -73,7 +73,7 QVector<bool> XYChart::offGridStatusVector() | |||||
73 |
|
73 | |||
74 | QVector<bool> returnVector; |
|
74 | QVector<bool> returnVector; | |
75 | returnVector.resize(m_points.size()); |
|
75 | returnVector.resize(m_points.size()); | |
76 |
// During remove |
|
76 | // During remove animation series may have different number of points, | |
77 | // so ensure we don't go over the index. No need to check for zero points, this |
|
77 | // so ensure we don't go over the index. No need to check for zero points, this | |
78 | // will not be called in such a situation. |
|
78 | // will not be called in such a situation. | |
79 | const int seriesLastIndex = m_series->count() - 1; |
|
79 | const int seriesLastIndex = m_series->count() - 1; |
General Comments 0
You need to be logged in to leave comments.
Login now