@@ -0,0 +1,259 | |||
|
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 | #include "scroller_p.h" | |
|
22 | #include "qlegend.h" | |
|
23 | #include <QGraphicsSceneMouseEvent> | |
|
24 | ||
|
25 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | |
|
26 | ||
|
27 | Scroller::Scroller(QLegend* legend): | |
|
28 | m_ticker(this), | |
|
29 | m_state(Idle), | |
|
30 | m_moveThreshold(10), | |
|
31 | m_timeTreshold(50), | |
|
32 | m_legend(legend) | |
|
33 | { | |
|
34 | ||
|
35 | } | |
|
36 | ||
|
37 | Scroller::~Scroller() | |
|
38 | { | |
|
39 | } | |
|
40 | ||
|
41 | void Scroller::mousePressEvent(QGraphicsSceneMouseEvent* event) | |
|
42 | { | |
|
43 | if (event->button() == Qt::LeftButton) { | |
|
44 | ||
|
45 | switch (m_state) { | |
|
46 | case Idle: | |
|
47 | { | |
|
48 | m_state = Pressed; | |
|
49 | m_offset = offset(); | |
|
50 | m_press = event->pos(); | |
|
51 | m_timeStamp = QTime::currentTime(); | |
|
52 | event->accept(); | |
|
53 | break; | |
|
54 | } | |
|
55 | case Scroll: | |
|
56 | { | |
|
57 | m_state = Stop; | |
|
58 | m_speed = QPoint(0, 0); | |
|
59 | m_offset = offset(); | |
|
60 | m_press = event->pos(); | |
|
61 | event->accept(); | |
|
62 | break; | |
|
63 | } | |
|
64 | case Pressed: | |
|
65 | case Move: | |
|
66 | case Stop: | |
|
67 | qWarning() << __FUNCTION__<<"Scroller unexpected state" << m_state; | |
|
68 | event->ignore(); | |
|
69 | break; | |
|
70 | } | |
|
71 | } | |
|
72 | } | |
|
73 | ||
|
74 | void Scroller::mouseMoveEvent(QGraphicsSceneMouseEvent* event) | |
|
75 | { | |
|
76 | QPointF delta = event->pos() - m_press; | |
|
77 | ||
|
78 | switch (m_state) { | |
|
79 | case Pressed: | |
|
80 | case Stop: | |
|
81 | { | |
|
82 | if (qAbs(delta.x()) > m_moveThreshold || qAbs(delta.y()) > m_moveThreshold) { | |
|
83 | m_state = Move; | |
|
84 | m_timeStamp = QTime::currentTime(); | |
|
85 | m_distance = QPointF(0, 0); | |
|
86 | m_press = event->pos(); | |
|
87 | event->accept(); | |
|
88 | break; | |
|
89 | } | |
|
90 | else { | |
|
91 | event->ignore(); | |
|
92 | break; | |
|
93 | } | |
|
94 | } | |
|
95 | case Move: | |
|
96 | { | |
|
97 | setOffset(m_offset - delta); | |
|
98 | calculateSpeed(event->pos()); | |
|
99 | event->accept(); | |
|
100 | break; | |
|
101 | } | |
|
102 | case Idle: | |
|
103 | case Scroll: | |
|
104 | qWarning() << __FUNCTION__<<"Scroller unexpected state" << m_state; | |
|
105 | event->ignore(); | |
|
106 | break; | |
|
107 | } | |
|
108 | ||
|
109 | } | |
|
110 | ||
|
111 | void Scroller::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) | |
|
112 | { | |
|
113 | if (event->button() == Qt::LeftButton) { | |
|
114 | ||
|
115 | switch (m_state) { | |
|
116 | ||
|
117 | case Scroll: | |
|
118 | m_state = Stop; | |
|
119 | m_speed = QPointF(0, 0); | |
|
120 | m_offset = offset(); | |
|
121 | event->accept(); | |
|
122 | break; | |
|
123 | case Pressed: | |
|
124 | { | |
|
125 | m_state = Idle; | |
|
126 | //if (m_timeStamp.elapsed() < m_clickedPressDelay) { | |
|
127 | ||
|
128 | //emit clicked(m_offset.toPoint()); | |
|
129 | //} | |
|
130 | event->accept(); | |
|
131 | break; | |
|
132 | } | |
|
133 | case Move: | |
|
134 | { | |
|
135 | calculateSpeed(event->pos()); | |
|
136 | m_offset = offset(); | |
|
137 | m_press = event->pos(); | |
|
138 | if (m_speed == QPointF(0, 0)) { | |
|
139 | m_state = Idle; | |
|
140 | } | |
|
141 | else { | |
|
142 | m_speed /= 4; | |
|
143 | m_state = Scroll; | |
|
144 | m_ticker.start(20); | |
|
145 | } | |
|
146 | event->accept(); | |
|
147 | break; | |
|
148 | } | |
|
149 | ||
|
150 | case Stop: | |
|
151 | case Idle: | |
|
152 | qWarning() << __FUNCTION__<<"Scroller unexpected state" << m_state; | |
|
153 | event->ignore(); | |
|
154 | break; | |
|
155 | ||
|
156 | } | |
|
157 | } | |
|
158 | } | |
|
159 | ||
|
160 | void Scroller::scrollTick() | |
|
161 | { | |
|
162 | switch (m_state) { | |
|
163 | case Scroll: | |
|
164 | { | |
|
165 | lowerSpeed(m_speed); | |
|
166 | setOffset(m_offset - m_speed); | |
|
167 | m_offset = offset(); | |
|
168 | if (m_speed == QPointF(0, 0)) { | |
|
169 | m_state = Idle; | |
|
170 | m_ticker.stop(); | |
|
171 | } | |
|
172 | break; | |
|
173 | } | |
|
174 | case Stop: | |
|
175 | m_ticker.stop(); | |
|
176 | break; | |
|
177 | case Idle: | |
|
178 | case Move: | |
|
179 | case Pressed: | |
|
180 | qWarning() << __FUNCTION__<<"Scroller unexpected state" << m_state; | |
|
181 | m_ticker.stop(); | |
|
182 | break; | |
|
183 | ||
|
184 | } | |
|
185 | } | |
|
186 | ||
|
187 | void Scroller::lowerSpeed(QPointF& speed, qreal maxSpeed) | |
|
188 | { | |
|
189 | qreal x = qBound(-maxSpeed, speed.x(), maxSpeed); | |
|
190 | qreal y = qBound(-maxSpeed, speed.y(), maxSpeed); | |
|
191 | ||
|
192 | x = (x == 0) ? x : | |
|
193 | (x > 0) ? qMax(qreal(0), x - m_fraction.x()) : qMin(qreal(0), x + m_fraction.x()); | |
|
194 | y = (y == 0) ? y : | |
|
195 | (y > 0) ? qMax(qreal(0), y - m_fraction.y()) : qMin(qreal(0), y + m_fraction.y()); | |
|
196 | speed.setX(x); | |
|
197 | speed.setY(y); | |
|
198 | } | |
|
199 | ||
|
200 | void Scroller::calculateSpeed(const QPointF& position) | |
|
201 | { | |
|
202 | if (m_timeStamp.elapsed() > m_timeTreshold) { | |
|
203 | ||
|
204 | QPointF distance = position - m_press; | |
|
205 | ||
|
206 | m_timeStamp = QTime::currentTime(); | |
|
207 | m_speed = distance - m_distance; | |
|
208 | m_distance = distance; | |
|
209 | ||
|
210 | qreal fraction = qMax(qAbs(m_speed.x()), qAbs(m_speed.y())); | |
|
211 | ||
|
212 | if (fraction != 0) { | |
|
213 | m_fraction.setX(qAbs(m_speed.x() / fraction)); | |
|
214 | m_fraction.setY(qAbs(m_speed.y() / fraction)); | |
|
215 | } | |
|
216 | else { | |
|
217 | m_fraction.setX(1); | |
|
218 | m_fraction.setY(1); | |
|
219 | } | |
|
220 | } | |
|
221 | } | |
|
222 | ||
|
223 | void Scroller::setOffset(const QPointF& point) | |
|
224 | { | |
|
225 | m_legend->setOffset(point); | |
|
226 | } | |
|
227 | ||
|
228 | QPointF Scroller::offset() const | |
|
229 | { | |
|
230 | return m_legend->offset(); | |
|
231 | } | |
|
232 | ||
|
233 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
|
234 | ||
|
235 | ScrollTicker::ScrollTicker(Scroller *scroller,QObject* parent):QObject(parent), | |
|
236 | m_scroller(scroller) | |
|
237 | { | |
|
238 | ||
|
239 | } | |
|
240 | ||
|
241 | void ScrollTicker::start(int interval) | |
|
242 | { | |
|
243 | if (!m_timer.isActive()){ | |
|
244 | m_timer.start(interval, this); | |
|
245 | } | |
|
246 | } | |
|
247 | ||
|
248 | void ScrollTicker::stop() | |
|
249 | { | |
|
250 | m_timer.stop(); | |
|
251 | } | |
|
252 | ||
|
253 | void ScrollTicker::timerEvent(QTimerEvent *event) | |
|
254 | { | |
|
255 | Q_UNUSED(event); | |
|
256 | m_scroller->scrollTick(); | |
|
257 | } | |
|
258 | ||
|
259 | QTCOMMERCIALCHART_END_NAMESPACE |
@@ -0,0 +1,107 | |||
|
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 SCROLLER_P_H_ | |
|
31 | #define SCROLLER_P_H_ | |
|
32 | ||
|
33 | #include "qchartglobal.h" | |
|
34 | #include <QBasicTimer> | |
|
35 | #include <QTime> | |
|
36 | #include <QPointF> | |
|
37 | ||
|
38 | class QGraphicsSceneMouseEvent; | |
|
39 | ||
|
40 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | |
|
41 | ||
|
42 | class Scroller; | |
|
43 | class QLegend; | |
|
44 | ||
|
45 | class ScrollTicker : public QObject | |
|
46 | { | |
|
47 | public: | |
|
48 | ScrollTicker(Scroller *scroller,QObject *parent=0); | |
|
49 | void start(int interval); | |
|
50 | void stop(); | |
|
51 | protected: | |
|
52 | void timerEvent(QTimerEvent *event); | |
|
53 | ||
|
54 | private: | |
|
55 | QBasicTimer m_timer; | |
|
56 | Scroller *m_scroller; | |
|
57 | }; | |
|
58 | ||
|
59 | class Scroller | |
|
60 | { | |
|
61 | public: | |
|
62 | enum State { | |
|
63 | Idle, | |
|
64 | Pressed, | |
|
65 | Move, | |
|
66 | Scroll, | |
|
67 | Stop | |
|
68 | }; | |
|
69 | ||
|
70 | explicit Scroller(QLegend* legend); | |
|
71 | virtual ~Scroller(); | |
|
72 | ||
|
73 | virtual void setOffset(const QPointF& point); | |
|
74 | virtual QPointF offset() const; | |
|
75 | ||
|
76 | public: | |
|
77 | void scrollTick(); | |
|
78 | ||
|
79 | ||
|
80 | public: | |
|
81 | void mousePressEvent(QGraphicsSceneMouseEvent* event); | |
|
82 | void mouseMoveEvent(QGraphicsSceneMouseEvent* event); | |
|
83 | void mouseReleaseEvent(QGraphicsSceneMouseEvent* event); | |
|
84 | ||
|
85 | private: | |
|
86 | void calculateSpeed(const QPointF& position); | |
|
87 | void lowerSpeed(QPointF& speed,qreal maxSpeed=100); | |
|
88 | ||
|
89 | private: | |
|
90 | ScrollTicker m_ticker; | |
|
91 | State m_state; | |
|
92 | QTime m_timeStamp; | |
|
93 | QPointF m_press; | |
|
94 | QPointF m_offset; | |
|
95 | QPointF m_speed; | |
|
96 | QPointF m_distance; | |
|
97 | QPointF m_fraction; | |
|
98 | int m_moveThreshold; | |
|
99 | int m_timeTreshold; | |
|
100 | QLegend* m_legend; | |
|
101 | ||
|
102 | ||
|
103 | }; | |
|
104 | ||
|
105 | QTCOMMERCIALCHART_END_NAMESPACE | |
|
106 | ||
|
107 | #endif /* SCROLLER_P_H_ */ |
@@ -60,6 +60,7 ThemeWidget::ThemeWidget(QWidget* parent) : | |||
|
60 | 60 | settingsLayout->addWidget(m_themeComboBox); |
|
61 | 61 | settingsLayout->addWidget(new QLabel("Animation:")); |
|
62 | 62 | settingsLayout->addWidget(m_animatedComboBox); |
|
63 | settingsLayout->addWidget(new QLabel("Legend:")); | |
|
63 | 64 | settingsLayout->addWidget(m_legendComboBox); |
|
64 | 65 | settingsLayout->addWidget(m_antialiasCheckBox); |
|
65 | 66 | settingsLayout->addStretch(); |
@@ -98,6 +99,7 ThemeWidget::ThemeWidget(QWidget* parent) : | |||
|
98 | 99 | |
|
99 | 100 | // Set defaults |
|
100 | 101 | m_antialiasCheckBox->setChecked(true); |
|
102 | updateUI(); | |
|
101 | 103 | } |
|
102 | 104 | |
|
103 | 105 | ThemeWidget::~ThemeWidget() |
@@ -164,7 +166,7 QComboBox* ThemeWidget::createAnimationBox() const | |||
|
164 | 166 | QComboBox* ThemeWidget::createLegendBox() const |
|
165 | 167 | { |
|
166 | 168 | QComboBox* legendComboBox = new QComboBox(); |
|
167 |
legendComboBox->addItem("Legend |
|
|
169 | legendComboBox->addItem("No Legend ", 0); | |
|
168 | 170 | legendComboBox->addItem("Legend Top", QLegend::AlignmentTop); |
|
169 | 171 | legendComboBox->addItem("Legend Bottom", QLegend::AlignmentBottom); |
|
170 | 172 | legendComboBox->addItem("Legend Left", QLegend::AlignmentLeft); |
@@ -355,17 +357,17 void ThemeWidget::updateUI() | |||
|
355 | 357 | chartView->chart()->setAnimationOptions(options); |
|
356 | 358 | } |
|
357 | 359 | |
|
358 | int alignment(m_legendComboBox->itemData(m_legendComboBox->currentIndex()).toInt()); | |
|
359 | if (alignment == -1) { | |
|
360 | QLegend::Alignments alignment(m_legendComboBox->itemData(m_legendComboBox->currentIndex()).toInt()); | |
|
361 | ||
|
362 | if (!alignment) { | |
|
360 | 363 | foreach (QChartView *chartView, m_charts) { |
|
361 |
chartView->chart()->legend()-> |
|
|
364 | chartView->chart()->legend()->hide(); | |
|
362 | 365 | } |
|
363 | } else { | |
|
364 | QLegend::Alignments legendAlignment(alignment); | |
|
366 | } | |
|
367 | else | |
|
365 | 368 | foreach (QChartView *chartView, m_charts) { |
|
366 |
chartView->chart()->legend()->setAlignmnent( |
|
|
367 |
chartView->chart()->legend()->s |
|
|
369 | chartView->chart()->legend()->setAlignmnent(alignment); | |
|
370 | chartView->chart()->legend()->show(); | |
|
368 | 371 | } |
|
369 | } | |
|
370 | 372 | } |
|
371 | 373 |
@@ -58,6 +58,7 public: // from QChartSeries | |||
|
58 | 58 | Q_SIGNALS: |
|
59 | 59 | void updated(); |
|
60 | 60 | void clicked(const QPointF &point); |
|
61 | void selected(); | |
|
61 | 62 | |
|
62 | 63 | private: |
|
63 | 64 | QBrush m_brush; |
@@ -283,6 +283,9 void Axis::setLayout(QVector<qreal> &layout) | |||
|
283 | 283 | Q_ASSERT(labels.size() == ticksList.size()); |
|
284 | 284 | Q_ASSERT(layout.size() == ticksList.size()); |
|
285 | 285 | |
|
286 | qreal minWidth = 0; | |
|
287 | qreal minHeight = 0; | |
|
288 | ||
|
286 | 289 | switch (m_type) |
|
287 | 290 | { |
|
288 | 291 | case X_AXIS: |
@@ -296,12 +299,18 void Axis::setLayout(QVector<qreal> &layout) | |||
|
296 | 299 | QGraphicsSimpleTextItem *labelItem = static_cast<QGraphicsSimpleTextItem*>(labels.at(i)); |
|
297 | 300 | if (!categories || i<1) { |
|
298 | 301 | labelItem->setText(ticksList.at(i)); |
|
299 |
|
|
|
302 | const QRectF& rect = labelItem->boundingRect(); | |
|
303 | minWidth+=rect.width(); | |
|
304 | minHeight=qMax(rect.height(),minHeight); | |
|
305 | QPointF center = rect.center(); | |
|
300 | 306 | labelItem->setTransformOriginPoint(center.x(), center.y()); |
|
301 | 307 | labelItem->setPos(layout[i] - center.x(), m_rect.bottom() + label_padding); |
|
302 | 308 | } else { |
|
303 | 309 | labelItem->setText(ticksList.at(i)); |
|
304 |
|
|
|
310 | const QRectF& rect = labelItem->boundingRect(); | |
|
311 | minWidth+=rect.width(); | |
|
312 | minHeight=qMax(rect.height()+label_padding,minHeight); | |
|
313 | QPointF center = rect.center(); | |
|
305 | 314 | labelItem->setTransformOriginPoint(center.x(), center.y()); |
|
306 | 315 | labelItem->setPos(layout[i] - (layout[i] - layout[i-1])/2 - center.x(), m_rect.bottom() + label_padding); |
|
307 | 316 | } |
@@ -313,6 +322,7 void Axis::setLayout(QVector<qreal> &layout) | |||
|
313 | 322 | lineItem = static_cast<QGraphicsLineItem*>(axis.at(i+1)); |
|
314 | 323 | lineItem->setLine(layout[i],m_rect.bottom(),layout[i],m_rect.bottom()+5); |
|
315 | 324 | } |
|
325 | ||
|
316 | 326 | } |
|
317 | 327 | break; |
|
318 | 328 | |
@@ -328,14 +338,20 void Axis::setLayout(QVector<qreal> &layout) | |||
|
328 | 338 | |
|
329 | 339 | if (!categories || i<1) { |
|
330 | 340 | labelItem->setText(ticksList.at(i)); |
|
331 |
|
|
|
341 | const QRectF& rect = labelItem->boundingRect(); | |
|
342 | minWidth=qMax(rect.width()+label_padding,minWidth); | |
|
343 | minHeight+=rect.height(); | |
|
344 | QPointF center = rect.center(); | |
|
332 | 345 | labelItem->setTransformOriginPoint(center.x(), center.y()); |
|
333 |
labelItem->setPos(m_rect.left() - |
|
|
346 | labelItem->setPos(m_rect.left() - rect.width() - label_padding , layout[i]-center.y()); | |
|
334 | 347 | } else { |
|
335 | 348 | labelItem->setText(ticksList.at(i)); |
|
336 |
|
|
|
349 | const QRectF& rect = labelItem->boundingRect(); | |
|
350 | minWidth=qMax(rect.width(),minWidth); | |
|
351 | minHeight+=rect.height(); | |
|
352 | QPointF center = rect.center(); | |
|
337 | 353 | labelItem->setTransformOriginPoint(center.x(), center.y()); |
|
338 |
labelItem->setPos(m_rect.left() - |
|
|
354 | labelItem->setPos(m_rect.left() - rect.width() - label_padding , layout[i] - (layout[i] - layout[i-1])/2 -center.y()); | |
|
339 | 355 | } |
|
340 | 356 | |
|
341 | 357 | if ((i+1)%2 && i>1) { |
@@ -352,7 +368,11 void Axis::setLayout(QVector<qreal> &layout) | |||
|
352 | 368 | break; |
|
353 | 369 | } |
|
354 | 370 | |
|
355 |
|
|
|
371 | m_layoutVector=layout; | |
|
372 | ||
|
373 | presenter()->setMinimumMarginWidth(this,minWidth); | |
|
374 | presenter()->setMinimumMarginHeight(this,minHeight); | |
|
375 | ||
|
356 | 376 | } |
|
357 | 377 | |
|
358 | 378 | bool Axis::isEmpty() |
@@ -425,10 +445,13 void Axis::handleRangeChanged(qreal min, qreal max,int tickCount) | |||
|
425 | 445 | |
|
426 | 446 | void Axis::handleGeometryChanged(const QRectF &rect) |
|
427 | 447 | { |
|
428 |
m_rect = rect |
|
|
429 | if (isEmpty()) return; | |
|
430 | QVector<qreal> layout = calculateLayout(); | |
|
431 | updateLayout(layout); | |
|
448 | if(m_rect != rect) | |
|
449 | { | |
|
450 | m_rect = rect; | |
|
451 | if (isEmpty()) return; | |
|
452 | QVector<qreal> layout = calculateLayout(); | |
|
453 | updateLayout(layout); | |
|
454 | } | |
|
432 | 455 | } |
|
433 | 456 | |
|
434 | 457 | void Axis::axisSelected() |
@@ -21,6 +21,7 | |||
|
21 | 21 | #ifndef AXISITEM_H_ |
|
22 | 22 | #define AXISITEM_H_ |
|
23 | 23 | |
|
24 | #include "qchartglobal.h" | |
|
24 | 25 | #include "chart_p.h" |
|
25 | 26 | #include <QGraphicsItem> |
|
26 | 27 | |
@@ -100,7 +101,6 private: | |||
|
100 | 101 | qreal m_min; |
|
101 | 102 | qreal m_max; |
|
102 | 103 | int m_ticksCount; |
|
103 | qreal m_zoomFactor; | |
|
104 | 104 | |
|
105 | 105 | friend class AxisAnimation; |
|
106 | 106 | friend class AxisItem; |
@@ -78,7 +78,7 public: | |||
|
78 | 78 | |
|
79 | 79 | Q_SIGNALS: |
|
80 | 80 | void clicked(QBarSet *barset, QString category, Qt::MouseButtons button); // Up to user of api, what to do with these signals |
|
81 | ||
|
81 | void selected(); | |
|
82 | 82 | // |
|
83 | 83 | void updatedBars(); |
|
84 | 84 | void restructuredBars(); |
@@ -19,6 +19,7 | |||
|
19 | 19 | ****************************************************************************/ |
|
20 | 20 | |
|
21 | 21 | #include "qchart.h" |
|
22 | #include "qchart_p.h" | |
|
22 | 23 | #include "qchartaxis.h" |
|
23 | 24 | #include "chartpresenter_p.h" |
|
24 | 25 | #include "chartdataset_p.h" |
@@ -51,10 +52,17 ChartPresenter::ChartPresenter(QChart* chart,ChartDataSet* dataset):QObject(char | |||
|
51 | 52 | m_animator(0), |
|
52 | 53 | m_dataset(dataset), |
|
53 | 54 | m_chartTheme(0), |
|
54 | m_rect(QRectF(QPoint(0,0),m_chart->size())), | |
|
55 | m_chartRect(QRectF(QPoint(0,0),m_chart->size())), | |
|
55 | 56 | m_options(QChart::NoAnimation), |
|
56 | 57 | m_themeForce(false), |
|
57 | m_backgroundPadding(10) | |
|
58 | m_minLeftMargin(0), | |
|
59 | m_minBottomMargin(0), | |
|
60 | m_backgroundItem(0), | |
|
61 | m_titleItem(0), | |
|
62 | m_marginBig(60), | |
|
63 | m_marginSmall(20), | |
|
64 | m_marginTiny(10), | |
|
65 | m_chartMargins(QRect(m_marginBig,m_marginBig,0,0)) | |
|
58 | 66 | { |
|
59 | 67 | createConnections(); |
|
60 | 68 | setTheme(QChart::ChartThemeLight, false); |
@@ -67,39 +75,65 ChartPresenter::~ChartPresenter() | |||
|
67 | 75 | |
|
68 | 76 | void ChartPresenter::createConnections() |
|
69 | 77 | { |
|
70 | QObject::connect(m_chart,SIGNAL(geometryChanged()),this,SLOT(handleGeometryChanged())); | |
|
71 | 78 | QObject::connect(m_dataset,SIGNAL(seriesAdded(QSeries*,Domain*)),this,SLOT(handleSeriesAdded(QSeries*,Domain*))); |
|
72 | 79 | QObject::connect(m_dataset,SIGNAL(seriesRemoved(QSeries*)),this,SLOT(handleSeriesRemoved(QSeries*))); |
|
73 | 80 | QObject::connect(m_dataset,SIGNAL(axisAdded(QChartAxis*,Domain*)),this,SLOT(handleAxisAdded(QChartAxis*,Domain*))); |
|
74 | 81 | QObject::connect(m_dataset,SIGNAL(axisRemoved(QChartAxis*)),this,SLOT(handleAxisRemoved(QChartAxis*))); |
|
75 | 82 | } |
|
76 | 83 | |
|
77 |
void ChartPresenter:: |
|
|
84 | void ChartPresenter::setGeometry(const QRectF& rect) | |
|
78 | 85 | { |
|
79 | QRectF rect(QPoint(0,0),m_chart->size()); | |
|
80 | QRectF padding = m_chart->padding(); | |
|
81 | rect.adjust(padding.left(), padding.top(), -padding.right(), -padding.bottom()); | |
|
82 | ||
|
83 | //rewrite zoom stack | |
|
84 | /* | |
|
85 | for(int i=0;i<m_zoomStack.count();i++){ | |
|
86 | QRectF r = m_zoomStack[i]; | |
|
87 | qreal w = rect.width()/m_rect.width(); | |
|
88 | qreal h = rect.height()/m_rect.height(); | |
|
89 | QPointF tl = r.topLeft(); | |
|
90 | tl.setX(tl.x()*w); | |
|
91 | tl.setY(tl.y()*h); | |
|
92 | QPointF br = r.bottomRight(); | |
|
93 | br.setX(br.x()*w); | |
|
94 | br.setY(br.y()*h); | |
|
95 | r.setTopLeft(tl); | |
|
96 | r.setBottomRight(br); | |
|
97 | m_zoomStack[i]=r; | |
|
98 | } | |
|
99 | */ | |
|
100 | 86 | m_rect = rect; |
|
101 | 87 | Q_ASSERT(m_rect.isValid()); |
|
102 | emit geometryChanged(m_rect); | |
|
88 | updateLayout(); | |
|
89 | } | |
|
90 | ||
|
91 | void ChartPresenter::setMinimumMarginWidth(Axis* axis, qreal width) | |
|
92 | { | |
|
93 | switch(axis->axisType()){ | |
|
94 | case Axis::X_AXIS: | |
|
95 | { | |
|
96 | if(width>m_chartRect.width()+ m_chartMargins.left()) { | |
|
97 | m_minLeftMargin= width - m_chartRect.width(); | |
|
98 | updateLayout(); | |
|
99 | } | |
|
100 | break; | |
|
101 | } | |
|
102 | case Axis::Y_AXIS: | |
|
103 | { | |
|
104 | ||
|
105 | if(m_minLeftMargin!=width){ | |
|
106 | m_minLeftMargin= width; | |
|
107 | updateLayout(); | |
|
108 | } | |
|
109 | break; | |
|
110 | } | |
|
111 | ||
|
112 | } | |
|
113 | } | |
|
114 | ||
|
115 | void ChartPresenter::setMinimumMarginHeight(Axis* axis, qreal height) | |
|
116 | { | |
|
117 | switch(axis->axisType()){ | |
|
118 | case Axis::X_AXIS: | |
|
119 | { | |
|
120 | if(m_minBottomMargin!=height) { | |
|
121 | m_minBottomMargin= height; | |
|
122 | updateLayout(); | |
|
123 | } | |
|
124 | break; | |
|
125 | } | |
|
126 | case Axis::Y_AXIS: | |
|
127 | { | |
|
128 | ||
|
129 | if(height>m_chartMargins.bottom()+m_chartRect.height()){ | |
|
130 | m_minBottomMargin= height - m_chartRect.height(); | |
|
131 | updateLayout(); | |
|
132 | } | |
|
133 | break; | |
|
134 | } | |
|
135 | ||
|
136 | } | |
|
103 | 137 | } |
|
104 | 138 | |
|
105 | 139 | void ChartPresenter::handleAxisAdded(QChartAxis* axis,Domain* domain) |
@@ -126,7 +160,7 void ChartPresenter::handleAxisAdded(QChartAxis* axis,Domain* domain) | |||
|
126 | 160 | |
|
127 | 161 | QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&))); |
|
128 | 162 | //initialize |
|
129 | item->handleGeometryChanged(m_rect); | |
|
163 | item->handleGeometryChanged(m_chartRect); | |
|
130 | 164 | m_axisItems.insert(axis, item); |
|
131 | 165 | } |
|
132 | 166 | |
@@ -265,7 +299,7 void ChartPresenter::handleSeriesAdded(QSeries* series,Domain* domain) | |||
|
265 | 299 | |
|
266 | 300 | //initialize |
|
267 | 301 | item->handleDomainChanged(domain->minX(),domain->maxX(),domain->minY(),domain->maxY()); |
|
268 | if(m_rect.isValid()) item->handleGeometryChanged(m_rect); | |
|
302 | if(m_chartRect.isValid()) item->handleGeometryChanged(m_chartRect); | |
|
269 | 303 | m_chartItems.insert(series,item); |
|
270 | 304 | } |
|
271 | 305 | |
@@ -334,23 +368,23 void ChartPresenter::resetAllElements() | |||
|
334 | 368 | |
|
335 | 369 | void ChartPresenter::zoomIn() |
|
336 | 370 | { |
|
337 |
QRectF rect = |
|
|
371 | QRectF rect = chartGeometry(); | |
|
338 | 372 | rect.setWidth(rect.width()/2); |
|
339 | 373 | rect.setHeight(rect.height()/2); |
|
340 |
rect.moveCenter( |
|
|
374 | rect.moveCenter(chartGeometry().center()); | |
|
341 | 375 | zoomIn(rect); |
|
342 | 376 | } |
|
343 | 377 | |
|
344 | 378 | void ChartPresenter::zoomIn(const QRectF& rect) |
|
345 | 379 | { |
|
346 | 380 | QRectF r = rect.normalized(); |
|
347 |
r.translate(-m_chart |
|
|
381 | r.translate(-m_chartMargins.topLeft()); | |
|
348 | 382 | if(m_animator) { |
|
349 | 383 | |
|
350 |
QPointF point(r.center().x()/ |
|
|
384 | QPointF point(r.center().x()/chartGeometry().width(),r.center().y()/chartGeometry().height()); | |
|
351 | 385 | m_animator->setState(ChartAnimator::ZoomInState,point); |
|
352 | 386 | } |
|
353 |
m_dataset->zoomInDomain(r, |
|
|
387 | m_dataset->zoomInDomain(r,chartGeometry().size()); | |
|
354 | 388 | if(m_animator) { |
|
355 | 389 | m_animator->setState(ChartAnimator::ShowState); |
|
356 | 390 | } |
@@ -363,9 +397,9 void ChartPresenter::zoomOut() | |||
|
363 | 397 | m_animator->setState(ChartAnimator::ZoomOutState); |
|
364 | 398 | } |
|
365 | 399 | |
|
366 |
QSizeF size = |
|
|
367 |
QRectF rect = |
|
|
368 |
rect.translate(-m_chart |
|
|
400 | QSizeF size = chartGeometry().size(); | |
|
401 | QRectF rect = chartGeometry(); | |
|
402 | rect.translate(-m_chartMargins.topLeft()); | |
|
369 | 403 | m_dataset->zoomOutDomain(rect.adjusted(size.width()/4,size.height()/4,-size.width()/4,-size.height()/4),size); |
|
370 | 404 | //m_dataset->zoomOutDomain(m_zoomStack[m_zoomIndex-1],geometry().size()); |
|
371 | 405 | |
@@ -383,7 +417,7 void ChartPresenter::scroll(int dx,int dy) | |||
|
383 | 417 | if(dy>0) m_animator->setState(ChartAnimator::ScrollDownState,QPointF()); |
|
384 | 418 | } |
|
385 | 419 | |
|
386 |
m_dataset->scrollDomain(dx,dy, |
|
|
420 | m_dataset->scrollDomain(dx,dy,chartGeometry().size()); | |
|
387 | 421 | |
|
388 | 422 | if(m_animator){ |
|
389 | 423 | m_animator->setState(ChartAnimator::ShowState); |
@@ -395,6 +429,104 QChart::AnimationOptions ChartPresenter::animationOptions() const | |||
|
395 | 429 | return m_options; |
|
396 | 430 | } |
|
397 | 431 | |
|
432 | void ChartPresenter::updateLayout() | |
|
433 | { | |
|
434 | if (!m_rect.isValid()) return; | |
|
435 | ||
|
436 | // recalculate title size | |
|
437 | ||
|
438 | QSize titleSize; | |
|
439 | int titlePadding=0; | |
|
440 | ||
|
441 | if (m_titleItem) { | |
|
442 | titleSize= m_titleItem->boundingRect().size().toSize(); | |
|
443 | } | |
|
444 | ||
|
445 | //defaults | |
|
446 | m_chartMargins = QRect(QPoint(m_minLeftMargin>m_marginBig?m_minLeftMargin:m_marginBig,m_marginBig),QPoint(m_marginBig,m_minBottomMargin>m_marginBig?m_minBottomMargin:m_marginBig)); | |
|
447 | titlePadding = m_chartMargins.top()/2; | |
|
448 | ||
|
449 | QLegend* legend = m_chart->d_ptr->m_legend; | |
|
450 | ||
|
451 | // recalculate legend position | |
|
452 | if (legend->isAttachedToChart() && legend->isEnabled()) { | |
|
453 | ||
|
454 | QRect legendRect; | |
|
455 | ||
|
456 | // Reserve some space for legend | |
|
457 | switch (legend->alignment()) { | |
|
458 | ||
|
459 | case QLegend::AlignmentTop: { | |
|
460 | int ledgendSize = legend->minHeight(); | |
|
461 | int topPadding = 2*m_marginTiny + titleSize.height() + ledgendSize + m_marginTiny; | |
|
462 | m_chartMargins = QRect(QPoint(m_chartMargins.left(),topPadding),QPoint(m_chartMargins.right(),m_chartMargins.bottom())); | |
|
463 | m_legendMargins = QRect(QPoint(m_chartMargins.left(),topPadding - (ledgendSize + m_marginTiny)),QPoint(m_chartMargins.right(),m_rect.height()-topPadding + m_marginTiny)); | |
|
464 | titlePadding = m_marginTiny + m_marginTiny; | |
|
465 | break; | |
|
466 | } | |
|
467 | case QLegend::AlignmentBottom: { | |
|
468 | int ledgendSize = legend->minHeight(); | |
|
469 | int bottomPadding = m_marginTiny + m_marginSmall + ledgendSize + m_marginTiny + m_minBottomMargin; | |
|
470 | m_chartMargins = QRect(QPoint(m_chartMargins.left(),m_chartMargins.top()),QPoint(m_chartMargins.right(),bottomPadding)); | |
|
471 | m_legendMargins = QRect(QPoint(m_chartMargins.left(),m_rect.height()-bottomPadding + m_marginTiny + m_minBottomMargin),QPoint(m_chartMargins.right(),m_marginTiny + m_marginSmall)); | |
|
472 | titlePadding = m_chartMargins.top()/2; | |
|
473 | break; | |
|
474 | } | |
|
475 | case QLegend::AlignmentLeft: { | |
|
476 | int ledgendSize = legend->minWidht(); | |
|
477 | int leftPadding = m_marginTiny + m_marginSmall + ledgendSize + m_marginTiny + m_minLeftMargin; | |
|
478 | m_chartMargins = QRect(QPoint(leftPadding,m_chartMargins.top()),QPoint(m_chartMargins.right(),m_chartMargins.bottom())); | |
|
479 | m_legendMargins = QRect(QPoint(m_marginTiny + m_marginSmall,m_chartMargins.top()),QPoint(m_rect.width()-leftPadding + m_marginTiny + m_minLeftMargin,m_chartMargins.bottom())); | |
|
480 | titlePadding = m_chartMargins.top()/2; | |
|
481 | break; | |
|
482 | } | |
|
483 | case QLegend::AlignmentRight: { | |
|
484 | int ledgendSize = legend->minWidht(); | |
|
485 | int rightPadding = m_marginTiny + m_marginSmall + ledgendSize + m_marginTiny; | |
|
486 | m_chartMargins = QRect(QPoint(m_chartMargins.left(),m_chartMargins.top()),QPoint(rightPadding,m_chartMargins.bottom())); | |
|
487 | m_legendMargins = QRect(QPoint(m_rect.width()- rightPadding+ m_marginTiny ,m_chartMargins.top()),QPoint(m_marginTiny + m_marginSmall,m_chartMargins.bottom())); | |
|
488 | titlePadding = m_chartMargins.top()/2; | |
|
489 | break; | |
|
490 | } | |
|
491 | default: { | |
|
492 | break; | |
|
493 | } | |
|
494 | } | |
|
495 | } | |
|
496 | ||
|
497 | // recalculate title position | |
|
498 | if (m_titleItem) { | |
|
499 | QPointF center = m_rect.center() -m_titleItem->boundingRect().center(); | |
|
500 | m_titleItem->setPos(center.x(),titlePadding); | |
|
501 | } | |
|
502 | ||
|
503 | //recalculate background gradient | |
|
504 | if (m_backgroundItem) { | |
|
505 | m_backgroundItem->setRect(m_rect.adjusted(m_marginTiny,m_marginTiny, -m_marginTiny, -m_marginTiny)); | |
|
506 | } | |
|
507 | ||
|
508 | m_chartRect = m_rect.adjusted(m_chartMargins.left(),m_chartMargins.top(),-m_chartMargins.right(),-m_chartMargins.bottom()); | |
|
509 | ||
|
510 | emit geometryChanged(m_chartRect); | |
|
511 | legend->setGeometry(m_rect.adjusted(m_legendMargins.left(),m_legendMargins.top(),-m_legendMargins.right(),-m_legendMargins.bottom())); | |
|
512 | } | |
|
513 | ||
|
514 | void ChartPresenter::createChartBackgroundItem() | |
|
515 | { | |
|
516 | if (!m_backgroundItem) { | |
|
517 | m_backgroundItem = new ChartBackground(rootItem()); | |
|
518 | m_backgroundItem->setPen(Qt::NoPen); | |
|
519 | m_backgroundItem->setZValue(ChartPresenter::BackgroundZValue); | |
|
520 | } | |
|
521 | } | |
|
522 | ||
|
523 | void ChartPresenter::createChartTitleItem() | |
|
524 | { | |
|
525 | if (!m_titleItem) { | |
|
526 | m_titleItem = new QGraphicsSimpleTextItem(rootItem()); | |
|
527 | m_titleItem->setZValue(ChartPresenter::BackgroundZValue); | |
|
528 | } | |
|
529 | } | |
|
398 | 530 | |
|
399 | 531 | #include "moc_chartpresenter_p.cpp" |
|
400 | 532 |
@@ -22,6 +22,7 | |||
|
22 | 22 | #define CHARTPRESENTER_H_ |
|
23 | 23 | |
|
24 | 24 | #include "qchartglobal.h" |
|
25 | #include "chartbackground_p.h" //TODO fix me | |
|
25 | 26 | #include "qchart.h" //becouse of QChart::ChartThemeId //TODO |
|
26 | 27 | #include "qchartaxis.h" |
|
27 | 28 | #include <QRectF> |
@@ -55,8 +56,6 public: | |||
|
55 | 56 | ChartPresenter(QChart* chart,ChartDataSet *dataset); |
|
56 | 57 | virtual ~ChartPresenter(); |
|
57 | 58 | |
|
58 | int backgroundPadding() const { return m_backgroundPadding; } | |
|
59 | QRectF geometry() const { return m_rect; } | |
|
60 | 59 | ChartAnimator* animator() const { return m_animator; } |
|
61 | 60 | ChartTheme *chartTheme() const { return m_chartTheme; } |
|
62 | 61 | ChartDataSet *dataSet() const { return m_dataset; } |
@@ -73,20 +72,32 public: | |||
|
73 | 72 | void zoomOut(); |
|
74 | 73 | void scroll(int dx,int dy); |
|
75 | 74 | |
|
76 | private: | |
|
75 | void setGeometry(const QRectF& rect); | |
|
76 | QRectF chartGeometry() const { return m_chartRect; } | |
|
77 | ||
|
78 | void setMinimumMarginHeight(Axis* axis, qreal height); | |
|
79 | void setMinimumMarginWidth(Axis* axis, qreal width); | |
|
80 | qreal minimumLeftMargin() const { return m_minLeftMargin; } | |
|
81 | qreal minimumBottomMargin() const { return m_minBottomMargin; } | |
|
82 | ||
|
83 | public: //TODO: fix me | |
|
77 | 84 | void createConnections(); |
|
78 | 85 | void resetAllElements(); |
|
86 | void createChartBackgroundItem(); | |
|
87 | void createChartTitleItem(); | |
|
88 | QRect margins() const { return m_chartMargins;} | |
|
79 | 89 | |
|
80 | 90 | public Q_SLOTS: |
|
81 | 91 | void handleSeriesAdded(QSeries* series,Domain* domain); |
|
82 | 92 | void handleSeriesRemoved(QSeries* series); |
|
83 | 93 | void handleAxisAdded(QChartAxis* axis,Domain* domain); |
|
84 | 94 | void handleAxisRemoved(QChartAxis* axis); |
|
85 | void handleGeometryChanged(); | |
|
95 | void updateLayout(); | |
|
86 | 96 | |
|
87 | 97 | Q_SIGNALS: |
|
88 | 98 | void geometryChanged(const QRectF& rect); |
|
89 | 99 | |
|
100 | ||
|
90 | 101 | private: |
|
91 | 102 | QChart* m_chart; |
|
92 | 103 | ChartAnimator* m_animator; |
@@ -95,9 +106,19 private: | |||
|
95 | 106 | QMap<QSeries*,Chart*> m_chartItems; |
|
96 | 107 | QMap<QChartAxis*,Axis*> m_axisItems; |
|
97 | 108 | QRectF m_rect; |
|
109 | QRectF m_chartRect; | |
|
98 | 110 | QChart::AnimationOptions m_options; |
|
99 | 111 | bool m_themeForce; |
|
100 | int m_backgroundPadding; | |
|
112 | qreal m_minLeftMargin; | |
|
113 | qreal m_minBottomMargin; | |
|
114 | public: //TODO: fixme | |
|
115 | ChartBackground* m_backgroundItem; | |
|
116 | QGraphicsSimpleTextItem* m_titleItem; | |
|
117 | int m_marginBig; | |
|
118 | int m_marginSmall; | |
|
119 | int m_marginTiny; | |
|
120 | QRect m_chartMargins; | |
|
121 | QRect m_legendMargins; | |
|
101 | 122 | |
|
102 | 123 | }; |
|
103 | 124 |
@@ -176,7 +176,6 void ChartTheme::decorate(QBarSeries* series, int index, bool force) | |||
|
176 | 176 | takeAtPos += step; |
|
177 | 177 | takeAtPos -= (int) takeAtPos; |
|
178 | 178 | } |
|
179 | qDebug() << "pos:" << takeAtPos; | |
|
180 | 179 | if (brush == sets.at(i)->brush() || force ) |
|
181 | 180 | sets.at(i)->setBrush(colorAt(m_seriesGradients.at(colorIndex), takeAtPos)); |
|
182 | 181 |
@@ -1,25 +1,27 | |||
|
1 | 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 | #include "qchartglobal.h" | |
|
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 | ||
|
22 | 21 | #include "legendmarker_p.h" |
|
22 | #include "qlegend.h" | |
|
23 | #include "qbarseries.h" | |
|
24 | #include "qpieseries.h" | |
|
23 | 25 | #include <qpieslice.h> |
|
24 | 26 | #include <qbarset.h> |
|
25 | 27 | #include <qxyseries.h> |
@@ -30,95 +32,61 | |||
|
30 | 32 | |
|
31 | 33 | QTCOMMERCIALCHART_BEGIN_NAMESPACE |
|
32 | 34 | |
|
33 |
LegendMarker::LegendMarker(QSeries * |
|
|
34 | m_pos(0,0), | |
|
35 | m_size(0,0), | |
|
36 |
|
|
|
37 | m_markerBoundingRect(0,0,0,0), | |
|
38 | m_series(series), | |
|
39 | m_barset(0), | |
|
40 | m_pieslice(0), | |
|
41 | m_textItem(new QGraphicsSimpleTextItem(this)) | |
|
42 | { | |
|
43 | setAcceptedMouseButtons(Qt::LeftButton|Qt::RightButton); | |
|
44 | } | |
|
45 | ||
|
46 | LegendMarker::LegendMarker(QSeries *series, QBarSet *barset, QGraphicsItem *parent) : QGraphicsObject(parent), | |
|
47 | m_pos(0,0), | |
|
48 | m_size(0,0), | |
|
49 | m_boundingRect(0,0,0,0), | |
|
50 | m_markerBoundingRect(0,0,0,0), | |
|
51 | m_series(series), | |
|
52 | m_barset(barset), | |
|
53 | m_pieslice(0), | |
|
54 | m_textItem(new QGraphicsSimpleTextItem(this)) | |
|
35 | LegendMarker::LegendMarker(QSeries* series,QLegend *legend) : QGraphicsObject(legend), | |
|
36 | m_series(series), | |
|
37 | m_markerRect(0,0,10.0,10.0), | |
|
38 | m_boundingRect(0,0,0,0), | |
|
39 | m_legend(legend), | |
|
40 | m_textItem(new QGraphicsSimpleTextItem(this)), | |
|
41 | m_rectItem(new QGraphicsRectItem(this)) | |
|
55 | 42 | { |
|
56 | setAcceptedMouseButtons(Qt::LeftButton|Qt::RightButton); | |
|
57 | } | |
|
58 | ||
|
59 | LegendMarker::LegendMarker(QSeries *series, QPieSlice *pieslice, QGraphicsItem *parent) : QGraphicsObject(parent), | |
|
60 | m_pos(0,0), | |
|
61 | m_size(0,0), | |
|
62 | m_boundingRect(0,0,0,0), | |
|
63 | m_markerBoundingRect(0,0,0,0), | |
|
64 | m_series(series), | |
|
65 | m_barset(0), | |
|
66 | m_pieslice(pieslice), | |
|
67 | m_textItem(new QGraphicsSimpleTextItem(this)) | |
|
68 | { | |
|
69 | setAcceptedMouseButtons(Qt::LeftButton|Qt::RightButton); | |
|
70 | } | |
|
71 | ||
|
72 | void LegendMarker::setPos(qreal x, qreal y) | |
|
73 | { | |
|
74 | m_pos = QPointF(x,y); | |
|
75 | layoutChanged(); | |
|
43 | //setAcceptedMouseButtons(Qt::LeftButton|Qt::RightButton); | |
|
44 | m_rectItem->setRect(m_markerRect); | |
|
45 | updateLayout(); | |
|
76 | 46 | } |
|
77 | 47 | |
|
78 | 48 | void LegendMarker::setPen(const QPen &pen) |
|
79 | 49 | { |
|
80 | m_pen = pen; | |
|
50 | m_textItem->setPen(pen); | |
|
51 | updateLayout(); | |
|
81 | 52 | } |
|
82 | 53 | |
|
83 | 54 | QPen LegendMarker::pen() const |
|
84 | 55 | { |
|
85 | return m_pen; | |
|
56 | return m_textItem->pen(); | |
|
86 | 57 | } |
|
87 | 58 | |
|
88 | 59 | void LegendMarker::setBrush(const QBrush &brush) |
|
89 | 60 | { |
|
90 | m_brush = brush; | |
|
61 | m_rectItem->setBrush(brush); | |
|
91 | 62 | } |
|
92 | 63 | |
|
93 | 64 | QBrush LegendMarker::brush() const |
|
94 | 65 | { |
|
95 | return m_brush; | |
|
66 | return m_rectItem->brush(); | |
|
96 | 67 | } |
|
97 | 68 | |
|
98 |
void LegendMarker::set |
|
|
69 | void LegendMarker::setLabel(const QString name) | |
|
99 | 70 | { |
|
100 | 71 | m_textItem->setText(name); |
|
101 |
|
|
|
72 | updateLayout(); | |
|
102 | 73 | } |
|
103 | 74 | |
|
104 | QString LegendMarker::name() const | |
|
75 | void LegendMarker::setSize(const QSize& size) | |
|
105 | 76 | { |
|
106 | return m_textItem->text(); | |
|
77 | m_markerRect = QRectF(0,0,size.width(),size.height()); | |
|
107 | 78 | } |
|
108 | 79 | |
|
109 |
QS |
|
|
80 | QString LegendMarker::label() const | |
|
110 | 81 | { |
|
111 |
return m_ |
|
|
82 | return m_textItem->text(); | |
|
112 | 83 | } |
|
113 | 84 | |
|
114 | 85 | void LegendMarker::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) |
|
115 | 86 | { |
|
116 | 87 | Q_UNUSED(option) |
|
117 | 88 | Q_UNUSED(widget) |
|
118 | ||
|
119 | painter->setPen(m_pen); | |
|
120 | painter->setBrush(m_brush); | |
|
121 | painter->drawRect(m_markerBoundingRect); | |
|
89 | Q_UNUSED(painter) | |
|
122 | 90 | } |
|
123 | 91 | |
|
124 | 92 | QRectF LegendMarker::boundingRect() const |
@@ -126,86 +94,96 QRectF LegendMarker::boundingRect() const | |||
|
126 | 94 | return m_boundingRect; |
|
127 | 95 | } |
|
128 | 96 | |
|
129 |
void LegendMarker:: |
|
|
97 | void LegendMarker::updateLayout() | |
|
130 | 98 | { |
|
131 | QSizeF markerSize(10,10); | |
|
132 | qreal margin = 2; | |
|
133 | ||
|
134 | m_size.setHeight(markerSize.height() + 2 * margin); | |
|
135 | m_size.setWidth(m_textItem->boundingRect().width() + markerSize.width() + 3 * margin); | |
|
136 | 99 | |
|
137 | m_boundingRect = QRectF(m_pos.x(),m_pos.y(),m_size.width(),m_size.height()); | |
|
100 | static const qreal margin = 2; | |
|
101 | static const qreal space = 4; | |
|
138 | 102 | |
|
139 | m_markerBoundingRect = QRectF(m_pos.x() + margin, m_pos.y() + margin, markerSize.width(),markerSize.height()); | |
|
103 | const QRectF& textRect = m_textItem->boundingRect(); | |
|
104 | prepareGeometryChange(); | |
|
105 | m_boundingRect = QRectF(0,0,m_markerRect.width() + 2*margin + space + textRect.width(),qMax(m_markerRect.height()+2*margin,textRect.height()+2*margin)); | |
|
106 | m_textItem->setPos(m_markerRect.width() + space + margin,m_boundingRect.height()/2 - textRect.height()/2); | |
|
107 | m_rectItem->setPos(margin,m_boundingRect.height()/2 - m_markerRect.height()/2); | |
|
140 | 108 | |
|
141 | m_textItem->setPos(m_pos.x() + markerSize.width() + 2 * margin, m_pos.y() + margin); | |
|
142 | 109 | } |
|
143 | 110 | |
|
144 | 111 | void LegendMarker::mousePressEvent(QGraphicsSceneMouseEvent *event) |
|
145 | 112 | { |
|
146 | switch (m_series->type()) { | |
|
147 | case QSeries::SeriesTypeLine: | |
|
148 | case QSeries::SeriesTypeArea: | |
|
149 | case QSeries::SeriesTypeScatter: | |
|
150 | case QSeries::SeriesTypeSpline: { | |
|
151 | emit clicked(m_series,event->button()); | |
|
152 | break; | |
|
153 | } | |
|
154 | case QSeries::SeriesTypeBar: | |
|
155 | case QSeries::SeriesTypeStackedBar: | |
|
156 | case QSeries::SeriesTypePercentBar: { | |
|
157 | emit clicked(m_barset,event->button()); | |
|
158 | break; | |
|
159 | } | |
|
160 | case QSeries::SeriesTypePie: { | |
|
161 | emit clicked(m_pieslice,event->button()); | |
|
162 | break; | |
|
163 | } | |
|
164 | default: { | |
|
165 | break; | |
|
166 | } | |
|
167 | } | |
|
113 | QGraphicsObject::mousePressEvent(event); | |
|
114 | emit selected(); | |
|
168 | 115 | } |
|
169 | 116 | |
|
170 | void LegendMarker::changed() | |
|
117 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
|
118 | ||
|
119 | AreaLegendMarker::AreaLegendMarker(QAreaSeries *series,QLegend *legend) : LegendMarker(series,legend), | |
|
120 | m_series(series) | |
|
171 | 121 | { |
|
172 | setPen(Qt::NoPen); | |
|
173 | switch (m_series->type()) { | |
|
174 | case QSeries::SeriesTypeArea: { | |
|
175 | QAreaSeries* s = static_cast<QAreaSeries*> (m_series); | |
|
176 | setBrush(s->brush()); | |
|
177 | setName(s->name()); | |
|
178 | break; | |
|
179 | } | |
|
180 | case QSeries::SeriesTypeLine: | |
|
181 | case QSeries::SeriesTypeSpline: { | |
|
182 | QXYSeries* s = static_cast<QXYSeries*> (m_series); | |
|
183 | setBrush(QBrush(s->pen().color(),Qt::SolidPattern)); | |
|
184 | setName(s->name()); | |
|
185 | break; | |
|
186 | } | |
|
187 | case QSeries::SeriesTypeScatter: { | |
|
188 | QXYSeries* s = static_cast<QXYSeries*> (m_series); | |
|
189 | setBrush(s->brush()); | |
|
190 | setName(s->name()); | |
|
191 | break; | |
|
122 | QObject::connect(this, SIGNAL(selected()), series, SIGNAL(selected())); | |
|
123 | QObject::connect(series,SIGNAL(updated()), this, SLOT(updated())); | |
|
124 | updated(); | |
|
125 | } | |
|
126 | ||
|
127 | void AreaLegendMarker::updated() | |
|
128 | { | |
|
129 | setBrush(m_series->brush()); | |
|
130 | setLabel(m_series->name()); | |
|
131 | } | |
|
132 | ||
|
133 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
|
134 | ||
|
135 | BarLegendMarker::BarLegendMarker(QBarSeries *series,QBarSet *barset, QLegend *legend) : LegendMarker(series,legend), | |
|
136 | m_barset(barset) | |
|
137 | { | |
|
138 | QObject::connect(this, SIGNAL(selected()),series, SIGNAL(selected())); | |
|
139 | QObject::connect(barset, SIGNAL(valueChanged()), this, SLOT(updated())); | |
|
140 | updated(); | |
|
141 | } | |
|
142 | ||
|
143 | void BarLegendMarker::updated() | |
|
144 | { | |
|
145 | setBrush(m_barset->brush()); | |
|
146 | setLabel(m_barset->name()); | |
|
147 | } | |
|
148 | ||
|
149 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
|
150 | ||
|
151 | PieLegendMarker::PieLegendMarker(QPieSeries* series,QPieSlice *pieslice, QLegend *legend) : LegendMarker(series,legend), | |
|
152 | m_pieslice(pieslice) | |
|
153 | { | |
|
154 | QObject::connect(this, SIGNAL(selected()),pieslice, SIGNAL(selected())); | |
|
155 | QObject::connect(pieslice, SIGNAL(changed()), this, SLOT(updated())); | |
|
156 | QObject::connect(pieslice, SIGNAL(destroyed()), this, SLOT(deleteLater())); //TODO:checkthis | |
|
157 | updated(); | |
|
158 | } | |
|
159 | ||
|
160 | void PieLegendMarker::updated() | |
|
161 | { | |
|
162 | setBrush(m_pieslice->brush()); | |
|
163 | setLabel(m_pieslice->label()); | |
|
164 | } | |
|
165 | ||
|
166 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
|
167 | ||
|
168 | XYLegendMarker::XYLegendMarker(QXYSeries *series, QLegend *legend) : LegendMarker(series,legend), | |
|
169 | m_series(series) | |
|
170 | { | |
|
171 | QObject::connect(this, SIGNAL(selected()), series, SIGNAL(selected())); | |
|
172 | QObject::connect(series,SIGNAL(updated()), this, SLOT(updated())); | |
|
173 | updated(); | |
|
174 | } | |
|
175 | ||
|
176 | void XYLegendMarker::updated() | |
|
177 | { | |
|
178 | setLabel(m_series->name()); | |
|
179 | ||
|
180 | if(m_series->type()== QSeries::SeriesTypeScatter) | |
|
181 | { | |
|
182 | setBrush(m_series->brush()); | |
|
183 | ||
|
192 | 184 | } |
|
193 | case QSeries::SeriesTypeBar: | |
|
194 | case QSeries::SeriesTypeStackedBar: | |
|
195 | case QSeries::SeriesTypePercentBar: { | |
|
196 | setBrush(m_barset->brush()); | |
|
197 | setName(m_barset->name()); | |
|
198 | break; | |
|
199 | } | |
|
200 | case QSeries::SeriesTypePie: { | |
|
201 | setBrush(m_pieslice->brush()); | |
|
202 | setName(m_pieslice->label()); | |
|
203 | break; | |
|
204 | } | |
|
205 | default: { | |
|
206 | setBrush(Qt::NoBrush); | |
|
207 | break; | |
|
208 | } | |
|
185 | else { | |
|
186 | setBrush(QBrush(m_series->pen().color())); | |
|
209 | 187 | } |
|
210 | 188 | } |
|
211 | 189 |
@@ -30,64 +30,98 | |||
|
30 | 30 | QTCOMMERCIALCHART_BEGIN_NAMESPACE |
|
31 | 31 | |
|
32 | 32 | class QSeries; |
|
33 | class QAreaSeries; | |
|
34 | class QXYSeries; | |
|
33 | 35 | class QBarSet; |
|
36 | class QBarSeries; | |
|
34 | 37 | class QPieSlice; |
|
38 | class QLegend; | |
|
39 | class QPieSeries; | |
|
35 | 40 | |
|
36 | // TODO: split this to 3 different markers for series, barset and pieslice. Current implementation is easier to misuse... | |
|
37 | 41 | class LegendMarker : public QGraphicsObject |
|
38 | 42 | { |
|
39 | 43 | Q_OBJECT |
|
40 | 44 | |
|
41 | 45 | public: |
|
42 |
LegendMarker(QSeries |
|
|
43 | LegendMarker(QSeries *series, QBarSet *barset, QGraphicsItem *parent = 0); | |
|
44 | LegendMarker(QSeries *series, QPieSlice *pieslice, QGraphicsItem *parent = 0); | |
|
45 | ||
|
46 | void setPos(qreal x, qreal y); | |
|
46 | explicit LegendMarker(QSeries* m_series,QLegend *parent); | |
|
47 | 47 | |
|
48 | 48 | void setPen(const QPen &pen); |
|
49 | 49 | QPen pen() const; |
|
50 | ||
|
51 | 50 | void setBrush(const QBrush &brush); |
|
52 | 51 | QBrush brush() const; |
|
53 | 52 | |
|
54 |
void set |
|
|
55 | QString name() const; | |
|
53 | void setSize(const QSize& size); | |
|
56 | 54 | |
|
57 | QSeries* series() const; | |
|
55 | void setLabel(const QString label); | |
|
56 | QString label() const; | |
|
57 | ||
|
58 | QSeries* series() const { return m_series;} | |
|
58 | 59 | |
|
59 | 60 | void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); |
|
60 | 61 | |
|
61 | 62 | QRectF boundingRect() const; |
|
62 | 63 | |
|
63 |
void |
|
|
64 | void updateLayout(); | |
|
64 | 65 | |
|
65 | public: | |
|
66 | protected: | |
|
66 | 67 | // From QGraphicsObject |
|
67 | 68 | void mousePressEvent(QGraphicsSceneMouseEvent *event); |
|
68 | 69 | |
|
69 | 70 | Q_SIGNALS: |
|
70 | void clicked(QSeries *series, Qt::MouseButton button); | |
|
71 | void clicked(QBarSet *barset, Qt::MouseButton button); | |
|
72 | void clicked(QPieSlice *pieslice, Qt::MouseButton button); | |
|
71 | void selected(); | |
|
73 | 72 | |
|
74 | 73 | public Q_SLOTS: |
|
75 |
void |
|
|
74 | virtual void updated() = 0; | |
|
76 | 75 | |
|
77 | private: | |
|
78 | QPointF m_pos; | |
|
79 | QSize m_size; | |
|
76 | protected: | |
|
77 | QSeries* m_series; | |
|
78 | QRectF m_markerRect; | |
|
80 | 79 | QRectF m_boundingRect; |
|
81 | QRectF m_markerBoundingRect; | |
|
82 | QBrush m_brush; | |
|
83 | QPen m_pen; | |
|
80 | QLegend* m_legend; | |
|
81 | QGraphicsSimpleTextItem *m_textItem; | |
|
82 | QGraphicsRectItem *m_rectItem; | |
|
84 | 83 | |
|
85 | QSeries *m_series; | |
|
84 | }; | |
|
85 | ||
|
86 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
|
87 | class XYLegendMarker : public LegendMarker | |
|
88 | { | |
|
89 | public: | |
|
90 | XYLegendMarker(QXYSeries *series, QLegend *legend); | |
|
91 | protected: | |
|
92 | void updated(); | |
|
93 | private: | |
|
94 | QXYSeries *m_series; | |
|
95 | }; | |
|
96 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
|
97 | class AreaLegendMarker : public LegendMarker | |
|
98 | { | |
|
99 | public: | |
|
100 | AreaLegendMarker(QAreaSeries *series, QLegend *legend); | |
|
101 | protected: | |
|
102 | void updated(); | |
|
103 | private: | |
|
104 | QAreaSeries *m_series; | |
|
105 | }; | |
|
106 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
|
107 | class BarLegendMarker : public LegendMarker | |
|
108 | { | |
|
109 | public: | |
|
110 | BarLegendMarker(QBarSeries *barseires, QBarSet *barset,QLegend *legend); | |
|
111 | protected: | |
|
112 | void updated(); | |
|
113 | private: | |
|
86 | 114 | QBarSet *m_barset; |
|
115 | }; | |
|
116 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
|
117 | class PieLegendMarker : public LegendMarker | |
|
118 | { | |
|
119 | public: | |
|
120 | PieLegendMarker(QPieSeries *pieSeries, QPieSlice *pieslice, QLegend *legend); | |
|
121 | protected: | |
|
122 | void updated(); | |
|
123 | private: | |
|
87 | 124 | QPieSlice *m_pieslice; |
|
88 | ||
|
89 | QGraphicsSimpleTextItem *m_textItem; | |
|
90 | ||
|
91 | 125 | }; |
|
92 | 126 | |
|
93 | 127 | QTCOMMERCIALCHART_END_NAMESPACE |
@@ -40,7 +40,7 LegendScrollButton::ScrollButtonId LegendScrollButton::id() | |||
|
40 | 40 | void LegendScrollButton::mousePressEvent(QGraphicsSceneMouseEvent *event) |
|
41 | 41 | { |
|
42 | 42 | Q_UNUSED(event); |
|
43 | m_ledgend->scrollButtonClicked(this); | |
|
43 | //m_ledgend->scrollButtonClicked(this); | |
|
44 | 44 | } |
|
45 | 45 | |
|
46 | 46 |
@@ -75,6 +75,7 Q_SIGNALS: | |||
|
75 | 75 | void hoverEnter(); |
|
76 | 76 | void hoverLeave(); |
|
77 | 77 | void changed(); |
|
78 | void selected(); | |
|
78 | 79 | |
|
79 | 80 | private: |
|
80 | 81 | friend class PieSliceData; |
@@ -66,13 +66,13 QTCOMMERCIALCHART_BEGIN_NAMESPACE | |||
|
66 | 66 | Constructs a chart object which is a child of a\a parent. Parameter \a wFlags is passed to the QGraphicsWidget constructor. |
|
67 | 67 | */ |
|
68 | 68 | QChart::QChart(QGraphicsItem *parent, Qt::WindowFlags wFlags) : QGraphicsWidget(parent,wFlags), |
|
69 |
d_ptr(new QChartPrivate( |
|
|
69 | d_ptr(new QChartPrivate()) | |
|
70 | 70 | { |
|
71 | //setMinimumSize(200,200); | |
|
72 | 71 | d_ptr->m_legend = new QLegend(this); |
|
73 | 72 | d_ptr->m_dataset = new ChartDataSet(this); |
|
74 | 73 | d_ptr->m_presenter = new ChartPresenter(this,d_ptr->m_dataset); |
|
75 | setMinimumSize(d_ptr->m_padding.left() * 3, d_ptr->m_padding.top() * 3); | |
|
74 | d_ptr->m_presenter->setTheme(QChart::ChartThemeDefault,false); | |
|
75 | //TODO:fix me setMinimumSize(d_ptr->m_padding.left() * 3, d_ptr->m_padding.top() * 3); | |
|
76 | 76 | connect(d_ptr->m_dataset,SIGNAL(seriesAdded(QSeries*,Domain*)),d_ptr->m_legend,SLOT(handleSeriesAdded(QSeries*,Domain*))); |
|
77 | 77 | connect(d_ptr->m_dataset,SIGNAL(seriesRemoved(QSeries*)),d_ptr->m_legend,SLOT(handleSeriesRemoved(QSeries*))); |
|
78 | 78 | } |
@@ -123,15 +123,15 void QChart::removeAllSeries() | |||
|
123 | 123 | */ |
|
124 | 124 | void QChart::setBackgroundBrush(const QBrush& brush) |
|
125 | 125 | { |
|
126 | d_ptr->createChartBackgroundItem(); | |
|
127 | d_ptr->m_backgroundItem->setBrush(brush); | |
|
128 | d_ptr->m_backgroundItem->update(); | |
|
126 | d_ptr->m_presenter->createChartBackgroundItem(); | |
|
127 | d_ptr->m_presenter->m_backgroundItem->setBrush(brush); | |
|
128 | d_ptr->m_presenter->m_backgroundItem->update(); | |
|
129 | 129 | } |
|
130 | 130 | |
|
131 | 131 | QBrush QChart::backgroundBrush() const |
|
132 | 132 | { |
|
133 | if (!d_ptr->m_backgroundItem) return QBrush(); | |
|
134 | return (d_ptr->m_backgroundItem)->brush(); | |
|
133 | if (!d_ptr->m_presenter->m_backgroundItem) return QBrush(); | |
|
134 | return (d_ptr->m_presenter->m_backgroundItem)->brush(); | |
|
135 | 135 | } |
|
136 | 136 | |
|
137 | 137 | /*! |
@@ -139,15 +139,15 QBrush QChart::backgroundBrush() const | |||
|
139 | 139 | */ |
|
140 | 140 | void QChart::setBackgroundPen(const QPen& pen) |
|
141 | 141 | { |
|
142 | d_ptr->createChartBackgroundItem(); | |
|
143 | d_ptr->m_backgroundItem->setPen(pen); | |
|
144 | d_ptr->m_backgroundItem->update(); | |
|
142 | d_ptr->m_presenter->createChartBackgroundItem(); | |
|
143 | d_ptr->m_presenter->m_backgroundItem->setPen(pen); | |
|
144 | d_ptr->m_presenter->m_backgroundItem->update(); | |
|
145 | 145 | } |
|
146 | 146 | |
|
147 | 147 | QPen QChart::backgroundPen() const |
|
148 | 148 | { |
|
149 | if (!d_ptr->m_backgroundItem) return QPen(); | |
|
150 | return d_ptr->m_backgroundItem->pen(); | |
|
149 | if (!d_ptr->m_presenter->m_backgroundItem) return QPen(); | |
|
150 | return d_ptr->m_presenter->m_backgroundItem->pen(); | |
|
151 | 151 | } |
|
152 | 152 | |
|
153 | 153 | /*! |
@@ -155,9 +155,9 QPen QChart::backgroundPen() const | |||
|
155 | 155 | */ |
|
156 | 156 | void QChart::setTitle(const QString& title) |
|
157 | 157 | { |
|
158 | d_ptr->createChartTitleItem(); | |
|
159 | d_ptr->m_titleItem->setText(title); | |
|
160 | d_ptr->updateLayout(); | |
|
158 | d_ptr->m_presenter->createChartTitleItem(); | |
|
159 | d_ptr->m_presenter->m_titleItem->setText(title); | |
|
160 | d_ptr->m_presenter->updateLayout(); | |
|
161 | 161 | } |
|
162 | 162 | |
|
163 | 163 | /*! |
@@ -165,8 +165,8 void QChart::setTitle(const QString& title) | |||
|
165 | 165 | */ |
|
166 | 166 | QString QChart::title() const |
|
167 | 167 | { |
|
168 | if (d_ptr->m_titleItem) | |
|
169 | return d_ptr->m_titleItem->text(); | |
|
168 | if (d_ptr->m_presenter->m_titleItem) | |
|
169 | return d_ptr->m_presenter->m_titleItem->text(); | |
|
170 | 170 | else |
|
171 | 171 | return QString(); |
|
172 | 172 | } |
@@ -176,9 +176,9 QString QChart::title() const | |||
|
176 | 176 | */ |
|
177 | 177 | void QChart::setTitleFont(const QFont& font) |
|
178 | 178 | { |
|
179 | d_ptr->createChartTitleItem(); | |
|
180 | d_ptr->m_titleItem->setFont(font); | |
|
181 | d_ptr->updateLayout(); | |
|
179 | d_ptr->m_presenter->createChartTitleItem(); | |
|
180 | d_ptr->m_presenter->m_titleItem->setFont(font); | |
|
181 | d_ptr->m_presenter->updateLayout(); | |
|
182 | 182 | } |
|
183 | 183 | |
|
184 | 184 | /*! |
@@ -186,9 +186,9 void QChart::setTitleFont(const QFont& font) | |||
|
186 | 186 | */ |
|
187 | 187 | void QChart::setTitleBrush(const QBrush &brush) |
|
188 | 188 | { |
|
189 | d_ptr->createChartTitleItem(); | |
|
190 | d_ptr->m_titleItem->setBrush(brush); | |
|
191 | d_ptr->updateLayout(); | |
|
189 | d_ptr->m_presenter->createChartTitleItem(); | |
|
190 | d_ptr->m_presenter->m_titleItem->setBrush(brush); | |
|
191 | d_ptr->m_presenter->updateLayout(); | |
|
192 | 192 | } |
|
193 | 193 | |
|
194 | 194 | /*! |
@@ -196,8 +196,8 void QChart::setTitleBrush(const QBrush &brush) | |||
|
196 | 196 | */ |
|
197 | 197 | QBrush QChart::titleBrush() const |
|
198 | 198 | { |
|
199 | if (!d_ptr->m_titleItem) return QBrush(); | |
|
200 | return d_ptr->m_titleItem->brush(); | |
|
199 | if (!d_ptr->m_presenter->m_titleItem) return QBrush(); | |
|
200 | return d_ptr->m_presenter->m_titleItem->brush(); | |
|
201 | 201 | } |
|
202 | 202 | |
|
203 | 203 | /*! |
@@ -267,9 +267,9 QLegend* QChart::legend() const | |||
|
267 | 267 | return d_ptr->m_legend; |
|
268 | 268 | } |
|
269 | 269 | |
|
270 |
QRect QChart:: |
|
|
270 | QRect QChart::margins() const | |
|
271 | 271 | { |
|
272 |
return d_ptr->m_p |
|
|
272 | return d_ptr->m_presenter->margins(); | |
|
273 | 273 | } |
|
274 | 274 | |
|
275 | 275 | |
@@ -279,9 +279,8 QRect QChart::padding() const | |||
|
279 | 279 | void QChart::resizeEvent(QGraphicsSceneResizeEvent *event) |
|
280 | 280 | { |
|
281 | 281 | d_ptr->m_rect = QRectF(QPoint(0,0),event->newSize()); |
|
282 | d_ptr->updateLayout(); | |
|
283 | 282 | QGraphicsWidget::resizeEvent(event); |
|
284 | update(); | |
|
283 | d_ptr->m_presenter->setGeometry(d_ptr->m_rect); | |
|
285 | 284 | } |
|
286 | 285 | |
|
287 | 286 | /*! |
@@ -302,46 +301,42 QChart::AnimationOptions QChart::animationOptions() const | |||
|
302 | 301 | |
|
303 | 302 | void QChart::scrollLeft() |
|
304 | 303 | { |
|
305 |
d_ptr->m_presenter->scroll(-d_ptr->m_presenter-> |
|
|
304 | d_ptr->m_presenter->scroll(-d_ptr->m_presenter->chartGeometry().width()/(axisX()->ticksCount()-1),0); | |
|
306 | 305 | } |
|
307 | 306 | |
|
308 | 307 | void QChart::scrollRight() |
|
309 | 308 | { |
|
310 |
d_ptr->m_presenter->scroll(d_ptr->m_presenter-> |
|
|
309 | d_ptr->m_presenter->scroll(d_ptr->m_presenter->chartGeometry().width()/(axisX()->ticksCount()-1),0); | |
|
311 | 310 | } |
|
312 | 311 | |
|
313 | 312 | void QChart::scrollUp() |
|
314 | 313 | { |
|
315 |
d_ptr->m_presenter->scroll(0,d_ptr->m_presenter-> |
|
|
314 | d_ptr->m_presenter->scroll(0,d_ptr->m_presenter->chartGeometry().width()/(axisY()->ticksCount()-1)); | |
|
316 | 315 | } |
|
317 | 316 | |
|
318 | 317 | void QChart::scrollDown() |
|
319 | 318 | { |
|
320 |
d_ptr->m_presenter->scroll(0,-d_ptr->m_presenter-> |
|
|
319 | d_ptr->m_presenter->scroll(0,-d_ptr->m_presenter->chartGeometry().width()/(axisY()->ticksCount()-1)); | |
|
321 | 320 | } |
|
322 | 321 | |
|
323 | 322 | void QChart::setBackgroundVisible(bool visible) |
|
324 | 323 | { |
|
325 | d_ptr->createChartBackgroundItem(); | |
|
326 | d_ptr->m_backgroundItem->setVisible(visible); | |
|
324 | d_ptr->m_presenter->createChartBackgroundItem(); | |
|
325 | d_ptr->m_presenter->m_backgroundItem->setVisible(visible); | |
|
327 | 326 | } |
|
328 | 327 | |
|
329 | 328 | bool QChart::isBackgroundVisible() const |
|
330 | 329 | { |
|
331 | if (!d_ptr->m_backgroundItem) return false; | |
|
332 | return d_ptr->m_backgroundItem->isVisible(); | |
|
330 | if (!d_ptr->m_presenter->m_backgroundItem) return false; | |
|
331 | return d_ptr->m_presenter->m_backgroundItem->isVisible(); | |
|
333 | 332 | } |
|
334 | 333 | |
|
335 | 334 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
336 | 335 | |
|
337 |
QChartPrivate::QChartPrivate( |
|
|
338 | q_ptr(parent), | |
|
339 | m_backgroundItem(0), | |
|
340 | m_titleItem(0), | |
|
336 | QChartPrivate::QChartPrivate(): | |
|
341 | 337 | m_legend(0), |
|
342 | 338 | m_dataset(0), |
|
343 |
m_presenter(0) |
|
|
344 | m_padding(QRect(50,50,0,0)) | |
|
339 | m_presenter(0) | |
|
345 | 340 | { |
|
346 | 341 | |
|
347 | 342 | } |
@@ -351,150 +346,6 QChartPrivate::~QChartPrivate() | |||
|
351 | 346 | |
|
352 | 347 | } |
|
353 | 348 | |
|
354 | void QChartPrivate::createChartBackgroundItem() | |
|
355 | { | |
|
356 | if (!m_backgroundItem) { | |
|
357 | m_backgroundItem = new ChartBackground(q_ptr); | |
|
358 | m_backgroundItem->setPen(Qt::NoPen); | |
|
359 | m_backgroundItem->setZValue(ChartPresenter::BackgroundZValue); | |
|
360 | } | |
|
361 | } | |
|
362 | ||
|
363 | void QChartPrivate::createChartTitleItem() | |
|
364 | { | |
|
365 | if (!m_titleItem) { | |
|
366 | m_titleItem = new QGraphicsSimpleTextItem(q_ptr); | |
|
367 | m_titleItem->setZValue(ChartPresenter::BackgroundZValue); | |
|
368 | } | |
|
369 | } | |
|
370 | ||
|
371 | void QChartPrivate::updateLegendLayout() | |
|
372 | { | |
|
373 | //int legendPadding = m_chart->legend()->padding(); | |
|
374 | int legendPadding = 30; | |
|
375 | QRectF rect = m_rect; | |
|
376 | ||
|
377 | if ((m_legend->attachedToChart()) && (m_legend->isVisible())) { | |
|
378 | ||
|
379 | // Reserve some space for legend | |
|
380 | switch (m_legend->alignment()) { | |
|
381 | case QLegend::AlignmentTop: { | |
|
382 | rect.adjust(m_padding.left(), | |
|
383 | m_padding.top() + legendPadding, | |
|
384 | -m_padding.right(), | |
|
385 | -m_padding.bottom()); | |
|
386 | break; | |
|
387 | } | |
|
388 | case QLegend::AlignmentBottom: { | |
|
389 | rect.adjust(m_padding.left(), | |
|
390 | m_padding.top(), | |
|
391 | -m_padding.right(), | |
|
392 | -m_padding.bottom() - legendPadding); | |
|
393 | break; | |
|
394 | } | |
|
395 | case QLegend::AlignmentLeft: { | |
|
396 | rect.adjust(m_padding.left() + legendPadding, | |
|
397 | m_padding.top(), | |
|
398 | -m_padding.right(), | |
|
399 | -m_padding.bottom()); | |
|
400 | break; | |
|
401 | } | |
|
402 | case QLegend::AlignmentRight: { | |
|
403 | rect.adjust(m_padding.left(), | |
|
404 | m_padding.top(), | |
|
405 | -m_padding.right() - legendPadding, | |
|
406 | -m_padding.bottom()); | |
|
407 | break; | |
|
408 | } | |
|
409 | default: { | |
|
410 | rect.adjust(m_padding.left(), | |
|
411 | m_padding.top(), | |
|
412 | -m_padding.right(), | |
|
413 | -m_padding.bottom()); | |
|
414 | break; | |
|
415 | } | |
|
416 | } | |
|
417 | } else { | |
|
418 | ||
|
419 | rect.adjust(m_padding.left(), | |
|
420 | m_padding.top(), | |
|
421 | -m_padding.right(), | |
|
422 | -m_padding.bottom()); | |
|
423 | } | |
|
424 | ||
|
425 | QRectF plotRect = m_rect.adjusted(m_padding.left() | |
|
426 | ,m_padding.top() | |
|
427 | ,-m_padding.right() | |
|
428 | ,-m_padding.bottom()); | |
|
429 | QRectF legendRect; | |
|
430 | ||
|
431 | int padding = 0; // TODO: fix this | |
|
432 | switch (m_legend->alignment()) | |
|
433 | { | |
|
434 | case QLegend::AlignmentTop: { | |
|
435 | legendRect = m_rect.adjusted(0,padding,0,-padding - plotRect.height()); | |
|
436 | break; | |
|
437 | } | |
|
438 | case QLegend::AlignmentBottom: { | |
|
439 | legendRect = m_rect.adjusted(padding,padding + plotRect.height(),-padding,0); | |
|
440 | break; | |
|
441 | } | |
|
442 | case QLegend::AlignmentLeft: { | |
|
443 | legendRect = m_rect.adjusted(0,padding,-padding - plotRect.width(),-padding); | |
|
444 | break; | |
|
445 | } | |
|
446 | case QLegend::AlignmentRight: { | |
|
447 | legendRect = m_rect.adjusted(padding + plotRect.width(),padding,0,-padding); | |
|
448 | break; | |
|
449 | } | |
|
450 | default: { | |
|
451 | legendRect = plotRect; | |
|
452 | break; | |
|
453 | } | |
|
454 | } | |
|
455 | ||
|
456 | m_legend->setMaximumSize(legendRect.size()); | |
|
457 | ||
|
458 | qreal width = legendRect.width() - m_legend->size().width(); | |
|
459 | qreal height = legendRect.height() - m_legend->size().height(); | |
|
460 | ||
|
461 | QPointF pos = legendRect.topLeft(); | |
|
462 | if (width > 0) { | |
|
463 | pos.setX(pos.x() + width/2); | |
|
464 | } | |
|
465 | if (height > 0) { | |
|
466 | pos.setY(pos.y() + height/2); | |
|
467 | } | |
|
468 | ||
|
469 | m_legend->setPos(pos); | |
|
470 | } | |
|
471 | ||
|
472 | void QChartPrivate::updateLayout() | |
|
473 | { | |
|
474 | if (!m_rect.isValid()) return; | |
|
475 | ||
|
476 | int padding = m_padding.top(); | |
|
477 | int backgroundPadding = m_presenter->backgroundPadding(); | |
|
478 | ||
|
479 | // recalculate title position | |
|
480 | if (m_titleItem) { | |
|
481 | QPointF center = m_rect.center() -m_titleItem->boundingRect().center(); | |
|
482 | m_titleItem->setPos(center.x(),m_rect.top()/2 + padding/2); | |
|
483 | } | |
|
484 | ||
|
485 | //recalculate background gradient | |
|
486 | if (m_backgroundItem) { | |
|
487 | m_backgroundItem->setRect(m_rect.adjusted(backgroundPadding,backgroundPadding, -backgroundPadding, -backgroundPadding)); | |
|
488 | } | |
|
489 | ||
|
490 | // recalculate legend position | |
|
491 | if (m_legend) { | |
|
492 | if ((m_legend->attachedToChart()) && (m_legend->parentObject() == q_ptr)) { | |
|
493 | updateLegendLayout(); | |
|
494 | } | |
|
495 | } | |
|
496 | } | |
|
497 | ||
|
498 | 349 | #include "moc_qchart.cpp" |
|
499 | 350 | |
|
500 | 351 | QTCOMMERCIALCHART_END_NAMESPACE |
@@ -99,8 +99,7 public: | |||
|
99 | 99 | QChartAxis* axisY() const; |
|
100 | 100 | |
|
101 | 101 | QLegend* legend() const; |
|
102 | ||
|
103 | QRect padding() const; | |
|
102 | QRect margins() const; | |
|
104 | 103 | |
|
105 | 104 | protected: |
|
106 | 105 | void resizeEvent(QGraphicsSceneResizeEvent *event); |
@@ -108,6 +107,7 protected: | |||
|
108 | 107 | protected: |
|
109 | 108 | QScopedPointer<QChartPrivate> d_ptr; |
|
110 | 109 | friend class QLegend; |
|
110 | friend class ChartPresenter; | |
|
111 | 111 | Q_DISABLE_COPY(QChart) |
|
112 | 112 | }; |
|
113 | 113 |
@@ -30,11 +30,9 | |||
|
30 | 30 | #ifndef QCHART_P_H |
|
31 | 31 | #define QCHART_P_H |
|
32 | 32 | |
|
33 | #include "qchartaxis.h" | |
|
34 | 33 | #include "qlegend.h" |
|
35 | 34 | #include "chartpresenter_p.h" |
|
36 | 35 | #include "chartdataset_p.h" |
|
37 | #include "chartbackground_p.h" | |
|
38 | 36 | |
|
39 | 37 | QTCOMMERCIALCHART_BEGIN_NAMESPACE |
|
40 | 38 | |
@@ -42,22 +40,13 class QChart; | |||
|
42 | 40 | |
|
43 | 41 | struct QChartPrivate |
|
44 | 42 | { |
|
45 |
QChartPrivate( |
|
|
43 | QChartPrivate(); | |
|
46 | 44 | ~QChartPrivate(); |
|
47 | ||
|
48 | void createChartBackgroundItem(); | |
|
49 | void createChartTitleItem(); | |
|
50 | void updateLayout(); | |
|
51 | void updateLegendLayout(); | |
|
52 | ||
|
53 | QChart *q_ptr; | |
|
54 | ChartBackground* m_backgroundItem; | |
|
55 | QGraphicsSimpleTextItem* m_titleItem; | |
|
56 | 45 | QRectF m_rect; |
|
57 | 46 | QLegend* m_legend; |
|
58 | 47 | ChartDataSet *m_dataset; |
|
59 | 48 | ChartPresenter *m_presenter; |
|
60 | QRect m_padding; | |
|
49 | ||
|
61 | 50 | }; |
|
62 | 51 | |
|
63 | 52 | QTCOMMERCIALCHART_END_NAMESPACE |
@@ -116,7 +116,7 void QChartView::mousePressEvent(QMouseEvent *event) | |||
|
116 | 116 | { |
|
117 | 117 | if(d_ptr->m_rubberBand && d_ptr->m_rubberBand->isEnabled() && event->button() == Qt::LeftButton) { |
|
118 | 118 | |
|
119 |
int padding = d_ptr->m_chart-> |
|
|
119 | int padding = d_ptr->m_chart->margins().top(); | |
|
120 | 120 | QRect rect(padding, padding, width() - 2 * padding, height() - 2 * padding); |
|
121 | 121 | |
|
122 | 122 | if (rect.contains(event->pos())) { |
@@ -138,7 +138,7 void QChartView::mousePressEvent(QMouseEvent *event) | |||
|
138 | 138 | void QChartView::mouseMoveEvent(QMouseEvent *event) |
|
139 | 139 | { |
|
140 | 140 | if(d_ptr->m_rubberBand && d_ptr->m_rubberBand->isVisible()) { |
|
141 |
int padding = d_ptr->m_chart-> |
|
|
141 | int padding = d_ptr->m_chart->margins().top(); | |
|
142 | 142 | QRect rect(padding, padding, width() - 2 * padding, height() - 2 * padding); |
|
143 | 143 | int width = event->pos().x() - d_ptr->m_rubberBandOrigin.x(); |
|
144 | 144 | int height = event->pos().y() - d_ptr->m_rubberBandOrigin.y(); |
This diff has been collapsed as it changes many lines, (528 lines changed) Show them Hide them | |||
@@ -22,7 +22,6 | |||
|
22 | 22 | #include "qchart_p.h" |
|
23 | 23 | #include "qseries.h" |
|
24 | 24 | #include "legendmarker_p.h" |
|
25 | #include "legendscrollbutton_p.h" | |
|
26 | 25 | #include "qxyseries.h" |
|
27 | 26 | #include "qlineseries.h" |
|
28 | 27 | #include "qareaseries.h" |
@@ -35,8 +34,10 | |||
|
35 | 34 | #include "qpieseries.h" |
|
36 | 35 | #include "qpieslice.h" |
|
37 | 36 | #include "chartpresenter_p.h" |
|
37 | #include "scroller_p.h" | |
|
38 | 38 | #include <QPainter> |
|
39 | 39 | #include <QPen> |
|
40 | #include <QTimer> | |
|
40 | 41 | |
|
41 | 42 | #include <QGraphicsSceneEvent> |
|
42 | 43 | |
@@ -86,45 +87,51 QTCOMMERCIALCHART_BEGIN_NAMESPACE | |||
|
86 | 87 | /*! |
|
87 | 88 | Constructs the legend object and sets the parent to \a parent |
|
88 | 89 | */ |
|
90 | ||
|
89 | 91 | QLegend::QLegend(QChart *chart):QGraphicsWidget(chart), |
|
90 | 92 | m_margin(5), |
|
91 |
m_ |
|
|
92 | m_minimumSize(50,20), // TODO: magic numbers | |
|
93 | m_maximumSize(150,100), | |
|
94 | m_size(m_minimumSize), | |
|
93 | m_offsetX(0), | |
|
94 | m_offsetY(0), | |
|
95 | 95 | m_brush(Qt::darkGray), // TODO: default should come from theme |
|
96 | 96 | m_alignment(QLegend::AlignmentTop), |
|
97 | mFirstMarker(0), | |
|
97 | m_markers(new QGraphicsItemGroup(this)), | |
|
98 | 98 | m_attachedToChart(true), |
|
99 | m_chart(chart) | |
|
99 | m_chart(chart), | |
|
100 | m_minWidth(0), | |
|
101 | m_minHeight(0), | |
|
102 | m_width(0), | |
|
103 | m_height(0), | |
|
104 | m_visible(false), | |
|
105 | m_dirty(false), | |
|
106 | m_scroller(new Scroller(this)) | |
|
100 | 107 | { |
|
101 | m_scrollButtonLeft = new LegendScrollButton(LegendScrollButton::ScrollButtonIdLeft, this); | |
|
102 | m_scrollButtonRight = new LegendScrollButton(LegendScrollButton::ScrollButtonIdRight, this); | |
|
103 | m_scrollButtonUp = new LegendScrollButton(LegendScrollButton::ScrollButtonIdUp, this); | |
|
104 | m_scrollButtonDown = new LegendScrollButton(LegendScrollButton::ScrollButtonIdDown, this); | |
|
105 | 108 | setZValue(ChartPresenter::LegendZValue); |
|
109 | setFlags(QGraphicsItem::ItemClipsChildrenToShape); | |
|
106 | 110 | } |
|
107 | 111 | |
|
108 | 112 | /*! |
|
109 | 113 | Paints the legend to given \a painter. Paremeters \a option and \a widget arent used. |
|
110 | 114 | */ |
|
115 | ||
|
111 | 116 | void QLegend::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) |
|
112 | 117 | { |
|
113 |
|
|
|
114 |
|
|
|
118 | Q_UNUSED(option) | |
|
119 | Q_UNUSED(widget) | |
|
120 | if(!m_visible) return; | |
|
115 | 121 | |
|
116 | 122 | painter->setOpacity(opacity()); |
|
117 | 123 | painter->setPen(m_pen); |
|
118 | 124 | painter->setBrush(m_brush); |
|
119 |
|
|
|
125 | painter->drawRect(boundingRect()); | |
|
120 | 126 | } |
|
121 | 127 | |
|
122 | 128 | /*! |
|
123 | 129 | Bounding rect of legend. |
|
124 | 130 | */ |
|
131 | ||
|
125 | 132 | QRectF QLegend::boundingRect() const |
|
126 | 133 | { |
|
127 |
return |
|
|
134 | return m_rect; | |
|
128 | 135 | } |
|
129 | 136 | |
|
130 | 137 | /*! |
@@ -172,11 +179,10 QPen QLegend::pen() const | |||
|
172 | 179 | */ |
|
173 | 180 | void QLegend::setAlignmnent(QLegend::Alignments alignment) |
|
174 | 181 | { |
|
175 |
|
|
|
182 | if(m_alignment!=alignment && m_attachedToChart) { | |
|
176 | 183 | m_alignment = alignment; |
|
177 | 184 | updateLayout(); |
|
178 | m_chart->resize(m_chart->size()); | |
|
179 | // } | |
|
185 | } | |
|
180 | 186 | } |
|
181 | 187 | |
|
182 | 188 | /*! |
@@ -188,56 +194,6 QLegend::Alignments QLegend::alignment() const | |||
|
188 | 194 | } |
|
189 | 195 | |
|
190 | 196 | /*! |
|
191 | Returns the maximum size of legend. | |
|
192 | */ | |
|
193 | QSizeF QLegend::maximumSize() const | |
|
194 | { | |
|
195 | return m_maximumSize; | |
|
196 | } | |
|
197 | ||
|
198 | /*! | |
|
199 | Sets the maximum \a size for legend. The legend can't grow bigger than this size. If there are | |
|
200 | more series than legend can fit to this size, scroll buttons are displayed. | |
|
201 | */ | |
|
202 | void QLegend::setMaximumSize(const QSizeF size) | |
|
203 | { | |
|
204 | m_maximumSize = size; | |
|
205 | updateLayout(); | |
|
206 | } | |
|
207 | ||
|
208 | /*! | |
|
209 | Returns the current size of legend. | |
|
210 | */ | |
|
211 | QSizeF QLegend::size() const | |
|
212 | { | |
|
213 | return m_size; | |
|
214 | } | |
|
215 | ||
|
216 | /*! | |
|
217 | Sets the \a size of legend. If size is bigger than maximum size of legend, the legend is resized to the maximum size. | |
|
218 | \sa setMmaximumSize() | |
|
219 | */ | |
|
220 | void QLegend::setSize(const QSizeF size) | |
|
221 | { | |
|
222 | m_size = size; | |
|
223 | if (m_size.width() > m_maximumSize.width()) { | |
|
224 | m_size.setWidth(m_maximumSize.width()); | |
|
225 | } | |
|
226 | if (m_size.height() > m_maximumSize.height()) { | |
|
227 | m_size.setHeight(m_maximumSize.height()); | |
|
228 | } | |
|
229 | } | |
|
230 | ||
|
231 | /*! | |
|
232 | Sets position of legend to \a pos | |
|
233 | */ | |
|
234 | void QLegend::setPos(const QPointF &pos) | |
|
235 | { | |
|
236 | m_pos = pos; | |
|
237 | updateLayout(); | |
|
238 | } | |
|
239 | ||
|
240 | /*! | |
|
241 | 197 | \internal \a series \a domain Should be called when series is added to chart. |
|
242 | 198 | */ |
|
243 | 199 | void QLegend::handleSeriesAdded(QSeries *series, Domain *domain) |
@@ -293,7 +249,11 void QLegend::handleSeriesAdded(QSeries *series, Domain *domain) | |||
|
293 | 249 | } |
|
294 | 250 | } |
|
295 | 251 | |
|
296 | updateLayout(); | |
|
252 | // wait for all series added | |
|
253 | if(!m_dirty){ | |
|
254 | QTimer::singleShot(0,this,SLOT(updateLayout())); | |
|
255 | m_dirty=true; | |
|
256 | } | |
|
297 | 257 | } |
|
298 | 258 | |
|
299 | 259 | /*! |
@@ -330,17 +290,10 void QLegend::handleSeriesRemoved(QSeries *series) | |||
|
330 | 290 | void QLegend::handleAdded(QList<QPieSlice *> slices) |
|
331 | 291 | { |
|
332 | 292 | QPieSeries* series = static_cast<QPieSeries *> (sender()); |
|
333 | foreach(QPieSlice* s, slices) { | |
|
334 |
LegendMarker* marker = new LegendMarker(series, |
|
|
335 | marker->setName(s->label()); | |
|
336 | marker->setBrush(s->brush()); | |
|
337 | connect(marker, SIGNAL(clicked(QPieSlice*,Qt::MouseButton)), | |
|
338 | this, SIGNAL(clicked(QPieSlice*,Qt::MouseButton))); | |
|
339 | connect(s, SIGNAL(changed()), marker, SLOT(changed())); | |
|
340 | connect(s, SIGNAL(destroyed()), marker, SLOT(deleteLater())); | |
|
293 | foreach(QPieSlice* slice, slices) { | |
|
294 | PieLegendMarker* marker = new PieLegendMarker(series,slice, this); | |
|
341 | 295 | connect(marker, SIGNAL(destroyed()), this, SLOT(handleMarkerDestroyed())); |
|
342 |
m_markers |
|
|
343 | childItems().append(marker); | |
|
296 | m_markers->addToGroup(marker); | |
|
344 | 297 | } |
|
345 | 298 | updateLayout(); |
|
346 | 299 | } |
@@ -361,36 +314,8 void QLegend::handleRemoved(QList<QPieSlice *> slices) | |||
|
361 | 314 | void QLegend::handleMarkerDestroyed() |
|
362 | 315 | { |
|
363 | 316 | LegendMarker* m = static_cast<LegendMarker *> (sender()); |
|
364 | m_markers.removeOne(m); | |
|
365 | updateLayout(); | |
|
366 | } | |
|
367 | ||
|
368 | /*! | |
|
369 | \internal \a event Handles clicked signals from scroll buttons | |
|
370 | */ | |
|
371 | void QLegend::scrollButtonClicked(LegendScrollButton *scrollButton) | |
|
372 | { | |
|
373 | Q_ASSERT(scrollButton); | |
|
374 | ||
|
375 | switch (scrollButton->id()) { | |
|
376 | case LegendScrollButton::ScrollButtonIdLeft: | |
|
377 | case LegendScrollButton::ScrollButtonIdUp: { | |
|
378 | // Lower limit is same in these cases | |
|
379 | mFirstMarker--; | |
|
380 | checkFirstMarkerBounds(); | |
|
381 | break; | |
|
382 | } | |
|
383 | case LegendScrollButton::ScrollButtonIdRight: | |
|
384 | case LegendScrollButton::ScrollButtonIdDown: { | |
|
385 | mFirstMarker++; | |
|
386 | checkFirstMarkerBounds(); | |
|
387 | break; | |
|
388 | } | |
|
389 | default: { | |
|
390 | break; | |
|
391 | } | |
|
392 | } | |
|
393 | updateLayout(); | |
|
317 | delete m; | |
|
318 | // updateLayout(); | |
|
394 | 319 | } |
|
395 | 320 | |
|
396 | 321 | /*! |
@@ -412,7 +337,7 void QLegend::attachToChart() | |||
|
412 | 337 | /*! |
|
413 | 338 | Returns true, if legend is attached to chart. |
|
414 | 339 | */ |
|
415 |
bool QLegend:: |
|
|
340 | bool QLegend::isAttachedToChart() | |
|
416 | 341 | { |
|
417 | 342 | return m_attachedToChart; |
|
418 | 343 | } |
@@ -422,13 +347,9 bool QLegend::attachedToChart() | |||
|
422 | 347 | */ |
|
423 | 348 | void QLegend::appendMarkers(QAreaSeries* series) |
|
424 | 349 | { |
|
425 | LegendMarker* marker = new LegendMarker(series,this); | |
|
426 | connect(marker, SIGNAL(clicked(QSeries *, Qt::MouseButton)), this, SIGNAL(clicked(QSeries *, Qt::MouseButton))); | |
|
350 | AreaLegendMarker* marker = new AreaLegendMarker(series,this); | |
|
427 | 351 | connect(marker, SIGNAL(destroyed()), this, SLOT(handleMarkerDestroyed())); |
|
428 | connect(series,SIGNAL(updated()),marker,SLOT(changed())); | |
|
429 | marker->changed(); | |
|
430 | m_markers.append(marker); | |
|
431 | childItems().append(marker); | |
|
352 | m_markers->addToGroup(marker); | |
|
432 | 353 | } |
|
433 | 354 | |
|
434 | 355 | /*! |
@@ -436,13 +357,9 void QLegend::appendMarkers(QAreaSeries* series) | |||
|
436 | 357 | */ |
|
437 | 358 | void QLegend::appendMarkers(QXYSeries* series) |
|
438 | 359 | { |
|
439 | LegendMarker* marker = new LegendMarker(series,this); | |
|
440 | connect(marker, SIGNAL(clicked(QSeries *, Qt::MouseButton)), this, SIGNAL(clicked(QSeries *, Qt::MouseButton))); | |
|
360 | XYLegendMarker* marker = new XYLegendMarker(series,this); | |
|
441 | 361 | connect(marker, SIGNAL(destroyed()), this, SLOT(handleMarkerDestroyed())); |
|
442 | connect(series,SIGNAL(updated()),marker,SLOT(changed())); | |
|
443 | marker->changed(); | |
|
444 | m_markers.append(marker); | |
|
445 | childItems().append(marker); | |
|
362 | m_markers->addToGroup(marker); | |
|
446 | 363 | } |
|
447 | 364 | |
|
448 | 365 | /*! |
@@ -451,14 +368,9 void QLegend::appendMarkers(QXYSeries* series) | |||
|
451 | 368 | void QLegend::appendMarkers(QBarSeries *series) |
|
452 | 369 | { |
|
453 | 370 | foreach(QBarSet* set, series->barSets()) { |
|
454 |
LegendMarker* marker = new LegendMarker(series, |
|
|
455 | connect(marker, SIGNAL(clicked(QBarSet *, Qt::MouseButton)), | |
|
456 | this, SIGNAL(clicked(QBarSet *, Qt::MouseButton))); | |
|
457 | connect(set, SIGNAL(valueChanged()), marker, SLOT(changed())); | |
|
371 | BarLegendMarker* marker = new BarLegendMarker(series,set, this); | |
|
458 | 372 | connect(marker, SIGNAL(destroyed()), this, SLOT(handleMarkerDestroyed())); |
|
459 |
marker-> |
|
|
460 | m_markers.append(marker); | |
|
461 | childItems().append(marker); | |
|
373 | m_markers->addToGroup(marker); | |
|
462 | 374 | } |
|
463 | 375 | } |
|
464 | 376 | |
@@ -468,15 +380,9 void QLegend::appendMarkers(QBarSeries *series) | |||
|
468 | 380 | void QLegend::appendMarkers(QPieSeries *series) |
|
469 | 381 | { |
|
470 | 382 | foreach(QPieSlice* slice, series->slices()) { |
|
471 |
LegendMarker* marker = new LegendMarker(series, |
|
|
472 | connect(marker, SIGNAL(clicked(QPieSlice *, Qt::MouseButton)), | |
|
473 | this, SIGNAL(clicked(QPieSlice *, Qt::MouseButton))); | |
|
474 | connect(slice, SIGNAL(changed()), marker, SLOT(changed())); | |
|
475 | connect(slice, SIGNAL(destroyed()), marker, SLOT(deleteLater())); | |
|
383 | PieLegendMarker* marker = new PieLegendMarker(series,slice, this); | |
|
476 | 384 | connect(marker, SIGNAL(destroyed()), this, SLOT(handleMarkerDestroyed())); |
|
477 |
marker-> |
|
|
478 | m_markers.append(marker); | |
|
479 | childItems().append(marker); | |
|
385 | m_markers->addToGroup(marker); | |
|
480 | 386 | } |
|
481 | 387 | } |
|
482 | 388 | |
@@ -486,10 +392,13 void QLegend::appendMarkers(QPieSeries *series) | |||
|
486 | 392 | void QLegend::deleteMarkers(QSeries *series) |
|
487 | 393 | { |
|
488 | 394 | // Search all markers that belong to given series and delete them. |
|
489 | foreach (LegendMarker *m, m_markers) { | |
|
490 | if (m->series() == series) { | |
|
491 | m_markers.removeOne(m); | |
|
492 | delete m; | |
|
395 | ||
|
396 | QList<QGraphicsItem *> items = m_markers->childItems(); | |
|
397 | ||
|
398 | foreach (QGraphicsItem *m, items) { | |
|
399 | LegendMarker *marker = static_cast<LegendMarker*>(m); | |
|
400 | if (marker->series() == series) { | |
|
401 | delete marker; | |
|
493 | 402 | } |
|
494 | 403 | } |
|
495 | 404 | } |
@@ -499,251 +408,154 void QLegend::deleteMarkers(QSeries *series) | |||
|
499 | 408 | If items don't fit, sets the visibility of scroll buttons accordingly. |
|
500 | 409 | Causes legend to be resized. |
|
501 | 410 | */ |
|
502 | void QLegend::updateLayout() | |
|
503 | { | |
|
504 | // Calculate layout for markers and text | |
|
505 | if (m_markers.count() <= 0) { | |
|
506 | // Nothing to do | |
|
507 | return; | |
|
508 | } | |
|
509 | 411 | |
|
510 | checkFirstMarkerBounds(); | |
|
412 | void QLegend::setOffset(const QPointF& point) | |
|
413 | { | |
|
511 | 414 | |
|
512 |
switch |
|
|
513 | { | |
|
514 | // Both cases organise items horizontally | |
|
515 | case QLegend::AlignmentBottom: | |
|
516 | case QLegend::AlignmentTop: { | |
|
517 | layoutHorizontal(); | |
|
518 | break; | |
|
519 | } | |
|
520 | // Both cases organize items vertically | |
|
521 | case QLegend::AlignmentLeft: | |
|
522 | case QLegend::AlignmentRight: { | |
|
523 | layoutVertical(); | |
|
524 | break; | |
|
525 | } | |
|
526 | default: { | |
|
527 | break; | |
|
528 | } | |
|
529 | } | |
|
415 | switch(m_alignment) { | |
|
530 | 416 | |
|
531 | } | |
|
417 | case AlignmentTop: | |
|
418 | case AlignmentBottom: { | |
|
419 | if(m_width<=m_rect.width()) return; | |
|
532 | 420 | |
|
533 | /*! | |
|
534 | \internal Organizes markers horizontally. | |
|
535 | Causes legend to be resized. | |
|
536 | */ | |
|
537 | void QLegend::layoutHorizontal() | |
|
538 | { | |
|
539 | // Find out widest item. | |
|
540 | QSizeF markerMaxSize = maximumMarkerSize(); | |
|
541 | // Use max height as scroll button size | |
|
542 | rescaleScrollButtons(QSize(markerMaxSize.height() ,markerMaxSize.height())); | |
|
543 | ||
|
544 | qreal totalWidth = 0; | |
|
545 | qreal totalHeight = 0; | |
|
546 | ||
|
547 | qreal xStep = markerMaxSize.width(); | |
|
548 | qreal x = m_pos.x() + m_margin; | |
|
549 | qreal y = m_pos.y() + m_margin; | |
|
550 | int column = 0; | |
|
551 | int maxColumns = 1; | |
|
552 | qreal scrollButtonWidth = 0; | |
|
553 | ||
|
554 | // Set correct visibility for scroll scrollbuttons | |
|
555 | if (scrollButtonsVisible()) { | |
|
556 | m_scrollButtonLeft->setVisible(true); | |
|
557 | m_scrollButtonRight->setVisible(true); | |
|
558 | // scrollbuttons visible, so add their width to total width | |
|
559 | totalWidth += (m_scrollButtonLeft->boundingRect().width() + m_margin) * 2; | |
|
560 | scrollButtonWidth = m_scrollButtonLeft->boundingRect().width() + m_margin; | |
|
561 | // start position changes by scrollbutton width | |
|
562 | x += scrollButtonWidth; | |
|
563 | } else { | |
|
564 | m_scrollButtonLeft->setVisible(false); | |
|
565 | m_scrollButtonRight->setVisible(false); | |
|
566 | } | |
|
567 | m_scrollButtonUp->setVisible(false); | |
|
568 | m_scrollButtonDown->setVisible(false); | |
|
569 | ||
|
570 | for (int i=0; i < m_markers.count(); i++) { | |
|
571 | LegendMarker *m = m_markers.at(i); | |
|
572 | if (i < mFirstMarker) { | |
|
573 | // Markers before first are not visible. | |
|
574 | m->setVisible(false); | |
|
575 | } else { | |
|
576 | if ((x + xStep + scrollButtonWidth + m_margin) > (m_pos.x() + m_maximumSize.width())) { | |
|
577 | // This marker would go outside legend rect. | |
|
578 | m->setVisible(false); | |
|
579 | } else { | |
|
580 | // This marker is ok | |
|
581 | m->setVisible(true); | |
|
582 | m->setPos(x, y); | |
|
583 | x += xStep; | |
|
584 | column++; | |
|
421 | if (point.x() != m_offsetX) { | |
|
422 | m_offsetX = qBound(0.0, point.x(), m_width - m_rect.width()); | |
|
423 | m_markers->setPos(-m_offsetX,m_rect.top()); | |
|
585 | 424 | } |
|
425 | break; | |
|
586 | 426 | } |
|
587 | maxColumns = column; | |
|
588 | } | |
|
589 | ||
|
590 | m_scrollButtonLeft->setPos(m_pos.x() + m_margin, y); | |
|
591 | m_scrollButtonRight->setPos(x + m_margin, y); | |
|
427 | case AlignmentLeft: | |
|
428 | case AlignmentRight: { | |
|
592 | 429 | |
|
593 | totalWidth += maxColumns * markerMaxSize.width() + m_margin * 2; | |
|
594 | totalHeight = markerMaxSize.height() + m_margin * 2; | |
|
430 | if(m_height<=m_rect.height()) return; | |
|
595 | 431 | |
|
596 | m_size.setWidth(totalWidth); | |
|
597 | m_size.setHeight(totalHeight); | |
|
598 | } | |
|
599 | ||
|
600 | /*! | |
|
601 | \internal Organizes markers vertically. | |
|
602 | Causes legend to be resized. | |
|
603 | */ | |
|
604 | void QLegend::layoutVertical() | |
|
605 | { | |
|
606 | // Find out widest item. | |
|
607 | QSizeF markerMaxSize = maximumMarkerSize(); | |
|
608 | // Use max height as scroll button size | |
|
609 | rescaleScrollButtons(QSize(markerMaxSize.height() ,markerMaxSize.height())); | |
|
610 | ||
|
611 | qreal totalWidth = 0; | |
|
612 | qreal totalHeight = 0; | |
|
613 | ||
|
614 | qreal yStep = markerMaxSize.height(); | |
|
615 | qreal x = m_pos.x() + m_margin; | |
|
616 | qreal y = m_pos.y() + m_margin; | |
|
617 | int row = 1; | |
|
618 | int maxRows = 1; | |
|
619 | qreal scrollButtonHeight = 0; | |
|
620 | ||
|
621 | // Set correct visibility for scroll scrollbuttons | |
|
622 | if (scrollButtonsVisible()) { | |
|
623 | m_scrollButtonUp->setVisible(true); | |
|
624 | m_scrollButtonDown->setVisible(true); | |
|
625 | totalHeight += (m_scrollButtonUp->boundingRect().height() + m_margin) * 2; // scrollbuttons visible, so add their height to total height | |
|
626 | scrollButtonHeight = m_scrollButtonUp->boundingRect().height(); | |
|
627 | y += scrollButtonHeight + m_margin; // start position changes by scrollbutton height | |
|
628 | } else { | |
|
629 | m_scrollButtonUp->setVisible(false); | |
|
630 | m_scrollButtonDown->setVisible(false); | |
|
631 | } | |
|
632 | m_scrollButtonLeft->setVisible(false); | |
|
633 | m_scrollButtonRight->setVisible(false); | |
|
634 | ||
|
635 | for (int i=0; i < m_markers.count(); i++) { | |
|
636 | LegendMarker* m = m_markers.at(i); | |
|
637 | if (i < mFirstMarker) { | |
|
638 | // Markers before first are not visible. | |
|
639 | m->setVisible(false); | |
|
640 | } else { | |
|
641 | if ((y + yStep + scrollButtonHeight) > (m_pos.y() + m_maximumSize.height())) { | |
|
642 | // This marker would go outside legend rect. | |
|
643 | m->setVisible(false); | |
|
644 | } else { | |
|
645 | // This marker is ok | |
|
646 | m->setVisible(true); | |
|
647 | m->setPos(x, y); | |
|
648 | y += yStep; | |
|
649 | row++; | |
|
432 | if (point.y() != m_offsetY) { | |
|
433 | m_offsetY = qBound(0.0, point.y(), m_height - m_rect.height()); | |
|
434 | m_markers->setPos(m_rect.left(),-m_offsetY); | |
|
650 | 435 | } |
|
436 | break; | |
|
651 | 437 | } |
|
652 | maxRows = row; | |
|
653 | 438 | } |
|
439 | } | |
|
654 | 440 | |
|
655 | m_scrollButtonUp->setPos(m_pos.x() + m_margin, m_pos.y() + m_margin); | |
|
656 | m_scrollButtonDown->setPos(m_pos.x() + m_margin, y + m_margin); | |
|
657 | ||
|
658 | totalWidth += markerMaxSize.width() + m_margin * 2; | |
|
659 | totalHeight = maxRows * markerMaxSize.height() + m_margin * 4 + scrollButtonHeight; // TODO: check this | |
|
660 | ||
|
661 | m_size.setWidth(totalWidth); | |
|
662 | m_size.setHeight(totalHeight); | |
|
441 | QPointF QLegend::offset() const | |
|
442 | { | |
|
443 | return QPointF(m_offsetX,m_offsetY); | |
|
663 | 444 | } |
|
664 | 445 | |
|
665 | /*! | |
|
666 | \internal Sets the size of scroll buttons to \a size | |
|
667 | */ | |
|
668 | void QLegend::rescaleScrollButtons(const QSize &size) | |
|
446 | // this function runs first to set min max values | |
|
447 | void QLegend::updateLayout() | |
|
669 | 448 | { |
|
670 | QPolygonF left; | |
|
671 | left << QPointF(size.width(), 0) << QPointF(0, size.height() / 2) << QPointF(size.width(), size.height()); | |
|
672 | QPolygonF right; | |
|
673 | right << QPointF(0, 0) << QPointF(size.width(), size.height() / 2) << QPointF(0, size.height()); | |
|
674 | QPolygonF up; | |
|
675 | up << QPointF(0, size.height()) << QPointF(size.width() / 2,0) << QPointF(size.width(), size.height()); | |
|
676 | QPolygonF down; | |
|
677 | down << QPointF(0, 0) << QPointF(size.width() / 2, size.height()) << QPointF(size.width(), 0); | |
|
449 | m_dirty=false; | |
|
450 | m_offsetX=0; | |
|
451 | QList<QGraphicsItem *> items = m_markers->childItems(); | |
|
452 | ||
|
453 | if(items.isEmpty()) return; | |
|
454 | ||
|
455 | m_minWidth=0; | |
|
456 | m_minHeight=0; | |
|
457 | ||
|
458 | switch(m_alignment) { | |
|
459 | ||
|
460 | case AlignmentTop: | |
|
461 | case AlignmentBottom: { | |
|
462 | QPointF point = m_rect.topLeft(); | |
|
463 | m_width = 0; | |
|
464 | foreach (QGraphicsItem *item, items) { | |
|
465 | item->setPos(point.x(),m_rect.height()/2 -item->boundingRect().height()/2); | |
|
466 | const QRectF& rect = item->boundingRect(); | |
|
467 | qreal w = rect.width(); | |
|
468 | m_minWidth=qMax(m_minWidth,w); | |
|
469 | m_minHeight=qMax(m_minHeight,rect.height()); | |
|
470 | m_width+=w; | |
|
471 | point.setX(point.x() + w); | |
|
472 | } | |
|
473 | if(m_width<m_rect.width()){ | |
|
474 | m_markers->setPos(m_rect.width()/2-m_width/2,m_rect.top()); | |
|
475 | }else{ | |
|
476 | m_markers->setPos(m_rect.topLeft()); | |
|
477 | } | |
|
478 | m_height=m_minHeight; | |
|
479 | } | |
|
480 | break; | |
|
481 | case AlignmentLeft: | |
|
482 | case AlignmentRight:{ | |
|
483 | QPointF point = m_rect.topLeft(); | |
|
484 | m_height = 0; | |
|
485 | foreach (QGraphicsItem *item, items) { | |
|
486 | item->setPos(point); | |
|
487 | const QRectF& rect = item->boundingRect(); | |
|
488 | qreal h = rect.height(); | |
|
489 | m_minWidth=qMax(m_minWidth,rect.width()); | |
|
490 | m_minHeight=qMax(m_minHeight,h); | |
|
491 | m_height+=h; | |
|
492 | point.setY(point.y() + h); | |
|
493 | } | |
|
494 | if(m_height<m_rect.height()){ | |
|
495 | m_markers->setPos(m_rect.left(),m_rect.height()/2-m_height/2); | |
|
496 | }else{ | |
|
497 | m_markers->setPos(m_rect.topLeft()); | |
|
498 | } | |
|
499 | m_width=m_minWidth; | |
|
500 | } | |
|
501 | break; | |
|
502 | } | |
|
678 | 503 | |
|
679 | m_scrollButtonLeft->setPolygon(left); | |
|
680 | m_scrollButtonRight->setPolygon(right); | |
|
681 | m_scrollButtonUp->setPolygon(up); | |
|
682 | m_scrollButtonDown->setPolygon(down); | |
|
504 | m_chart->d_ptr->m_presenter->updateLayout(); //TODO fixme; | |
|
683 | 505 | } |
|
684 | 506 | |
|
685 | /*! | |
|
686 | \internal Finds out maximum size of single marker. Marker sizes depend on series names. | |
|
687 | */ | |
|
688 | QSizeF QLegend::maximumMarkerSize() | |
|
689 | { | |
|
690 | QSizeF max(0,0); | |
|
691 | foreach (LegendMarker* m, m_markers) { | |
|
692 | if (m->boundingRect().width() > max.width()) | |
|
693 | max.setWidth(m->boundingRect().width()); | |
|
694 | if (m->boundingRect().height() > max.height()) | |
|
695 | max.setHeight(m->boundingRect().height()); | |
|
507 | void QLegend::setBackgroundVisible(bool visible) | |
|
508 | { | |
|
509 | if(m_visible!=visible) | |
|
510 | { | |
|
511 | m_visible=visible; | |
|
512 | update(); | |
|
696 | 513 | } |
|
697 | return max; | |
|
698 | 514 | } |
|
699 | 515 | |
|
700 | /*! | |
|
701 | \internal Checks that first marker is in acceptable bounds. Bounds range from 0 to (maximum number of markers - visible markers) | |
|
702 | If scrollbuttons are visible, they affect the number of visible markers. | |
|
703 | */ | |
|
704 | void QLegend::checkFirstMarkerBounds() | |
|
705 | { | |
|
706 | if ((m_alignment == QLegend::AlignmentLeft) || (m_alignment == QLegend::AlignmentRight)) { | |
|
707 | // Bounds limited by height. | |
|
708 | int max; | |
|
709 | if (scrollButtonsVisible()) { | |
|
710 | max = (m_maximumSize.height() - m_scrollButtonLeft->boundingRect().height() * 2 - m_margin * 4) / maximumMarkerSize().height(); | |
|
711 | } else { | |
|
712 | max = m_maximumSize.height() / maximumMarkerSize().height(); | |
|
713 | } | |
|
714 | ||
|
715 | if (mFirstMarker > m_markers.count() - max) | |
|
716 | mFirstMarker = m_markers.count() - max; | |
|
717 | } else { | |
|
718 | // Bounds limited by width | |
|
719 | int max; | |
|
720 | if (scrollButtonsVisible()) { | |
|
721 | max = (m_maximumSize.width() - m_scrollButtonLeft->boundingRect().width() * 2 - m_margin*4) / maximumMarkerSize().width(); | |
|
722 | } else { | |
|
723 | max = m_maximumSize.width() / maximumMarkerSize().width(); | |
|
724 | } | |
|
516 | bool QLegend::isBackgroundVisible() const | |
|
517 | { | |
|
518 | return m_visible; | |
|
519 | } | |
|
725 | 520 | |
|
726 | if (mFirstMarker > m_markers.count() - max) | |
|
727 | mFirstMarker = m_markers.count() - max; | |
|
521 | void QLegend::resizeEvent(QGraphicsSceneResizeEvent *event) | |
|
522 | { | |
|
523 | const QRectF& rect = QRectF(QPoint(0,0),event->newSize()); | |
|
524 | QGraphicsWidget::resizeEvent(event); | |
|
525 | if(m_rect != rect){ | |
|
526 | m_rect = rect; | |
|
527 | updateLayout(); | |
|
728 | 528 | } |
|
529 | } | |
|
729 | 530 | |
|
730 | if (mFirstMarker < 0) | |
|
731 | mFirstMarker = 0; | |
|
531 | void QLegend::hideEvent(QHideEvent *event) | |
|
532 | { | |
|
533 | QGraphicsWidget::hideEvent(event); | |
|
534 | setEnabled(false); | |
|
535 | updateLayout(); | |
|
732 | 536 | } |
|
733 | 537 | |
|
734 | /*! | |
|
735 | \internal Helper function. Visibility of scroll buttons isn't quite obvious, so helper function clarifies the logic. | |
|
736 | */ | |
|
737 | bool QLegend::scrollButtonsVisible() | |
|
538 | void QLegend::showEvent(QShowEvent *event) | |
|
738 | 539 | { |
|
739 | // Just a helper to clarify, what the magic below means :) | |
|
740 | if ((m_alignment == QLegend::AlignmentTop) || (m_alignment == QLegend::AlignmentBottom)) { | |
|
741 | return (maximumMarkerSize().width() * m_markers.count() + m_margin * 2 > m_maximumSize.width()); | |
|
742 | } else if ((m_alignment == QLegend::AlignmentLeft) || (m_alignment == QLegend::AlignmentRight)) { | |
|
743 | return (maximumMarkerSize().height() * m_markers.count() + m_margin * 2 > m_maximumSize.height()); | |
|
744 | } | |
|
540 | QGraphicsWidget::showEvent(event); | |
|
541 | setEnabled(true); | |
|
542 | updateLayout(); | |
|
543 | } | |
|
745 | 544 | |
|
746 | return (maximumMarkerSize().height() * m_markers.count() + m_margin * 2 > m_maximumSize.height()); | |
|
545 | void QLegend::mousePressEvent(QGraphicsSceneMouseEvent* event) | |
|
546 | { | |
|
547 | //Q_UNUSED(event); | |
|
548 | m_scroller->mousePressEvent(event); | |
|
549 | } | |
|
550 | void QLegend::mouseMoveEvent(QGraphicsSceneMouseEvent* event) | |
|
551 | { | |
|
552 | //Q_UNUSED(event); | |
|
553 | m_scroller->mouseMoveEvent(event); | |
|
554 | } | |
|
555 | void QLegend::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) | |
|
556 | { | |
|
557 | //Q_UNUSED(event); | |
|
558 | m_scroller->mouseReleaseEvent(event); | |
|
747 | 559 | } |
|
748 | 560 | |
|
749 | 561 | #include "moc_qlegend.cpp" |
@@ -39,6 +39,7 class QAreaSeries; | |||
|
39 | 39 | class LegendScrollButton; |
|
40 | 40 | class QSeries; |
|
41 | 41 | class QChart; |
|
42 | class Scroller; | |
|
42 | 43 | |
|
43 | 44 | class QTCOMMERCIALCHART_EXPORT QLegend : public QGraphicsWidget |
|
44 | 45 | { |
@@ -71,25 +72,27 public: | |||
|
71 | 72 | void setAlignmnent(QLegend::Alignments alignment); |
|
72 | 73 | QLegend::Alignments alignment() const; |
|
73 | 74 | |
|
74 | QSizeF maximumSize() const; | |
|
75 | void setMaximumSize(const QSizeF size); | |
|
76 | ||
|
77 | QSizeF size() const; | |
|
78 | void setSize(const QSizeF size); | |
|
79 | void setPos(const QPointF &pos); | |
|
80 | ||
|
81 | void scrollButtonClicked(LegendScrollButton *scrollButton); | |
|
82 | 75 | |
|
83 | 76 | void detachFromChart(); |
|
84 | 77 | void attachToChart(); |
|
85 |
bool |
|
|
78 | bool isAttachedToChart(); | |
|
79 | ||
|
80 | qreal minWidht() const { return m_minWidth;} | |
|
81 | qreal minHeight() const { return m_minHeight;} | |
|
86 | 82 | |
|
87 | Q_SIGNALS: | |
|
88 | // for interactions. | |
|
89 | void clicked(QSeries *series, Qt::MouseButton button); | |
|
90 | void clicked(QBarSet *barset, Qt::MouseButton button); | |
|
91 | void clicked(QPieSlice *slice, Qt::MouseButton button); | |
|
92 | void legendGeometryChanged(); | |
|
83 | void setBackgroundVisible(bool visible); | |
|
84 | bool isBackgroundVisible() const; | |
|
85 | ||
|
86 | void setOffset(const QPointF& point); | |
|
87 | QPointF offset() const; | |
|
88 | ||
|
89 | protected: | |
|
90 | void resizeEvent(QGraphicsSceneResizeEvent *event); | |
|
91 | void hideEvent(QHideEvent *event); | |
|
92 | void showEvent(QShowEvent *event); | |
|
93 | void mousePressEvent(QGraphicsSceneMouseEvent* event); | |
|
94 | void mouseMoveEvent(QGraphicsSceneMouseEvent* event); | |
|
95 | void mouseReleaseEvent(QGraphicsSceneMouseEvent* event); | |
|
93 | 96 | |
|
94 | 97 | public Q_SLOTS: |
|
95 | 98 | // PIMPL ---> |
@@ -108,36 +111,39 private: | |||
|
108 | 111 | void appendMarkers(QBarSeries *series); |
|
109 | 112 | void appendMarkers(QPieSeries *series); |
|
110 | 113 | void deleteMarkers(QSeries *series); |
|
114 | ||
|
115 | ||
|
116 | ||
|
117 | ||
|
118 | private Q_SLOTS: | |
|
111 | 119 | void updateLayout(); |
|
112 |
void |
|
|
113 | void layoutVertical(); | |
|
114 | void rescaleScrollButtons(const QSize &size); | |
|
115 | QSizeF maximumMarkerSize(); | |
|
116 | void checkFirstMarkerBounds(); | |
|
117 | bool scrollButtonsVisible(); | |
|
120 | void scroll(); | |
|
118 | 121 | |
|
122 | private: | |
|
119 | 123 | qreal m_margin; |
|
120 | QPointF m_pos; | |
|
121 | QSizeF m_minimumSize; | |
|
122 | QSizeF m_maximumSize; | |
|
123 | QSizeF m_size; | |
|
124 | 124 | |
|
125 | QList<LegendMarker *> m_markers; | |
|
125 | QRectF m_rect; | |
|
126 | qreal m_offsetX; | |
|
127 | qreal m_offsetY; | |
|
128 | ||
|
129 | //QList<LegendMarker *> m_markers; | |
|
126 | 130 | |
|
127 | 131 | QBrush m_brush; |
|
128 | 132 | QPen m_pen; |
|
129 | 133 | QLegend::Alignments m_alignment; |
|
134 | QGraphicsItemGroup* m_markers; | |
|
130 | 135 | |
|
131 | int mFirstMarker; | |
|
132 | ||
|
133 | LegendScrollButton *m_scrollButtonLeft; | |
|
134 | LegendScrollButton *m_scrollButtonRight; | |
|
135 | LegendScrollButton *m_scrollButtonUp; | |
|
136 | LegendScrollButton *m_scrollButtonDown; | |
|
137 | 136 | |
|
138 | 137 | bool m_attachedToChart; |
|
139 | 138 | |
|
140 | 139 | QChart *m_chart; |
|
140 | qreal m_minWidth; | |
|
141 | qreal m_minHeight; | |
|
142 | qreal m_width; | |
|
143 | qreal m_height; | |
|
144 | bool m_visible; | |
|
145 | bool m_dirty; | |
|
146 | Scroller* m_scroller; | |
|
141 | 147 | friend class QChart; |
|
142 | 148 | // <--- PIMPL |
|
143 | 149 | }; |
@@ -19,7 +19,8 SOURCES += \ | |||
|
19 | 19 | $$PWD/legendmarker.cpp \ |
|
20 | 20 | $$PWD/legendscrollbutton.cpp \ |
|
21 | 21 | $$PWD/chartbackground.cpp \ |
|
22 | $$PWD/chart.cpp | |
|
22 | $$PWD/chart.cpp \ | |
|
23 | $$PWD/scroller.cpp | |
|
23 | 24 | PRIVATE_HEADERS += \ |
|
24 | 25 | $$PWD/chartdataset_p.h \ |
|
25 | 26 | $$PWD/chartitem_p.h \ |
@@ -32,7 +33,8 PRIVATE_HEADERS += \ | |||
|
32 | 33 | $$PWD/chart_p.h \ |
|
33 | 34 | $$PWD/chartconfig_p.h \ |
|
34 | 35 | $$PWD/qchart_p.h \ |
|
35 | $$PWD/qchartview_p.h | |
|
36 | $$PWD/qchartview_p.h \ | |
|
37 | $$PWD/scroller_p.h | |
|
36 | 38 | PUBLIC_HEADERS += \ |
|
37 | 39 | $$PWD/qchart.h \ |
|
38 | 40 | $$PWD/qchartglobal.h \ |
@@ -75,6 +75,7 private Q_SLOTS: | |||
|
75 | 75 | |
|
76 | 76 | Q_SIGNALS: |
|
77 | 77 | void clicked(const QPointF &point); |
|
78 | void selected(); | |
|
78 | 79 | void updated(); |
|
79 | 80 | void pointReplaced(int index); |
|
80 | 81 | void pointRemoved(int index); |
@@ -87,7 +88,7 protected: | |||
|
87 | 88 | QPen m_pen; |
|
88 | 89 | QBrush m_brush; |
|
89 | 90 | |
|
90 |
int m_mapX; |
|
|
91 | int m_mapX; | |
|
91 | 92 | int m_mapY; |
|
92 | 93 | int m_mapFirst; |
|
93 | 94 | int m_mapCount; |
@@ -131,7 +131,7 void tst_QChartView::rubberBand() | |||
|
131 | 131 | QFETCH(int, maxY); |
|
132 | 132 | |
|
133 | 133 | m_view->setRubberBand(rubberBand); |
|
134 |
QRect padding = m_view->chart()-> |
|
|
134 | QRect padding = m_view->chart()->margins(); | |
|
135 | 135 | QCOMPARE(m_view->rubberBand(), rubberBand); |
|
136 | 136 | |
|
137 | 137 | QLineSeries* line = new QLineSeries(); |
@@ -186,7 +186,7 void tst_QChartView::keys() | |||
|
186 | 186 | QFETCH(int, Xcount); |
|
187 | 187 | QFETCH(int, Ycount); |
|
188 | 188 | |
|
189 |
QRect padding = m_view->chart()-> |
|
|
189 | QRect padding = m_view->chart()->margins(); | |
|
190 | 190 | |
|
191 | 191 | QLineSeries* line = new QLineSeries(); |
|
192 | 192 | *line << QPointF(0, 0) << QPointF(100, 100); |
General Comments 0
You need to be logged in to leave comments.
Login now