##// END OF EJS Templates
Renames axisitem applyLayout to updateLayout
Michal Klocek -
r635:c28f6c761b2a
parent child
Show More
@@ -1,261 +1,261
1 #include "chartanimator_p.h"
1 #include "chartanimator_p.h"
2 #include "axisanimation_p.h"
2 #include "axisanimation_p.h"
3 #include "xyanimation_p.h"
3 #include "xyanimation_p.h"
4 #include "splineanimation_p.h"
4 #include "splineanimation_p.h"
5 #include "xychartitem_p.h"
5 #include "xychartitem_p.h"
6 #include "pieanimation_p.h"
6 #include "pieanimation_p.h"
7 #include "areachartitem_p.h"
7 #include "areachartitem_p.h"
8 #include "splinechartitem_p.h"
8 #include "splinechartitem_p.h"
9 #include "scatterchartitem_p.h"
9 #include "scatterchartitem_p.h"
10 #include <QTimer>
10 #include <QTimer>
11
11
12 Q_DECLARE_METATYPE(QVector<QPointF>)
12 Q_DECLARE_METATYPE(QVector<QPointF>)
13 Q_DECLARE_METATYPE(QVector<qreal>)
13 Q_DECLARE_METATYPE(QVector<qreal>)
14
14
15 QTCOMMERCIALCHART_BEGIN_NAMESPACE
15 QTCOMMERCIALCHART_BEGIN_NAMESPACE
16
16
17 const static int duration = 1000;
17 const static int duration = 1000;
18
18
19 ChartAnimator::ChartAnimator(QObject *parent):QObject(parent)
19 ChartAnimator::ChartAnimator(QObject *parent):QObject(parent)
20 {
20 {
21 }
21 }
22
22
23 ChartAnimator::~ChartAnimator()
23 ChartAnimator::~ChartAnimator()
24 {
24 {
25 }
25 }
26
26
27 void ChartAnimator::addAnimation(AxisItem* item)
27 void ChartAnimator::addAnimation(AxisItem* item)
28 {
28 {
29 ChartAnimation* animation = m_animations.value(item);
29 ChartAnimation* animation = m_animations.value(item);
30
30
31 if(!animation) {
31 if(!animation) {
32 animation = new AxisAnimation(item);
32 animation = new AxisAnimation(item);
33 m_animations.insert(item,animation);
33 m_animations.insert(item,animation);
34 }
34 }
35
35
36 item->setAnimator(this);
36 item->setAnimator(this);
37 }
37 }
38
38
39 void ChartAnimator::addAnimation(SplineChartItem* item)
39 void ChartAnimator::addAnimation(SplineChartItem* item)
40 {
40 {
41 ChartAnimation* animation = m_animations.value(item);
41 ChartAnimation* animation = m_animations.value(item);
42
42
43 if(!animation) {
43 if(!animation) {
44 animation = new SplineAnimation(item);
44 animation = new SplineAnimation(item);
45 m_animations.insert(item,animation);
45 m_animations.insert(item,animation);
46 }
46 }
47
47
48 item->setAnimator(this);
48 item->setAnimator(this);
49 }
49 }
50
50
51 void ChartAnimator::addAnimation(ScatterChartItem* item)
51 void ChartAnimator::addAnimation(ScatterChartItem* item)
52 {
52 {
53 ChartAnimation* animation = m_animations.value(item);
53 ChartAnimation* animation = m_animations.value(item);
54
54
55 if(!animation) {
55 if(!animation) {
56 animation = new XYAnimation(item);
56 animation = new XYAnimation(item);
57 m_animations.insert(item,animation);
57 m_animations.insert(item,animation);
58 }
58 }
59
59
60 item->setAnimator(this);
60 item->setAnimator(this);
61 }
61 }
62
62
63 void ChartAnimator::addAnimation(LineChartItem* item)
63 void ChartAnimator::addAnimation(LineChartItem* item)
64 {
64 {
65 ChartAnimation* animation = m_animations.value(item);
65 ChartAnimation* animation = m_animations.value(item);
66
66
67 if(!animation) {
67 if(!animation) {
68 animation = new XYAnimation(item);
68 animation = new XYAnimation(item);
69 m_animations.insert(item,animation);
69 m_animations.insert(item,animation);
70 }
70 }
71
71
72 item->setAnimator(this);
72 item->setAnimator(this);
73 }
73 }
74
74
75 void ChartAnimator::addAnimation(PieChartItem* item)
75 void ChartAnimator::addAnimation(PieChartItem* item)
76 {
76 {
77 ChartAnimation* animation = m_animations.value(item);
77 ChartAnimation* animation = m_animations.value(item);
78
78
79 if(!animation) {
79 if(!animation) {
80 animation = new PieAnimation(item);
80 animation = new PieAnimation(item);
81 m_animations.insert(item,animation);
81 m_animations.insert(item,animation);
82 }
82 }
83
83
84 item->setAnimator(this);
84 item->setAnimator(this);
85 }
85 }
86
86
87 void ChartAnimator::removeAnimation(ChartItem* item)
87 void ChartAnimator::removeAnimation(ChartItem* item)
88 {
88 {
89 item->setAnimator(0);
89 item->setAnimator(0);
90 m_animations.remove(item);
90 m_animations.remove(item);
91 }
91 }
92
92
93 void ChartAnimator::applyLayout(AxisItem* item , QVector<qreal>& newLayout)
93 void ChartAnimator::updateLayout(AxisItem* item , QVector<qreal>& newLayout)
94 {
94 {
95 AxisAnimation* animation = static_cast<AxisAnimation*>(m_animations.value(item));
95 AxisAnimation* animation = static_cast<AxisAnimation*>(m_animations.value(item));
96
96
97 Q_ASSERT(animation);
97 Q_ASSERT(animation);
98
98
99 QVector<qreal> oldLayout = item->layout();
99 QVector<qreal> oldLayout = item->layout();
100
100
101 if(newLayout.count()==0) return;
101 if(newLayout.count()==0) return;
102
102
103 switch(m_state)
103 switch(m_state)
104 {
104 {
105 case ZoomOutState: {
105 case ZoomOutState: {
106 QRectF rect = item->geometry();
106 QRectF rect = item->geometry();
107 oldLayout.resize(newLayout.count());
107 oldLayout.resize(newLayout.count());
108
108
109 for(int i=0,j=oldLayout.count()-1;i<(oldLayout.count()+1)/2;i++,j--)
109 for(int i=0,j=oldLayout.count()-1;i<(oldLayout.count()+1)/2;i++,j--)
110 {
110 {
111 oldLayout[i]= item->axisType()==AxisItem::X_AXIS?rect.left():rect.bottom();
111 oldLayout[i]= item->axisType()==AxisItem::X_AXIS?rect.left():rect.bottom();
112 oldLayout[j]= item->axisType()==AxisItem::X_AXIS?rect.right():rect.top();
112 oldLayout[j]= item->axisType()==AxisItem::X_AXIS?rect.right():rect.top();
113 }
113 }
114 }
114 }
115 break;
115 break;
116 case ZoomInState: {
116 case ZoomInState: {
117 int index = qMin(oldLayout.count()*(item->axisType()==AxisItem::X_AXIS?m_point.x():(1 -m_point.y())),newLayout.count()-1.0);
117 int index = qMin(oldLayout.count()*(item->axisType()==AxisItem::X_AXIS?m_point.x():(1 -m_point.y())),newLayout.count()-1.0);
118 oldLayout.resize(newLayout.count());
118 oldLayout.resize(newLayout.count());
119
119
120 for(int i=0;i<oldLayout.count();i++)
120 for(int i=0;i<oldLayout.count();i++)
121 {
121 {
122 oldLayout[i]= oldLayout[index];
122 oldLayout[i]= oldLayout[index];
123 }
123 }
124 }
124 }
125 break;
125 break;
126 case ScrollDownState:
126 case ScrollDownState:
127 case ScrollRightState: {
127 case ScrollRightState: {
128 oldLayout.resize(newLayout.count());
128 oldLayout.resize(newLayout.count());
129
129
130 for(int i=0, j=i+1;i<oldLayout.count()-1;i++,j++)
130 for(int i=0, j=i+1;i<oldLayout.count()-1;i++,j++)
131 {
131 {
132 oldLayout[i]= oldLayout[j];
132 oldLayout[i]= oldLayout[j];
133 }
133 }
134 }
134 }
135 break;
135 break;
136 case ScrollUpState:
136 case ScrollUpState:
137 case ScrollLeftState: {
137 case ScrollLeftState: {
138 oldLayout.resize(newLayout.count());
138 oldLayout.resize(newLayout.count());
139
139
140 for(int i=oldLayout.count()-1, j=i-1;i>0;i--,j--)
140 for(int i=oldLayout.count()-1, j=i-1;i>0;i--,j--)
141 {
141 {
142 oldLayout[i]= oldLayout[j];
142 oldLayout[i]= oldLayout[j];
143 }
143 }
144 }
144 }
145 break;
145 break;
146 default: {
146 default: {
147 oldLayout.resize(newLayout.count());
147 oldLayout.resize(newLayout.count());
148 QRectF rect = item->geometry();
148 QRectF rect = item->geometry();
149 for(int i=0, j=oldLayout.count()-1;i<oldLayout.count();i++,j--)
149 for(int i=0, j=oldLayout.count()-1;i<oldLayout.count();i++,j--)
150 {
150 {
151 oldLayout[i]= item->axisType()==AxisItem::X_AXIS?rect.left():rect.top();
151 oldLayout[i]= item->axisType()==AxisItem::X_AXIS?rect.left():rect.top();
152 }
152 }
153 }
153 }
154 break;
154 break;
155 }
155 }
156
156
157
157
158 if(animation->state()!=QAbstractAnimation::Stopped) {
158 if(animation->state()!=QAbstractAnimation::Stopped) {
159 animation->stop();
159 animation->stop();
160 }
160 }
161
161
162 animation->setDuration(duration);
162 animation->setDuration(duration);
163 animation->setEasingCurve(QEasingCurve::OutQuart);
163 animation->setEasingCurve(QEasingCurve::OutQuart);
164 QVariantAnimation::KeyValues value;
164 QVariantAnimation::KeyValues value;
165 animation->setKeyValues(value); //workaround for wrong interpolation call
165 animation->setKeyValues(value); //workaround for wrong interpolation call
166 animation->setKeyValueAt(0.0, qVariantFromValue(oldLayout));
166 animation->setKeyValueAt(0.0, qVariantFromValue(oldLayout));
167 animation->setKeyValueAt(1.0, qVariantFromValue(newLayout));
167 animation->setKeyValueAt(1.0, qVariantFromValue(newLayout));
168
168
169 QTimer::singleShot(0,animation,SLOT(start()));
169 QTimer::singleShot(0,animation,SLOT(start()));
170 }
170 }
171
171
172 void ChartAnimator::updateLayout(SplineChartItem* item, QVector<QPointF>& oldPoints ,QVector<QPointF>& newPoints, QVector<QPointF>& oldControlPoints, QVector<QPointF>& newControlPoints,int index)
172 void ChartAnimator::updateLayout(SplineChartItem* item, QVector<QPointF>& oldPoints ,QVector<QPointF>& newPoints, QVector<QPointF>& oldControlPoints, QVector<QPointF>& newControlPoints,int index)
173 {
173 {
174 SplineAnimation* animation = static_cast<SplineAnimation*>(m_animations.value(item));
174 SplineAnimation* animation = static_cast<SplineAnimation*>(m_animations.value(item));
175
175
176 Q_ASSERT(animation);
176 Q_ASSERT(animation);
177
177
178 if(newPoints.count()<2 || newControlPoints.count()<2) return;
178 if(newPoints.count()<2 || newControlPoints.count()<2) return;
179
179
180 bool empty = oldPoints.count()==0;
180 bool empty = oldPoints.count()==0;
181
181
182
182
183 if(animation->state()!=QAbstractAnimation::Stopped) {
183 if(animation->state()!=QAbstractAnimation::Stopped) {
184 animation->stop();
184 animation->stop();
185 }
185 }
186
186
187 animation->setDuration(duration);
187 animation->setDuration(duration);
188 if(!empty)
188 if(!empty)
189 animation->setAnimationType(ChartAnimation::MoveDownAnimation);
189 animation->setAnimationType(ChartAnimation::MoveDownAnimation);
190 else
190 else
191 animation->setAnimationType(ChartAnimation::LineDrawAnimation);
191 animation->setAnimationType(ChartAnimation::LineDrawAnimation);
192
192
193 animation->setEasingCurve(QEasingCurve::OutQuart);
193 animation->setEasingCurve(QEasingCurve::OutQuart);
194 animation->setValues(oldPoints,newPoints,oldControlPoints,newControlPoints,index);
194 animation->setValues(oldPoints,newPoints,oldControlPoints,newControlPoints,index);
195
195
196 QTimer::singleShot(0,animation,SLOT(start()));
196 QTimer::singleShot(0,animation,SLOT(start()));
197 }
197 }
198
198
199
199
200 void ChartAnimator::updateLayout(XYChartItem* item, QVector<QPointF>& oldPoints , QVector<QPointF>& newPoints, int index)
200 void ChartAnimator::updateLayout(XYChartItem* item, QVector<QPointF>& oldPoints , QVector<QPointF>& newPoints, int index)
201 {
201 {
202 XYAnimation* animation = static_cast<XYAnimation*>(m_animations.value(item));
202 XYAnimation* animation = static_cast<XYAnimation*>(m_animations.value(item));
203
203
204 Q_ASSERT(animation);
204 Q_ASSERT(animation);
205
205
206 if(newPoints.count()==0) return;
206 if(newPoints.count()==0) return;
207
207
208 bool empty = oldPoints.count()==0;
208 bool empty = oldPoints.count()==0;
209
209
210
210
211 if(animation->state()!=QAbstractAnimation::Stopped) {
211 if(animation->state()!=QAbstractAnimation::Stopped) {
212 animation->stop();
212 animation->stop();
213 }
213 }
214
214
215 animation->setDuration(duration);
215 animation->setDuration(duration);
216 if(!empty)
216 if(!empty)
217 animation->setAnimationType(ChartAnimation::MoveDownAnimation);
217 animation->setAnimationType(ChartAnimation::MoveDownAnimation);
218 else
218 else
219 animation->setAnimationType(ChartAnimation::LineDrawAnimation);
219 animation->setAnimationType(ChartAnimation::LineDrawAnimation);
220
220
221 animation->setEasingCurve(QEasingCurve::OutQuart);
221 animation->setEasingCurve(QEasingCurve::OutQuart);
222 animation->setValues(oldPoints,newPoints,index);
222 animation->setValues(oldPoints,newPoints,index);
223
223
224 QTimer::singleShot(0,animation,SLOT(start()));
224 QTimer::singleShot(0,animation,SLOT(start()));
225 }
225 }
226
226
227 void ChartAnimator::addAnimation(PieChartItem* item, QPieSlice *slice, const PieSliceLayout &layout, bool isEmpty)
227 void ChartAnimator::addAnimation(PieChartItem* item, QPieSlice *slice, const PieSliceLayout &layout, bool isEmpty)
228 {
228 {
229 PieAnimation* animation = static_cast<PieAnimation*>(m_animations.value(item));
229 PieAnimation* animation = static_cast<PieAnimation*>(m_animations.value(item));
230 Q_ASSERT(animation);
230 Q_ASSERT(animation);
231 animation->addSlice(slice, layout, isEmpty);
231 animation->addSlice(slice, layout, isEmpty);
232 }
232 }
233
233
234 void ChartAnimator::removeAnimation(PieChartItem* item, QPieSlice *slice)
234 void ChartAnimator::removeAnimation(PieChartItem* item, QPieSlice *slice)
235 {
235 {
236 PieAnimation* animation = static_cast<PieAnimation*>(m_animations.value(item));
236 PieAnimation* animation = static_cast<PieAnimation*>(m_animations.value(item));
237 Q_ASSERT(animation);
237 Q_ASSERT(animation);
238 animation->removeSlice(slice);
238 animation->removeSlice(slice);
239 }
239 }
240
240
241 void ChartAnimator::updateLayout(PieChartItem* item, const PieLayout &layout)
241 void ChartAnimator::updateLayout(PieChartItem* item, const PieLayout &layout)
242 {
242 {
243 PieAnimation* animation = static_cast<PieAnimation*>(m_animations.value(item));
243 PieAnimation* animation = static_cast<PieAnimation*>(m_animations.value(item));
244 Q_ASSERT(animation);
244 Q_ASSERT(animation);
245 animation->updateValues(layout);
245 animation->updateValues(layout);
246 }
246 }
247
247
248 void ChartAnimator::updateLayout(PieChartItem* item, QPieSlice *slice, const PieSliceLayout &layout)
248 void ChartAnimator::updateLayout(PieChartItem* item, QPieSlice *slice, const PieSliceLayout &layout)
249 {
249 {
250 PieAnimation* animation = static_cast<PieAnimation*>(m_animations.value(item));
250 PieAnimation* animation = static_cast<PieAnimation*>(m_animations.value(item));
251 Q_ASSERT(animation);
251 Q_ASSERT(animation);
252 animation->updateValue(slice, layout);
252 animation->updateValue(slice, layout);
253 }
253 }
254
254
255 void ChartAnimator::setState(State state,const QPointF& point)
255 void ChartAnimator::setState(State state,const QPointF& point)
256 {
256 {
257 m_state=state;
257 m_state=state;
258 m_point=point;
258 m_point=point;
259 }
259 }
260
260
261 QTCOMMERCIALCHART_END_NAMESPACE
261 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,53 +1,53
1 #ifndef CHARTANIMATOR_P_H_
1 #ifndef CHARTANIMATOR_P_H_
2 #define CHARTANIMATOR_P_H_
2 #define CHARTANIMATOR_P_H_
3 #include "qchartglobal.h"
3 #include "qchartglobal.h"
4 #include "chartanimation_p.h"
4 #include "chartanimation_p.h"
5 #include "piechartitem_p.h"
5 #include "piechartitem_p.h"
6 #include <QPointF>
6 #include <QPointF>
7
7
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9
9
10 class ChartItem;
10 class ChartItem;
11 class AxisItem;
11 class AxisItem;
12 class AreaChartItem;
12 class AreaChartItem;
13 class SplineChartItem;
13 class SplineChartItem;
14 class ScatterChartItem;
14 class ScatterChartItem;
15 class LineChartItem;
15 class LineChartItem;
16 class XYChartItem;
16 class XYChartItem;
17
17
18 class ChartAnimator : public QObject {
18 class ChartAnimator : public QObject {
19
19
20 public:
20 public:
21 //TODO: this should be flags in case of two state at the time
21 //TODO: this should be flags in case of two state at the time
22 enum State{ShowState, ScrollUpState, ScrollDownState, ScrollLeftState,ScrollRightState,ZoomInState,ZoomOutState};
22 enum State{ShowState, ScrollUpState, ScrollDownState, ScrollLeftState,ScrollRightState,ZoomInState,ZoomOutState};
23 ChartAnimator(QObject *parent = 0);
23 ChartAnimator(QObject *parent = 0);
24 virtual ~ChartAnimator();
24 virtual ~ChartAnimator();
25
25
26 void addAnimation(AxisItem* item);
26 void addAnimation(AxisItem* item);
27 void addAnimation(PieChartItem* item);
27 void addAnimation(PieChartItem* item);
28 void addAnimation(ScatterChartItem* item);
28 void addAnimation(ScatterChartItem* item);
29 void addAnimation(LineChartItem* item);
29 void addAnimation(LineChartItem* item);
30 void addAnimation(SplineChartItem* item);
30 void addAnimation(SplineChartItem* item);
31 void removeAnimation(ChartItem* item);
31 void removeAnimation(ChartItem* item);
32
32
33 void animationStarted();
33 void animationStarted();
34 void updateLayout(XYChartItem* item, QVector<QPointF>& oldLayout,QVector<QPointF>& newLayout,int index);
34 void updateLayout(XYChartItem* item, QVector<QPointF>& oldLayout,QVector<QPointF>& newLayout,int index);
35 void updateLayout(SplineChartItem* item, QVector<QPointF>& oldPoints , QVector<QPointF>& newPoints, QVector<QPointF>& oldControlPoints, QVector<QPointF>& newContorlPoints,int index);
35 void updateLayout(SplineChartItem* item, QVector<QPointF>& oldPoints , QVector<QPointF>& newPoints, QVector<QPointF>& oldControlPoints, QVector<QPointF>& newContorlPoints,int index);
36 void applyLayout(AxisItem* item, QVector<qreal>& layout);
36 void updateLayout(AxisItem* item, QVector<qreal>& layout);
37
37
38 void addAnimation(PieChartItem* item, QPieSlice *slice, const PieSliceLayout &layout, bool isEmpty);
38 void addAnimation(PieChartItem* item, QPieSlice *slice, const PieSliceLayout &layout, bool isEmpty);
39 void removeAnimation(PieChartItem* item, QPieSlice *slice);
39 void removeAnimation(PieChartItem* item, QPieSlice *slice);
40 void updateLayout(PieChartItem* item, const PieLayout &layout);
40 void updateLayout(PieChartItem* item, const PieLayout &layout);
41 void updateLayout(PieChartItem* item, QPieSlice *slice, const PieSliceLayout &layout);
41 void updateLayout(PieChartItem* item, QPieSlice *slice, const PieSliceLayout &layout);
42
42
43 void setState(State state,const QPointF& point = QPointF());
43 void setState(State state,const QPointF& point = QPointF());
44
44
45 private:
45 private:
46 QMap<ChartItem*,ChartAnimation*> m_animations;
46 QMap<ChartItem*,ChartAnimation*> m_animations;
47 State m_state;
47 State m_state;
48 QPointF m_point;
48 QPointF m_point;
49 };
49 };
50
50
51 QTCOMMERCIALCHART_END_NAMESPACE
51 QTCOMMERCIALCHART_END_NAMESPACE
52
52
53 #endif
53 #endif
@@ -1,406 +1,406
1 #include "axisitem_p.h"
1 #include "axisitem_p.h"
2 #include "qchartaxis.h"
2 #include "qchartaxis.h"
3 #include "chartpresenter_p.h"
3 #include "chartpresenter_p.h"
4 #include "chartanimator_p.h"
4 #include "chartanimator_p.h"
5 #include <QPainter>
5 #include <QPainter>
6 #include <QDebug>
6 #include <QDebug>
7
7
8 static int label_padding = 5;
8 static int label_padding = 5;
9
9
10 QTCOMMERCIALCHART_BEGIN_NAMESPACE
10 QTCOMMERCIALCHART_BEGIN_NAMESPACE
11
11
12 AxisItem::AxisItem(QChartAxis* axis,ChartPresenter* presenter,AxisType type,QGraphicsItem* parent) :
12 AxisItem::AxisItem(QChartAxis* axis,ChartPresenter* presenter,AxisType type,QGraphicsItem* parent) :
13 ChartItem(parent),
13 ChartItem(parent),
14 m_presenter(presenter),
14 m_presenter(presenter),
15 m_chartAxis(axis),
15 m_chartAxis(axis),
16 m_type(type),
16 m_type(type),
17 m_labelsAngle(0),
17 m_labelsAngle(0),
18 m_grid(parent),
18 m_grid(parent),
19 m_shades(parent),
19 m_shades(parent),
20 m_labels(parent),
20 m_labels(parent),
21 m_axis(parent),
21 m_axis(parent),
22 m_min(0),
22 m_min(0),
23 m_max(0),
23 m_max(0),
24 m_ticksCount(0)
24 m_ticksCount(0)
25 {
25 {
26 //initial initialization
26 //initial initialization
27 m_axis.setZValue(ChartPresenter::AxisZValue);
27 m_axis.setZValue(ChartPresenter::AxisZValue);
28 m_shades.setZValue(ChartPresenter::ShadesZValue);
28 m_shades.setZValue(ChartPresenter::ShadesZValue);
29 m_grid.setZValue(ChartPresenter::GridZValue);
29 m_grid.setZValue(ChartPresenter::GridZValue);
30 setFlags(QGraphicsItem::ItemHasNoContents);
30 setFlags(QGraphicsItem::ItemHasNoContents);
31
31
32 QObject::connect(m_chartAxis,SIGNAL(updated()),this,SLOT(handleAxisUpdated()));
32 QObject::connect(m_chartAxis,SIGNAL(updated()),this,SLOT(handleAxisUpdated()));
33 QObject::connect(m_chartAxis->categories(),SIGNAL(updated()),this,SLOT(handleAxisCategoriesUpdated()));
33 QObject::connect(m_chartAxis->categories(),SIGNAL(updated()),this,SLOT(handleAxisCategoriesUpdated()));
34
34
35 handleAxisUpdated();
35 handleAxisUpdated();
36 }
36 }
37
37
38 AxisItem::~AxisItem()
38 AxisItem::~AxisItem()
39 {
39 {
40 }
40 }
41
41
42 QRectF AxisItem::boundingRect() const
42 QRectF AxisItem::boundingRect() const
43 {
43 {
44 return QRectF();
44 return QRectF();
45 }
45 }
46
46
47 void AxisItem::createItems(int count)
47 void AxisItem::createItems(int count)
48 {
48 {
49
49
50 if(m_axis.children().size()==0)
50 if(m_axis.children().size()==0)
51 m_axis.addToGroup(new QGraphicsLineItem());
51 m_axis.addToGroup(new QGraphicsLineItem());
52 for (int i = 0; i < count; ++i) {
52 for (int i = 0; i < count; ++i) {
53 m_grid.addToGroup(new QGraphicsLineItem());
53 m_grid.addToGroup(new QGraphicsLineItem());
54 m_labels.addToGroup(new QGraphicsSimpleTextItem());
54 m_labels.addToGroup(new QGraphicsSimpleTextItem());
55 m_axis.addToGroup(new QGraphicsLineItem());
55 m_axis.addToGroup(new QGraphicsLineItem());
56 if((m_grid.childItems().size())%2 && m_grid.childItems().size()>2) m_shades.addToGroup(new QGraphicsRectItem());
56 if((m_grid.childItems().size())%2 && m_grid.childItems().size()>2) m_shades.addToGroup(new QGraphicsRectItem());
57 }
57 }
58 }
58 }
59
59
60 void AxisItem::deleteItems(int count)
60 void AxisItem::deleteItems(int count)
61 {
61 {
62 QList<QGraphicsItem *> lines = m_grid.childItems();
62 QList<QGraphicsItem *> lines = m_grid.childItems();
63 QList<QGraphicsItem *> labels = m_labels.childItems();
63 QList<QGraphicsItem *> labels = m_labels.childItems();
64 QList<QGraphicsItem *> shades = m_shades.childItems();
64 QList<QGraphicsItem *> shades = m_shades.childItems();
65 QList<QGraphicsItem *> axis = m_axis.childItems();
65 QList<QGraphicsItem *> axis = m_axis.childItems();
66
66
67 for (int i = 0; i < count; ++i) {
67 for (int i = 0; i < count; ++i) {
68 if(lines.size()%2 && lines.size()>1) delete(shades.takeLast());
68 if(lines.size()%2 && lines.size()>1) delete(shades.takeLast());
69 delete(lines.takeLast());
69 delete(lines.takeLast());
70 delete(labels.takeLast());
70 delete(labels.takeLast());
71 delete(axis.takeLast());
71 delete(axis.takeLast());
72 }
72 }
73 }
73 }
74
74
75 void AxisItem::updateLayout(QVector<qreal>& layout)
75 void AxisItem::updateLayout(QVector<qreal>& layout)
76 {
76 {
77 if(m_animator){
77 if(m_animator){
78 m_animator->applyLayout(this,layout);
78 m_animator->updateLayout(this,layout);
79 }
79 }
80 else setLayout(layout);
80 else setLayout(layout);
81 }
81 }
82
82
83 QStringList AxisItem::createLabels(int ticks, qreal min, qreal max) const
83 QStringList AxisItem::createLabels(int ticks, qreal min, qreal max) const
84 {
84 {
85 Q_ASSERT(max>=min);
85 Q_ASSERT(max>=min);
86 Q_ASSERT(ticks>0);
86 Q_ASSERT(ticks>0);
87
87
88 QStringList labels;
88 QStringList labels;
89
89
90 QChartAxisCategories* categories = m_chartAxis->categories();
90 QChartAxisCategories* categories = m_chartAxis->categories();
91
91
92 for(int i=0; i< ticks; i++) {
92 for(int i=0; i< ticks; i++) {
93 qreal value = min + (i * (max - min)/ (ticks-1));
93 qreal value = min + (i * (max - min)/ (ticks-1));
94 if(categories->count()==0) {
94 if(categories->count()==0) {
95 labels << QString::number(value);
95 labels << QString::number(value);
96 }
96 }
97 else {
97 else {
98
98
99 QString label = categories->label(value);
99 QString label = categories->label(value);
100 labels << label;
100 labels << label;
101 }
101 }
102 }
102 }
103 return labels;
103 return labels;
104 }
104 }
105
105
106 void AxisItem::setAxisOpacity(qreal opacity)
106 void AxisItem::setAxisOpacity(qreal opacity)
107 {
107 {
108 m_axis.setOpacity(opacity);
108 m_axis.setOpacity(opacity);
109 }
109 }
110
110
111 qreal AxisItem::axisOpacity() const
111 qreal AxisItem::axisOpacity() const
112 {
112 {
113 return m_axis.opacity();
113 return m_axis.opacity();
114 }
114 }
115
115
116 void AxisItem::setGridOpacity(qreal opacity)
116 void AxisItem::setGridOpacity(qreal opacity)
117 {
117 {
118 m_grid.setOpacity(opacity);
118 m_grid.setOpacity(opacity);
119 }
119 }
120
120
121 qreal AxisItem::gridOpacity() const
121 qreal AxisItem::gridOpacity() const
122 {
122 {
123 return m_grid.opacity();
123 return m_grid.opacity();
124 }
124 }
125
125
126 void AxisItem::setLabelsOpacity(qreal opacity)
126 void AxisItem::setLabelsOpacity(qreal opacity)
127 {
127 {
128 m_labels.setOpacity(opacity);
128 m_labels.setOpacity(opacity);
129 }
129 }
130
130
131 qreal AxisItem::labelsOpacity() const
131 qreal AxisItem::labelsOpacity() const
132 {
132 {
133 return m_labels.opacity();
133 return m_labels.opacity();
134 }
134 }
135
135
136 void AxisItem::setShadesOpacity(qreal opacity)
136 void AxisItem::setShadesOpacity(qreal opacity)
137 {
137 {
138 m_shades.setOpacity(opacity);
138 m_shades.setOpacity(opacity);
139 }
139 }
140
140
141 qreal AxisItem::shadesOpacity() const
141 qreal AxisItem::shadesOpacity() const
142 {
142 {
143 return m_shades.opacity();
143 return m_shades.opacity();
144 }
144 }
145
145
146 void AxisItem::setLabelsAngle(int angle)
146 void AxisItem::setLabelsAngle(int angle)
147 {
147 {
148 foreach(QGraphicsItem* item , m_labels.childItems()) {
148 foreach(QGraphicsItem* item , m_labels.childItems()) {
149 QPointF center = item->boundingRect().center();
149 QPointF center = item->boundingRect().center();
150 item->setRotation(angle);
150 item->setRotation(angle);
151 }
151 }
152
152
153 m_labelsAngle=angle;
153 m_labelsAngle=angle;
154 }
154 }
155
155
156 void AxisItem::setLabelsPen(const QPen& pen)
156 void AxisItem::setLabelsPen(const QPen& pen)
157 {
157 {
158 foreach(QGraphicsItem* item , m_labels.childItems()) {
158 foreach(QGraphicsItem* item , m_labels.childItems()) {
159 static_cast<QGraphicsSimpleTextItem*>(item)->setPen(pen);
159 static_cast<QGraphicsSimpleTextItem*>(item)->setPen(pen);
160 }
160 }
161 }
161 }
162
162
163 void AxisItem::setLabelsBrush(const QBrush& brush)
163 void AxisItem::setLabelsBrush(const QBrush& brush)
164 {
164 {
165 foreach(QGraphicsItem* item , m_labels.childItems()) {
165 foreach(QGraphicsItem* item , m_labels.childItems()) {
166 static_cast<QGraphicsSimpleTextItem*>(item)->setBrush(brush);
166 static_cast<QGraphicsSimpleTextItem*>(item)->setBrush(brush);
167 }
167 }
168 }
168 }
169
169
170 void AxisItem::setLabelsFont(const QFont& font)
170 void AxisItem::setLabelsFont(const QFont& font)
171 {
171 {
172 foreach(QGraphicsItem* item , m_labels.childItems()) {
172 foreach(QGraphicsItem* item , m_labels.childItems()) {
173 static_cast<QGraphicsSimpleTextItem*>(item)->setFont(font);
173 static_cast<QGraphicsSimpleTextItem*>(item)->setFont(font);
174 }
174 }
175 }
175 }
176
176
177 void AxisItem::setShadesBrush(const QBrush& brush)
177 void AxisItem::setShadesBrush(const QBrush& brush)
178 {
178 {
179 foreach(QGraphicsItem* item , m_shades.childItems()) {
179 foreach(QGraphicsItem* item , m_shades.childItems()) {
180 static_cast<QGraphicsRectItem*>(item)->setBrush(brush);
180 static_cast<QGraphicsRectItem*>(item)->setBrush(brush);
181 }
181 }
182 }
182 }
183
183
184 void AxisItem::setShadesPen(const QPen& pen)
184 void AxisItem::setShadesPen(const QPen& pen)
185 {
185 {
186 foreach(QGraphicsItem* item , m_shades.childItems()) {
186 foreach(QGraphicsItem* item , m_shades.childItems()) {
187 static_cast<QGraphicsRectItem*>(item)->setPen(pen);
187 static_cast<QGraphicsRectItem*>(item)->setPen(pen);
188 }
188 }
189 }
189 }
190
190
191 void AxisItem::setAxisPen(const QPen& pen)
191 void AxisItem::setAxisPen(const QPen& pen)
192 {
192 {
193 foreach(QGraphicsItem* item , m_axis.childItems()) {
193 foreach(QGraphicsItem* item , m_axis.childItems()) {
194 static_cast<QGraphicsLineItem*>(item)->setPen(pen);
194 static_cast<QGraphicsLineItem*>(item)->setPen(pen);
195 }
195 }
196 }
196 }
197
197
198 void AxisItem::setGridPen(const QPen& pen)
198 void AxisItem::setGridPen(const QPen& pen)
199 {
199 {
200 foreach(QGraphicsItem* item , m_grid.childItems()) {
200 foreach(QGraphicsItem* item , m_grid.childItems()) {
201 static_cast<QGraphicsLineItem*>(item)->setPen(pen);
201 static_cast<QGraphicsLineItem*>(item)->setPen(pen);
202 }
202 }
203 }
203 }
204
204
205 QVector<qreal> AxisItem::calculateLayout() const
205 QVector<qreal> AxisItem::calculateLayout() const
206 {
206 {
207 Q_ASSERT(m_ticksCount>=2);
207 Q_ASSERT(m_ticksCount>=2);
208
208
209 QVector<qreal> points;
209 QVector<qreal> points;
210 points.resize(m_ticksCount);
210 points.resize(m_ticksCount);
211
211
212 switch (m_type)
212 switch (m_type)
213 {
213 {
214 case X_AXIS:
214 case X_AXIS:
215 {
215 {
216 const qreal deltaX = m_rect.width()/(m_ticksCount-1);
216 const qreal deltaX = m_rect.width()/(m_ticksCount-1);
217 for (int i = 0; i < m_ticksCount; ++i) {
217 for (int i = 0; i < m_ticksCount; ++i) {
218 int x = i * deltaX + m_rect.left();
218 int x = i * deltaX + m_rect.left();
219 points[i] = x;
219 points[i] = x;
220 }
220 }
221 }
221 }
222 break;
222 break;
223 case Y_AXIS:
223 case Y_AXIS:
224 {
224 {
225 const qreal deltaY = m_rect.height()/(m_ticksCount-1);
225 const qreal deltaY = m_rect.height()/(m_ticksCount-1);
226 for (int i = 0; i < m_ticksCount; ++i) {
226 for (int i = 0; i < m_ticksCount; ++i) {
227 int y = i * -deltaY + m_rect.bottom();
227 int y = i * -deltaY + m_rect.bottom();
228 points[i] = y;
228 points[i] = y;
229 }
229 }
230 }
230 }
231 break;
231 break;
232 }
232 }
233 return points;
233 return points;
234 }
234 }
235
235
236 void AxisItem::setLayout(QVector<qreal>& layout)
236 void AxisItem::setLayout(QVector<qreal>& layout)
237 {
237 {
238 int diff = m_layoutVector.size() - layout.size();
238 int diff = m_layoutVector.size() - layout.size();
239
239
240 if(diff>0) {
240 if(diff>0) {
241 deleteItems(diff);
241 deleteItems(diff);
242 }
242 }
243 else if(diff<0) {
243 else if(diff<0) {
244 createItems(-diff);
244 createItems(-diff);
245 }
245 }
246
246
247 if(diff!=0) handleAxisUpdated();
247 if(diff!=0) handleAxisUpdated();
248
248
249 QStringList ticksList = createLabels(layout.size(),m_min,m_max);
249 QStringList ticksList = createLabels(layout.size(),m_min,m_max);
250
250
251 QList<QGraphicsItem *> lines = m_grid.childItems();
251 QList<QGraphicsItem *> lines = m_grid.childItems();
252 QList<QGraphicsItem *> labels = m_labels.childItems();
252 QList<QGraphicsItem *> labels = m_labels.childItems();
253 QList<QGraphicsItem *> shades = m_shades.childItems();
253 QList<QGraphicsItem *> shades = m_shades.childItems();
254 QList<QGraphicsItem *> axis = m_axis.childItems();
254 QList<QGraphicsItem *> axis = m_axis.childItems();
255
255
256 Q_ASSERT(labels.size() == ticksList.size());
256 Q_ASSERT(labels.size() == ticksList.size());
257 Q_ASSERT(layout.size() == ticksList.size());
257 Q_ASSERT(layout.size() == ticksList.size());
258
258
259 switch (m_type)
259 switch (m_type)
260 {
260 {
261 case X_AXIS:
261 case X_AXIS:
262 {
262 {
263 QGraphicsLineItem *lineItem = static_cast<QGraphicsLineItem*>(axis.at(0));
263 QGraphicsLineItem *lineItem = static_cast<QGraphicsLineItem*>(axis.at(0));
264 lineItem->setLine(m_rect.left(), m_rect.bottom(), m_rect.right(), m_rect.bottom());
264 lineItem->setLine(m_rect.left(), m_rect.bottom(), m_rect.right(), m_rect.bottom());
265
265
266 for (int i = 0; i < layout.size(); ++i) {
266 for (int i = 0; i < layout.size(); ++i) {
267 QGraphicsLineItem *lineItem = static_cast<QGraphicsLineItem*>(lines.at(i));
267 QGraphicsLineItem *lineItem = static_cast<QGraphicsLineItem*>(lines.at(i));
268 lineItem->setLine(layout[i], m_rect.top(), layout[i], m_rect.bottom());
268 lineItem->setLine(layout[i], m_rect.top(), layout[i], m_rect.bottom());
269 QGraphicsSimpleTextItem *labelItem = static_cast<QGraphicsSimpleTextItem*>(labels.at(i));
269 QGraphicsSimpleTextItem *labelItem = static_cast<QGraphicsSimpleTextItem*>(labels.at(i));
270 labelItem->setText(ticksList.at(i));
270 labelItem->setText(ticksList.at(i));
271 QPointF center = labelItem->boundingRect().center();
271 QPointF center = labelItem->boundingRect().center();
272 labelItem->setTransformOriginPoint(center.x(), center.y());
272 labelItem->setTransformOriginPoint(center.x(), center.y());
273 labelItem->setPos(layout[i] - center.x(), m_rect.bottom() + label_padding);
273 labelItem->setPos(layout[i] - center.x(), m_rect.bottom() + label_padding);
274 if((i+1)%2 && i>1) {
274 if((i+1)%2 && i>1) {
275 QGraphicsRectItem *rectItem = static_cast<QGraphicsRectItem*>(shades.at(i/2-1));
275 QGraphicsRectItem *rectItem = static_cast<QGraphicsRectItem*>(shades.at(i/2-1));
276 rectItem->setRect(layout[i-1],m_rect.top(),layout[i]-layout[i-1],m_rect.height());
276 rectItem->setRect(layout[i-1],m_rect.top(),layout[i]-layout[i-1],m_rect.height());
277 }
277 }
278 lineItem = static_cast<QGraphicsLineItem*>(axis.at(i+1));
278 lineItem = static_cast<QGraphicsLineItem*>(axis.at(i+1));
279 lineItem->setLine(layout[i],m_rect.bottom(),layout[i],m_rect.bottom()+5);
279 lineItem->setLine(layout[i],m_rect.bottom(),layout[i],m_rect.bottom()+5);
280 }
280 }
281 }
281 }
282 break;
282 break;
283
283
284 case Y_AXIS:
284 case Y_AXIS:
285 {
285 {
286 QGraphicsLineItem *lineItem = static_cast<QGraphicsLineItem*>(axis.at(0));
286 QGraphicsLineItem *lineItem = static_cast<QGraphicsLineItem*>(axis.at(0));
287 lineItem->setLine(m_rect.left() , m_rect.top(), m_rect.left(), m_rect.bottom());
287 lineItem->setLine(m_rect.left() , m_rect.top(), m_rect.left(), m_rect.bottom());
288
288
289 for (int i = 0; i < layout.size(); ++i) {
289 for (int i = 0; i < layout.size(); ++i) {
290 QGraphicsLineItem *lineItem = static_cast<QGraphicsLineItem*>(lines.at(i));
290 QGraphicsLineItem *lineItem = static_cast<QGraphicsLineItem*>(lines.at(i));
291 lineItem->setLine(m_rect.left() , layout[i], m_rect.right(), layout[i]);
291 lineItem->setLine(m_rect.left() , layout[i], m_rect.right(), layout[i]);
292 QGraphicsSimpleTextItem *labelItem = static_cast<QGraphicsSimpleTextItem*>(labels.at(i));
292 QGraphicsSimpleTextItem *labelItem = static_cast<QGraphicsSimpleTextItem*>(labels.at(i));
293 labelItem->setText(ticksList.at(i));
293 labelItem->setText(ticksList.at(i));
294 QPointF center = labelItem->boundingRect().center();
294 QPointF center = labelItem->boundingRect().center();
295 labelItem->setTransformOriginPoint(center.x(), center.y());
295 labelItem->setTransformOriginPoint(center.x(), center.y());
296 labelItem->setPos(m_rect.left() - labelItem->boundingRect().width() - label_padding , layout[i]-center.y());
296 labelItem->setPos(m_rect.left() - labelItem->boundingRect().width() - label_padding , layout[i]-center.y());
297 if((i+1)%2 && i>1) {
297 if((i+1)%2 && i>1) {
298 QGraphicsRectItem *rectItem = static_cast<QGraphicsRectItem*>(shades.at(i/2-1));
298 QGraphicsRectItem *rectItem = static_cast<QGraphicsRectItem*>(shades.at(i/2-1));
299 rectItem->setRect(m_rect.left(),layout[i],m_rect.width(),layout[i-1]-layout[i]);
299 rectItem->setRect(m_rect.left(),layout[i],m_rect.width(),layout[i-1]-layout[i]);
300 }
300 }
301 lineItem = static_cast<QGraphicsLineItem*>(axis.at(i+1));
301 lineItem = static_cast<QGraphicsLineItem*>(axis.at(i+1));
302 lineItem->setLine(m_rect.left()-5,layout[i],m_rect.left(),layout[i]);
302 lineItem->setLine(m_rect.left()-5,layout[i],m_rect.left(),layout[i]);
303 }
303 }
304 }
304 }
305 break;
305 break;
306 default:
306 default:
307 qDebug()<<"Unknown axis type";
307 qDebug()<<"Unknown axis type";
308 break;
308 break;
309 }
309 }
310
310
311 m_layoutVector=layout;
311 m_layoutVector=layout;
312 }
312 }
313
313
314 bool AxisItem::isEmpty()
314 bool AxisItem::isEmpty()
315 {
315 {
316 return m_rect.isEmpty() || m_min==m_max || m_ticksCount==0;
316 return m_rect.isEmpty() || m_min==m_max || m_ticksCount==0;
317 }
317 }
318
318
319 //handlers
319 //handlers
320
320
321 void AxisItem::handleAxisCategoriesUpdated()
321 void AxisItem::handleAxisCategoriesUpdated()
322 {
322 {
323 if(isEmpty()) return;
323 if(isEmpty()) return;
324 updateLayout(m_layoutVector);
324 updateLayout(m_layoutVector);
325 }
325 }
326
326
327 void AxisItem::handleAxisUpdated()
327 void AxisItem::handleAxisUpdated()
328 {
328 {
329
329
330 if(isEmpty()) return;
330 if(isEmpty()) return;
331
331
332 if(m_chartAxis->isAxisVisible()) {
332 if(m_chartAxis->isAxisVisible()) {
333 setAxisOpacity(100);
333 setAxisOpacity(100);
334 }
334 }
335 else {
335 else {
336 setAxisOpacity(0);
336 setAxisOpacity(0);
337 }
337 }
338
338
339 if(m_chartAxis->isGridLineVisible()) {
339 if(m_chartAxis->isGridLineVisible()) {
340 setGridOpacity(100);
340 setGridOpacity(100);
341 }
341 }
342 else {
342 else {
343 setGridOpacity(0);
343 setGridOpacity(0);
344 }
344 }
345
345
346 if(m_chartAxis->labelsVisible())
346 if(m_chartAxis->labelsVisible())
347 {
347 {
348 setLabelsOpacity(100);
348 setLabelsOpacity(100);
349 }
349 }
350 else {
350 else {
351 setLabelsOpacity(0);
351 setLabelsOpacity(0);
352 }
352 }
353
353
354 if(m_chartAxis->shadesVisible()) {
354 if(m_chartAxis->shadesVisible()) {
355 setShadesOpacity(m_chartAxis->shadesOpacity());
355 setShadesOpacity(m_chartAxis->shadesOpacity());
356 }
356 }
357 else {
357 else {
358 setShadesOpacity(0);
358 setShadesOpacity(0);
359 }
359 }
360
360
361 setLabelsAngle(m_chartAxis->labelsAngle());
361 setLabelsAngle(m_chartAxis->labelsAngle());
362 setAxisPen(m_chartAxis->axisPen());
362 setAxisPen(m_chartAxis->axisPen());
363 setLabelsPen(m_chartAxis->labelsPen());
363 setLabelsPen(m_chartAxis->labelsPen());
364 setLabelsBrush(m_chartAxis->labelsBrush());
364 setLabelsBrush(m_chartAxis->labelsBrush());
365 setLabelsFont(m_chartAxis->labelsFont());
365 setLabelsFont(m_chartAxis->labelsFont());
366 setGridPen(m_chartAxis->gridLinePen());
366 setGridPen(m_chartAxis->gridLinePen());
367 setShadesPen(m_chartAxis->shadesPen());
367 setShadesPen(m_chartAxis->shadesPen());
368 setShadesBrush(m_chartAxis->shadesBrush());
368 setShadesBrush(m_chartAxis->shadesBrush());
369
369
370 }
370 }
371
371
372 void AxisItem::handleRangeChanged(qreal min, qreal max,int tickCount)
372 void AxisItem::handleRangeChanged(qreal min, qreal max,int tickCount)
373 {
373 {
374 if(min==max || tickCount<2) return;
374 if(min==max || tickCount<2) return;
375
375
376 m_min = min;
376 m_min = min;
377 m_max = max;
377 m_max = max;
378 m_ticksCount= tickCount;
378 m_ticksCount= tickCount;
379
379
380 if(isEmpty()) return;
380 if(isEmpty()) return;
381 QVector<qreal> layout = calculateLayout();
381 QVector<qreal> layout = calculateLayout();
382 updateLayout(layout);
382 updateLayout(layout);
383
383
384 }
384 }
385
385
386 void AxisItem::handleGeometryChanged(const QRectF& rect)
386 void AxisItem::handleGeometryChanged(const QRectF& rect)
387 {
387 {
388 m_rect = rect;
388 m_rect = rect;
389 if(isEmpty()) return;
389 if(isEmpty()) return;
390 QVector<qreal> layout = calculateLayout();
390 QVector<qreal> layout = calculateLayout();
391 updateLayout(layout);
391 updateLayout(layout);
392 }
392 }
393
393
394 //painter
394 //painter
395
395
396 void AxisItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
396 void AxisItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
397 {
397 {
398 Q_UNUSED(painter)
398 Q_UNUSED(painter)
399 Q_UNUSED(option)
399 Q_UNUSED(option)
400 Q_UNUSED(widget)
400 Q_UNUSED(widget)
401 }
401 }
402
402
403 //TODO "nice numbers algorithm"
403 //TODO "nice numbers algorithm"
404 #include "moc_axisitem_p.cpp"
404 #include "moc_axisitem_p.cpp"
405
405
406 QTCOMMERCIALCHART_END_NAMESPACE
406 QTCOMMERCIALCHART_END_NAMESPACE
General Comments 0
You need to be logged in to leave comments. Login now