##// END OF EJS Templates
Refactored for MVP...
Michal Klocek -
r139:167329998526
parent child
Show More
@@ -24,20 +24,6 void BarGroupBase::setSeparatorsVisible(bool visible)
24 24 mSeparatorsVisible = visible;
25 25 }
26 26
27 void BarGroupBase::setSize(const QSizeF& size)
28 {
29 mWidth = size.width();
30 mHeight = size.height();
31 layoutChanged();
32 mLayoutSet = true;
33 }
34
35 void BarGroupBase::setPlotDomain(const PlotDomain& data)
36 {
37 qDebug() << "BarGroupBase::setPlotDomain";
38 // TODO:
39 }
40
41 27 void BarGroupBase::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
42 28 {
43 29 if (!mLayoutSet) {
@@ -119,4 +105,27 void BarGroupBase::dataChanged()
119 105 mLayoutDirty = true;
120 106 }
121 107
108 //handlers
109
110 void BarGroupBase::handleModelChanged(int index)
111 {
112 qDebug() << "BarGroupBase::handleModelChanged";
113 }
114
115 void BarGroupBase::handleDomainChanged(const Domain& domain)
116 {
117 qDebug() << "BarGroupBase::handleModelChanged";
118 }
119
120 void BarGroupBase::handleGeometryChanged(const QRectF& rect)
121 {
122 mWidth = rect.width();
123 mHeight = rect.height();
124 layoutChanged();
125 mLayoutSet = true;
126 setPos(rect.topLeft());
127 }
128
129 #include "moc_bargroupbase.cpp"
130
122 131 QTCOMMERCIALCHART_END_NAMESPACE
@@ -12,16 +12,16 QTCOMMERCIALCHART_BEGIN_NAMESPACE
12 12
13 13 // Base Class for bar groups. Common implemantation of different groups. Not to be instantiated.
14 14
15 class BarGroupBase : public ChartItem, public ChartThemeObserver
15 class BarGroupBase : public QObject, public ChartItem
16 16 {
17
17 Q_OBJECT
18 18 public:
19 19 BarGroupBase(BarChartSeriesBase& series, QGraphicsItem *parent = 0);
20 20 void setSeparatorsVisible(bool visible = true);
21 21
22 22 public: // From ChartItem
23 void setSize(const QSizeF &size);
24 void setPlotDomain(const PlotDomain& data);
23 void setSize(const QSizeF &size){};
24 void setPlotDomain(const PlotDomain& data){};
25 25
26 26 // From QGraphicsItem
27 27 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
@@ -38,6 +38,12 public: // From ChartItem
38 38 virtual void dataChanged(); // data of series has changed -> need to recalculate bar sizes
39 39 virtual void layoutChanged() = 0; // layout has changed -> need to recalculate bar sizes
40 40
41 protected slots:
42 void handleModelChanged(int index);
43 void handleDomainChanged(const Domain& domain);
44 void handleGeometryChanged(const QRectF& size);
45
46
41 47 protected:
42 48
43 49 BarChartSeriesBase& mSeries;
@@ -1,5 +1,9
1 1 #include "chartdataset_p.h"
2 //series
2 3 #include "qxychartseries.h"
4 #include "barchartseries.h"
5 #include "stackedbarchartseries.h"
6 #include "percentbarchartseries.h"
3 7
4 8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
5 9
@@ -21,42 +25,114 const Domain& ChartDataSet::domain() const
21 25
22 26 void ChartDataSet::addSeries(QChartSeries* series)
23 27 {
24 // TODO: we should check the series not already added
25 m_chartSeries << series;
26 m_domainIndex = 0;
27 m_domains.resize(1);
28
29 Domain& domain = m_domains[m_domainIndex];
30
31 switch(series->type())
32 {
33 case QChartSeries::SeriesTypeLine: {
34
35 QXYChartSeries* xyseries = static_cast<QXYChartSeries*>(series);
36
37 for (int i = 0; i < xyseries->count(); i++)
38 {
39 qreal x = xyseries->x(i);
40 qreal y = xyseries->y(i);
41 domain.m_minX = qMin(domain.m_minX,x);
42 domain.m_minY = qMin(domain.m_minY,y);
43 domain.m_maxX = qMax(domain.m_maxX,x);
44 domain.m_maxY = qMax(domain.m_maxY,y);
45 }
46
47 emit domainChanged();
48
49 break;
50 }
51 default: {
52 qDebug()<<__FUNCTION__<<"type" << series->type()<<"not supported";
53 return;
54 break;
55 }
56
57 }
58
59 emit seriesAdded(series);
28 // TODO: we should check the series not already added
29 m_chartSeries << series;
30 m_domainIndex = 0;
31 m_domains.resize(1);
32
33 Domain& domain = m_domains[m_domainIndex];
34
35 switch(series->type())
36 {
37 case QChartSeries::SeriesTypeLine: {
38
39 QXYChartSeries* xyseries = static_cast<QXYChartSeries*>(series);
40
41 for (int i = 0; i < xyseries->count(); i++)
42 {
43 qreal x = xyseries->x(i);
44 qreal y = xyseries->y(i);
45 domain.m_minX = qMin(domain.m_minX,x);
46 domain.m_minY = qMin(domain.m_minY,y);
47 domain.m_maxX = qMax(domain.m_maxX,x);
48 domain.m_maxY = qMax(domain.m_maxY,y);
49 }
50 break;
51 }
52 case QChartSeries::SeriesTypeBar: {
53
54 BarChartSeries* barSeries = static_cast<BarChartSeries*>(series);
55 qreal x = barSeries->countColumns();
56 qreal y = barSeries->max();
57 domain.m_minX = qMin(domain.m_minX,x);
58 domain.m_minY = qMin(domain.m_minY,y);
59 domain.m_maxX = qMax(domain.m_maxX,x);
60 domain.m_maxY = qMax(domain.m_maxY,y);
61 }
62 break;
63 case QChartSeries::SeriesTypeStackedBar: {
64
65 StackedBarChartSeries* stackedBarSeries = static_cast<StackedBarChartSeries*>(series);
66 qreal x = stackedBarSeries->countColumns();
67 qreal y = stackedBarSeries->maxColumnSum();
68 domain.m_minX = qMin(domain.m_minX,x);
69 domain.m_minY = qMin(domain.m_minY,y);
70 domain.m_maxX = qMax(domain.m_maxX,x);
71 domain.m_maxY = qMax(domain.m_maxY,y);
72 }
73 break;
74 case QChartSeries::SeriesTypePercentBar: {
75
76 PercentBarChartSeries* percentBarSeries = static_cast<PercentBarChartSeries*>(series);
77 qreal x = percentBarSeries->countColumns();
78 domain.m_minX = qMin(domain.m_minX,x);
79 domain.m_minY = 0;
80 domain.m_maxX = qMax(domain.m_maxX,x);
81 domain.m_maxY = 100;
82 }
83 break;
84
85 default: {
86 qDebug()<<__FUNCTION__<<"type" << series->type()<<"not supported";
87 return;
88 break;
89 }
90
91 }
92
93 emit seriesAdded(series);
94 emit domainChanged(domain);
95 }
96
97 bool ChartDataSet::nextDomain()
98 {
99 if (m_domainIndex < m_domains.count() - 1) {
100 m_domainIndex++;
101 emit domainChanged(m_domains[m_domainIndex]);
102 return true;
103 }
104 else {
105 return false;
106 }
107 }
108
109 bool ChartDataSet::previousDomain()
110 {
111 if (m_domainIndex > 0) {
112 m_domainIndex--;
113 emit domainChanged(m_domains[m_domainIndex]);
114 return true;
115 }
116 else {
117 return false;
118 }
119 }
120
121 void ChartDataSet::clearDomains()
122 {
123 if (m_domainIndex > 0) {
124 m_domainIndex = 0;
125 emit domainChanged(m_domains[m_domainIndex]);
126 }
127 }
128
129 void ChartDataSet::addDomain(const Domain& domain)
130 {
131 m_domains.resize(m_domainIndex + 1);
132 m_domains << domain;
133 m_domainIndex++;
134
135 emit domainChanged(domain);
60 136 }
61 137
62 138 #include "moc_chartdataset_p.cpp"
@@ -15,11 +15,15 public:
15 15 virtual ~ChartDataSet();
16 16
17 17 void addSeries(QChartSeries* series);
18 void addDomain(const Domain& domain);
19 bool nextDomain();
20 bool previousDomain();
21 void clearDomains();
18 22 const Domain& domain() const;
19 23
20 24 signals:
21 25 void seriesAdded(QChartSeries* series);
22 void domainChanged();
26 void domainChanged(const Domain& domain);
23 27
24 28 private:
25 29 QList<QChartSeries*> m_chartSeries;
@@ -1,9 +1,17
1 #include "qchart.h"
1 2 #include "chartpresenter_p.h"
2 3 #include "chartdataset_p.h"
4 //series
5 #include "barchartseries.h"
6 #include "stackedbarchartseries.h"
7 #include "percentbarchartseries.h"
3 8 #include "qxychartseries.h"
9 //items
10 #include "bargroup.h"
11 #include "stackedbargroup.h"
4 12 #include "xylinechartitem_p.h"
13 #include "percentbargroup.h"
5 14 #include "linechartanimationitem_p.h"
6 #include "qchart.h"
7 15
8 16 #include <QAbstractAnimation>
9 17 #include <QPropertyAnimation>
@@ -13,6 +21,8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
13 21 ChartPresenter::ChartPresenter(QChart* chart,ChartDataSet* dataset):QObject(chart),
14 22 m_chart(chart),
15 23 m_dataset(dataset),
24 m_domainIndex(0),
25 m_marginSize(0),
16 26 m_rect(QRectF(QPoint(0,0),m_chart->size()))
17 27 {
18 28 creteConnections();
@@ -26,21 +36,23 void ChartPresenter::creteConnections()
26 36 {
27 37 QObject::connect(m_chart,SIGNAL(geometryChanged()),this,SLOT(handleGeometryChanged()));
28 38 QObject::connect(m_dataset,SIGNAL(seriesAdded(QChartSeries*)),this,SLOT(handleSeriesAdded(QChartSeries*)));
29 QObject::connect(m_dataset,SIGNAL(domainChanged()),this,SLOT(handleDomainChanged()));
30 39 }
31 40
32 41 void ChartPresenter::handleGeometryChanged()
33 42 {
34 43 m_rect = QRectF(QPoint(0,0),m_chart->size());
44 m_rect.adjust(m_marginSize,m_marginSize, -m_marginSize, -m_marginSize);
45 emit geometryChanged(m_rect);
46 }
35 47
36 int margin = m_chart->margin();
37 m_rect.adjust(margin,margin, -margin, -margin);
48 int ChartPresenter::margin() const
49 {
50 return m_marginSize;
51 }
38 52
39 foreach (ChartItem *item, m_chartItems) {
40 item->setPos(m_rect.topLeft());
41 item->setSize(m_rect.size());
42 item->updateItem();
43 }
53 void ChartPresenter::setMargin(int margin)
54 {
55 m_marginSize = margin;
44 56 }
45 57
46 58 void ChartPresenter::handleSeriesAdded(QChartSeries* series)
@@ -48,38 +60,167 void ChartPresenter::handleSeriesAdded(QChartSeries* series)
48 60 switch(series->type())
49 61 {
50 62 case QChartSeries::SeriesTypeLine: {
63 QXYChartSeries* lineSeries = static_cast<QXYChartSeries*>(series);
64 XYLineChartItem* item = new LineChartAnimationItem(this,lineSeries,m_chart);
65 item->setPen(lineSeries->pen());
66 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
67 QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),item,SLOT(handleDomainChanged(const Domain&)));
68 QObject::connect(lineSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int)));
69 m_chartItems.insert(series,item);
70 break;
71 }
72
73 case QChartSeries::SeriesTypeBar: {
74 BarChartSeries* barSeries = static_cast<BarChartSeries*>(series);
75 BarGroup* item = new BarGroup(*barSeries,m_chart);
76
77 // Add some fugly colors for 5 fist series...
78 item->addColor(QColor(255,0,0,128));
79 item->addColor(QColor(255,255,0,128));
80 item->addColor(QColor(0,255,0,128));
81 item->addColor(QColor(0,0,255,128));
82 item->addColor(QColor(255,128,0,128));
51 83
52 QXYChartSeries* xyseries = static_cast<QXYChartSeries*>(series);
53 //TODO: series->createViewItem();
54 //XYLineChartItem* item = new XYLineChartItem(this,m_chart);
55 XYLineChartItem* item = new LineChartAnimationItem(this,xyseries,m_chart);
56 item->setDomain(m_dataset->domain());
57 item->updateItem();
84 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
85 QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),item,SLOT(handleDomainChanged(const Domain&)));
86 QObject::connect(barSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int)));
58 87 m_chartItems.insert(series,item);
88 // m_axisXItem->setVisible(false);
59 89 break;
60 90 }
61 91
92 case QChartSeries::SeriesTypeStackedBar: {
93
94 StackedBarChartSeries* stackedBarSeries = static_cast<StackedBarChartSeries*>(series);
95 StackedBarGroup* item = new StackedBarGroup(*stackedBarSeries,m_chart);
96
97 // Add some fugly colors for 5 fist series...
98 item->addColor(QColor(255,0,0,128));
99 item->addColor(QColor(255,255,0,128));
100 item->addColor(QColor(0,255,0,128));
101 item->addColor(QColor(0,0,255,128));
102 item->addColor(QColor(255,128,0,128));
103 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
104 QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),item,SLOT(handleDomainChanged(const Domain&)));
105 QObject::connect(stackedBarSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int)));
106 m_chartItems.insert(series,item);
107 break;
108 }
109
110 case QChartSeries::SeriesTypePercentBar: {
111
112 PercentBarChartSeries* percentBarSeries = static_cast<PercentBarChartSeries*>(series);
113 PercentBarGroup* item = new PercentBarGroup(*percentBarSeries,m_chart);
114
115 // Add some fugly colors for 5 fist series...
116 item->addColor(QColor(255,0,0,128));
117 item->addColor(QColor(255,255,0,128));
118 item->addColor(QColor(0,255,0,128));
119 item->addColor(QColor(0,0,255,128));
120 item->addColor(QColor(255,128,0,128));
121 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
122 QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),item,SLOT(handleDomainChanged(const Domain&)));
123 QObject::connect(percentBarSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int)));
124 m_chartItems.insert(series,item);
125 break;
126 }
127 /*
128 case QChartSeries::SeriesTypeScatter: {
129 QScatterSeries *scatterSeries = qobject_cast<QScatterSeries *>(series);
130 scatterSeries->d->m_theme = m_chartTheme->themeForSeries();
131 scatterSeries->d->setParentItem(this);
132 scatterSeries->d->m_boundingRect = m_rect.adjusted(margin(),margin(), -margin(), -margin());
133 m_chartItems << scatterSeries->d;
134 m_chartTheme->addObserver(scatterSeries->d);
135
136 foreach (qreal x, scatterSeries->d->m_x) {
137 domain.m_minX = qMin(domain.m_minX, x);
138 domain.m_maxX = qMax(domain.m_maxX, x);
139 }
140 foreach (qreal y, scatterSeries->d->m_y) {
141 domain.m_minY = qMin(domain.m_minY, y);
142 domain.m_maxY = qMax(domain.m_maxY, y);
143 }
144
145 break;
146 }
147 case QChartSeries::SeriesTypePie: {
148 QPieSeries *pieSeries = qobject_cast<QPieSeries *>(series);
149 pieSeries->d->setParentItem(this);
150 m_chartItems << pieSeries->d;
151 pieSeries->d->m_chartTheme = m_chartTheme;
152 m_chartTheme->addObserver(pieSeries->d);
153 break;
154 }
155 default:
156 break;
157 }
158 */
159
62 160 default: {
63 qDebug()<< "Series type" << series->type() << "not implemented.";
64 break;
161 qDebug()<< "Series type" << series->type() << "not implemented.";
162 break;
65 163 }
66 164 }
67 165 }
68 166
69 167 void ChartPresenter::handleSeriesChanged(QChartSeries* series)
70 168 {
71 switch(series->type())
72 {
73 case QChartSeries::SeriesTypeLine: {
169 //TODO:
170 }
171
172 void ChartPresenter::zoomInToRect(const QRectF& rect)
173 {
174 if(!rect.isValid()) return;
175 QRectF r = rect.normalized();
176 r.translate(-m_marginSize, -m_marginSize);
177 Domain domain (m_dataset->domain().subDomain(rect,m_rect.width(),m_rect.height()));
178 m_dataset->addDomain(domain);
179 }
74 180
75 break;
76 }
77 181
78 }
182 void ChartPresenter::zoomIn()
183 {
184 if (!m_dataset->nextDomain()) {
185 QRectF rect = m_rect;
186 rect.setWidth(rect.width()/2);
187 rect.setHeight(rect.height()/2);
188 rect.moveCenter(m_rect.center());
189 Domain domain (m_dataset->domain().subDomain(rect,m_rect.width(),m_rect.height()));
190 m_dataset->addDomain(domain);
191 }
192 }
79 193
80 //m_chartItems.value(series)->updateItem();
194 void ChartPresenter::zoomOut()
195 {
196 m_dataset->previousDomain();
81 197 }
82 198
199 void ChartPresenter::zoomReset()
200 {
201 m_dataset->clearDomains();
202 }
203
204 /*
205 void ChartPresenter::setAxisX(const QChartAxis& axis)
206 {
207 setAxis(m_axisXItem,axis);
208 }
209 void ChartPresenter::setAxisY(const QChartAxis& axis)
210 {
211 setAxis(m_axisYItem.at(0),axis);
212 }
213
214 void ChartPresenter::setAxisY(const QList<QChartAxis>& axis)
215 {
216 //TODO not implemented
217 }
218
219 void ChartPresenter::setAxis(AxisItem *item, const QChartAxis& axis)
220 {
221 item->setVisible(axis.isAxisVisible());
222 }
223 */
83 224 #include "moc_chartpresenter_p.cpp"
84 225
85 226 QTCOMMERCIALCHART_END_NAMESPACE
@@ -20,6 +20,21 class ChartPresenter: public QObject
20 20 public:
21 21 ChartPresenter(QChart* chart,ChartDataSet *dataset);
22 22 virtual ~ChartPresenter();
23 /*
24 void setAxisX(const QChartAxis& axis);
25 void setAxisY(const QChartAxis& axis);
26 void setAxisY(const QList<QChartAxis>& axis);
27
28
29 */
30
31 void setMargin(int margin);
32 int margin() const;
33
34 void zoomInToRect(const QRectF& rectangle);
35 void zoomIn();
36 void zoomOut();
37 void zoomReset();
23 38
24 39 private:
25 40 void creteConnections();
@@ -31,12 +46,16 public slots:
31 46 //void handleDomainChanged(Domain oldDomain,Domain newDomain);
32 47 void handleGeometryChanged();
33 48
34
49 signals:
50 void geometryChanged(const QRectF& rect);
35 51
36 52 private:
37 53 QMap<QChartSeries*,ChartItem*> m_chartItems;
38 54 QChart* m_chart;
39 55 ChartDataSet* m_dataset;
56 QVector<Domain> m_domains;
57 int m_domainIndex;
58 int m_marginSize;
40 59 QRectF m_rect;
41 60 };
42 61
@@ -28,7 +28,7 qreal Domain::spanY() const
28 28 return m_maxY - m_minY;
29 29 }
30 30
31 Domain Domain::subDomain(const QRect& rect, qreal maxWidth,qreal maxHeight) const
31 Domain Domain::subDomain(const QRectF& rect, qreal maxWidth,qreal maxHeight) const
32 32 {
33 33 Domain domain;
34 34
@@ -13,7 +13,7 public:
13 13 qreal spanX() const;
14 14 qreal spanY() const;
15 15
16 Domain subDomain(const QRect& rect, qreal maxWidth, qreal maxHeight) const;
16 Domain subDomain(const QRectF& rect, qreal maxWidth, qreal maxHeight) const;
17 17
18 18 public:
19 19 qreal m_minX;
@@ -4,22 +4,21
4 4 #include "qscatterseries_p.h"
5 5 #include "qpieseries.h"
6 6 #include "qpieseries_p.h"
7 #include "qxychartseries.h"
8 7 #include "qchartaxis.h"
9 #include "barchartseries.h"
10 #include "bargroup.h"
11 #include "stackedbarchartseries.h"
12 #include "stackedbargroup.h"
13 #include "percentbarchartseries.h"
14 #include "percentbargroup.h"
15 8 #include "charttheme_p.h"
16 9 #include "chartitem_p.h"
17
18 #include "xylinechartitem_p.h"
19 10 #include "plotdomain_p.h"
20 11 #include "axisitem_p.h"
21 12 #include "chartpresenter_p.h"
22 13 #include "chartdataset_p.h"
14
15 //series
16 #include "barchartseries.h"
17 #include "stackedbarchartseries.h"
18 #include "percentbarchartseries.h"
19 #include "qxychartseries.h"
20
21
23 22 #include <QGraphicsScene>
24 23 #include <QGraphicsSceneResizeEvent>
25 24 #include <QDebug>
@@ -31,18 +30,18 QChart::QChart(QGraphicsItem *parent, Qt::WindowFlags wFlags) : QGraphicsWidget(
31 30 m_titleItem(0),
32 31 m_axisXItem(new AxisItem(AxisItem::X_AXIS, this)),
33 32 m_plotDataIndex(0),
34 m_marginSize(0),
35 33 m_chartTheme(new ChartTheme(this)),
36 m_dataset(0),
37 //m_dataset(new ChartDataSet(this)),
38 m_presenter(0)
39 //m_presenter(new ChartPresenter(this,m_dataset))
34 //m_dataset(0),
35 m_dataset(new ChartDataSet(this)),
36 //m_presenter(0)
37 m_presenter(new ChartPresenter(this,m_dataset))
40 38 {
41 39 // TODO: the default theme?
42 40 setTheme(QChart::ChartThemeDefault);
43 41
44 42 PlotDomain domain;
45 43 m_plotDomainList << domain;
44
46 45 m_axisYItem << new AxisItem(AxisItem::Y_AXIS,this);
47 46 m_chartItems << m_axisXItem;
48 47 m_chartItems << m_axisYItem.at(0);
@@ -52,154 +51,7 QChart::~QChart(){}
52 51
53 52 void QChart::addSeries(QChartSeries* series)
54 53 {
55 if(m_dataset) {
56 m_dataset->addSeries(series);
57 return;
58 }
59
60 Q_ASSERT(series);
61 Q_ASSERT(series->type() != QChartSeries::SeriesTypeInvalid);
62
63 // TODO: we should check the series not already added
64
65
66 m_chartSeries << series;
67
68 m_plotDataIndex = 0 ;
69 m_plotDomainList.resize(1);
70 PlotDomain& domain = m_plotDomainList[m_plotDataIndex];
71
72 switch(series->type())
73 {
74 case QChartSeries::SeriesTypeLine: {
75
76 QXYChartSeries* xyseries = static_cast<QXYChartSeries*>(series);
77
78 for (int i = 0 ; i < xyseries->count() ; i++) {
79 qreal x = xyseries->x(i);
80 qreal y = xyseries->y(i);
81 domain.m_minX = qMin(domain.m_minX,x);
82 domain.m_minY = qMin(domain.m_minY,y);
83 domain.m_maxX = qMax(domain.m_maxX,x);
84 domain.m_maxY = qMax(domain.m_maxY,y);
85 }
86
87 //XYLineChartItem* item = new XYLineChartItem(xyseries,0,this);
88
89 //m_chartItems << item;
90 // TODO:
91 //m_chartTheme->addObserver(xyseries);
92
93 break;
94 }
95 case QChartSeries::SeriesTypeBar: {
96
97 qDebug() << "barSeries added";
98 BarChartSeries* barSeries = static_cast<BarChartSeries*>(series);
99 BarGroup* barGroup = new BarGroup(*barSeries,this);
100
101 // Add some fugly colors for 5 fist series...
102 barGroup->addColor(QColor(255,0,0,128));
103 barGroup->addColor(QColor(255,255,0,128));
104 barGroup->addColor(QColor(0,255,0,128));
105 barGroup->addColor(QColor(0,0,255,128));
106 barGroup->addColor(QColor(255,128,0,128));
107
108 m_chartItems << barGroup;
109 childItems().append(barGroup);
110
111 qreal x = barSeries->countColumns();
112 qreal y = barSeries->max();
113 domain.m_minX = qMin(domain.m_minX,x);
114 domain.m_minY = qMin(domain.m_minY,y);
115 domain.m_maxX = qMax(domain.m_maxX,x);
116 domain.m_maxY = qMax(domain.m_maxY,y);
117 m_axisXItem->setVisible(false);
118 break;
119 }
120 case QChartSeries::SeriesTypeStackedBar: {
121
122 qDebug() << "barSeries added";
123 StackedBarChartSeries* stackedBarSeries = static_cast<StackedBarChartSeries*>(series);
124 StackedBarGroup* stackedBarGroup = new StackedBarGroup(*stackedBarSeries,this);
125
126 // Add some fugly colors for 5 fist series...
127 stackedBarGroup->addColor(QColor(255,0,0,128));
128 stackedBarGroup->addColor(QColor(255,255,0,128));
129 stackedBarGroup->addColor(QColor(0,255,0,128));
130 stackedBarGroup->addColor(QColor(0,0,255,128));
131 stackedBarGroup->addColor(QColor(255,128,0,128));
132
133 m_chartItems << stackedBarGroup;
134 childItems().append(stackedBarGroup);
135
136 qreal x = stackedBarSeries->countColumns();
137 qreal y = stackedBarSeries->maxColumnSum();
138 domain.m_minX = qMin(domain.m_minX,x);
139 domain.m_minY = qMin(domain.m_minY,y);
140 domain.m_maxX = qMax(domain.m_maxX,x);
141 domain.m_maxY = qMax(domain.m_maxY,y);
142 m_axisXItem->setVisible(false);
143 break;
144 }
145 case QChartSeries::SeriesTypePercentBar: {
146
147 qDebug() << "barSeries added";
148 PercentBarChartSeries* percentBarSeries = static_cast<PercentBarChartSeries*>(series);
149 PercentBarGroup* percentBarGroup = new PercentBarGroup(*percentBarSeries,this);
150
151 // Add some fugly colors for 5 fist series...
152 percentBarGroup->addColor(QColor(255,0,0,128));
153 percentBarGroup->addColor(QColor(255,255,0,128));
154 percentBarGroup->addColor(QColor(0,255,0,128));
155 percentBarGroup->addColor(QColor(0,0,255,128));
156 percentBarGroup->addColor(QColor(255,128,0,128));
157
158 m_chartItems << percentBarGroup;
159 childItems().append(percentBarGroup);
160
161 qreal x = percentBarSeries->countColumns();
162 domain.m_minX = qMin(domain.m_minX,x);
163 domain.m_minY = 0;
164 domain.m_maxX = qMax(domain.m_maxX,x);
165 domain.m_maxY = 100;
166 m_axisXItem->setVisible(false);
167 break;
168 }
169 case QChartSeries::SeriesTypeScatter: {
170 QScatterSeries *scatterSeries = qobject_cast<QScatterSeries *>(series);
171 scatterSeries->d->m_theme = m_chartTheme->themeForSeries();
172 scatterSeries->d->setParentItem(this);
173 scatterSeries->d->m_boundingRect = m_rect.adjusted(margin(),margin(), -margin(), -margin());
174 m_chartItems << scatterSeries->d;
175 m_chartTheme->addObserver(scatterSeries->d);
176
177 foreach (qreal x, scatterSeries->d->m_x) {
178 domain.m_minX = qMin(domain.m_minX, x);
179 domain.m_maxX = qMax(domain.m_maxX, x);
180 }
181 foreach (qreal y, scatterSeries->d->m_y) {
182 domain.m_minY = qMin(domain.m_minY, y);
183 domain.m_maxY = qMax(domain.m_maxY, y);
184 }
185
186 break;
187 }
188 case QChartSeries::SeriesTypePie: {
189 QPieSeries *pieSeries = qobject_cast<QPieSeries *>(series);
190 pieSeries->d->setParentItem(this);
191 m_chartItems << pieSeries->d;
192 pieSeries->d->m_chartTheme = m_chartTheme;
193 m_chartTheme->addObserver(pieSeries->d);
194 break;
195 }
196 default:
197 break;
198 }
199
200 // Update all the items to match the new visible area of the chart
201 foreach(ChartItem* i, m_chartItems)
202 i->setPlotDomain(m_plotDomainList.at(m_plotDataIndex));
54 m_dataset->addSeries(series);
203 55 }
204 56
205 57 QChartSeries* QChart::createSeries(QChartSeries::QChartSeriesType type)
@@ -275,12 +127,12 void QChart::setTitle(const QString& title,const QFont& font)
275 127
276 128 int QChart::margin() const
277 129 {
278 return m_marginSize;
130 m_presenter->margin();
279 131 }
280 132
281 133 void QChart::setMargin(int margin)
282 134 {
283 m_marginSize = margin;
135 m_presenter->setMargin(margin);
284 136 }
285 137
286 138 void QChart::setTheme(QChart::ChartThemeId theme)
@@ -315,61 +167,22 QChart::ChartThemeId QChart::theme()
315 167
316 168 void QChart::zoomInToRect(const QRectF& rectangle)
317 169 {
318
319 if(!rectangle.isValid()) return;
320
321 qreal margin = this->margin();
322
323 QRectF rect = rectangle.normalized();
324 rect.translate(-margin, -margin);
325
326 PlotDomain& oldDomain = m_plotDomainList[m_plotDataIndex];
327
328 PlotDomain domain = oldDomain.subDomain(rect,m_rect.width() - 2 * margin,m_rect.height() - 2 * margin);
329
330 m_plotDomainList.resize(m_plotDataIndex + 1);
331 m_plotDomainList<<domain;
332 m_plotDataIndex++;
333
334 foreach (ChartItem* item, m_chartItems)
335 item->setPlotDomain(m_plotDomainList[m_plotDataIndex]);
336 update();
170 m_presenter->zoomInToRect(rectangle);
337 171 }
338 172
339 173 void QChart::zoomIn()
340 174 {
341 if (m_plotDataIndex < m_plotDomainList.count() - 1) {
342 m_plotDataIndex++;
343 foreach (ChartItem* item, m_chartItems)
344 item->setPlotDomain(m_plotDomainList[m_plotDataIndex]);
345 update();
346 } else {
347 QRectF rect = m_rect.adjusted(margin(),margin(), -margin(), -margin());
348 rect.setWidth(rect.width()/2);
349 rect.setHeight(rect.height()/2);
350 rect.moveCenter(m_rect.center());
351 zoomInToRect(rect);
352 }
175 m_presenter->zoomIn();
353 176 }
354 177
355 178 void QChart::zoomOut()
356 179 {
357 if (m_plotDataIndex > 0) {
358 m_plotDataIndex--;
359 foreach (ChartItem* item, m_chartItems)
360 item->setPlotDomain(m_plotDomainList[m_plotDataIndex]);
361 update();
362 }
180 m_presenter->zoomOut();
363 181 }
364 182
365 183 void QChart::zoomReset()
366 184 {
367 if (m_plotDataIndex > 0) {
368 m_plotDataIndex = 0;
369 foreach (ChartItem* item, m_chartItems)
370 item->setPlotDomain(m_plotDomainList[m_plotDataIndex]);
371 update();
372 }
185 m_presenter->zoomReset();
373 186 }
374 187
375 188 void QChart::setAxisX(const QChartAxis& axis)
@@ -408,12 +221,6 void QChart::resizeEvent(QGraphicsSceneResizeEvent *event)
408 221 m_backgroundItem->setRect(rect);
409 222 }
410 223
411 // resize and reposition childs
412 foreach (ChartItem *item, m_chartItems) {
413 item->setPos(rect.topLeft());
414 item->setSize(rect.size());
415 }
416
417 224 QGraphicsWidget::resizeEvent(event);
418 225 update();
419 226 }
@@ -33,10 +33,6 class QTCOMMERCIALCHART_EXPORT QChart : public QGraphicsWidget
33 33 {
34 34 Q_OBJECT
35 35 public:
36 enum GradientOrientation {
37 HorizonatlGradientOrientation,
38 VerticalGradientOrientation
39 };
40 36 enum ChartThemeId {
41 37 ChartThemeInvalid = -1,
42 38 /*! The default theme follows the GUI style of the Operating System */
@@ -85,7 +81,6 private:
85 81 private:
86 82 Q_DISABLE_COPY(QChart)
87 83 QGraphicsRectItem* m_backgroundItem;
88 GradientOrientation m_bacgroundOrinetation;
89 84 QGraphicsTextItem* m_titleItem;
90 85 AxisItem* m_axisXItem;
91 86 QList<AxisItem*> m_axisYItem;
@@ -94,7 +89,6 private:
94 89 QList<ChartItem *> m_chartItems;
95 90 QVector<PlotDomain> m_plotDomainList;
96 91 int m_plotDataIndex;
97 int m_marginSize;
98 92 ChartTheme *m_chartTheme;
99 93
100 94
@@ -13,7 +13,6 m_dirtyData(false),
13 13 m_dirtyGeometry(false),
14 14 m_dirtyDomain(false)
15 15 {
16 QObject::connect(series,SIGNAL(changed(int)),this,SLOT(handleSeriesChanged(int)));
17 16 }
18 17
19 18 QRectF XYLineChartItem::boundingRect() const
@@ -26,23 +25,6 QPainterPath XYLineChartItem::shape() const
26 25 return m_path;
27 26 }
28 27
29 void XYLineChartItem::setSize(const QSizeF& size)
30 {
31 m_size=size;
32 m_dirtyGeometry=true;
33 }
34
35 void XYLineChartItem::setDomain(const Domain& domain)
36 {
37 m_domain=domain;
38 m_dirtyDomain=true;
39 }
40
41 void XYLineChartItem::setSeries(QXYChartSeries* series)
42 {
43 m_series = series;
44 m_dirtyData=true;
45 }
46 28
47 29 void XYLineChartItem::addPoints(const QVector<QPointF>& points)
48 30 {
@@ -112,21 +94,11 void XYLineChartItem::clearView()
112 94 m_data.clear();
113 95 }
114 96
115 void XYLineChartItem::handleSeriesChanged(int index)
116 {
117 Q_ASSERT(index<m_series->count());
118 if(m_hash.contains(index)){
119 int i = m_hash.value(index);
120 QPointF point;
121 calculatePoint(point,index,m_series,m_size,m_domain);
122 setPoint(i,point);
123 }
124 }
125
126 97 void XYLineChartItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
127 98 {
128 99 Q_UNUSED(widget);
129 100 Q_UNUSED(option);
101 painter->setPen(m_pen);
130 102 painter->drawPath(m_path);
131 103 }
132 104
@@ -161,7 +133,6 void XYLineChartItem::updateDomain()
161 133 clear();
162 134 calculatePoints(m_data,m_hash,m_series,m_size, m_domain);
163 135 addPoints(m_data);
164 m_dirtyGeometry = true;
165 136 }
166 137
167 138 void XYLineChartItem::updateData()
@@ -188,26 +159,44 void XYLineChartItem::updateGeometry()
188 159 m_rect = path.boundingRect();
189 160 }
190 161
191 void XYLineChartItem::updateItem()
162 void XYLineChartItem::setPen(const QPen& pen)
192 163 {
193 if(m_dirtyDomain) {
194 updateDomain();
195 m_dirtyData = false;
196 }
164 m_pen = pen;
165 }
197 166
198 if(m_dirtyData) {
199 updateData();
200 m_dirtyData = false;
201 }
167 //handlers
202 168
203 if(m_dirtyGeometry) {
204 updateGeometry();
205 m_dirtyGeometry = false;
169 void XYLineChartItem::handleModelChanged(int index)
170 {
171 Q_ASSERT(index<m_series->count());
172 if(m_hash.contains(index)){
173 int i = m_hash.value(index);
174 QPointF point;
175 calculatePoint(point,index,m_series,m_size,m_domain);
176 setPoint(i,point);
206 177 }
178 update();
179 }
207 180
181 void XYLineChartItem::handleDomainChanged(const Domain& domain)
182 {
183 m_domain = domain;
184 updateDomain();
208 185 update();
209 186 }
210 187
188 void XYLineChartItem::handleGeometryChanged(const QRectF& rect)
189 {
190 Q_ASSERT(rect.isValid());
191
192 m_size=rect.size();
193 updateDomain();
194 updateGeometry();
195 setPos(rect.topLeft());
196 update();
197 }
198
199
211 200 #include "moc_xylinechartitem_p.cpp"
212 201
213 202 QTCOMMERCIALCHART_END_NAMESPACE
@@ -3,6 +3,7
3 3
4 4 #include "qchartglobal.h"
5 5 #include "chartitem_p.h"
6 #include <QPen>
6 7
7 8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8 9
@@ -21,15 +22,16 public:
21 22 QRectF boundingRect() const;
22 23 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
23 24 QPainterPath shape() const;
25
26
27 void setPen(const QPen& pen);
28
24 29 //from ChartItem
25 void setSize(const QSizeF& size);
30 void setSize(const QSizeF& size){};
26 31 void setPlotDomain(const PlotDomain& data){};
27 void setDomain(const Domain& data);
28 void setSeries(QXYChartSeries* series);
29 const Domain& domain() const { return m_domain;}
30 //ChartAnimationManager* animationManager();
31 32
32 void updateItem();
33
34 const Domain& domain() const { return m_domain;}
33 35
34 36 virtual void addPoint(const QPointF& );
35 37 virtual void addPoints(const QVector<QPointF>& points);
@@ -50,8 +52,10 protected:
50 52 void calculatePoint(QPointF& point, int index, const QXYChartSeries* series,const QSizeF& size, const Domain& domain) const;
51 53 void calculatePoints(QVector<QPointF>& points,QHash<int,int>& hash,const QXYChartSeries* series, const QSizeF& size, const Domain& domain) const;
52 54
53 private slots:
54 void handleSeriesChanged(int index);
55 protected slots:
56 void handleModelChanged(int index);
57 void handleDomainChanged(const Domain& domain);
58 void handleGeometryChanged(const QRectF& size);
55 59
56 60 private:
57 61 ChartPresenter* m_presenter;
@@ -63,6 +67,7 private:
63 67 QVector<QPointF> m_data;
64 68 QHash<int,int> m_hash;
65 69 QXYChartSeries* m_series;
70 QPen m_pen;
66 71 bool m_dirtyData;
67 72 bool m_dirtyGeometry;
68 73 bool m_dirtyDomain;
General Comments 0
You need to be logged in to leave comments. Login now