@@ -50,6 +50,7 | |||
|
50 | 50 | #include <QSplineSeries> |
|
51 | 51 | #include <QScatterSeries> |
|
52 | 52 | #include <QAreaSeries> |
|
53 | #include <QLegend> | |
|
53 | 54 | #include <QGridLayout> |
|
54 | 55 | #include <QFormLayout> |
|
55 | 56 | #include <QComboBox> |
@@ -67,7 +68,9 ThemeWidget::ThemeWidget(QWidget* parent) : | |||
|
67 | 68 | m_dataTable(generateRandomData(m_listCount,m_valueMax,m_valueCount)), |
|
68 | 69 | m_themeComboBox(createThemeBox()), |
|
69 | 70 | m_antialiasCheckBox(new QCheckBox("Anti aliasing")), |
|
70 | m_animatedComboBox(createAnimationBox()) | |
|
71 | m_animatedComboBox(createAnimationBox()), | |
|
72 | m_legendComboBox(createLegendBox()) | |
|
73 | ||
|
71 | 74 | { |
|
72 | 75 | |
|
73 | 76 | connectSignals(); |
@@ -78,6 +81,7 ThemeWidget::ThemeWidget(QWidget* parent) : | |||
|
78 | 81 | settingsLayout->addWidget(m_themeComboBox); |
|
79 | 82 | settingsLayout->addWidget(new QLabel("Animation:")); |
|
80 | 83 | settingsLayout->addWidget(m_animatedComboBox); |
|
84 | settingsLayout->addWidget(m_legendComboBox); | |
|
81 | 85 | settingsLayout->addWidget(m_antialiasCheckBox); |
|
82 | 86 | settingsLayout->addStretch(); |
|
83 | 87 | baseLayout->addLayout(settingsLayout, 0, 0, 1, 3); |
@@ -123,6 +127,7 void ThemeWidget::connectSignals() | |||
|
123 | 127 | connect(m_themeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(updateUI())); |
|
124 | 128 | connect(m_antialiasCheckBox, SIGNAL(toggled(bool)), this, SLOT(updateUI())); |
|
125 | 129 | connect(m_animatedComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(updateUI())); |
|
130 | connect(m_legendComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(updateUI())); | |
|
126 | 131 | } |
|
127 | 132 | |
|
128 | 133 | DataTable ThemeWidget::generateRandomData(int listCount,int valueMax,int valueCount) const |
@@ -172,6 +177,16 QComboBox* ThemeWidget::createAnimationBox() const | |||
|
172 | 177 | return animationComboBox; |
|
173 | 178 | } |
|
174 | 179 | |
|
180 | QComboBox* ThemeWidget::createLegendBox() const | |
|
181 | { | |
|
182 | QComboBox* legendComboBox = new QComboBox(); | |
|
183 | legendComboBox->addItem("Legend Top", QLegend::AlignmentTop); | |
|
184 | legendComboBox->addItem("Legend Bottom", QLegend::AlignmentBottom); | |
|
185 | legendComboBox->addItem("Legend Left", QLegend::AlignmentLeft); | |
|
186 | legendComboBox->addItem("Legend Right", QLegend::AlignmentRight); | |
|
187 | return legendComboBox; | |
|
188 | } | |
|
189 | ||
|
175 | 190 | QChart* ThemeWidget::createAreaChart() const |
|
176 | 191 | { |
|
177 | 192 | // area chart |
@@ -342,5 +357,11 void ThemeWidget::updateUI() | |||
|
342 | 357 | foreach (QChartView *chartView, m_charts) |
|
343 | 358 | chartView->chart()->setAnimationOptions(options); |
|
344 | 359 | } |
|
360 | ||
|
361 | QLegend::Alignments alignment(m_legendComboBox->itemData(m_legendComboBox->currentIndex()).toInt()); | |
|
362 | foreach (QChartView *chartView, m_charts) { | |
|
363 | qDebug() << alignment; | |
|
364 | chartView->chart()->legend()->setAlignmnent(alignment); | |
|
365 | } | |
|
345 | 366 | } |
|
346 | 367 |
@@ -70,6 +70,7 private: | |||
|
70 | 70 | DataTable generateRandomData(int listCount,int valueMax,int valueCount) const; |
|
71 | 71 | QComboBox* createThemeBox() const; |
|
72 | 72 | QComboBox* createAnimationBox() const; |
|
73 | QComboBox* createLegendBox() const; | |
|
73 | 74 | void connectSignals(); |
|
74 | 75 | QChart* createAreaChart() const; |
|
75 | 76 | QChart* createBarChart(int valueCount) const; |
@@ -88,6 +89,7 private: | |||
|
88 | 89 | QComboBox *m_themeComboBox; |
|
89 | 90 | QCheckBox *m_antialiasCheckBox; |
|
90 | 91 | QComboBox *m_animatedComboBox; |
|
92 | QComboBox *m_legendComboBox; | |
|
91 | 93 | }; |
|
92 | 94 | |
|
93 | 95 | #endif /* THEMEWINDOW_H_ */ |
@@ -19,7 +19,6 | |||
|
19 | 19 | ****************************************************************************/ |
|
20 | 20 | |
|
21 | 21 | #include "qchart.h" |
|
22 | #include "qlegend.h" | |
|
23 | 22 | #include "qchartaxis.h" |
|
24 | 23 | #include "chartpresenter_p.h" |
|
25 | 24 | #include "chartdataset_p.h" |
@@ -55,7 +54,6 ChartPresenter::ChartPresenter(QChart* chart,ChartDataSet* dataset):QObject(char | |||
|
55 | 54 | m_rect(QRectF(QPoint(0,0),m_chart->size())), |
|
56 | 55 | m_options(QChart::NoAnimation), |
|
57 | 56 | m_themeForce(false), |
|
58 | m_padding(50), | |
|
59 | 57 | m_backgroundPadding(10) |
|
60 | 58 | { |
|
61 | 59 | createConnections(); |
@@ -79,55 +77,8 void ChartPresenter::createConnections() | |||
|
79 | 77 | void ChartPresenter::handleGeometryChanged() |
|
80 | 78 | { |
|
81 | 79 | QRectF rect(QPoint(0,0),m_chart->size()); |
|
82 | QLegend* legend = m_chart->legend(); | |
|
83 | if ((legend->attachedToChart()) && (legend->isVisible())) { | |
|
84 | ||
|
85 | // Reserve some space for legend | |
|
86 | switch (m_chart->legend()->alignment()) { | |
|
87 | case QLegend::AlignmentTop: { | |
|
88 | rect.adjust(m_padding, | |
|
89 | m_padding + legend->size().height(), | |
|
90 | -m_padding, | |
|
91 | -m_padding); | |
|
92 | break; | |
|
93 | } | |
|
94 | case QLegend::AlignmentBottom: { | |
|
95 | rect.adjust(m_padding, | |
|
96 | m_padding, | |
|
97 | -m_padding, | |
|
98 | -m_padding - legend->size().height()); | |
|
99 | break; | |
|
100 | } | |
|
101 | case QLegend::AlignmentLeft: { | |
|
102 | rect.adjust(m_padding + legend->size().width(), | |
|
103 | m_padding, | |
|
104 | -m_padding, | |
|
105 | -m_padding); | |
|
106 | break; | |
|
107 | } | |
|
108 | case QLegend::AlignmentRight: { | |
|
109 | rect.adjust(m_padding, | |
|
110 | m_padding, | |
|
111 | -m_padding - legend->size().width(), | |
|
112 | -m_padding); | |
|
113 | break; | |
|
114 | } | |
|
115 | default: { | |
|
116 | rect.adjust(m_padding, | |
|
117 | m_padding, | |
|
118 | -m_padding, | |
|
119 | -m_padding); | |
|
120 | break; | |
|
121 | } | |
|
122 | } | |
|
123 | } else { | |
|
124 | ||
|
125 | // Legend is detached, or not visible | |
|
126 | rect.adjust(m_padding, | |
|
127 | m_padding, | |
|
128 | -m_padding, | |
|
129 | -m_padding); | |
|
130 | } | |
|
80 | QRectF padding = m_chart->padding(); | |
|
81 | rect.adjust(padding.left(), padding.top(), -padding.right(), -padding.bottom()); | |
|
131 | 82 | |
|
132 | 83 | //rewrite zoom stack |
|
133 | 84 | /* |
@@ -393,7 +344,7 void ChartPresenter::zoomIn() | |||
|
393 | 344 | void ChartPresenter::zoomIn(const QRectF& rect) |
|
394 | 345 | { |
|
395 | 346 | QRectF r = rect.normalized(); |
|
396 | r.translate(-m_padding, -m_padding); | |
|
347 | r.translate(-m_chart->padding().topLeft()); | |
|
397 | 348 | if(m_animator) { |
|
398 | 349 | |
|
399 | 350 | QPointF point(r.center().x()/geometry().width(),r.center().y()/geometry().height()); |
@@ -414,8 +365,8 void ChartPresenter::zoomOut() | |||
|
414 | 365 | |
|
415 | 366 | QSizeF size = geometry().size(); |
|
416 | 367 | QRectF rect = geometry(); |
|
417 |
|
|
|
418 |
|
|
|
368 | rect.translate(-m_chart->padding().topLeft()); | |
|
369 | m_dataset->zoomOutDomain(rect.adjusted(size.width()/4,size.height()/4,-size.width()/4,-size.height()/4),size); | |
|
419 | 370 | //m_dataset->zoomOutDomain(m_zoomStack[m_zoomIndex-1],geometry().size()); |
|
420 | 371 | |
|
421 | 372 | if(m_animator){ |
@@ -55,7 +55,6 public: | |||
|
55 | 55 | ChartPresenter(QChart* chart,ChartDataSet *dataset); |
|
56 | 56 | virtual ~ChartPresenter(); |
|
57 | 57 | |
|
58 | int padding() const { return m_padding; } | |
|
59 | 58 | int backgroundPadding() const { return m_backgroundPadding; } |
|
60 | 59 | QRectF geometry() const { return m_rect; } |
|
61 | 60 | ChartAnimator* animator() const { return m_animator; } |
@@ -98,7 +97,6 private: | |||
|
98 | 97 | QRectF m_rect; |
|
99 | 98 | QChart::AnimationOptions m_options; |
|
100 | 99 | bool m_themeForce; |
|
101 | int m_padding; | |
|
102 | 100 | int m_backgroundPadding; |
|
103 | 101 | |
|
104 | 102 | }; |
@@ -73,8 +73,7 d_ptr(new QChartPrivate(this)) | |||
|
73 | 73 | d_ptr->m_legend = new QLegend(this); |
|
74 | 74 | d_ptr->m_dataset = new ChartDataSet(this); |
|
75 | 75 | d_ptr->m_presenter = new ChartPresenter(this,d_ptr->m_dataset); |
|
76 | int padding = d_ptr->m_presenter->padding(); | |
|
77 | setMinimumSize(3*padding,3*padding); | |
|
76 | setMinimumSize(d_ptr->m_padding.left() * 3, d_ptr->m_padding.top() * 3); | |
|
78 | 77 | connect(d_ptr->m_dataset,SIGNAL(seriesAdded(QSeries*,Domain*)),d_ptr->m_legend,SLOT(handleSeriesAdded(QSeries*,Domain*))); |
|
79 | 78 | connect(d_ptr->m_dataset,SIGNAL(seriesRemoved(QSeries*)),d_ptr->m_legend,SLOT(handleSeriesRemoved(QSeries*))); |
|
80 | 79 | } |
@@ -269,6 +268,12 QLegend* QChart::legend() const | |||
|
269 | 268 | return d_ptr->m_legend; |
|
270 | 269 | } |
|
271 | 270 | |
|
271 | QRectF QChart::padding() const | |
|
272 | { | |
|
273 | return d_ptr->m_padding; | |
|
274 | } | |
|
275 | ||
|
276 | ||
|
272 | 277 | /*! |
|
273 | 278 | Resizes and updates the chart area using the \a event data |
|
274 | 279 | */ |
@@ -336,7 +341,8 m_backgroundItem(0), | |||
|
336 | 341 | m_titleItem(0), |
|
337 | 342 | m_legend(0), |
|
338 | 343 | m_dataset(0), |
|
339 | m_presenter(0) | |
|
344 | m_presenter(0), | |
|
345 | m_padding(QRectF(50,50,50,50)) | |
|
340 | 346 | { |
|
341 | 347 | |
|
342 | 348 | } |
@@ -365,10 +371,65 void QChartPrivate::createChartTitleItem() | |||
|
365 | 371 | |
|
366 | 372 | void QChartPrivate::updateLegendLayout() |
|
367 | 373 | { |
|
368 |
|
|
|
369 | QRectF plotRect = m_rect.adjusted(padding,padding,-padding,-padding); | |
|
374 | //int legendPadding = m_chart->legend()->padding(); | |
|
375 | int legendPadding = 30; | |
|
376 | QRectF rect = m_rect; | |
|
377 | ||
|
378 | if ((m_legend->attachedToChart()) && (m_legend->isVisible())) { | |
|
379 | ||
|
380 | // Reserve some space for legend | |
|
381 | switch (m_legend->alignment()) { | |
|
382 | case QLegend::AlignmentTop: { | |
|
383 | rect.adjust(m_padding.left(), | |
|
384 | m_padding.top() + legendPadding, | |
|
385 | -m_padding.right(), | |
|
386 | -m_padding.bottom()); | |
|
387 | break; | |
|
388 | } | |
|
389 | case QLegend::AlignmentBottom: { | |
|
390 | rect.adjust(m_padding.left(), | |
|
391 | m_padding.top(), | |
|
392 | -m_padding.right(), | |
|
393 | -m_padding.bottom() - legendPadding); | |
|
394 | break; | |
|
395 | } | |
|
396 | case QLegend::AlignmentLeft: { | |
|
397 | rect.adjust(m_padding.left() + legendPadding, | |
|
398 | m_padding.top(), | |
|
399 | -m_padding.right(), | |
|
400 | -m_padding.bottom()); | |
|
401 | break; | |
|
402 | } | |
|
403 | case QLegend::AlignmentRight: { | |
|
404 | rect.adjust(m_padding.left(), | |
|
405 | m_padding.top(), | |
|
406 | -m_padding.right() - legendPadding, | |
|
407 | -m_padding.bottom()); | |
|
408 | break; | |
|
409 | } | |
|
410 | default: { | |
|
411 | rect.adjust(m_padding.left(), | |
|
412 | m_padding.top(), | |
|
413 | -m_padding.right(), | |
|
414 | -m_padding.bottom()); | |
|
415 | break; | |
|
416 | } | |
|
417 | } | |
|
418 | } else { | |
|
419 | ||
|
420 | rect.adjust(m_padding.left(), | |
|
421 | m_padding.top(), | |
|
422 | -m_padding.right(), | |
|
423 | -m_padding.bottom()); | |
|
424 | } | |
|
425 | ||
|
426 | QRectF plotRect = m_rect.adjusted(m_padding.left() | |
|
427 | ,m_padding.top() | |
|
428 | ,-m_padding.right() | |
|
429 | ,-m_padding.bottom()); | |
|
370 | 430 | QRectF legendRect; |
|
371 | 431 | |
|
432 | int padding = 0; // TODO: fix this | |
|
372 | 433 | switch (m_legend->alignment()) |
|
373 | 434 | { |
|
374 | 435 | case QLegend::AlignmentTop: { |
@@ -406,7 +467,6 void QChartPrivate::updateLegendLayout() | |||
|
406 | 467 | pos.setY(pos.y() + height/2); |
|
407 | 468 | } |
|
408 | 469 | |
|
409 | qDebug() << "lenged topleft:" << pos; | |
|
410 | 470 | m_legend->setPos(pos); |
|
411 | 471 | } |
|
412 | 472 | |
@@ -414,7 +474,7 void QChartPrivate::updateLayout() | |||
|
414 | 474 | { |
|
415 | 475 | if (!m_rect.isValid()) return; |
|
416 | 476 | |
|
417 |
int padding = m_p |
|
|
477 | int padding = m_padding.top(); | |
|
418 | 478 | int backgroundPadding = m_presenter->backgroundPadding(); |
|
419 | 479 | |
|
420 | 480 | // recalculate title position |
@@ -99,6 +99,8 public: | |||
|
99 | 99 | |
|
100 | 100 | QLegend* legend() const; |
|
101 | 101 | |
|
102 | QRectF padding() const; | |
|
103 | ||
|
102 | 104 | protected: |
|
103 | 105 | void resizeEvent(QGraphicsSceneResizeEvent *event); |
|
104 | 106 |
@@ -57,6 +57,7 struct QChartPrivate | |||
|
57 | 57 | QLegend* m_legend; |
|
58 | 58 | ChartDataSet *m_dataset; |
|
59 | 59 | ChartPresenter *m_presenter; |
|
60 | QRectF m_padding; | |
|
60 | 61 | }; |
|
61 | 62 | |
|
62 | 63 | QTCOMMERCIALCHART_END_NAMESPACE |
@@ -117,7 +117,7 void QChartView::mousePressEvent(QMouseEvent *event) | |||
|
117 | 117 | { |
|
118 | 118 | if(d_ptr->m_rubberBand && d_ptr->m_rubberBand->isEnabled() && event->button() == Qt::LeftButton) { |
|
119 | 119 | |
|
120 |
int padding = d_ptr->m_ |
|
|
120 | int padding = d_ptr->m_chart->padding().top(); | |
|
121 | 121 | QRect rect(padding, padding, width() - 2 * padding, height() - 2 * padding); |
|
122 | 122 | |
|
123 | 123 | if (rect.contains(event->pos())) { |
@@ -139,7 +139,7 void QChartView::mousePressEvent(QMouseEvent *event) | |||
|
139 | 139 | void QChartView::mouseMoveEvent(QMouseEvent *event) |
|
140 | 140 | { |
|
141 | 141 | if(d_ptr->m_rubberBand && d_ptr->m_rubberBand->isVisible()) { |
|
142 |
int padding = d_ptr->m_ |
|
|
142 | int padding = d_ptr->m_chart->padding().top(); | |
|
143 | 143 | QRect rect(padding, padding, width() - 2 * padding, height() - 2 * padding); |
|
144 | 144 | int width = event->pos().x() - d_ptr->m_rubberBandOrigin.x(); |
|
145 | 145 | int height = event->pos().y() - d_ptr->m_rubberBandOrigin.y(); |
@@ -95,7 +95,8 QLegend::QLegend(QChart *chart):QGraphicsWidget(chart), | |||
|
95 | 95 | m_brush(Qt::darkGray), // TODO: default should come from theme |
|
96 | 96 | m_alignment(QLegend::AlignmentTop), |
|
97 | 97 | mFirstMarker(0), |
|
98 | m_attachedToChart(true) | |
|
98 | m_attachedToChart(true), | |
|
99 | m_chart(chart) | |
|
99 | 100 | { |
|
100 | 101 | m_scrollButtonLeft = new LegendScrollButton(LegendScrollButton::ScrollButtonIdLeft, this); |
|
101 | 102 | m_scrollButtonRight = new LegendScrollButton(LegendScrollButton::ScrollButtonIdRight, this); |
@@ -169,16 +170,19 QPen QLegend::pen() const | |||
|
169 | 170 | Sets the \a preferred layout for legend. Legend tries to paint itself on the defined position in chart. |
|
170 | 171 | \sa QLegend::Layout |
|
171 | 172 | */ |
|
172 | void QLegend::setAlignmnent(QLegend::Alignment alignment) | |
|
173 | void QLegend::setAlignmnent(QLegend::Alignments alignment) | |
|
173 | 174 | { |
|
174 | m_alignment = alignment; | |
|
175 | updateLayout(); | |
|
175 | // if (!m_attachedToChart) { | |
|
176 | m_alignment = alignment; | |
|
177 | updateLayout(); | |
|
178 | m_chart->resize(m_chart->size()); | |
|
179 | // } | |
|
176 | 180 | } |
|
177 | 181 | |
|
178 | 182 | /*! |
|
179 | 183 | Returns the preferred layout for legend |
|
180 | 184 | */ |
|
181 | QLegend::Alignment QLegend::alignment() const | |
|
185 | QLegend::Alignments QLegend::alignment() const | |
|
182 | 186 | { |
|
183 | 187 | return m_alignment; |
|
184 | 188 | } |
@@ -52,6 +52,9 public: | |||
|
52 | 52 | AlignmentLeft = Qt::AlignLeft, |
|
53 | 53 | AlignmentRight = Qt::AlignRight |
|
54 | 54 | }; |
|
55 | ||
|
56 | Q_DECLARE_FLAGS(Alignments, Alignment) | |
|
57 | ||
|
55 | 58 | private: |
|
56 | 59 | explicit QLegend(QChart *chart); |
|
57 | 60 | |
@@ -65,8 +68,8 public: | |||
|
65 | 68 | void setPen(const QPen &pen); |
|
66 | 69 | QPen pen() const; |
|
67 | 70 | |
|
68 | void setAlignmnent(QLegend::Alignment alignment); | |
|
69 | QLegend::Alignment alignment() const; | |
|
71 | void setAlignmnent(QLegend::Alignments alignment); | |
|
72 | QLegend::Alignments alignment() const; | |
|
70 | 73 | |
|
71 | 74 | QSizeF maximumSize() const; |
|
72 | 75 | void setMaximumSize(const QSizeF size); |
@@ -86,6 +89,7 Q_SIGNALS: | |||
|
86 | 89 | void clicked(QSeries *series, Qt::MouseButton button); |
|
87 | 90 | void clicked(QBarSet *barset, Qt::MouseButton button); |
|
88 | 91 | void clicked(QPieSlice *slice, Qt::MouseButton button); |
|
92 | void legendGeometryChanged(); | |
|
89 | 93 | |
|
90 | 94 | public Q_SLOTS: |
|
91 | 95 | // PIMPL ---> |
@@ -120,7 +124,7 private: | |||
|
120 | 124 | |
|
121 | 125 | QBrush m_brush; |
|
122 | 126 | QPen m_pen; |
|
123 | QLegend::Alignment m_alignment; | |
|
127 | QLegend::Alignments m_alignment; | |
|
124 | 128 | |
|
125 | 129 | int mFirstMarker; |
|
126 | 130 | |
@@ -131,6 +135,7 private: | |||
|
131 | 135 | |
|
132 | 136 | bool m_attachedToChart; |
|
133 | 137 | |
|
138 | QChart *m_chart; | |
|
134 | 139 | friend class QChart; |
|
135 | 140 | // <--- PIMPL |
|
136 | 141 | }; |
General Comments 0
You need to be logged in to leave comments.
Login now