##// END OF EJS Templates
Animation refactor...
Michal Klocek -
r530:d482058261e4
parent child
Show More
@@ -0,0 +1,13
1 INCLUDEPATH += $$PWD
2 DEPENDPATH += $$PWD
3
4 SOURCES += \
5 $$PWD/axisanimation.cpp \
6 $$PWD/chartanimator.cpp \
7 $$PWD/xyanimation.cpp
8
9 PRIVATE_HEADERS += \
10 $$PWD/axisanimation_p.h \
11 $$PWD/chartanimator_p.h \
12 $$PWD/chartanimation_p.h \
13 $$PWD/xyanimation_p.h No newline at end of file
@@ -0,0 +1,45
1 #include "axisanimation_p.h"
2 #include <QTimer>
3
4 Q_DECLARE_METATYPE(QVector<qreal>)
5
6 QTCOMMERCIALCHART_BEGIN_NAMESPACE
7
8
9 AxisAnimation::AxisAnimation(AxisItem *axis): ChartAnimation(axis),
10 m_axis(axis)
11 {
12 }
13
14 AxisAnimation::~AxisAnimation()
15 {
16 }
17
18 QVariant AxisAnimation::interpolated(const QVariant &start, const QVariant & end, qreal progress ) const
19 {
20 QVector<qreal> startVector = qVariantValue<QVector<qreal> >(start);
21 QVector<qreal> endVecotr = qVariantValue<QVector<qreal> >(end);
22 QVector<qreal> result;
23
24 Q_ASSERT(startVector.count() == endVecotr.count()) ;
25
26 for(int i =0 ;i< startVector.count();i++){
27 qreal value = startVector[i] + ((endVecotr[i]- startVector[i]) * progress);//qBound(0.0, progress, 1.0));
28 result << value;
29 }
30 return qVariantFromValue(result);
31 }
32
33
34 void AxisAnimation::updateCurrentValue (const QVariant & value )
35 {
36 if(state()!=QAbstractAnimation::Stopped)//workaround
37 {
38 QVector<qreal> vector = qVariantValue<QVector<qreal> >(value);
39 Q_ASSERT(vector.count()!=0);
40 m_axis->setLayout(vector);
41 }
42
43 }
44
45 QTCOMMERCIALCHART_END_NAMESPACE
@@ -0,0 +1,19
1 #ifndef CHARTANIMATION_H_
2 #define CHARTANIMATION_H_
3
4 #include "qchartglobal.h"
5 #include <QVariantAnimation>
6
7 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8
9 class ChartAnimation: public QVariantAnimation
10 {
11 public:
12 ChartAnimation(QObject* parent=0):QVariantAnimation(parent){};
13 };
14
15 QTCOMMERCIALCHART_END_NAMESPACE
16
17
18
19 #endif /* AXISITEM_H_ */
@@ -0,0 +1,141
1 #include "chartanimator_p.h"
2 #include "axisanimation_p.h"
3 #include "xyanimation_p.h"
4 #include "xychartitem_p.h"
5 #include <QTimer>
6
7 Q_DECLARE_METATYPE(QVector<QPointF>)
8 Q_DECLARE_METATYPE(QVector<qreal>)
9
10 QTCOMMERCIALCHART_BEGIN_NAMESPACE
11
12 const static int duration = 1000;
13
14 ChartAnimator::ChartAnimator(QObject *parent):QObject(parent)
15 {
16 }
17
18 ChartAnimator::~ChartAnimator()
19 {
20 }
21
22 void ChartAnimator::addAnimation(AxisItem* item)
23 {
24 AxisAnimation* animation = static_cast<AxisAnimation*>(m_animations.value(item));
25
26 if(!animation) {
27 animation = new AxisAnimation(item);
28 m_animations.insert(item,animation);
29 }
30
31 item->setAnimator(this);
32 }
33
34 void ChartAnimator::addAnimation(XYChartItem* item)
35 {
36 XYAnimation* animation = static_cast<XYAnimation*>(m_animations.value(item));
37
38 if(!animation) {
39 animation = new XYAnimation(item);
40 m_animations.insert(item,animation);
41 }
42
43 item->setAnimator(this);
44 }
45
46 void ChartAnimator::removeAnimation(ChartItem* item)
47 {
48 item->setAnimator(0);
49 m_animations.remove(item);
50 }
51
52 void ChartAnimator::applyLayout(AxisItem* item , QVector<qreal>& newLayout)
53 {
54 AxisAnimation* animation = static_cast<AxisAnimation*>(m_animations.value(item));
55
56 if(!animation) return;
57
58 QVector<qreal> oldLayout = item->layout();
59
60 if(newLayout.count()==0) return;
61
62 if(item->zoomFactor()<0) {
63
64 QRectF rect = item->geometry();
65 oldLayout.resize(newLayout.count());
66
67 for(int i=0,j=oldLayout.count()-1;i<(oldLayout.count()+1)/2;i++,j--)
68 {
69 oldLayout[i]= item->axisType()==AxisItem::X_AXIS?rect.left():rect.bottom();
70 oldLayout[j]= item->axisType()==AxisItem::X_AXIS?rect.right():rect.top();
71 }
72
73 }
74 else {
75
76 int index = qMin(oldLayout.count()*item->zoomFactor(),newLayout.count()-1.0);
77 oldLayout.resize(newLayout.count());
78
79 for(int i=0;i<oldLayout.count();i++)
80 {
81 oldLayout[i]= oldLayout[index]; //axisType()==X_AXIS?rect.center.x():rect.center().y();
82 }
83 }
84
85 if(animation->state()!=QAbstractAnimation::Stopped) {
86 animation->stop();
87 }
88
89 animation->setDuration(duration);
90 animation->setEasingCurve(QEasingCurve::OutQuart);
91 QVariantAnimation::KeyValues value;
92 animation->setKeyValues(value); //workaround for wrong interpolation call
93 animation->setKeyValueAt(0.0, qVariantFromValue(oldLayout));
94 animation->setKeyValueAt(1.0, qVariantFromValue(newLayout));
95
96 QTimer::singleShot(0,animation,SLOT(start()));
97 }
98
99 void ChartAnimator::applyLayout(XYChartItem* item, QVector<QPointF>& newPoints)
100 {
101
102 XYAnimation* animation = static_cast<XYAnimation*>(m_animations.value(item));
103
104 if(!animation) return;
105
106 QVector<QPointF> oldPoints = item->points();
107
108 if(newPoints.count()==0) return;
109
110 bool empty = oldPoints.count()==0;
111 oldPoints.resize(newPoints.size());
112
113 if(animation->state()!=QAbstractAnimation::Stopped) {
114 animation->stop();
115 }
116
117 animation->setDuration(duration);
118 if(!empty)
119 animation->setAnimationType(XYAnimation::MoveDownAnimation);
120 else
121 animation->setAnimationType(XYAnimation::LineDrawAnimation);
122 animation->setEasingCurve(QEasingCurve::OutQuart);
123 animation->setValues(oldPoints,newPoints);
124 QTimer::singleShot(0,animation,SLOT(start()));
125 }
126
127 void ChartAnimator::updateLayout(XYChartItem* item, QVector<QPointF>& newPoints)
128 {
129 XYAnimation* animation = static_cast<XYAnimation*>(m_animations.value(item));
130
131 if(!animation) return;
132
133 animation->setDuration(duration);
134 animation->setAnimationType(XYAnimation::MoveDownAnimation);
135 animation->setEasingCurve(QEasingCurve::OutQuart);
136 animation->updateValues(newPoints);
137
138 QTimer::singleShot(0,animation,SLOT(start()));
139 }
140
141 QTCOMMERCIALCHART_END_NAMESPACE
@@ -0,0 +1,35
1 #ifndef CHARTANIMATOR_P_H_
2 #define CHARTANIMATOR_P_H_
3 #include "qchartglobal.h"
4 #include "chartanimation_p.h"
5
6 QTCOMMERCIALCHART_BEGIN_NAMESPACE
7
8 class ChartItem;
9 class XYChartItem;
10 class AxisItem;
11
12
13 class ChartAnimator : public QObject {
14
15 public:
16 ChartAnimator(QObject *parent = 0);
17 virtual ~ChartAnimator();
18
19 void addAnimation(AxisItem* item);
20 void addAnimation(XYChartItem* item);
21
22 void removeAnimation(ChartItem* item);
23
24 void animationStarted();
25 void applyLayout(XYChartItem* item, QVector<QPointF>& layout);
26 void updateLayout(XYChartItem* item, QVector<QPointF>& layout);
27 void applyLayout(AxisItem* item, QVector<qreal>& layout);
28
29 private:
30 QMap<ChartItem*,ChartAnimation*> m_animations;
31 };
32
33 QTCOMMERCIALCHART_END_NAMESPACE
34
35 #endif
@@ -0,0 +1,34
1 #ifndef XYCHARTANIMATION_P_H_
2 #define XYCHARTANIMATION_P_H_
3 #include "chartanimation_p.h"
4 #include <QPointF>
5
6 QTCOMMERCIALCHART_BEGIN_NAMESPACE
7
8 class XYChartItem;
9
10 class XYAnimation : public ChartAnimation
11 {
12 public:
13 enum Animation { LineDrawAnimation, MoveDownAnimation, MoveUpAnimation };
14 XYAnimation(XYChartItem *item);
15 ~XYAnimation();
16 void setAnimationType(Animation type);
17 void setValues(QVector<QPointF>& oldPoints,QVector<QPointF>& newPoints);
18 void updateValues(QVector<QPointF>& newPoints);
19
20 protected:
21 QVariant interpolated(const QVariant &start, const QVariant & end, qreal progress ) const;
22 void updateCurrentValue (const QVariant & value );
23 void updateState ( QAbstractAnimation::State newState, QAbstractAnimation::State oldState);
24
25 private:
26 XYChartItem *m_item;
27 Animation m_type;
28 QVector<QPointF> m_points;
29 bool m_dirty;
30 };
31
32 QTCOMMERCIALCHART_END_NAMESPACE
33
34 #endif
@@ -33,6 +33,7 int main(int argc, char *argv[])
33 33 ChartWidget* chartWidget = new ChartWidget(&window);
34 34 chartWidget->setRenderHint(QPainter::Antialiasing);
35 35 chartWidget->setChartTitle("Zoom in/out line chart example");
36 chartWidget->setAnimationOptions(QChart::AllAnimations);
36 37 chartWidget->addSeries(series0);
37 38 chartWidget->addSeries(series1);
38 39
@@ -1,37 +1,17
1 1 #ifndef AXISANIMATIONITEM_H_
2 2 #define AXISANIMATIONITEM_H_
3 3
4 #include "domain_p.h"
5 4 #include "axisitem_p.h"
6 #include <QGraphicsItem>
7 #include <QVariantAnimation>
5 #include "chartanimation_p.h"
8 6
9 QTCOMMERCIALCHART_BEGIN_NAMESPACE
10
11 class AxisAnimator;
12
13 class AxisAnimationItem : public AxisItem
14 {
15 Q_OBJECT
16
17 public:
18 AxisAnimationItem(QChartAxis* axis,AxisType type = X_AXIS,QGraphicsItem* parent = 0);
19 ~AxisAnimationItem();
20 7
21 void setLabelsAngle(int angle);
22
23 protected:
24 virtual void updateLayout(QVector<qreal>& layout);
25
26 private:
27 AxisAnimator *m_animation;
28 };
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
29 9
30 class AxisAnimator: public QVariantAnimation
10 class AxisAnimation: public ChartAnimation
31 11 {
32 12 public:
33 AxisAnimator(AxisItem *axis,QObject *parent = 0);
34 ~AxisAnimator();
13 AxisAnimation(AxisItem *axis);
14 ~AxisAnimation();
35 15 protected:
36 16 virtual QVariant interpolated (const QVariant & from, const QVariant & to, qreal progress ) const;
37 17 virtual void updateCurrentValue (const QVariant & value );
@@ -1,103 +1,96
1 #ifndef XYCHARTANIMATOR_P_H_
2 #define XYCHARTANIMATOR_P_H_
3 #include "qchartglobal.h"
4 #include <QVariantAnimation>
5 #include <QPointF>
1 #include "xyanimation_p.h"
2 #include "xychartitem_p.h"
6 3
7 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8
9 template <class T, class U>
10 class XYChartAnimationItem;
4 Q_DECLARE_METATYPE(QVector<QPointF>)
11 5
6 QTCOMMERCIALCHART_BEGIN_NAMESPACE
12 7
13 template <class T, class U>
14 class XYChartAnimator : public QVariantAnimation
15 {
16 public:
17 enum Animation { LineDrawAnimation, MoveDownAnimation, MoveUpAnimation };
18 XYChartAnimator(XYChartAnimationItem<T,U> *item, QObject *parent = 0 );
19 ~XYChartAnimator();
20 void setAnimationType(Animation type);
21
22 protected:
23 QVariant interpolated(const QVariant &start, const QVariant & end, qreal progress ) const;
24 void updateCurrentValue (const QVariant & value );
25 void updateState ( QAbstractAnimation::State newState, QAbstractAnimation::State oldState);
26
27 private:
28 XYChartAnimationItem<T,U> *m_item;
29 Animation m_type;
30 };
31
32 template <class T, class U>
33 XYChartAnimator<T,U>::XYChartAnimator(XYChartAnimationItem<T,U> *item , QObject *parent):QVariantAnimation(parent),
8 XYAnimation::XYAnimation(XYChartItem *item):ChartAnimation(item),
34 9 m_item(item),
35 m_type(MoveDownAnimation)
10 m_type(MoveDownAnimation),
11 m_dirty(false)
36 12 {
37 13 }
38 14
39 template <class T,class U>
40 XYChartAnimator<T,U>::~XYChartAnimator()
15 XYAnimation::~XYAnimation()
41 16 {
42 17 }
43 18
44 template <class T,class U>
45 void XYChartAnimator<T,U>::setAnimationType(Animation type)
19 void XYAnimation::setAnimationType(Animation type)
46 20 {
47 21 m_type=type;
48 22 }
49 23
50 template <class T, class U>
51 QVariant XYChartAnimator<T,U>::interpolated(const QVariant &start, const QVariant & end, qreal progress ) const
24 void XYAnimation::setValues(QVector<QPointF>& oldPoints,QVector<QPointF>& newPoints)
52 25 {
53 QVector<QPointF> startVector = qVariantValue<QVector<QPointF> >(start);
54 QVector<QPointF> endVector = qVariantValue<QVector<QPointF> >(end);
55 QVector<QPointF> result;
56
57 switch(m_type) {
58
59 case MoveDownAnimation: {
60
61 Q_ASSERT(startVector.count() == endVector.count());
62 for(int i =0;i< startVector.count();i++) {
63 qreal x = startVector[i].x() + ((endVector[i].x()- startVector[i].x()) * progress);
64 qreal y = startVector[i].y() + ((endVector[i].y()- startVector[i].y()) * progress);
65 result << QPointF(x,y);
66 }
67
68 }
69 break;
70 case LineDrawAnimation:{
71 for(int i =0;i< endVector.count()* qBound(0.0, progress, 1.0);i++) {
72 result << endVector[i];
73 }
74 }
75 break;
76 default:
77 qWarning()<<"Unknow type of animation";
78 break;
79 }
80
81 return qVariantFromValue(result);
26 setKeyValueAt(0.0, qVariantFromValue(oldPoints));
27 setKeyValueAt(1.0, qVariantFromValue(newPoints));
28 m_points = newPoints;
29 m_dirty=false;
82 30 }
83 31
84 template <class T, class U>
85 void XYChartAnimator<T,U>::updateCurrentValue (const QVariant & value )
32 void XYAnimation::updateValues(QVector<QPointF>& newPoints)
86 33 {
87 if(state()!=QAbstractAnimation::Stopped){ //workaround
88 QVector<QPointF> vector = qVariantValue<QVector<QPointF> >(value);
89 m_item->setGeometry(vector);
90 }
34 if(state()!=QAbstractAnimation::Stopped) {
35 stop();
36 m_dirty=true;
37 }
38
39 if(m_dirty) {
40 m_points=newPoints;
41 m_dirty=false;
42 }
43
44 setKeyValueAt(0.0, qVariantFromValue(m_points));
45 setKeyValueAt(1.0, qVariantFromValue(newPoints));
91 46 }
92 47
93 template <class T, class U>
94 void XYChartAnimator<T,U>::updateState(QAbstractAnimation::State newState, QAbstractAnimation::State oldState)
48 QVariant XYAnimation::interpolated(const QVariant &start, const QVariant & end, qreal progress ) const
95 49 {
96 Q_UNUSED(oldState)
97 if (newState==QAbstractAnimation::Running) m_item->animationStarted();
98 QVariantAnimation::updateState(newState,oldState);
50 QVector<QPointF> startVector = qVariantValue<QVector<QPointF> >(start);
51 QVector<QPointF> endVector = qVariantValue<QVector<QPointF> >(end);
52 QVector<QPointF> result;
53
54 switch(m_type) {
55
56 case MoveDownAnimation: {
57
58 Q_ASSERT(startVector.count() == endVector.count());
59 for(int i =0;i< startVector.count();i++) {
60 qreal x = startVector[i].x() + ((endVector[i].x()- startVector[i].x()) * progress);
61 qreal y = startVector[i].y() + ((endVector[i].y()- startVector[i].y()) * progress);
62 result << QPointF(x,y);
63 }
64
65 }
66 break;
67 case LineDrawAnimation:{
68 for(int i =0;i< endVector.count()* qBound(0.0, progress, 1.0);i++) {
69 result << endVector[i];
70 }
71 }
72 break;
73 default:
74 qWarning()<<"Unknow type of animation";
75 break;
76 }
77
78 return qVariantFromValue(result);
99 79 }
100 80
101 QTCOMMERCIALCHART_END_NAMESPACE
81 void XYAnimation::updateCurrentValue (const QVariant & value )
82 {
83 if(state()!=QAbstractAnimation::Stopped){ //workaround
84 QVector<QPointF> vector = qVariantValue<QVector<QPointF> >(value);
85 m_item->setGeometry(vector);
86 }
87 }
102 88
103 #endif /* XYCHARTANIMATOR_P_H_ */
89 void XYAnimation::updateState(QAbstractAnimation::State newState, QAbstractAnimation::State oldState)
90 {
91 Q_UNUSED(oldState)
92 if (newState==QAbstractAnimation::Running) m_dirty=true;
93 QVariantAnimation::updateState(newState,oldState);
94 }
95
96 QTCOMMERCIALCHART_END_NAMESPACE
@@ -7,7 +7,6
7 7
8 8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9 9
10 class ChartPresenter;
11 10 class QAreaSeries;
12 11 class AreaChartItem;
13 12
@@ -2,13 +2,11 INCLUDEPATH += $$PWD
2 2 DEPENDPATH += $$PWD
3 3
4 4 SOURCES += \
5 $$PWD/axisanimationitem.cpp \
6 5 $$PWD/axisitem.cpp \
7 6 $$PWD/qchartaxis.cpp \
8 7 $$PWD/qchartaxiscategories.cpp
9 8
10 9 PRIVATE_HEADERS += \
11 $$PWD/axisanimationitem_p.h \
12 10 $$PWD/axisitem_p.h
13 11
14 12 PUBLIC_HEADERS += \
@@ -1,6 +1,7
1 1 #include "axisitem_p.h"
2 2 #include "qchartaxis.h"
3 3 #include "chartpresenter_p.h"
4 #include "chartanimator_p.h"
4 5 #include <QPainter>
5 6 #include <QDebug>
6 7
@@ -8,8 +9,9 static int label_padding = 5;
8 9
9 10 QTCOMMERCIALCHART_BEGIN_NAMESPACE
10 11
11 AxisItem::AxisItem(QChartAxis* axis,AxisType type,QGraphicsItem* parent) :
12 AxisItem::AxisItem(QChartAxis* axis,ChartPresenter* presenter,AxisType type,QGraphicsItem* parent) :
12 13 ChartItem(parent),
14 m_presenter(presenter),
13 15 m_chartAxis(axis),
14 16 m_type(type),
15 17 m_labelsAngle(0),
@@ -45,13 +47,14 QRectF AxisItem::boundingRect() const
45 47
46 48 void AxisItem::createItems(int count)
47 49 {
50
48 51 if(m_axis.children().size()==0)
49 52 m_axis.addToGroup(new QGraphicsLineItem());
50 53 for (int i = 0; i < count; ++i) {
51 54 m_grid.addToGroup(new QGraphicsLineItem());
52 55 m_labels.addToGroup(new QGraphicsSimpleTextItem());
53 if(m_grid.childItems().size()%2) m_shades.addToGroup(new QGraphicsRectItem());
54 56 m_axis.addToGroup(new QGraphicsLineItem());
57 if((m_grid.childItems().size())%2 && m_grid.childItems().size()>2) m_shades.addToGroup(new QGraphicsRectItem());
55 58 }
56 59 }
57 60
@@ -63,16 +66,19 void AxisItem::deleteItems(int count)
63 66 QList<QGraphicsItem *> axis = m_axis.childItems();
64 67
65 68 for (int i = 0; i < count; ++i) {
69 if(lines.size()%2 && lines.size()>1) delete(shades.takeLast());
66 70 delete(lines.takeLast());
67 71 delete(labels.takeLast());
68 if(lines.size()%2) delete(shades.takeLast());
69 72 delete(axis.takeLast());
70 73 }
71 74 }
72 75
73 76 void AxisItem::updateLayout(QVector<qreal>& layout)
74 77 {
75 setLayout(layout);
78 if(m_animator){
79 m_animator->applyLayout(this,layout);
80 }
81 else setLayout(layout);
76 82 }
77 83
78 84 QStringList AxisItem::createLabels(int ticks, qreal min, qreal max) const
@@ -240,7 +246,7 void AxisItem::setLayout(QVector<qreal>& layout)
240 246
241 247 if(diff!=0) handleAxisUpdated();
242 248
243 QStringList ticksList = createLabels(m_ticksCount,m_min,m_max);
249 QStringList ticksList = createLabels(layout.size(),m_min,m_max);
244 250
245 251 QList<QGraphicsItem *> lines = m_grid.childItems();
246 252 QList<QGraphicsItem *> labels = m_labels.childItems();
@@ -249,6 +255,7 void AxisItem::setLayout(QVector<qreal>& layout)
249 255
250 256 Q_ASSERT(labels.size() == ticksList.size());
251 257 Q_ASSERT(layout.size() == ticksList.size());
258 Q_ASSERT(layout.size() == m_ticksCount);
252 259
253 260 switch (m_type)
254 261 {
@@ -265,7 +272,7 void AxisItem::setLayout(QVector<qreal>& layout)
265 272 QPointF center = labelItem->boundingRect().center();
266 273 labelItem->setTransformOriginPoint(center.x(), center.y());
267 274 labelItem->setPos(layout[i] - center.x(), m_rect.bottom() + label_padding);
268 if(i%2 && i+1 < layout.size()) {
275 if(i%2 && i+1 < layout.size() && i>1) {
269 276 QGraphicsRectItem *rectItem = static_cast<QGraphicsRectItem*>(shades.at(i/2));
270 277 rectItem->setRect(layout[i],m_rect.top(),layout[i+1]-layout[i],m_rect.height());
271 278 }
@@ -288,7 +295,7 void AxisItem::setLayout(QVector<qreal>& layout)
288 295 QPointF center = labelItem->boundingRect().center();
289 296 labelItem->setTransformOriginPoint(center.x(), center.y());
290 297 labelItem->setPos(m_rect.left() - labelItem->boundingRect().width() - label_padding , layout[i]-center.y());
291 if(i%2 && i+1 < layout.size()) {
298 if(i%2 && i+1 < layout.size() && i>1) {
292 299 QGraphicsRectItem *rectItem = static_cast<QGraphicsRectItem*>(shades.at(i/2));
293 300 rectItem->setRect(m_rect.left(),layout[i],m_rect.width(),layout[i]-layout[i+1]);
294 301 }
@@ -302,7 +309,6 void AxisItem::setLayout(QVector<qreal>& layout)
302 309 break;
303 310 }
304 311
305 //if(diff!=0) handleAxisUpdated();
306 312 m_layoutVector=layout;
307 313 }
308 314
@@ -391,6 +397,7 void AxisItem::handleRangeChanged(qreal min, qreal max)
391 397 m_min = min;
392 398 m_max = max;
393 399
400
394 401 m_ticksCount = qrand()%10;
395 402
396 403 while(m_ticksCount<2){
@@ -408,7 +415,6 void AxisItem::handleRangeChanged(qreal min, qreal max)
408 415
409 416 void AxisItem::handleGeometryChanged(const QRectF& rect)
410 417 {
411
412 418 m_rect = rect;
413 419 if(isEmpty()) return;
414 420 QVector<qreal> layout = calculateLayout();
@@ -8,6 +8,7
8 8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9 9
10 10 class QChartAxis;
11 class ChartPresenter;
11 12
12 13 class AxisItem : public QObject, public ChartItem
13 14 {
@@ -15,7 +16,7 class AxisItem : public QObject, public ChartItem
15 16 public:
16 17 enum AxisType{X_AXIS,Y_AXIS};
17 18
18 AxisItem(QChartAxis* axis,AxisType type = X_AXIS,QGraphicsItem* parent = 0);
19 AxisItem(QChartAxis* axis,ChartPresenter* presenter,AxisType type = X_AXIS,QGraphicsItem* parent = 0);
19 20 ~AxisItem();
20 21
21 22 //from QGraphicsItem
@@ -50,6 +51,7 public:
50 51 void setLabelsFont(const QFont& font);
51 52
52 53 inline QRectF geometry() const { return m_rect; }
54 inline QVector<qreal> layout() { return m_layoutVector;};
53 55 inline qreal zoomFactor() const { return m_zoomFactor;}
54 56
55 57 public slots:
@@ -59,19 +61,20 public slots:
59 61 void handleTicksCountChanged(int count);
60 62 void handleGeometryChanged(const QRectF& size);
61 63
62 public:
63 virtual void updateLayout(QVector<qreal>& layout);
64 void setLayout(QVector<qreal>& layout);
65 QVector<qreal> layout() { return m_layoutVector;};
66 64
67 65 private:
68 66 inline bool isEmpty();
69 67 void createItems(int count);
70 68 void deleteItems(int count);
69
71 70 QVector<qreal> calculateLayout() const;
71 void updateLayout(QVector<qreal>& layout);
72 void setLayout(QVector<qreal>& layout);
73
72 74 QStringList createLabels(int ticks, qreal min, qreal max) const;
73 75
74 76 private:
77 ChartPresenter* m_presenter;
75 78 QChartAxis* m_chartAxis;
76 79 AxisType m_type;
77 80 QRectF m_rect;
@@ -86,6 +89,8 private:
86 89 int m_ticksCount;
87 90 qreal m_zoomFactor;
88 91
92 friend class AxisAnimation;
93
89 94 };
90 95
91 96 QTCOMMERCIALCHART_END_NAMESPACE
@@ -146,11 +146,9 void ChartDataSet::calculateDomain(QSeries* series,Domain* domain) const
146 146 minY = qMin(minY, y);
147 147 maxX = qMax(maxX, x);
148 148 maxY = qMax(maxY, y);
149 domain->setMinX(qMin(domain->minX(),x));
150 domain->setMinY(qMin(domain->minY(),y));
151 domain->setMaxX(qMax(domain->maxX(),x));
152 domain->setMaxY(qMax(domain->maxY(),y));
153 149 }
150
151 domain->setRange(minX, maxX, minY, maxY);
154 152 break;
155 153 }
156 154 case QSeries::SeriesTypeArea: {
@@ -6,17 +6,26
6 6
7 7 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8 8
9 class ChartAnimationManager;
9 class ChartAnimator;
10 10
11 11 class ChartItem : public QGraphicsItem
12 12 {
13 13 enum ChartItemTypes{ AXIS_ITEM = UserType+1, XYLINE_ITEM};
14 14 public:
15 ChartItem(QGraphicsItem* parent = 0):QGraphicsItem(parent){};
15 ChartItem(QGraphicsItem* parent = 0):QGraphicsItem(parent),
16 m_animator(0){};
16 17 //TODO make pure
17 18 virtual void handleGeometryChanged(const QRectF&){};
18 19 virtual void handleDomainChanged(const Domain& domain){};
20
21 void setAnimator(ChartAnimator* animator){
22 m_animator=animator;
23 }
24
19 25 virtual ~ChartItem(){};
26
27 protected:
28 ChartAnimator* m_animator;
20 29 };
21 30
22 31 QTCOMMERCIALCHART_END_NAMESPACE
@@ -3,6 +3,7
3 3 #include "chartpresenter_p.h"
4 4 #include "chartdataset_p.h"
5 5 #include "charttheme_p.h"
6 #include "chartanimator_p.h"
6 7 //series
7 8 #include "qbarseries.h"
8 9 #include "qstackedbarseries.h"
@@ -14,7 +15,6
14 15 #include "qsplineseries.h"
15 16 //items
16 17 #include "axisitem_p.h"
17 #include "axisanimationitem_p.h"
18 18 #include "areachartitem_p.h"
19 19 #include "barpresenter_p.h"
20 20 #include "stackedbarpresenter_p.h"
@@ -28,6 +28,7 QTCOMMERCIALCHART_BEGIN_NAMESPACE
28 28
29 29 ChartPresenter::ChartPresenter(QChart* chart,ChartDataSet* dataset):QObject(chart),
30 30 m_chart(chart),
31 m_animator(0),
31 32 m_dataset(dataset),
32 33 m_chartTheme(0),
33 34 m_zoomIndex(0),
@@ -96,15 +97,12 void ChartPresenter::setMargin(int margin)
96 97
97 98 void ChartPresenter::handleAxisAdded(QChartAxis* axis,Domain* domain)
98 99 {
100 AxisItem* item = new AxisItem(axis,this,axis==m_dataset->axisX()?AxisItem::X_AXIS : AxisItem::Y_AXIS,m_chart);
99 101
100 AxisItem* item ;
101
102 if(!m_options.testFlag(QChart::GridAxisAnimations))
103 {
104 item = new AxisItem(axis,axis==m_dataset->axisX()?AxisItem::X_AXIS : AxisItem::Y_AXIS,m_chart);
105 }else{
106 item = new AxisAnimationItem(axis,axis==m_dataset->axisX()?AxisItem::X_AXIS : AxisItem::Y_AXIS,m_chart);
102 if(m_options.testFlag(QChart::GridAxisAnimations)){
103 m_animator->addAnimation(item);
107 104 }
105
108 106 if(axis==m_dataset->axisX()){
109 107 QObject::connect(domain,SIGNAL(rangeXChanged(qreal,qreal)),item,SLOT(handleRangeChanged(qreal,qreal)));
110 108 //initialize
@@ -114,7 +112,6 void ChartPresenter::handleAxisAdded(QChartAxis* axis,Domain* domain)
114 112 QObject::connect(domain,SIGNAL(rangeYChanged(qreal,qreal)),item,SLOT(handleRangeChanged(qreal,qreal)));
115 113 //initialize
116 114 item->handleRangeChanged(domain->minY(),domain->maxY());
117
118 115 }
119 116
120 117 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
@@ -122,12 +119,14 void ChartPresenter::handleAxisAdded(QChartAxis* axis,Domain* domain)
122 119 item->handleGeometryChanged(m_rect);
123 120 m_chartTheme->decorate(axis,item);
124 121 m_axisItems.insert(axis,item);
122
125 123 }
126 124
127 125 void ChartPresenter::handleAxisRemoved(QChartAxis* axis)
128 126 {
129 127 AxisItem* item = m_axisItems.take(axis);
130 128 Q_ASSERT(item);
129 if(m_animator) m_animator->removeAnimation(item);
131 130 delete item;
132 131 }
133 132
@@ -139,11 +138,9 void ChartPresenter::handleSeriesAdded(QSeries* series,Domain* domain)
139 138 case QSeries::SeriesTypeLine: {
140 139
141 140 QLineSeries* lineSeries = static_cast<QLineSeries*>(series);
142 LineChartItem* item;
141 LineChartItem* item = new LineChartItem(lineSeries,m_chart);
143 142 if(m_options.testFlag(QChart::SeriesAnimations)){
144 item = new LineChartAnimationItem(lineSeries,m_chart);
145 }else{
146 item = new LineChartItem(lineSeries,m_chart);
143 m_animator->addAnimation(item);
147 144 }
148 145 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
149 146 QObject::connect(domain,SIGNAL(domainChanged(qreal,qreal,qreal,qreal)),item,SLOT(handleDomainChanged(qreal,qreal,qreal,qreal)));
@@ -159,12 +156,9 void ChartPresenter::handleSeriesAdded(QSeries* series,Domain* domain)
159 156 case QSeries::SeriesTypeArea: {
160 157
161 158 QAreaSeries* areaSeries = static_cast<QAreaSeries*>(series);
162 AreaChartItem* item;
159 AreaChartItem* item = new AreaChartItem(areaSeries,m_chart);
163 160 if(m_options.testFlag(QChart::SeriesAnimations)) {
164 item = new AreaChartItem(areaSeries,m_chart);
165 }
166 else {
167 item = new AreaChartItem(areaSeries,m_chart);
161 // m_animator->addAnimation(item);
168 162 }
169 163 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
170 164 QObject::connect(domain,SIGNAL(domainChanged(qreal,qreal,qreal,qreal)),item,SLOT(handleDomainChanged(qreal,qreal,qreal,qreal)));
@@ -214,11 +208,9 void ChartPresenter::handleSeriesAdded(QSeries* series,Domain* domain)
214 208 }
215 209 case QSeries::SeriesTypeScatter: {
216 210 QScatterSeries *scatterSeries = qobject_cast<QScatterSeries *>(series);
217 ScatterChartItem *item;
211 ScatterChartItem *item = new ScatterChartItem(scatterSeries, m_chart);
218 212 if(m_options.testFlag(QChart::SeriesAnimations)) {
219 item = new ScatterChartAnimationItem(scatterSeries,m_chart);
220 } else {
221 item = new ScatterChartItem(scatterSeries, m_chart);
213 m_animator->addAnimation(item);
222 214 }
223 215 QObject::connect(this, SIGNAL(geometryChanged(const QRectF&)),
224 216 item, SLOT(handleGeometryChanged(const QRectF&)));
@@ -262,11 +254,9 void ChartPresenter::handleSeriesAdded(QSeries* series,Domain* domain)
262 254 case QSeries::SeriesTypeSpline: {
263 255
264 256 QSplineSeries* splineSeries = qobject_cast<QSplineSeries*>(series);
265 SplineChartItem* item;
257 SplineChartItem* item = new SplineChartItem(splineSeries, m_chart);
266 258 if(m_options.testFlag(QChart::SeriesAnimations)) {
267 item = new SplineChartAnimationItem(splineSeries, m_chart);
268 } else {
269 item = new SplineChartItem(splineSeries, m_chart);
259 m_animator->addAnimation(item);
270 260 }
271 261 QObject::connect(this, SIGNAL(geometryChanged(const QRectF&)), item, SLOT(handleGeometryChanged(const QRectF&)));
272 262 QObject::connect(domain,SIGNAL(domainChanged(qreal,qreal,qreal,qreal)),item,SLOT(handleDomainChanged(qreal,qreal,qreal,qreal)));
@@ -290,6 +280,8 void ChartPresenter::handleSeriesAdded(QSeries* series,Domain* domain)
290 280 void ChartPresenter::handleSeriesRemoved(QSeries* series)
291 281 {
292 282 ChartItem* item = m_chartItems.take(series);
283 Q_ASSERT(item);
284 if(m_animator) m_animator->removeAnimation(item);
293 285 delete item;
294 286 }
295 287
@@ -327,6 +319,10 void ChartPresenter::setAnimationOptions(QChart::AnimationOptions options)
327 319
328 320 m_options=options;
329 321
322 if(m_options!=QChart::NoAnimation && !m_animator) {
323 m_animator= new ChartAnimator(this);
324 }
325
330 326 //recreate elements
331 327 QList<QChartAxis*> axisList = m_axisItems.uniqueKeys();
332 328 QList<QSeries*> seriesList = m_chartItems.uniqueKeys();
@@ -340,6 +336,7 void ChartPresenter::setAnimationOptions(QChart::AnimationOptions options)
340 336 handleSeriesAdded(series,m_dataset->domain(series));
341 337 }
342 338 }
339
343 340 }
344 341
345 342 void ChartPresenter::zoomIn()
@@ -11,10 +11,10 QTCOMMERCIALCHART_BEGIN_NAMESPACE
11 11 class ChartItem;
12 12 class QSeries;
13 13 class ChartDataSet;
14 //class QChart;
15 14 class Domain;
16 15 class AxisItem;
17 16 class ChartTheme;
17 class ChartAnimator;
18 18
19 19 class ChartPresenter: public QObject
20 20 {
@@ -37,6 +37,7 public:
37 37 int margin() const;
38 38
39 39 QRectF geometry() const;
40 ChartAnimator* animator() const {return m_animator;};
40 41
41 42 void setChartTheme(QChart::ChartTheme theme);
42 43 QChart::ChartTheme chartTheme();
@@ -65,6 +66,7 signals:
65 66
66 67 private:
67 68 QChart* m_chart;
69 ChartAnimator* m_animator;
68 70 ChartDataSet* m_dataset;
69 71 ChartTheme *m_chartTheme;
70 72 int m_zoomIndex;
@@ -3,12 +3,10
3 3
4 4 #include "qchartglobal.h"
5 5 #include "xychartitem_p.h"
6 #include "xychartanimationitem_p.h"
7 6 #include <QPen>
8 7
9 8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
10 9
11 class ChartPresenter;
12 10 class QLineSeries;
13 11
14 12 class LineChartItem : public XYChartItem
@@ -43,12 +41,8 private:
43 41 QRectF m_rect;
44 42 QPen m_pen;
45 43
46 template<class,class> friend class XYChartAnimator;
47
48 44 };
49 45
50 typedef XYChartAnimationItem<LineChartItem,QLineSeries> LineChartAnimationItem;
51
52 46 QTCOMMERCIALCHART_END_NAMESPACE
53 47
54 48 #endif
@@ -3,7 +3,6
3 3
4 4 #include "qchartglobal.h"
5 5 #include "xychartitem_p.h"
6 #include "xychartanimationitem_p.h"
7 6 #include <QGraphicsItem>
8 7 #include <QPen>
9 8
@@ -45,11 +44,8 private:
45 44 int m_size;
46 45 QRectF m_rect;
47 46
48 template<class,class> friend class XYChartAnimator;
49 47 };
50 48
51 typedef XYChartAnimationItem<ScatterChartItem,QScatterSeries> ScatterChartAnimationItem;
52
53 49 QTCOMMERCIALCHART_END_NAMESPACE
54 50
55 51 #endif // SCATTERPRESENTER_H
@@ -3,7 +3,6
3 3
4 4 #include "qsplineseries.h"
5 5 #include "xychartitem_p.h"
6 #include "xychartanimationitem_p.h"
7 6 #include <QGraphicsItem>
8 7
9 8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
@@ -37,11 +36,8 private:
37 36 QRectF m_rect;
38 37 QPen m_pen;
39 38
40 template<class,class> friend class XYChartAnimator;
41 39 };
42 40
43 typedef XYChartAnimationItem<SplineChartItem,QSplineSeries> SplineChartAnimationItem;
44
45 41 QTCOMMERCIALCHART_END_NAMESPACE
46 42
47 43 #endif // SPLINECHARTITEM_P_H
@@ -27,7 +27,8 PUBLIC_HEADERS += \
27 27 qseries.h \
28 28 qchartview.h \
29 29 qlegend.h
30
30
31 include(animations/animations.pri)
31 32 include(axis/axis.pri)
32 33 include(xychart/xychart.pri)
33 34 include(linechart/linechart.pri)
@@ -6,9 +6,8 SOURCES += \
6 6 $$PWD/qxyseries.cpp
7 7
8 8 PRIVATE_HEADERS += \
9 $$PWD/xychartitem_p.h \
10 $$PWD/xychartanimationitem_p.h \
11 $$PWD/xychartanimator_p.h
9 $$PWD/xychartitem_p.h
10
12 11
13 12 PUBLIC_HEADERS += \
14 13 $$PWD/qxyseries.h No newline at end of file
@@ -1,6 +1,7
1 1 #include "xychartitem_p.h"
2 2 #include "qxyseries.h"
3 3 #include "chartpresenter_p.h"
4 #include "chartanimator_p.h"
4 5 #include <QPainter>
5 6
6 7
@@ -8,7 +9,7 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8 9
9 10 //TODO: optimize : remove points which are not visible
10 11
11 XYChartItem::XYChartItem(QXYSeries* series,QGraphicsItem *parent):ChartItem(parent),
12 XYChartItem::XYChartItem(QXYSeries* series, QGraphicsItem *parent):ChartItem(parent),
12 13 m_minX(0),
13 14 m_maxX(0),
14 15 m_minY(0),
@@ -57,7 +58,11 QVector<QPointF> XYChartItem::calculateGeometryPoints() const
57 58
58 59 void XYChartItem::updatePoints(QVector<QPointF>& points)
59 60 {
60 setGeometry(points);
61 if(m_animator){
62 m_animator->applyLayout(this,points);
63 }
64 else setGeometry(points);
65
61 66 }
62 67
63 68 void XYChartItem::updatePoint(QVector<QPointF>& points)
@@ -14,7 +14,7 class XYChartItem : public QObject , public ChartItem
14 14 {
15 15 Q_OBJECT
16 16 public:
17 explicit XYChartItem(QXYSeries* series,QGraphicsItem *parent = 0);
17 explicit XYChartItem(QXYSeries* series, QGraphicsItem *parent = 0);
18 18 ~ XYChartItem(){};
19 19
20 20 QVector<QPointF> points() const {return m_points;}
@@ -28,15 +28,14 public slots:
28 28 void handleGeometryChanged(const QRectF& size);
29 29
30 30 protected:
31 virtual void updatePoints(QVector<QPointF>& points);
32 virtual void updatePoint(QVector<QPointF>& points);
33 31 virtual void setGeometry(QVector<QPointF>& points);
34
35 32 QPointF calculateGeometryPoint(const QPointF& point) const;
36 33 QPointF calculateGeometryPoint(int index) const;
37 34 QVector<QPointF> calculateGeometryPoints() const;
38 35
39 36 private:
37 void updatePoints(QVector<QPointF>& points);
38 void updatePoint(QVector<QPointF>& points);
40 39 inline bool isEmpty();
41 40
42 41 private:
@@ -49,7 +48,7 private:
49 48 QRectF m_clipRect;
50 49 QVector<QPointF> m_points;
51 50
52 template<class,class> friend class XYChartAnimator;
51 friend class XYAnimation;
53 52
54 53 };
55 54
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now