##// END OF EJS Templates
Adds qlegend pimpl...
Michal Klocek -
r950:2b4630c67306
parent child
Show More
@@ -0,0 +1,72
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
31 #ifndef LEGENDSCROLLER_P_H_
32 #define LEGENDSCROLLER_P_H_
33
34 #include "qlegend.h"
35 #include "scroller_p.h"
36
37 QTCOMMERCIALCHART_BEGIN_NAMESPACE
38
39 class LegendScroller: public QLegend, public Scroller
40 {
41
42 public:
43 LegendScroller(QChart *chart):QLegend(chart)
44 {
45 }
46
47 void setOffset(const QPointF& point)
48 {
49 QLegend::setOffset(point);
50 }
51 QPointF offset() const
52 {
53 return QLegend::offset();
54 }
55
56 void mousePressEvent(QGraphicsSceneMouseEvent* event){
57 Scroller::mousePressEvent(event);
58 //QLegend::mousePressEvent(event);
59 }
60 void mouseMoveEvent(QGraphicsSceneMouseEvent* event){
61 Scroller::mouseMoveEvent(event);
62 //QLegend::mouseMoveEvent(event);
63 }
64 void mouseReleaseEvent(QGraphicsSceneMouseEvent* event){
65 Scroller::mouseReleaseEvent(event);
66 //QLegend::mouseReleaseEvent(event);
67 }
68 };
69
70 QTCOMMERCIALCHART_END_NAMESPACE
71
72 #endif
@@ -0,0 +1,76
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 QLEGEND_P_H_
31 #define QLEGEND_P_H_
32
33 #include "qlegend.h"
34
35 QTCOMMERCIALCHART_BEGIN_NAMESPACE
36
37 class ChartPresenter;
38
39 class QLegendPrivate : public QObject
40 {
41 Q_OBJECT
42 public:
43 QLegendPrivate(ChartPresenter *chart,QLegend *q);
44 ~QLegendPrivate();
45
46 void setOffset(qreal x, qreal y);
47 void updateLayout();
48
49 public Q_SLOTS:
50 void handleSeriesAdded(QSeries *series, Domain *domain);
51 void handleSeriesRemoved(QSeries *series);
52
53 private:
54 QLegend *q_ptr;
55 ChartPresenter *m_presenter;
56 QGraphicsItemGroup* m_markers;
57 QLegend::Alignments m_alignment;
58 QBrush m_brush;
59 QPen m_pen;
60 QRectF m_rect;
61 qreal m_offsetX;
62 qreal m_offsetY;
63 qreal m_minWidth;
64 qreal m_minHeight;
65 qreal m_width;
66 qreal m_height;
67 bool m_attachedToChart;
68 bool m_backgroundVisible;
69
70 friend class QLegend;
71
72 };
73
74 QTCOMMERCIALCHART_END_NAMESPACE
75
76 #endif
@@ -22,6 +22,7
22 #include "qareaseries_p.h"
22 #include "qareaseries_p.h"
23 #include "qlineseries.h"
23 #include "qlineseries.h"
24 #include "areachartitem_p.h"
24 #include "areachartitem_p.h"
25 #include "legendmarker_p.h"
25 #include "domain_p.h"
26 #include "domain_p.h"
26 #include "chartdataset_p.h"
27 #include "chartdataset_p.h"
27 #include "charttheme_p.h"
28 #include "charttheme_p.h"
@@ -261,6 +262,13 Chart* QAreaSeriesPrivate::createGraphics(ChartPresenter* presenter)
261 return area;
262 return area;
262 }
263 }
263
264
265 QList<LegendMarker*> QAreaSeriesPrivate::createLegendMarker(QLegend* legend)
266 {
267 Q_Q(QAreaSeries);
268 QList<LegendMarker*> list;
269 return list << new AreaLegendMarker(q,legend);
270 }
271
264 #include "moc_qareaseries.cpp"
272 #include "moc_qareaseries.cpp"
265 #include "moc_qareaseries_p.cpp"
273 #include "moc_qareaseries_p.cpp"
266
274
@@ -45,6 +45,7 public:
45
45
46 void scaleDomain(Domain& domain);
46 void scaleDomain(Domain& domain);
47 Chart* createGraphics(ChartPresenter* presenter);
47 Chart* createGraphics(ChartPresenter* presenter);
48 QList<LegendMarker*> createLegendMarker(QLegend* legend);
48
49
49 Q_SIGNALS:
50 Q_SIGNALS:
50 void updated();
51 void updated();
@@ -24,6 +24,7
24 #include "qbarset_p.h"
24 #include "qbarset_p.h"
25 #include "barchartmodel_p.h"
25 #include "barchartmodel_p.h"
26 #include "domain_p.h"
26 #include "domain_p.h"
27 #include "legendmarker_p.h"
27 #include "chartdataset_p.h"
28 #include "chartdataset_p.h"
28 #include "charttheme_p.h"
29 #include "charttheme_p.h"
29 #include "chartanimator_p.h"
30 #include "chartanimator_p.h"
@@ -805,6 +806,18 Chart* QBarSeriesPrivate::createGraphics(ChartPresenter* presenter)
805
806
806 }
807 }
807
808
809 QList<LegendMarker*> QBarSeriesPrivate::createLegendMarker(QLegend* legend)
810 {
811 Q_Q(QBarSeries);
812 QList<LegendMarker*> markers;
813 foreach(QBarSet* set, q->barSets()) {
814 BarLegendMarker* marker = new BarLegendMarker(q,set,legend);
815 markers << marker;
816 }
817
818 return markers;
819 }
820
808 #include "moc_qbarseries.cpp"
821 #include "moc_qbarseries.cpp"
809 #include "moc_qbarseries_p.cpp"
822 #include "moc_qbarseries_p.cpp"
810
823
@@ -19,6 +19,7 public:
19
19
20 void scaleDomain(Domain& domain);
20 void scaleDomain(Domain& domain);
21 Chart* createGraphics(ChartPresenter* presenter);
21 Chart* createGraphics(ChartPresenter* presenter);
22 QList<LegendMarker*> createLegendMarker(QLegend* legend);
22
23
23 bool setModel(QAbstractItemModel *model);
24 bool setModel(QAbstractItemModel *model);
24 void setModelMapping(int categories, int bottomBoundry, int topBoundry, Qt::Orientation orientation = Qt::Vertical);
25 void setModelMapping(int categories, int bottomBoundry, int topBoundry, Qt::Orientation orientation = Qt::Vertical);
@@ -25,6 +25,7
25 #include "chartdataset_p.h"
25 #include "chartdataset_p.h"
26 #include "charttheme_p.h"
26 #include "charttheme_p.h"
27 #include "chartanimator_p.h"
27 #include "chartanimator_p.h"
28 #include "legendmarker_p.h"
28 #include <QAbstractItemModel>
29 #include <QAbstractItemModel>
29 #include <QDebug>
30 #include <QDebug>
30
31
@@ -716,6 +717,17 Chart* QPieSeriesPrivate::createGraphics(ChartPresenter* presenter)
716 return pie;
717 return pie;
717 }
718 }
718
719
720 QList<LegendMarker*> QPieSeriesPrivate::createLegendMarker(QLegend* legend)
721 {
722 Q_Q(QPieSeries);
723 QList<LegendMarker*> markers;
724 foreach(QPieSlice* slice, q->slices()) {
725 PieLegendMarker* marker = new PieLegendMarker(q,slice,legend);
726 markers << marker;
727 }
728 return markers;
729 }
730
719 #include "moc_qpieseries.cpp"
731 #include "moc_qpieseries.cpp"
720 #include "moc_qpieseries_p.cpp"
732 #include "moc_qpieseries_p.cpp"
721
733
@@ -38,6 +38,7 public:
38
38
39 void scaleDomain(Domain& domain);
39 void scaleDomain(Domain& domain);
40 Chart* createGraphics(ChartPresenter* presenter);
40 Chart* createGraphics(ChartPresenter* presenter);
41 QList<LegendMarker*> createLegendMarker(QLegend* legend);
41
42
42 void updateDerivativeData();
43 void updateDerivativeData();
43
44
@@ -20,6 +20,8
20
20
21 #include "qchart.h"
21 #include "qchart.h"
22 #include "qchart_p.h"
22 #include "qchart_p.h"
23 #include "legendscroller_p.h"
24 #include "qlegend_p.h"
23 #include <QGraphicsScene>
25 #include <QGraphicsScene>
24 #include <QGraphicsSceneResizeEvent>
26 #include <QGraphicsSceneResizeEvent>
25
27
@@ -67,12 +69,13 QTCOMMERCIALCHART_BEGIN_NAMESPACE
67 QChart::QChart(QGraphicsItem *parent, Qt::WindowFlags wFlags) : QGraphicsWidget(parent,wFlags),
69 QChart::QChart(QGraphicsItem *parent, Qt::WindowFlags wFlags) : QGraphicsWidget(parent,wFlags),
68 d_ptr(new QChartPrivate())
70 d_ptr(new QChartPrivate())
69 {
71 {
70 d_ptr->m_legend = new ScrolledQLegend(this);
71 d_ptr->m_legend->setVisible(false);
72 d_ptr->m_dataset = new ChartDataSet(this);
72 d_ptr->m_dataset = new ChartDataSet(this);
73 d_ptr->m_presenter = new ChartPresenter(this,d_ptr->m_dataset);
73 d_ptr->m_presenter = new ChartPresenter(this,d_ptr->m_dataset);
74 d_ptr->m_presenter->setTheme(QChart::ChartThemeLight, false);
75 d_ptr->createConnections();
74 d_ptr->createConnections();
75 d_ptr->m_legend = new LegendScroller(this);
76 // d_ptr->m_legend->setVisible(false);
77 d_ptr->m_presenter->setTheme(QChart::ChartThemeLight, false);
78
76 //TODO:fix me setMinimumSize(d_ptr->m_padding.left() * 3, d_ptr->m_padding.top() * 3);
79 //TODO:fix me setMinimumSize(d_ptr->m_padding.left() * 3, d_ptr->m_padding.top() * 3);
77 }
80 }
78
81
@@ -400,8 +403,7 QChartPrivate::~QChartPrivate()
400
403
401 void QChartPrivate::createConnections()
404 void QChartPrivate::createConnections()
402 {
405 {
403 QObject::connect(m_dataset,SIGNAL(seriesAdded(QSeries*,Domain*)),m_legend,SLOT(handleSeriesAdded(QSeries*,Domain*)));
406
404 QObject::connect(m_dataset,SIGNAL(seriesRemoved(QSeries*)),m_legend,SLOT(handleSeriesRemoved(QSeries*)));
405 QObject::connect(m_dataset,SIGNAL(seriesAdded(QSeries*,Domain*)),m_presenter,SLOT(handleSeriesAdded(QSeries*,Domain*)));
407 QObject::connect(m_dataset,SIGNAL(seriesAdded(QSeries*,Domain*)),m_presenter,SLOT(handleSeriesAdded(QSeries*,Domain*)));
406 QObject::connect(m_dataset,SIGNAL(seriesRemoved(QSeries*)),m_presenter,SLOT(handleSeriesRemoved(QSeries*)));
408 QObject::connect(m_dataset,SIGNAL(seriesRemoved(QSeries*)),m_presenter,SLOT(handleSeriesRemoved(QSeries*)));
407 QObject::connect(m_dataset,SIGNAL(axisAdded(QChartAxis*,Domain*)),m_presenter,SLOT(handleAxisAdded(QChartAxis*,Domain*)));
409 QObject::connect(m_dataset,SIGNAL(axisAdded(QChartAxis*,Domain*)),m_presenter,SLOT(handleAxisAdded(QChartAxis*,Domain*)));
This diff has been collapsed as it changes many lines, (509 lines changed) Show them Hide them
@@ -1,26 +1,29
1 /****************************************************************************
1 /****************************************************************************
2 **
2 **
3 ** Copyright (C) 2012 Digia Plc
3 ** Copyright (C) 2012 Digia Plc
4 ** All rights reserved.
4 ** All rights reserved.
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 **
6 **
7 ** This file is part of the Qt Commercial Charts Add-on.
7 ** This file is part of the Qt Commercial Charts Add-on.
8 **
8 **
9 ** $QT_BEGIN_LICENSE$
9 ** $QT_BEGIN_LICENSE$
10 ** Licensees holding valid Qt Commercial licenses may use this file in
10 ** Licensees holding valid Qt Commercial licenses may use this file in
11 ** accordance with the Qt Commercial License Agreement provided with the
11 ** accordance with the Qt Commercial License Agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.
13 ** a written agreement between you and Digia.
14 **
14 **
15 ** If you have questions regarding the use of this file, please use
15 ** If you have questions regarding the use of this file, please use
16 ** contact form at http://qt.digia.com
16 ** contact form at http://qt.digia.com
17 ** $QT_END_LICENSE$
17 ** $QT_END_LICENSE$
18 **
18 **
19 ****************************************************************************/
19 ****************************************************************************/
20
20
21 #include "qlegend.h"
21 #include "qlegend.h"
22 #include "qchart_p.h"
22 #include "qlegend_p.h"
23 #include "qseries.h"
23 #include "qseries.h"
24 #include "qseries_p.h"
25 #include "qchart_p.h"
26
24 #include "legendmarker_p.h"
27 #include "legendmarker_p.h"
25 #include "qxyseries.h"
28 #include "qxyseries.h"
26 #include "qlineseries.h"
29 #include "qlineseries.h"
@@ -43,366 +46,287
43 QTCOMMERCIALCHART_BEGIN_NAMESPACE
46 QTCOMMERCIALCHART_BEGIN_NAMESPACE
44
47
45 /*!
48 /*!
46 \class QLegend
49 \class QLegend
47 \brief part of QtCommercial chart API.
50 \brief part of QtCommercial chart API.
48
51
49 QLegend is a graphical object, whics displays legend of the chart. Legend state is updated by QChart, when
52 QLegend is a graphical object, whics displays legend of the chart. Legend state is updated by QChart, when
50 series have been changed. By default, legend is drawn by QChart, but user can set a new parent to legend and
53 series have been changed. By default, legend is drawn by QChart, but user can set a new parent to legend and
51 handle the drawing manually.
54 handle the drawing manually.
52 User isn't supposed to create or delete legend objects, but can reference it via QChart class.
55 User isn't supposed to create or delete legend objects, but can reference it via QChart class.
53
56
54 \mainclass
57 \mainclass
55
58
56 \sa QChart, QSeries
59 \sa QChart, QSeries
57 */
60 */
58
61
59 /*!
62 /*!
60 \enum QLegend::Alignment
63 \enum QLegend::Alignment
61
64
62 This enum describes the possible position for legend inside chart.
65 This enum describes the possible position for legend inside chart.
63
66
64 \value AlignmentTop
67 \value AlignmentTop
65 \value AlignmentBottom
68 \value AlignmentBottom
66 \value AlignmentLeft
69 \value AlignmentLeft
67 \value AlignmentRight
70 \value AlignmentRight
68 */
71 */
69
72
70 /*!
73 /*!
71 \fn qreal QLegend::minWidth() const
74 \fn qreal QLegend::minWidth() const
72 Returns minimum width of the legend
75 Returns minimum width of the legend
73 */
76 */
74
77
75 /*!
78 /*!
76 \fn qreal QLegend::minHeight() const
79 \fn qreal QLegend::minHeight() const
77 Returns minimum height of the legend
80 Returns minimum height of the legend
78 */
81 */
79
82
80 /*!
83 /*!
81 Constructs the legend object and sets the parent to \a parent
84 Constructs the legend object and sets the parent to \a parent
82 */
85 */
83
86
84 QLegend::QLegend(QChart *chart):QGraphicsWidget(chart),
87 QLegend::QLegend(QChart *chart):QGraphicsWidget(chart),
85 m_margin(5),
88 d_ptr(new QLegendPrivate(chart->d_ptr->m_presenter,this))
86 m_offsetX(0),
87 m_offsetY(0),
88 m_brush(Qt::darkGray), // TODO: default should come from theme
89 m_alignment(QLegend::AlignmentTop),
90 m_markers(new QGraphicsItemGroup(this)),
91 m_attachedToChart(true),
92 m_chart(chart),
93 m_minWidth(0),
94 m_minHeight(0),
95 m_width(0),
96 m_height(0),
97 m_backgroundVisible(false)
98 {
89 {
99 setZValue(ChartPresenter::LegendZValue);
90 setZValue(ChartPresenter::LegendZValue);
100 setFlags(QGraphicsItem::ItemClipsChildrenToShape);
91 setFlags(QGraphicsItem::ItemClipsChildrenToShape);
101 setVisible(false); // By default legend is invisible
92 setEnabled(false); // By default legend is disabled
93
94 QObject::connect(chart->d_ptr->m_dataset,SIGNAL(seriesAdded(QSeries*,Domain*)),d_ptr.data(),SLOT(handleSeriesAdded(QSeries*,Domain*)));
95 QObject::connect(chart->d_ptr->m_dataset,SIGNAL(seriesRemoved(QSeries*)),d_ptr.data(),SLOT(handleSeriesRemoved(QSeries*)));
96 }
97
98 QLegend::~QLegend()
99 {
100
102 }
101 }
103
102
104 /*!
103 /*!
105 Paints the legend to given \a painter. Paremeters \a option and \a widget arent used.
104 Paints the legend to given \a painter. Paremeters \a option and \a widget arent used.
106 */
105 */
107
106
108 void QLegend::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
107 void QLegend::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
109 {
108 {
110 Q_UNUSED(option)
109 Q_UNUSED(option)
111 Q_UNUSED(widget)
110 Q_UNUSED(widget)
112 if(!m_backgroundVisible) return;
111 if(!d_ptr->m_backgroundVisible) return;
113
112
114 painter->setOpacity(opacity());
113 painter->setOpacity(opacity());
115 painter->setPen(m_pen);
114 painter->setPen(d_ptr->m_pen);
116 painter->setBrush(m_brush);
115 painter->setBrush(d_ptr->m_brush);
117 painter->drawRect(boundingRect());
116 painter->drawRect(boundingRect());
118 }
117 }
119
118
120 /*!
119 /*!
121 Bounding rect of legend.
120 Bounding rect of legend.
122 */
121 */
123
122
124 QRectF QLegend::boundingRect() const
123 QRectF QLegend::boundingRect() const
125 {
124 {
126 return m_rect;
125 return d_ptr->m_rect;
127 }
126 }
128
127
129 /*!
128 /*!
130 Sets the \a brush of legend. Brush affects the background of legend.
129 Sets the \a brush of legend. Brush affects the background of legend.
131 */
130 */
132 void QLegend::setBrush(const QBrush &brush)
131 void QLegend::setBrush(const QBrush &brush)
133 {
132 {
134 if (m_brush != brush) {
133 if (d_ptr->m_brush != brush) {
135 m_brush = brush;
134 d_ptr->m_brush = brush;
136 update();
135 update();
137 }
136 }
138 }
137 }
139
138
140 /*!
139 /*!
141 Returns the brush used by legend.
140 Returns the brush used by legend.
142 */
141 */
143 QBrush QLegend::brush() const
142 QBrush QLegend::brush() const
144 {
143 {
145 return m_brush;
144 return d_ptr->m_brush;
146 }
145 }
147
146
148 /*!
147 /*!
149 Sets the \a pen of legend. Pen affects the legend borders.
148 Sets the \a pen of legend. Pen affects the legend borders.
150 */
149 */
151 void QLegend::setPen(const QPen &pen)
150 void QLegend::setPen(const QPen &pen)
152 {
151 {
153 if (m_pen != pen) {
152 if (d_ptr->m_pen != pen) {
154 m_pen = pen;
153 d_ptr->m_pen = pen;
155 update();
154 update();
156 }
155 }
157 }
156 }
158
157
159 /*!
158 /*!
160 Returns the pen used by legend
159 Returns the pen used by legend
161 */
160 */
162
161
163 QPen QLegend::pen() const
162 QPen QLegend::pen() const
164 {
163 {
165 return m_pen;
164 return d_ptr->m_pen;
166 }
165 }
167
166
168 /*!
167 /*!
169 Sets the \a alignment for legend. Legend tries to paint itself on the defined position in chart.
168 Sets the \a alignment for legend. Legend tries to paint itself on the defined position in chart.
170 \sa QLegend::Alignment
169 \sa QLegend::Alignment
171 */
170 */
172 void QLegend::setAlignment(QLegend::Alignments alignment)
171 void QLegend::setAlignment(QLegend::Alignments alignment)
173 {
172 {
174 if(m_alignment!=alignment && m_attachedToChart) {
173 if(d_ptr->m_alignment!=alignment && d_ptr->m_attachedToChart) {
175 m_alignment = alignment;
174 d_ptr->m_alignment = alignment;
176 updateLayout();
175 d_ptr->updateLayout();
177 }
176 }
178 }
177 }
179
178
180 /*!
179 /*!
181 Returns the preferred layout for legend
180 Returns the preferred layout for legend
182 */
181 */
183 QLegend::Alignments QLegend::alignment() const
182 QLegend::Alignments QLegend::alignment() const
184 {
183 {
185 return m_alignment;
184 return d_ptr->m_alignment;
186 }
185 }
187
186
188 /*!
187 /*!
189 \internal \a series \a domain Should be called when series is added to chart.
188 Detaches the legend from chart. Chart won't change layout of the legend.
190 */
189 */
191 void QLegend::handleSeriesAdded(QSeries *series, Domain *domain)
190 void QLegend::detachFromChart()
192 {
191 {
193 Q_UNUSED(domain)
192 d_ptr->m_attachedToChart = false;
194
195 switch (series->type())
196 {
197 case QSeries::SeriesTypeLine: {
198 QLineSeries *lineSeries = static_cast<QLineSeries *>(series);
199 appendMarkers(lineSeries);
200 break;
201 }
202 case QSeries::SeriesTypeArea: {
203 QAreaSeries *areaSeries = static_cast<QAreaSeries *>(series);
204 appendMarkers(areaSeries);
205 break;
206 }
207 case QSeries::SeriesTypeBar: {
208 QBarSeries *barSeries = static_cast<QBarSeries *>(series);
209 appendMarkers(barSeries);
210 break;
211 }
212 case QSeries::SeriesTypeStackedBar: {
213 QStackedBarSeries *stackedBarSeries = static_cast<QStackedBarSeries *>(series);
214 appendMarkers(stackedBarSeries);
215 break;
216 }
217 case QSeries::SeriesTypePercentBar: {
218 QPercentBarSeries *percentBarSeries = static_cast<QPercentBarSeries *>(series);
219 appendMarkers(percentBarSeries);
220 break;
221 }
222 case QSeries::SeriesTypeScatter: {
223 QScatterSeries *scatterSeries = static_cast<QScatterSeries *>(series);
224 appendMarkers(scatterSeries);
225 break;
226 }
227 case QSeries::SeriesTypePie: {
228 QPieSeries *pieSeries = static_cast<QPieSeries *>(series);
229 appendMarkers(pieSeries);
230 connect(pieSeries,SIGNAL(added(QList<QPieSlice*>)),this,SLOT(handleAdded(QList<QPieSlice*>)));
231 break;
232 }
233 case QSeries::SeriesTypeSpline: {
234 QSplineSeries *splineSeries = static_cast<QSplineSeries *>(series);
235 appendMarkers(splineSeries);
236 break;
237 }
238 default: {
239 qWarning()<< "QLegend::handleSeriesAdded" << series->type() << "unknown series type.";
240 break;
241 }
242 }
243
244 updateLayout();
245 }
193 }
246
194
247 /*!
195 /*!
248 \internal \a series Should be called when series is removed from chart.
196 Attaches the legend to chart. Chart may change layout of the legend.
249 */
197 */
250 void QLegend::handleSeriesRemoved(QSeries *series)
198 void QLegend::attachToChart()
251 {
199 {
252 switch (series->type())
200 d_ptr->m_attachedToChart = true;
253 {
254 case QSeries::SeriesTypeArea: {
255 QAreaSeries *areaSeries = static_cast<QAreaSeries *>(series);
256 deleteMarkers(areaSeries);
257 break;
258 }
259 case QSeries::SeriesTypePie: {
260 QPieSeries *pieSeries = static_cast<QPieSeries *>(series);
261 disconnect(pieSeries, SIGNAL(added(QList<QPieSlice *>)), this, SLOT(handleAdded(QList<QPieSlice *>)));
262 deleteMarkers(series);
263 break;
264 }
265 default: {
266 // All other types
267 deleteMarkers(series);
268 break;
269 }
270 }
271
272 updateLayout();
273 }
201 }
274
202
275 /*!
203 /*!
276 \internal \a slices Should be called when slices are added to pie chart.
204 Returns true, if legend is attached to chart.
277 */
205 */
278 void QLegend::handleAdded(QList<QPieSlice *> slices)
206 bool QLegend::isAttachedToChart()
279 {
207 {
280 QPieSeries* series = static_cast<QPieSeries *> (sender());
208 return d_ptr->m_attachedToChart;
281 foreach(QPieSlice* slice, slices) {
282 PieLegendMarker* marker = new PieLegendMarker(series,slice, this);
283 m_markers->addToGroup(marker);
284 }
285 updateLayout();
286 }
209 }
287
210
288 /*!
211 void QLegend::setOffset(const QPointF& point)
289 \internal \a slices Should be called when slices are removed from pie chart. Currently unused,
290 because removed slices are also deleted and we listen destroyed signal
291 */
292 void QLegend::handleRemoved(QList<QPieSlice *> slices)
293 {
212 {
294 Q_UNUSED(slices)
213 d_ptr->setOffset(point.x(),point.y());
295 }
214 }
296
215
297 /*!
216 QPointF QLegend::offset() const
298 Detaches the legend from chart. Chart won't change layout of the legend.
299 */
300 void QLegend::detachFromChart()
301 {
217 {
302 m_attachedToChart = false;
218 return QPointF(d_ptr->m_offsetX,d_ptr->m_offsetY);
303 }
219 }
304
220
305 /*!
221 /*!
306 Attaches the legend to chart. Chart may change layout of the legend.
222 Sets the visibility of legend background to \a visible
307 */
223 */
308 void QLegend::attachToChart()
224 void QLegend::setBackgroundVisible(bool visible)
309 {
225 {
310 m_attachedToChart = true;
226 if(d_ptr->m_backgroundVisible!=visible)
227 {
228 d_ptr->m_backgroundVisible=visible;
229 update();
230 }
311 }
231 }
312
232
313 /*!
233 /*!
314 Returns true, if legend is attached to chart.
234 Returns the visibility of legend background
315 */
235 */
316 bool QLegend::isAttachedToChart()
236 bool QLegend::isBackgroundVisible() const
317 {
237 {
318 return m_attachedToChart;
238 return d_ptr->m_backgroundVisible;
319 }
239 }
320
240
321 /*!
241 /*!
322 \internal Helper function. Appends markers from \a series to legend.
242 \internal \a event see QGraphicsWidget for details
323 */
243 */
324 void QLegend::appendMarkers(QAreaSeries* series)
244 void QLegend::resizeEvent(QGraphicsSceneResizeEvent *event)
325 {
245 {
326 AreaLegendMarker* marker = new AreaLegendMarker(series,this);
246 const QRectF& rect = QRectF(QPoint(0,0),event->newSize());
327 m_markers->addToGroup(marker);
247 QGraphicsWidget::resizeEvent(event);
248 if(d_ptr->m_rect != rect) {
249 d_ptr->m_rect = rect;
250 d_ptr->updateLayout();
251 }
328 }
252 }
329
253
330 /*!
254 /*!
331 \internal Helper function. Appends markers from \a series to legend.
255 \internal \a event see QGraphicsWidget for details
332 */
256 */
333 void QLegend::appendMarkers(QXYSeries* series)
257 void QLegend::hideEvent(QHideEvent *event)
334 {
258 {
335 XYLegendMarker* marker = new XYLegendMarker(series,this);
259 QGraphicsWidget::hideEvent(event);
336 m_markers->addToGroup(marker);
260 setEnabled(false);
261 d_ptr->updateLayout();
337 }
262 }
338
263
339 /*!
264 /*!
340 \internal Helper function. Appends markers from \a series to legend.
265 \internal \a event see QGraphicsWidget for details
341 */
266 */
342 void QLegend::appendMarkers(QBarSeries *series)
267 void QLegend::showEvent(QShowEvent *event)
343 {
268 {
344 foreach(QBarSet* set, series->barSets()) {
269 QGraphicsWidget::showEvent(event);
345 BarLegendMarker* marker = new BarLegendMarker(series,set, this);
270 setEnabled(true);
346 m_markers->addToGroup(marker);
271 d_ptr->updateLayout();
347 }
348 }
272 }
349
273
350 /*!
274 qreal QLegend::minWidth() const
351 \internal Helper function. Appends markers from \a series to legend.
352 */
353 void QLegend::appendMarkers(QPieSeries *series)
354 {
275 {
355 foreach(QPieSlice* slice, series->slices()) {
276 return d_ptr->m_minWidth;
356 PieLegendMarker* marker = new PieLegendMarker(series,slice, this);
357 m_markers->addToGroup(marker);
358 }
359 }
277 }
360
278
361 /*!
279 qreal QLegend::minHeight() const
362 \internal Deletes all markers that are created from \a series
363 */
364 void QLegend::deleteMarkers(QSeries *series)
365 {
280 {
366 // Search all markers that belong to given series and delete them.
281 return d_ptr->m_minHeight;
282 }
367
283
368 QList<QGraphicsItem *> items = m_markers->childItems();
284 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
285
286 QLegendPrivate::QLegendPrivate(ChartPresenter* presenter,QLegend *q):
287 q_ptr(q),
288 m_presenter(presenter),
289 m_markers(new QGraphicsItemGroup(q)),
290 m_alignment(QLegend::AlignmentTop),
291 m_offsetX(0),
292 m_offsetY(0),
293 m_minWidth(0),
294 m_minHeight(0),
295 m_width(0),
296 m_height(0),
297 m_attachedToChart(true),
298 m_backgroundVisible(false)
299 {
369
300
370 foreach (QGraphicsItem *markers, items) {
371 LegendMarker *marker = static_cast<LegendMarker*>(markers);
372 if (marker->series() == series) {
373 delete marker;
374 }
375 }
376 }
301 }
377
302
378 /*!
303 QLegendPrivate::~QLegendPrivate()
379 \internal Updates layout of legend. Tries to fit as many markers as possible up to the maximum size of legend.
304 {
380 If items don't fit, sets the visibility of scroll buttons accordingly.
381 Causes legend to be resized.
382 */
383
305
384 void QLegend::setOffset(const QPointF& point)
306 }
307
308 void QLegendPrivate::setOffset(qreal x, qreal y)
385 {
309 {
386
310
387 switch(m_alignment) {
311 switch(m_alignment) {
388
312
389 case AlignmentTop:
313 case QLegend::AlignmentTop:
390 case AlignmentBottom: {
314 case QLegend::AlignmentBottom: {
391 if(m_width<=m_rect.width()) return;
315 if(m_width<=m_rect.width()) return;
392
316
393 if (point.x() != m_offsetX) {
317 if (x != m_offsetX) {
394 m_offsetX = qBound(0.0, point.x(), m_width - m_rect.width());
318 m_offsetX = qBound(0.0, x, m_width - m_rect.width());
395 m_markers->setPos(-m_offsetX,m_rect.top());
319 m_markers->setPos(-m_offsetX,m_rect.top());
396 }
320 }
397 break;
321 break;
398 }
322 }
399 case AlignmentLeft:
323 case QLegend::AlignmentLeft:
400 case AlignmentRight: {
324 case QLegend::AlignmentRight: {
401
325
402 if(m_height<=m_rect.height()) return;
326 if(m_height<=m_rect.height()) return;
403
327
404 if (point.y() != m_offsetY) {
328 if (y != m_offsetY) {
405 m_offsetY = qBound(0.0, point.y(), m_height - m_rect.height());
329 m_offsetY = qBound(0.0, y, m_height - m_rect.height());
406 m_markers->setPos(m_rect.left(),-m_offsetY);
330 m_markers->setPos(m_rect.left(),-m_offsetY);
407 }
331 }
408 break;
332 break;
@@ -410,15 +334,10 void QLegend::setOffset(const QPointF& point)
410 }
334 }
411 }
335 }
412
336
413 QPointF QLegend::offset() const
414 {
415 return QPointF(m_offsetX,m_offsetY);
416 }
417
337
418 // this function runs first to set min max values
338 void QLegendPrivate::updateLayout()
419 void QLegend::updateLayout()
420 {
339 {
421 m_offsetX=0;
340 m_offsetX=0;
422 QList<QGraphicsItem *> items = m_markers->childItems();
341 QList<QGraphicsItem *> items = m_markers->childItems();
423
342
424 if(items.isEmpty()) return;
343 if(items.isEmpty()) return;
@@ -428,8 +347,8 void QLegend::updateLayout()
428
347
429 switch(m_alignment) {
348 switch(m_alignment) {
430
349
431 case AlignmentTop:
350 case QLegend::AlignmentTop:
432 case AlignmentBottom: {
351 case QLegend::AlignmentBottom: {
433 QPointF point = m_rect.topLeft();
352 QPointF point = m_rect.topLeft();
434 m_width = 0;
353 m_width = 0;
435 foreach (QGraphicsItem *item, items) {
354 foreach (QGraphicsItem *item, items) {
@@ -441,16 +360,17 void QLegend::updateLayout()
441 m_width+=w;
360 m_width+=w;
442 point.setX(point.x() + w);
361 point.setX(point.x() + w);
443 }
362 }
444 if(m_width<m_rect.width()){
363 if(m_width<m_rect.width()) {
445 m_markers->setPos(m_rect.width()/2-m_width/2,m_rect.top());
364 m_markers->setPos(m_rect.width()/2-m_width/2,m_rect.top());
446 }else{
365 }
366 else {
447 m_markers->setPos(m_rect.topLeft());
367 m_markers->setPos(m_rect.topLeft());
448 }
368 }
449 m_height=m_minHeight;
369 m_height=m_minHeight;
450 }
370 }
451 break;
371 break;
452 case AlignmentLeft:
372 case QLegend::AlignmentLeft:
453 case AlignmentRight:{
373 case QLegend::AlignmentRight: {
454 QPointF point = m_rect.topLeft();
374 QPointF point = m_rect.topLeft();
455 m_height = 0;
375 m_height = 0;
456 foreach (QGraphicsItem *item, items) {
376 foreach (QGraphicsItem *item, items) {
@@ -462,9 +382,10 void QLegend::updateLayout()
462 m_height+=h;
382 m_height+=h;
463 point.setY(point.y() + h);
383 point.setY(point.y() + h);
464 }
384 }
465 if(m_height<m_rect.height()){
385 if(m_height<m_rect.height()) {
466 m_markers->setPos(m_rect.left(),m_rect.height()/2-m_height/2);
386 m_markers->setPos(m_rect.left(),m_rect.height()/2-m_height/2);
467 }else{
387 }
388 else {
468 m_markers->setPos(m_rect.topLeft());
389 m_markers->setPos(m_rect.topLeft());
469 }
390 }
470 m_width=m_minWidth;
391 m_width=m_minWidth;
@@ -472,62 +393,36 void QLegend::updateLayout()
472 break;
393 break;
473 }
394 }
474
395
475 m_chart->d_ptr->m_presenter->updateLayout(); //TODO fixme;
396 m_presenter->updateLayout();
476 }
397 }
477
398
478 /*!
399 void QLegendPrivate::handleSeriesAdded(QSeries *series, Domain *domain)
479 Sets the visibility of legend background to \a visible
480 */
481 void QLegend::setBackgroundVisible(bool visible)
482 {
400 {
483 if(m_backgroundVisible!=visible)
401 Q_UNUSED(domain)
484 {
485 m_backgroundVisible=visible;
486 update();
487 }
488 }
489
490 /*!
491 Returns the visibility of legend background
492 */
493 bool QLegend::isBackgroundVisible() const
494 {
495 return m_backgroundVisible;
496 }
497
402
498 /*!
403 QList<LegendMarker*> markers = series->d_ptr->createLegendMarker(q_ptr);
499 \internal \a event see QGraphicsWidget for details
404 foreach(LegendMarker* marker , markers)
500 */
405 m_markers->addToGroup(marker);
501 void QLegend::resizeEvent(QGraphicsSceneResizeEvent *event)
502 {
503 const QRectF& rect = QRectF(QPoint(0,0),event->newSize());
504 QGraphicsWidget::resizeEvent(event);
505 if(m_rect != rect){
506 m_rect = rect;
507 updateLayout();
508 }
509 }
510
406
511 /*!
512 \internal \a event see QGraphicsWidget for details
513 */
514 void QLegend::hideEvent(QHideEvent *event)
515 {
516 QGraphicsWidget::hideEvent(event);
517 setEnabled(false);
518 updateLayout();
407 updateLayout();
519 }
408 }
520
409
521 /*!
410 void QLegendPrivate::handleSeriesRemoved(QSeries *series)
522 \internal \a event see QGraphicsWidget for details
523 */
524 void QLegend::showEvent(QShowEvent *event)
525 {
411 {
526 QGraphicsWidget::showEvent(event);
412
527 setEnabled(true);
413 QList<QGraphicsItem *> items = m_markers->childItems();
414
415 foreach (QGraphicsItem *markers, items) {
416 LegendMarker *marker = static_cast<LegendMarker*>(markers);
417 if (marker->series() == series) {
418 delete marker;
419 }
420 }
421
528 updateLayout();
422 updateLayout();
529 }
423 }
530
424
531 #include "moc_qlegend.cpp"
425 #include "moc_qlegend.cpp"
426 #include "moc_qlegend_p.cpp"
532
427
533 QTCOMMERCIALCHART_END_NAMESPACE
428 QTCOMMERCIALCHART_END_NAMESPACE
@@ -25,7 +25,6
25 #include <QGraphicsWidget>
25 #include <QGraphicsWidget>
26 #include <QPen>
26 #include <QPen>
27 #include <QBrush>
27 #include <QBrush>
28 #include "private/scroller_p.h" //TODO fixme
29
28
30 QTCOMMERCIALCHART_BEGIN_NAMESPACE
29 QTCOMMERCIALCHART_BEGIN_NAMESPACE
31
30
@@ -39,7 +38,9 class QPieSeries;
39 class QAreaSeries;
38 class QAreaSeries;
40 class LegendScrollButton;
39 class LegendScrollButton;
41 class QSeries;
40 class QSeries;
41
42 class QChart;
42 class QChart;
43 class QLegendPrivate;
43
44
44 class QTCOMMERCIALCHART_EXPORT QLegend : public QGraphicsWidget
45 class QTCOMMERCIALCHART_EXPORT QLegend : public QGraphicsWidget
45 {
46 {
@@ -60,6 +61,8 private:
60 explicit QLegend(QChart *chart);
61 explicit QLegend(QChart *chart);
61
62
62 public:
63 public:
64 ~QLegend();
65
63 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
66 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
64 QRectF boundingRect() const;
67 QRectF boundingRect() const;
65
68
@@ -76,8 +79,8 public:
76 void attachToChart();
79 void attachToChart();
77 bool isAttachedToChart();
80 bool isAttachedToChart();
78
81
79 qreal minWidth() const { return m_minWidth;}
82 qreal minWidth() const;
80 qreal minHeight() const { return m_minHeight;}
83 qreal minHeight() const;
81
84
82 void setBackgroundVisible(bool visible = true);
85 void setBackgroundVisible(bool visible = true);
83 bool isBackgroundVisible() const;
86 bool isBackgroundVisible() const;
@@ -90,79 +93,10 protected:
90 void hideEvent(QHideEvent *event);
93 void hideEvent(QHideEvent *event);
91 void showEvent(QShowEvent *event);
94 void showEvent(QShowEvent *event);
92
95
93 public Q_SLOTS:
94 // PIMPL --->
95 void handleSeriesAdded(QSeries *series, Domain *domain);
96 void handleSeriesRemoved(QSeries *series);
97 void handleAdded(QList<QPieSlice *> slices);
98 void handleRemoved(QList<QPieSlice *> slices);
99 // PIMPL <---
100
101 private:
102 // PIMPL --->
103 void appendMarkers(QAreaSeries *series);
104 void appendMarkers(QXYSeries *series);
105 void appendMarkers(QBarSeries *series);
106 void appendMarkers(QPieSeries *series);
107 void deleteMarkers(QSeries *series);
108 void updateLayout();
109
110 private:
96 private:
111 qreal m_margin;
97 QScopedPointer<QLegendPrivate> d_ptr;
112
98 Q_DISABLE_COPY(QLegend);
113 QRectF m_rect;
99 friend class LegendScroller;
114 qreal m_offsetX;
115 qreal m_offsetY;
116
117 //QList<LegendMarker *> m_markers;
118
119 QBrush m_brush;
120 QPen m_pen;
121 QLegend::Alignments m_alignment;
122 QGraphicsItemGroup* m_markers;
123
124
125 bool m_attachedToChart;
126
127 QChart *m_chart;
128 qreal m_minWidth;
129 qreal m_minHeight;
130 qreal m_width;
131 qreal m_height;
132 bool m_backgroundVisible;
133 friend class ScrolledQLegend;
134 // <--- PIMPL
135 };
136
137 class ScrolledQLegend: public QLegend, public Scroller
138 {
139
140 public:
141 ScrolledQLegend(QChart *chart):QLegend(chart)
142 {
143 }
144
145 void setOffset(const QPointF& point)
146 {
147 QLegend::setOffset(point);
148 }
149 QPointF offset() const
150 {
151 return QLegend::offset();
152 }
153
154 void mousePressEvent(QGraphicsSceneMouseEvent* event){
155 Scroller::mousePressEvent(event);
156 //QLegend::mousePressEvent(event);
157 }
158 void mouseMoveEvent(QGraphicsSceneMouseEvent* event){
159 Scroller::mouseMoveEvent(event);
160 //QLegend::mouseMoveEvent(event);
161 }
162 void mouseReleaseEvent(QGraphicsSceneMouseEvent* event){
163 Scroller::mouseReleaseEvent(event);
164 //QLegend::mouseReleaseEvent(event);
165 }
166 };
100 };
167
101
168 QTCOMMERCIALCHART_END_NAMESPACE
102 QTCOMMERCIALCHART_END_NAMESPACE
@@ -65,6 +65,7 protected:
65 QScopedPointer<QSeriesPrivate> d_ptr;
65 QScopedPointer<QSeriesPrivate> d_ptr;
66 friend class ChartDataSet;
66 friend class ChartDataSet;
67 friend class ChartPresenter;
67 friend class ChartPresenter;
68 friend class QLegendPrivate;
68 };
69 };
69
70
70 QTCOMMERCIALCHART_END_NAMESPACE
71 QTCOMMERCIALCHART_END_NAMESPACE
@@ -39,6 +39,8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
39 class Domain;
39 class Domain;
40 class ChartPresenter;
40 class ChartPresenter;
41 class Chart;
41 class Chart;
42 class LegendMarker;
43 class QLegend;
42
44
43 class QSeriesPrivate : public QObject
45 class QSeriesPrivate : public QObject
44 {
46 {
@@ -48,6 +50,7 public:
48
50
49 virtual void scaleDomain(Domain& domain) = 0;
51 virtual void scaleDomain(Domain& domain) = 0;
50 virtual Chart* createGraphics(ChartPresenter* presenter) = 0;
52 virtual Chart* createGraphics(ChartPresenter* presenter) = 0;
53 virtual QList<LegendMarker*> createLegendMarker(QLegend* legend) = 0;
51
54
52 protected:
55 protected:
53 QSeries *q_ptr;
56 QSeries *q_ptr;
@@ -33,7 +33,9 PRIVATE_HEADERS += \
33 $$PWD/qchart_p.h \
33 $$PWD/qchart_p.h \
34 $$PWD/qchartview_p.h \
34 $$PWD/qchartview_p.h \
35 $$PWD/scroller_p.h \
35 $$PWD/scroller_p.h \
36 $$PWD/qseries_p.h
36 $$PWD/qseries_p.h \
37 $$PWD/qlegend_p.h \
38 $$PWD/legendscroller_p.h
37 PUBLIC_HEADERS += \
39 PUBLIC_HEADERS += \
38 $$PWD/qchart.h \
40 $$PWD/qchart.h \
39 $$PWD/qchartglobal.h \
41 $$PWD/qchartglobal.h \
@@ -21,6 +21,7
21 #include "qxyseries.h"
21 #include "qxyseries.h"
22 #include "qxyseries_p.h"
22 #include "qxyseries_p.h"
23 #include "domain_p.h"
23 #include "domain_p.h"
24 #include "legendmarker_p.h"
24 #include <QAbstractItemModel>
25 #include <QAbstractItemModel>
25
26
26 QTCOMMERCIALCHART_BEGIN_NAMESPACE
27 QTCOMMERCIALCHART_BEGIN_NAMESPACE
@@ -646,6 +647,13 void QXYSeriesPrivate::scaleDomain(Domain& domain)
646 domain.setRangeY(minY,maxY,tickYCount);
647 domain.setRangeY(minY,maxY,tickYCount);
647 }
648 }
648
649
650 QList<LegendMarker*> QXYSeriesPrivate::createLegendMarker(QLegend* legend)
651 {
652 Q_Q(QXYSeries);
653 QList<LegendMarker*> list;
654 return list << new XYLegendMarker(q,legend);
655 }
656
649 #include "moc_qxyseries.cpp"
657 #include "moc_qxyseries.cpp"
650 #include "moc_qxyseries_p.cpp"
658 #include "moc_qxyseries_p.cpp"
651
659
@@ -44,6 +44,7 public:
44 QXYSeriesPrivate(QXYSeries* q);
44 QXYSeriesPrivate(QXYSeries* q);
45
45
46 void scaleDomain(Domain& domain);
46 void scaleDomain(Domain& domain);
47 QList<LegendMarker*> createLegendMarker(QLegend* legend);
47
48
48 Q_SIGNALS:
49 Q_SIGNALS:
49 void updated();
50 void updated();
General Comments 0
You need to be logged in to leave comments. Login now