##// END OF EJS Templates
Marek Rosa -
r207:1bc0eafcd96e merge
parent child
Show More
@@ -0,0 +1,18
1 #include <QtGui/QApplication>
2 #include <QMainWindow>
3 #include "multichartwidget.h"
4
5 int main(int argc, char *argv[])
6 {
7 QApplication a(argc, argv);
8
9 MultiChartWidget *multi = new MultiChartWidget();
10
11 // Use the chart widget as the central widget
12 QMainWindow w;
13 w.resize(640, 480);
14 w.setCentralWidget(multi);
15 w.show();
16
17 return a.exec();
18 }
@@ -0,0 +1,21
1 !include( ../../common.pri ) {
2 error( "Couldn't find the common.pri file!" )
3 }
4 !include( ../../integrated.pri ) {
5 error( "Couldn't find the integrated.pri file !")
6 }
7
8 QT += core gui
9
10 TARGET = multichart
11 TEMPLATE = app
12
13 SOURCES += main.cpp \
14 multichartwidget.cpp
15
16 HEADERS += \
17 multichartwidget.h
18
19
20
21
@@ -0,0 +1,35
1 #include "multichartwidget.h"
2 #include <QVBoxLayout>
3 #include <qchartglobal.h>
4 #include <qchartview.h>
5 #include <qscatterseries.h>
6 #include <qpieseries.h>
7
8 QTCOMMERCIALCHART_USE_NAMESPACE
9
10 MultiChartWidget::MultiChartWidget(QWidget *parent) :
11 QWidget(parent)
12 {
13 QVBoxLayout *l = new QVBoxLayout(this);
14
15 // Create chart 1 and add a simple pie series onto it
16 QChartView *chartView1 = new QChartView();
17 l->addWidget(chartView1);
18 QPieSeries *pie = new QPieSeries();
19 pie->add(1.1, "label1");
20 pie->add(1.2, "label2");
21 chartView1->addSeries(pie);
22
23 // Create chart 2 and add a simple scatter series onto it
24 QChartView *chartView2 = new QChartView();
25 l->addWidget(chartView2);
26 QScatterSeries *scatter = new QScatterSeries();
27 *scatter << QPointF(0.5, 5.0)
28 << QPointF(1.0, 4.5)
29 << QPointF(1.0, 5.5)
30 << QPointF(1.5, 5.0)
31 << QPointF(2.0, 4.5)
32 << QPointF(2.0, 5.5)
33 << QPointF(2.5, 5.0);
34 chartView2->addSeries(scatter);
35 }
@@ -0,0 +1,18
1 #ifndef MULTICHARTWIDGET_H
2 #define MULTICHARTWIDGET_H
3
4 #include <QWidget>
5
6 class MultiChartWidget : public QWidget
7 {
8 Q_OBJECT
9 public:
10 explicit MultiChartWidget(QWidget *parent = 0);
11
12 signals:
13
14 public slots:
15
16 };
17
18 #endif // MULTICHARTWIDGET_H
@@ -0,0 +1,20
1 #include "customslice.h"
2
3 CustomSlice::CustomSlice(qreal value, QObject* parent)
4 :QPieSlice(parent)
5 {
6 setValue(value);
7 connect(this, SIGNAL(changed()), this, SLOT(updateLabel()));
8 connect(this, SIGNAL(hoverEnter()), this, SLOT(toggleExploded()));
9 connect(this, SIGNAL(hoverLeave()), this, SLOT(toggleExploded()));
10 }
11
12 void CustomSlice::updateLabel()
13 {
14 setLabel(QString::number(this->percentage()));
15 }
16
17 void CustomSlice::toggleExploded()
18 {
19 setExploded(!isExploded());
20 }
@@ -0,0 +1,15
1 #include <qpieslice.h>
2
3 QTCOMMERCIALCHART_USE_NAMESPACE
4
5 class CustomSlice : public QPieSlice
6 {
7 Q_OBJECT
8
9 public:
10 CustomSlice(qreal value, QObject* parent = 0);
11
12 public Q_SLOTS:
13 void updateLabel();
14 void toggleExploded();
15 };
@@ -0,0 +1,69
1 #include "declarativescatterseries.h"
2 #include "declarativechart.h"
3 #include "qchart.h"
4 #include "qscatterseries.h"
5 #include <cmath>
6
7 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8
9 DeclarativeScatterSeries::DeclarativeScatterSeries(QDeclarativeItem *parent) :
10 QDeclarativeItem(parent),
11 m_chart(0),
12 m_series(0)
13 {
14 setFlag(QGraphicsItem::ItemHasNoContents, false);
15 connect(this, SIGNAL(parentChanged()),
16 this, SLOT(setParentForSeries()));
17 }
18
19 void DeclarativeScatterSeries::setParentForSeries()
20 {
21 if (!m_series)
22 initSeries();
23 }
24
25 void DeclarativeScatterSeries::initSeries()
26 {
27 Q_ASSERT(!m_series);
28 DeclarativeChart *declarativeChart = qobject_cast<DeclarativeChart *>(parent());
29
30 if (declarativeChart) {
31 QChart *chart = qobject_cast<QChart *>(declarativeChart->m_chart);
32 qDebug() << "creating scatter series for chart: " << chart;
33 Q_ASSERT(chart);
34
35 m_series = new QScatterSeries();
36 Q_ASSERT(m_series);
37 for (int i(0); i < m_data.count(); i++) {
38 ScatterElement *element = m_data.at(i);
39 *m_series << QPointF(element->x(), element->y());
40 }
41 chart->addSeries(m_series);
42 }
43 }
44
45 QDeclarativeListProperty<ScatterElement> DeclarativeScatterSeries::data()
46 {
47 return QDeclarativeListProperty<ScatterElement>(this, 0,
48 &DeclarativeScatterSeries::appendData);
49 }
50
51 void DeclarativeScatterSeries::appendData(QDeclarativeListProperty<ScatterElement> *list,
52 ScatterElement *element)
53 {
54 DeclarativeScatterSeries *series = qobject_cast<DeclarativeScatterSeries *>(list->object);
55 qDebug() << "appendData: " << series;
56 qDebug() << "appendData: " << element;
57 qDebug() << "appendData: " << element->x();
58 qDebug() << "appendData: " << element->y();
59 qDebug() << "appendData: " << series->m_series;
60 if (series) {
61 series->m_data.append(element);
62 if (series->m_series)
63 series->m_series->addData(QPointF(element->x(), element->y()));
64 }
65 }
66
67 #include "moc_declarativescatterseries.cpp"
68
69 QTCOMMERCIALCHART_END_NAMESPACE
@@ -0,0 +1,42
1 #ifndef DECLARATIVESCATTERSERIES_H
2 #define DECLARATIVESCATTERSERIES_H
3
4 #include "qchartglobal.h"
5 #include "scatterelement.h"
6 #include <QDeclarativeItem>
7
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9
10 class QChart;
11 class QScatterSeries;
12
13 class DeclarativeScatterSeries : public QDeclarativeItem
14 {
15 Q_OBJECT
16 Q_PROPERTY(QDeclarativeListProperty<ScatterElement> data READ data)
17
18 public:
19 explicit DeclarativeScatterSeries(QDeclarativeItem *parent = 0);
20 QDeclarativeListProperty<ScatterElement> data();
21
22 signals:
23
24 public slots:
25 static void appendData(QDeclarativeListProperty<ScatterElement> *list,
26 ScatterElement *element);
27 // void append(ScatterElement element);
28
29 private slots:
30 void setParentForSeries();
31
32 public:
33 void initSeries();
34
35 QChart *m_chart;
36 QScatterSeries *m_series;
37 QList<ScatterElement *> m_data;
38 };
39
40 QTCOMMERCIALCHART_END_NAMESPACE
41
42 #endif // DECLARATIVESCATTERSERIES_H
@@ -0,0 +1,12
1 #include "scatterelement.h"
2
3 QTCOMMERCIALCHART_BEGIN_NAMESPACE
4
5 ScatterElement::ScatterElement(QObject *parent) :
6 QObject(parent)
7 {
8 }
9
10 #include "moc_scatterelement.cpp"
11
12 QTCOMMERCIALCHART_END_NAMESPACE
@@ -0,0 +1,30
1 #ifndef SCATTERELEMENT_H
2 #define SCATTERELEMENT_H
3
4 #include "qchartglobal.h"
5 #include <QObject>
6
7 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8
9 class ScatterElement : public QObject
10 {
11 Q_OBJECT
12 Q_PROPERTY(qreal x READ x WRITE setX /*NOTIFY dataXChanged*/)
13 Q_PROPERTY(qreal y READ y WRITE setY /*NOTIFY dataYChanged*/)
14
15 public:
16 explicit ScatterElement(QObject *parent = 0);
17
18 void setX(qreal x) {m_x = x;}
19 qreal x() {return m_x;}
20 void setY(qreal y) {m_y = y;}
21 qreal y() {return m_y;}
22
23 public:
24 qreal m_x;
25 qreal m_y;
26 };
27
28 QTCOMMERCIALCHART_END_NAMESPACE
29
30 #endif // SCATTERELEMENT_H
@@ -0,0 +1,181
1 #include "qpieslice.h"
2
3 QTCOMMERCIALCHART_BEGIN_NAMESPACE
4
5 #define DEFAULT_PEN_COLOR Qt::black
6 #define DEFAULT_BRUSH_COLOR Qt::white
7 #define DEFAULT_LABEL_ARM_LENGTH 50
8
9 QPieSlice::QPieSlice(QObject *parent)
10 :QObject(parent),
11 m_value(0),
12 m_isLabelVisible(true),
13 m_isExploded(false),
14 m_percentage(0),
15 m_angle(0),
16 m_span(0),
17 m_pen(DEFAULT_PEN_COLOR),
18 m_brush(DEFAULT_BRUSH_COLOR),
19 m_labelPen(DEFAULT_PEN_COLOR),
20 m_labelArmLength(DEFAULT_LABEL_ARM_LENGTH)
21 {
22
23 }
24
25 QPieSlice::QPieSlice(qreal value, QString label, bool labelVisible, QObject *parent)
26 :QObject(parent),
27 m_value(value),
28 m_label(label),
29 m_isLabelVisible(labelVisible),
30 m_isExploded(false),
31 m_percentage(0),
32 m_angle(0),
33 m_span(0),
34 m_pen(DEFAULT_PEN_COLOR),
35 m_brush(DEFAULT_BRUSH_COLOR),
36 m_labelPen(DEFAULT_PEN_COLOR),
37 m_labelArmLength(DEFAULT_LABEL_ARM_LENGTH)
38 {
39
40 }
41
42 QPieSlice::~QPieSlice()
43 {
44
45 }
46
47 qreal QPieSlice::value() const
48 {
49 return m_value;
50 }
51
52 QString QPieSlice::label() const
53 {
54 return m_label;
55 }
56
57 bool QPieSlice::isLabelVisible() const
58 {
59 return m_isLabelVisible;
60 }
61
62 bool QPieSlice::isExploded() const
63 {
64 return m_isExploded;
65 }
66
67 qreal QPieSlice::percentage() const
68 {
69 return m_percentage;
70 }
71
72 qreal QPieSlice::angle() const
73 {
74 return m_angle;
75 }
76
77 qreal QPieSlice::span() const
78 {
79 return m_span;
80 }
81
82 QPen QPieSlice::pen() const
83 {
84 return m_pen;
85 }
86
87 QBrush QPieSlice::brush() const
88 {
89 return m_brush;
90 }
91
92 QPen QPieSlice::labelPen() const
93 {
94 return m_labelPen;
95 }
96
97 QFont QPieSlice::labelFont() const
98 {
99 return m_labelFont;
100 }
101
102 qreal QPieSlice::labelArmLenght() const
103 {
104 return m_labelArmLength;
105 }
106
107 void QPieSlice::setValue(qreal value)
108 {
109 if (m_value != value) {
110 m_value = value;
111 emit changed();
112 }
113 }
114
115 void QPieSlice::setLabel(QString label)
116 {
117 if (m_label != label) {
118 m_label = label;
119 emit changed();
120 }
121 }
122
123 void QPieSlice::setLabelVisible(bool visible)
124 {
125 if (m_isLabelVisible != visible) {
126 m_isLabelVisible = visible;
127 emit changed();
128 }
129 }
130
131 void QPieSlice::setExploded(bool exploded)
132 {
133 if (m_isExploded != exploded) {
134 m_isExploded = exploded;
135 emit changed();
136 }
137 }
138
139 void QPieSlice::setPen(QPen pen)
140 {
141 if (m_pen != pen) {
142 m_pen = pen;
143 emit changed();
144 }
145 }
146
147 void QPieSlice::setBrush(QBrush brush)
148 {
149 if (m_brush != brush) {
150 m_brush = brush;
151 emit changed();
152 }
153 }
154
155 void QPieSlice::setLabelFont(QFont font)
156 {
157 if (m_labelFont != font) {
158 m_labelFont = font;
159 emit changed();
160 }
161 }
162
163 void QPieSlice::setLabelPen(QPen pen)
164 {
165 if (m_labelPen != pen) {
166 m_labelPen = pen;
167 emit changed();
168 }
169 }
170
171 void QPieSlice::setLabelArmLength(qreal len)
172 {
173 if (m_labelArmLength != len) {
174 m_labelArmLength = len;
175 emit changed();
176 }
177 }
178
179 #include "moc_qpieslice.cpp"
180
181 QTCOMMERCIALCHART_END_NAMESPACE
@@ -0,0 +1,86
1 #ifndef QPIESLICE_H
2 #define QPIESLICE_H
3
4 #include <qchartglobal.h>
5 #include <QObject>
6 #include <QPen>
7 #include <QBrush>
8 #include <QFont>
9
10 QTCOMMERCIALCHART_BEGIN_NAMESPACE
11
12 class QTCOMMERCIALCHART_EXPORT QPieSlice : public QObject
13 {
14 Q_OBJECT
15
16 public:
17 QPieSlice(QObject *parent = 0);
18 QPieSlice(qreal value, QString label, bool labelVisible = true, QObject *parent = 0);
19 virtual ~QPieSlice();
20
21 // data
22 qreal value() const;
23 QString label() const;
24 bool isLabelVisible() const;
25 bool isExploded() const;
26
27 // generated data
28 qreal percentage() const;
29 qreal angle() const;
30 qreal span() const;
31
32 // customization
33 QPen pen() const;
34 QBrush brush() const;
35 QPen labelPen() const;
36 QFont labelFont() const;
37 qreal labelArmLenght() const;
38
39 Q_SIGNALS:
40 void clicked();
41 void hoverEnter();
42 void hoverLeave();
43 void changed();
44
45 public Q_SLOTS:
46
47 // data
48 void setLabel(QString label);
49 void setLabelVisible(bool visible);
50 void setValue(qreal value);
51 void setExploded(bool exploded);
52
53 // customization
54 void setPen(QPen pen);
55 void setBrush(QBrush brush);
56 void setLabelFont(QFont font);
57 void setLabelPen(QPen pen);
58 void setLabelArmLength(qreal len);
59
60 private:
61
62 // TODO: use private class
63 friend class QPieSeries;
64
65 // data
66 qreal m_value;
67 QString m_label;
68 bool m_isLabelVisible;
69 bool m_isExploded;
70
71 // generated data
72 qreal m_percentage;
73 qreal m_angle;
74 qreal m_span;
75
76 // customization
77 QPen m_pen;
78 QBrush m_brush;
79 QPen m_labelPen;
80 QFont m_labelFont;
81 qreal m_labelArmLength;
82 };
83
84 QTCOMMERCIALCHART_END_NAMESPACE
85
86 #endif // QPIESLICE_H
@@ -0,0 +1,13
1 INCLUDEPATH += $$PWD
2 DEPENDPATH += $$PWD
3
4 SOURCES += \
5 $$PWD/qscatterseries.cpp \
6 $$PWD/scatterpresenter.cpp
7
8 PRIVATE_HEADERS += \
9 $$PWD/scatterpresenter_p.h \
10 $$PWD/scatterseries_p.h
11
12 PUBLIC_HEADERS += \
13 $$PWD/qscatterseries.h
@@ -1,15 +1,22
1 !include(common.pri) {
1 !include(common.pri) {
2 error('missing common.pri')
2 error('missing common.pri')
3 }
3 }
4
4
5 TEMPLATE = subdirs
5 TEMPLATE = subdirs
6 SUBDIRS += src qmlplugin example test
6 SUBDIRS += src example test qmlplugin
7
8 integrated_build:{
9 message('Configured for integrated build')
10 } else {
11 message('Please build example test and qmlplugin after installing library.')
12 }
13
7 CONFIG += ordered
14 CONFIG += ordered
8 QMAKE_CXXFLAGS += -g -Wall
15 QMAKE_CXXFLAGS += -g -Wall
9 unix:QMAKE_DISTCLEAN += -r build bin
16 unix:QMAKE_DISTCLEAN += -r build bin
10 win32:QMAKE_DISTCLEAN += /Q build bin
17 win32:QMAKE_DISTCLEAN += /Q build bin
11
18
12 # install feature file
19 # install feature file
13 feature.path = $$[QT_INSTALL_DATA]/mkspecs/features
20 feature.path = $$[QT_INSTALL_DATA]/mkspecs/features
14 feature.files = $$PWD/features/qtcommercialchart.prf
21 feature.files = $$PWD/features/qtcommercialchart.prf
15 INSTALLS += feature
22 INSTALLS += feature
@@ -1,23 +1,25
1 CONFIG+=integrated_build #remove if you want to build against installed libs
1 CONFIG+=integrated_build #remove if you want to build against installed libs
2
2
3 CHART_BUILD_HEADER_DIR = $$PWD/include
3 CHART_BUILD_PUBLIC_HEADER_DIR = $$PWD/include
4 CHART_BUILD_PRIVATE_HEADER_DIR = $$CHART_BUILD_PUBLIC_HEADER_DIR/private
4 CHART_BUILD_LIB_DIR = $$PWD/lib
5 CHART_BUILD_LIB_DIR = $$PWD/lib
5 CHART_BUILD_DIR = $$PWD/build
6 CHART_BUILD_DIR = $$PWD/build
6 CHART_BUILD_BIN_DIR = $$PWD/bin
7 CHART_BUILD_BIN_DIR = $$PWD/bin
7
8
8 # hack to fix windows builds
9 # hack to fix windows builds
9 win32:{
10 win32:{
10 CHART_BUILD_HEADER_DIR = $$replace(CHART_BUILD_HEADER_DIR, "/","\\")
11 CHART_BUILD_PUBLIC_HEADER_DIR = $$replace(CHART_BUILD_PUBLIC_HEADER_DIR, "/","\\")
12 CHART_BUILD_PRIVATE_HEADER_DIR = $$replace(CHART_BUILD_PRIVATE_HEADER_DIR, "/","\\")
11 CHART_BUILD_LIB_DIR = $$replace(CHART_BUILD_LIB_DIR, "/","\\")
13 CHART_BUILD_LIB_DIR = $$replace(CHART_BUILD_LIB_DIR, "/","\\")
12 CHART_BUILD_BUILD_DIR = $$replace(CHART_BUILD_BUILD_DIR, "/","\\")
14 CHART_BUILD_BUILD_DIR = $$replace(CHART_BUILD_BUILD_DIR, "/","\\")
13 CHART_BUILD_BIN_DIR = $$replace(CHART_BUILD_BIN_DIR, "/","\\")
15 CHART_BUILD_BIN_DIR = $$replace(CHART_BUILD_BIN_DIR, "/","\\")
14 }
16 }
15
17
16 mac: {
18 mac: {
17 # TODO: The following qmake flags are a work-around to make QtCommercial Charts compile on
19 # TODO: The following qmake flags are a work-around to make QtCommercial Charts compile on
18 # QtCommercial 4.8. On the other hand Charts builds successfully with Qt open source 4.8
20 # QtCommercial 4.8. On the other hand Charts builds successfully with Qt open source 4.8
19 # without these definitions, so this is probably a configuration issue on QtCommercial 4.8;
21 # without these definitions, so this is probably a configuration issue on QtCommercial 4.8;
20 # it should probably define the minimum OSX version to be 10.5...
22 # it should probably define the minimum OSX version to be 10.5...
21 QMAKE_CXXFLAGS *= -mmacosx-version-min=10.5
23 QMAKE_CXXFLAGS *= -mmacosx-version-min=10.5
22 QMAKE_LFLAGS *= -mmacosx-version-min=10.5
24 QMAKE_LFLAGS *= -mmacosx-version-min=10.5
23 }
25 }
@@ -1,12 +1,13
1 TEMPLATE = subdirs
1 TEMPLATE = subdirs
2 SUBDIRS += linechart \
2 SUBDIRS += linechart \
3 zoomlinechart \
3 zoomlinechart \
4 colorlinechart \
4 colorlinechart \
5 barchart \
5 barchart \
6 stackedbarchart \
6 stackedbarchart \
7 percentbarchart \
7 percentbarchart \
8 scatter \
8 scatter \
9 piechart \
9 piechart \
10 dynamiclinechart \
10 dynamiclinechart \
11 axischart\
11 axischart\
12 gdpbarchart
12 gdpbarchart\
13 multichart
@@ -1,33 +1,42
1 #include <QtGui/QApplication>
1 #include <QtGui/QApplication>
2 #include <QMainWindow>
2 #include <QMainWindow>
3 #include <cmath>
4 #include <qchartglobal.h>
3 #include <qchartglobal.h>
5 #include <qchartview.h>
4 #include <qchartview.h>
6 #include <qpieseries.h>
5 #include <qpieseries.h>
6 #include <qpieslice.h>
7 #include "customslice.h"
7
8
8 QTCOMMERCIALCHART_USE_NAMESPACE
9 QTCOMMERCIALCHART_USE_NAMESPACE
9
10
10 int main(int argc, char *argv[])
11 int main(int argc, char *argv[])
11 {
12 {
12 QApplication a(argc, argv);
13 QApplication a(argc, argv);
13
14
14 // Create widget and scatter series
15 QMainWindow window;
15 QChartView *chartWidget = new QChartView();
16
16 QPieSeries *series = qobject_cast<QPieSeries *>(chartWidget->createSeries(QChartSeries::SeriesTypePie));
17 QPieSeries *series = new QPieSeries();
17 Q_ASSERT(series);
18 series->add(5, "Slice 1");
18
19 series->add(2, "Slice 2");
19 // Add test data to the series
20 series->add(3, "Slice 3");
20 series->add(QPieSlice(1, "test1", true, true, QPen(Qt::red, 2), QBrush(Qt::red)));
21 series->add(4, "Slice 4");
21 series->add(QPieSlice(2, "test2"));
22 series->add(5, "Slice 5");
22 series->add(QPieSlice(3, "test3"));
23 series->add(6, "Slice 6");
23 series->add(QPieSlice(4, "test4"));
24 series->add(7, "Slice 7");
24 series->add(QPieSlice(5, "test5"));
25 series->add(new CustomSlice(8));
25
26 series->enableClickExplodes(true);
26 // Use the chart widget as the central widget
27 series->enableHoverHighlight(true);
27 QMainWindow w;
28
28 w.resize(640, 480);
29 foreach (QPieSlice*s, series->slices())
29 w.setCentralWidget(chartWidget);
30 qDebug() << s->angle() << s->span() << s->percentage();
30 w.show();
31
32 QChartView* chartView = new QChartView(&window);
33 chartView->addSeries(series);
34 chartView->setChartTitle("simple piechart");
35 chartView->setChartTheme(QChart::ChartThemeIcy);
36
37 window.setCentralWidget(chartView);
38 window.resize(600, 600);
39 window.show();
31
40
32 return a.exec();
41 return a.exec();
33 }
42 }
@@ -1,17 +1,19
1 !include( ../../common.pri ) {
1 !include( ../../common.pri ) {
2 error( "Couldn't find the common.pri file!" )
2 error( "Couldn't find the common.pri file!" )
3 }
3 }
4 !include( ../../integrated.pri ) {
4 !include( ../../integrated.pri ) {
5 error( "Couldn't find the integrated.pri file !")
5 error( "Couldn't find the integrated.pri file !")
6 }
6 }
7
7
8 QT += core gui
8 QT += core gui
9
9
10 TARGET = piechart
10 TARGET = piechart
11 TEMPLATE = app
11 TEMPLATE = app
12
12
13 SOURCES += main.cpp
13 SOURCES += main.cpp customslice.cpp
14 HEADERS += customslice.h
14
15
15 HEADERS +=
16 OBJECTS_DIR = tmp
17 MOC_DIR = tmp
16
18
17
19
@@ -1,39 +1,57
1 #include <QtGui/QApplication>
1 #include <QtGui/QApplication>
2 #include <QMainWindow>
2 #include <QMainWindow>
3 #include <cmath>
3 #include <cmath>
4 #include <qchartglobal.h>
4 #include <qchartglobal.h>
5 #include <qchartview.h>
5 #include <qchartview.h>
6 #include <qscatterseries.h>
6 #include <qscatterseries.h>
7
7
8 QTCOMMERCIALCHART_USE_NAMESPACE
8 QTCOMMERCIALCHART_USE_NAMESPACE
9
9
10 int main(int argc, char *argv[])
10 int main(int argc, char *argv[])
11 {
11 {
12 QApplication a(argc, argv);
12 QApplication a(argc, argv);
13
13
14 // Create chart widget
14 // Create chart widget
15 QChartView *chartWidget = new QChartView();
15 QChartView *chartWidget = new QChartView();
16
16
17 // Create scatter series with simple test data
17 // Add scatter series with simple test data
18 QScatterSeries *scatter = new QScatterSeries();
18 QScatterSeries *scatter = new QScatterSeries();
19 *scatter << QPointF(0.5, 2.0)
19 *scatter << QPointF(0.5, 5.0)
20 << QPointF(1.0, 2.5)
20 << QPointF(1.0, 4.5)
21 << QPointF(1.5, 2.0)
21 << QPointF(1.0, 5.5)
22 << QPointF(2.0, 2.5);
22 << QPointF(1.5, 5.0)
23 << QPointF(2.0, 4.5)
24 << QPointF(2.0, 5.5)
25 << QPointF(2.5, 5.0);
23 chartWidget->addSeries(scatter);
26 chartWidget->addSeries(scatter);
24
27
25 // Add another scatter series with more complex data with random component
28 // Add another scatter series
29 // - more data with random component
26 QScatterSeries *scatter2 = new QScatterSeries();
30 QScatterSeries *scatter2 = new QScatterSeries();
27 for (qreal i(0.0); i < 20; i += 0.5)
31 for (qreal i(0.0); i < 20; i += 0.05) {
28 (*scatter2) << QPointF(i + (qreal)(rand() % 100) / 100.0,
32 (*scatter2) << QPointF(i + (qreal)(rand() % 100) / 100.0,
29 i + (qreal)(rand() % 100) / 100.0);
33 i + (qreal)(rand() % 100) / 100.0);
34 }
30 chartWidget->addSeries(scatter2);
35 chartWidget->addSeries(scatter2);
36 // Custom pen and brush (not those defined by the chart theme)
37 // - uses opaque color
38 QColor color("#2685BF");
39 color.setAlpha(80);
40 QBrush brush(Qt::SolidPattern);
41 brush.setColor(color);
42 scatter2->setMarkerBrush(brush);
43 QPen pen;
44 pen.setColor(color);
45 pen.setWidth(2);
46 scatter2->setMarkerPen(pen);
47 // use a rectangle as the marker shape
48 scatter2->setMarkerShape(QScatterSeries::MarkerShapeRectangle);
31
49
32 // Use the chart widget as the central widget
50 // Use the chart widget as the central widget
33 QMainWindow w;
51 QMainWindow w;
34 w.resize(640, 480);
52 w.resize(640, 480);
35 w.setCentralWidget(chartWidget);
53 w.setCentralWidget(chartWidget);
36 w.show();
54 w.show();
37
55
38 return a.exec();
56 return a.exec();
39 }
57 }
@@ -1,49 +1,56
1 integrated_build:{
1 integrated_build:{
2 message('Internal build within charts core source tree')
2 message('Running integrated build against local libs...')
3 INCLUDEPATH += $$CHART_BUILD_HEADER_DIR
3 INCLUDEPATH += $$CHART_BUILD_PUBLIC_HEADER_DIR
4
4
5 !win32: {
5 !win32: {
6 LIBS += -L $$CHART_BUILD_LIB_DIR -Wl,-rpath,$$CHART_BUILD_LIB_DIR
6 LIBS += -L $$CHART_BUILD_LIB_DIR -Wl,-rpath,$$CHART_BUILD_LIB_DIR
7 }else{
7 }else{
8 LIBS += -L $$CHART_BUILD_LIB_DIR
8 win32-msvc*: {
9 # hack fix for error:
10 # "LINK : fatal error LNK1146: no argument specified with option '/LIBPATH:'"
11 QMAKE_LIBDIR += $$CHART_BUILD_LIB_DIR
12 }else{
13 LIBS += -L $$CHART_BUILD_LIB_DIR
14 }
9 }
15 }
10
16
11 DESTDIR = $$CHART_BUILD_BIN_DIR
17 DESTDIR = $$CHART_BUILD_BIN_DIR
12
18
13 CONFIG(debug, debug|release) {
19 CONFIG(debug, debug|release) {
14 LIBS += -lQtCommercialChartd
20 LIBS += -lQtCommercialChartd
15 #this is ugly hack to work around missing rpath, it simply copies lib
21 #this is ugly hack to work around missing rpath, it simply copies lib
16 win32:{
22 win32:{
17 copylib.target = $$CHART_BUILD_BIN_DIR/QtCommercialChartd.dll
23 copylib.target = $$CHART_BUILD_BIN_DIR/QtCommercialChartd.dll
18 copylib.commands = $$QMAKE_COPY $$CHART_BUILD_LIB_DIR\\QtCommercialChartd.dll $$CHART_BUILD_BIN_DIR
24 copylib.commands = $$QMAKE_COPY $$CHART_BUILD_LIB_DIR\\QtCommercialChartd.dll $$CHART_BUILD_BIN_DIR
19 copylib.depends = $$CHART_BUILD_LIB_DIR/QtCommercialChartd.dll
25 copylib.depends = $$CHART_BUILD_LIB_DIR/QtCommercialChartd.dll
20 PRE_TARGETDEPS += $$CHART_BUILD_BIN_DIR/QtCommercialChartd.dll
26 PRE_TARGETDEPS += $$CHART_BUILD_BIN_DIR/QtCommercialChartd.dll
21 QMAKE_EXTRA_TARGETS +=copylib
27 QMAKE_EXTRA_TARGETS +=copylib
22 }
28 }
23 } else {
29 } else {
24 LIBS += -lQtCommercialChart
30 LIBS += -lQtCommercialChart
25
31
26 #this is ugly hack to work around missing rpath, it simply copies lib
32 #this is ugly hack to work around missing rpath, it simply copies lib
27 win32: {
33 win32: {
28 copylib.target = $$CHART_BUILD_BIN_DIR/QtCommercialChart
34 copylib.target = $$CHART_BUILD_BIN_DIR/QtCommercialChart
29 copylib.commands = $$QMAKE_COPY $$CHART_BUILD_LIB_DIR\\QtCommercialChart.dll $$CHART_BUILD_BIN_DIR
35 copylib.commands = $$QMAKE_COPY $$CHART_BUILD_LIB_DIR\\QtCommercialChart.dll $$CHART_BUILD_BIN_DIR
30 copylib.depends = $$CHART_BUILD_LIB_DIR/QtCommercialChart.dll
36 copylib.depends = $$CHART_BUILD_LIB_DIR/QtCommercialChart.dll
31 PRE_TARGETDEPS += $$CHART_BUILD_BIN_DIR/QtCommercialChart
37 PRE_TARGETDEPS += $$CHART_BUILD_BIN_DIR/QtCommercialChart
32 QMAKE_EXTRA_TARGETS +=copylib
38 QMAKE_EXTRA_TARGETS +=copylib
33 }
39 }
34 }
40 }
35
41
36 mac: {
42 mac: {
37 # This is a hack to make binaries to use the internal version of the QtCommercial Charts library on OSX
43 # This is a hack to make binaries to use the internal version of the QtCommercial Charts library on OSX
38 QMAKE_POST_LINK += install_name_tool -change "libQtCommercialChartd.1.dylib" "@rpath/libQtCommercialChartd.dylib" $$CHART_BUILD_BIN_DIR/chartwidgettest.app/Contents/MacOS/chartwidgettest
44 QMAKE_POST_LINK += install_name_tool -change "libQtCommercialChartd.1.dylib" "@rpath/libQtCommercialChartd.dylib" $$CHART_BUILD_BIN_DIR/chartwidgettest.app/Contents/MacOS/chartwidgettest
39 QMAKE_POST_LINK += && install_name_tool -change "libQtCommercialChartd.1.dylib" "@rpath/libQtCommercialChartd.dylib" $$CHART_BUILD_BIN_DIR/barchart.app/Contents/MacOS/barchart
45 QMAKE_POST_LINK += && install_name_tool -change "libQtCommercialChartd.1.dylib" "@rpath/libQtCommercialChartd.dylib" $$CHART_BUILD_BIN_DIR/barchart.app/Contents/MacOS/barchart
40 QMAKE_POST_LINK += && install_name_tool -change "libQtCommercialChartd.1.dylib" "@rpath/libQtCommercialChartd.dylib" $$CHART_BUILD_BIN_DIR/colorlineChart.app/Contents/MacOS/colorlineChart
46 QMAKE_POST_LINK += && install_name_tool -change "libQtCommercialChartd.1.dylib" "@rpath/libQtCommercialChartd.dylib" $$CHART_BUILD_BIN_DIR/colorlineChart.app/Contents/MacOS/colorlineChart
41 QMAKE_POST_LINK += && install_name_tool -change "libQtCommercialChartd.1.dylib" "@rpath/libQtCommercialChartd.dylib" $$CHART_BUILD_BIN_DIR/lineChart.app/Contents/MacOS/lineChart
47 QMAKE_POST_LINK += && install_name_tool -change "libQtCommercialChartd.1.dylib" "@rpath/libQtCommercialChartd.dylib" $$CHART_BUILD_BIN_DIR/lineChart.app/Contents/MacOS/lineChart
42 QMAKE_POST_LINK += && install_name_tool -change "libQtCommercialChartd.1.dylib" "@rpath/libQtCommercialChartd.dylib" $$CHART_BUILD_BIN_DIR/percentbarchart.app/Contents/MacOS/percentbarchart
48 QMAKE_POST_LINK += && install_name_tool -change "libQtCommercialChartd.1.dylib" "@rpath/libQtCommercialChartd.dylib" $$CHART_BUILD_BIN_DIR/percentbarchart.app/Contents/MacOS/percentbarchart
43 QMAKE_POST_LINK += && install_name_tool -change "libQtCommercialChartd.1.dylib" "@rpath/libQtCommercialChartd.dylib" $$CHART_BUILD_BIN_DIR/stackedbarchart.app/Contents/MacOS/stackedbarchart
49 QMAKE_POST_LINK += && install_name_tool -change "libQtCommercialChartd.1.dylib" "@rpath/libQtCommercialChartd.dylib" $$CHART_BUILD_BIN_DIR/stackedbarchart.app/Contents/MacOS/stackedbarchart
44 QMAKE_POST_LINK += && install_name_tool -change "libQtCommercialChartd.1.dylib" "@rpath/libQtCommercialChartd.dylib" $$CHART_BUILD_BIN_DIR/zoomLineChart.app/Contents/MacOS/zoomLineChart
50 QMAKE_POST_LINK += && install_name_tool -change "libQtCommercialChartd.1.dylib" "@rpath/libQtCommercialChartd.dylib" $$CHART_BUILD_BIN_DIR/zoomLineChart.app/Contents/MacOS/zoomLineChart
45 }
51 }
46
52
47 } else {
53 } else {
54 message('Running build aginst system libs...')
48 CONFIG+=qtcommercialchart
55 CONFIG+=qtcommercialchart
49 }
56 }
@@ -1,27 +1,39
1 #include "declarativechart.h"
1 #include "declarativechart.h"
2
2
3 QTCOMMERCIALCHART_BEGIN_NAMESPACE
3 QTCOMMERCIALCHART_BEGIN_NAMESPACE
4
4
5 DeclarativeChart::DeclarativeChart(QDeclarativeItem *parent)
5 DeclarativeChart::DeclarativeChart(QDeclarativeItem *parent)
6 : QDeclarativeItem(parent),
6 : QDeclarativeItem(parent),
7 m_chart(new QChart(this))
7 m_chart(new QChart(this))
8 {
8 {
9 setFlag(QGraphicsItem::ItemHasNoContents, false);
9 setFlag(QGraphicsItem::ItemHasNoContents, false);
10 // m_chart->setMargin(50); // TODO: should not be needed?
11 }
10 }
12
11
13 DeclarativeChart::ChartTheme DeclarativeChart::theme()
12 DeclarativeChart::ChartTheme DeclarativeChart::theme()
14 {
13 {
15 if (m_chart)
14 if (m_chart)
16 return (ChartTheme) m_chart->chartTheme();
15 return (ChartTheme) m_chart->chartTheme();
17 }
16 }
18
17
19 void DeclarativeChart::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
18 void DeclarativeChart::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
20 {
19 {
21 if (newGeometry.isValid())
20 qDebug() << "geometryChanged " << this << " old geometry: " << oldGeometry;
22 m_chart->resize(newGeometry.width(), newGeometry.height());
21 if (newGeometry.isValid()) {
22 if (newGeometry.width() > 0 && newGeometry.height() > 0) {
23 // TODO: setting margin should not be needed to make axis visible?
24 const int margin = 30;
25 if (m_chart->margin() == 0
26 && newGeometry.width() > (margin * 2)
27 && newGeometry.height() > (margin * 2)) {
28 m_chart->setMargin(margin);
29 m_chart->resize(newGeometry.width(), newGeometry.height());
30 } else {
31 m_chart->resize(newGeometry.width(), newGeometry.height());
32 }
33 }
34 }
23 }
35 }
24
36
25 #include "moc_declarativechart.cpp"
37 #include "moc_declarativechart.cpp"
26
38
27 QTCOMMERCIALCHART_END_NAMESPACE
39 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,100 +1,91
1 #include "declarativeseries.h"
1 #include "declarativeseries.h"
2 #include "declarativechart.h"
2 #include "declarativechart.h"
3 #include <qscatterseries.h>
3 #include <qscatterseries.h>
4 #include <qlinechartseries.h>
4 #include <qlinechartseries.h>
5 #include <cmath>
5 #include <cmath>
6 #include <QDebug>
6 #include <QDebug>
7
7
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9
9
10 DeclarativeSeries::DeclarativeSeries(QDeclarativeItem *parent) :
10 DeclarativeSeries::DeclarativeSeries(QDeclarativeItem *parent) :
11 QDeclarativeItem(parent),
11 QDeclarativeItem(parent),
12 m_seriesType(SeriesTypeInvalid), // TODO: default type?
12 m_seriesType(SeriesTypeInvalid), // TODO: default type?
13 m_chart(0),
13 m_chart(0),
14 m_series(0)
14 m_series(0)
15 {
15 {
16 setFlag(QGraphicsItem::ItemHasNoContents, false);
16 setFlag(QGraphicsItem::ItemHasNoContents, false);
17 connect(this, SIGNAL(parentChanged()),
17 connect(this, SIGNAL(parentChanged()),
18 this, SLOT(setParentForSeries()));
18 this, SLOT(setParentForSeries()));
19 }
19 }
20
20
21 void DeclarativeSeries::setSeriesType(SeriesType type)
21 void DeclarativeSeries::setSeriesType(SeriesType type)
22 {
22 {
23 if (!m_series || type != m_seriesType) {
23 if (!m_series || type != m_seriesType) {
24 m_seriesType = type;
24 m_seriesType = type;
25 initSeries();
25 initSeries();
26 } else {
26 } else {
27 m_seriesType = type;
27 m_seriesType = type;
28 }
28 }
29 }
29 }
30
30
31 void DeclarativeSeries::setParentForSeries()
31 void DeclarativeSeries::setParentForSeries()
32 {
32 {
33 if (!m_series)
33 if (!m_series)
34 initSeries();
34 initSeries();
35 else if (m_series->type() != m_seriesType)
35 else if (m_series->type() != m_seriesType)
36 initSeries();
36 initSeries();
37 }
37 }
38
38
39 void DeclarativeSeries::initSeries()
39 void DeclarativeSeries::initSeries()
40 {
40 {
41 DeclarativeChart *declarativeChart = qobject_cast<DeclarativeChart *>(parent());
41 DeclarativeChart *declarativeChart = qobject_cast<DeclarativeChart *>(parent());
42
42
43 if (declarativeChart && m_seriesType != SeriesTypeInvalid) {
43 if (declarativeChart && m_seriesType != SeriesTypeInvalid) {
44 delete m_series;
44 delete m_series;
45 m_series = 0;
45 m_series = 0;
46
46
47 QChart *chart = qobject_cast<QChart *>(declarativeChart->m_chart);
47 QChart *chart = qobject_cast<QChart *>(declarativeChart->m_chart);
48 qDebug() << "creating series for chart: " << chart;
48 qDebug() << "creating series for chart: " << chart;
49 Q_ASSERT(chart);
49 Q_ASSERT(chart);
50
50
51 switch (m_seriesType) {
51 switch (m_seriesType) {
52 case SeriesTypeLine: {
52 case SeriesTypeLine: {
53 m_series = new QLineChartSeries(this);
53 m_series = new QLineChartSeries(this);
54 for (qreal i(0.0); i < 100.0; i += 1.0)
54 for (qreal i(0.0); i < 100.0; i += 1.0)
55 ((QLineChartSeries *)m_series)->add(i, i);
55 ((QLineChartSeries *)m_series)->add(i, i);
56 chart->addSeries(m_series);
56 chart->addSeries(m_series);
57 break;
57 break;
58 }
58 }
59 case SeriesTypeBar:
59 case SeriesTypeBar:
60 // fallthrough; bar and scatter use the same test data
60 // fallthrough; bar and scatter use the same test data
61 case SeriesTypeScatter: {
61 case SeriesTypeScatter: {
62 m_series = chart->createSeries((QChartSeries::QChartSeriesType) m_seriesType);
62 m_series = chart->createSeries((QChartSeries::QChartSeriesType) m_seriesType);
63 QScatterSeries *scatter = qobject_cast<QScatterSeries *>(m_series);
63 QScatterSeries *scatter = qobject_cast<QScatterSeries *>(m_series);
64 Q_ASSERT(scatter);
64 Q_ASSERT(scatter);
65 for (qreal i = 0; i < 100; i += 0.1)
65 for (qreal i = 0; i < 100; i += 0.1)
66 scatter->addData(QPointF(i + (rand() % 5),
66 scatter->addData(QPointF(i + (rand() % 5),
67 abs(sin(3.14159265358979 / 50 * i) * 100) + (rand() % 5)));
67 abs(sin(3.14159265358979 / 50 * i) * 100) + (rand() % 5)));
68 break;
68 break;
69 }
69 }
70 case SeriesTypeStackedBar:
70 case SeriesTypeStackedBar:
71 break;
71 break;
72 case SeriesTypePercentBar:
72 case SeriesTypePercentBar:
73 break;
73 break;
74 case SeriesTypePie: {
74 case SeriesTypePie: {
75 m_series = chart->createSeries((QChartSeries::QChartSeriesType) m_seriesType);
75 m_series = chart->createSeries((QChartSeries::QChartSeriesType) m_seriesType);
76 QList<qreal> data;
76 QList<qreal> data;
77 data << 1.0;
77 data << 1.0;
78 data << 12.0;
78 data << 12.0;
79 data << 4.0;
79 data << 4.0;
80 Q_ASSERT(m_series->setData(data));
80 Q_ASSERT(m_series->setData(data));
81 break;
81 break;
82 }
82 }
83 default:
83 default:
84 break;
84 break;
85 }
85 }
86 }
86 }
87 }
87 }
88
88
89 QVariant DeclarativeSeries::itemChange(GraphicsItemChange change,
90 const QVariant &value)
91 {
92 // For debugging purposes only:
93 // qDebug() << QString::number(change) << " : " << value.toString();
94 return QGraphicsItem::itemChange(change, value);
95 }
96
97
98 #include "moc_declarativeseries.cpp"
89 #include "moc_declarativeseries.cpp"
99
90
100 QTCOMMERCIALCHART_END_NAMESPACE
91 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,53 +1,50
1 #ifndef DECLARATIVESERIES_H
1 #ifndef DECLARATIVESERIES_H
2 #define DECLARATIVESERIES_H
2 #define DECLARATIVESERIES_H
3
3
4 #include <QDeclarativeItem>
4 #include <QDeclarativeItem>
5 #include <qchart.h>
5 #include <qchart.h>
6 #include <qchartseries.h>
6 #include <qchartseries.h>
7
7
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9
9
10 class DeclarativeSeries : public QDeclarativeItem
10 class DeclarativeSeries : public QDeclarativeItem
11 {
11 {
12 Q_OBJECT
12 Q_OBJECT
13 Q_ENUMS(SeriesType)
13 Q_ENUMS(SeriesType)
14 Q_PROPERTY(SeriesType seriesType READ seriesType WRITE setSeriesType)
14 Q_PROPERTY(SeriesType seriesType READ seriesType WRITE setSeriesType)
15
15
16 public:
16 public:
17 // TODO: how to re-use the existing enum from QChart?
17 // TODO: how to re-use the existing enum from QChart?
18 enum SeriesType {
18 enum SeriesType {
19 SeriesTypeInvalid = QChartSeries::SeriesTypeInvalid,
19 SeriesTypeInvalid = QChartSeries::SeriesTypeInvalid,
20 SeriesTypeLine,
20 SeriesTypeLine,
21 // SeriesTypeArea,
21 // SeriesTypeArea,
22 SeriesTypeBar,
22 SeriesTypeBar,
23 SeriesTypeStackedBar,
23 SeriesTypeStackedBar,
24 SeriesTypePercentBar,
24 SeriesTypePercentBar,
25 SeriesTypePie,
25 SeriesTypePie,
26 SeriesTypeScatter
26 SeriesTypeScatter
27 // SeriesTypeSpline
27 // SeriesTypeSpline
28 };
28 };
29
29
30 explicit DeclarativeSeries(QDeclarativeItem *parent = 0);
30 explicit DeclarativeSeries(QDeclarativeItem *parent = 0);
31
31
32 signals:
32 signals:
33
33
34 public slots:
34 public slots:
35 void setParentForSeries();
35 void setParentForSeries();
36
36
37 public: // from QDeclarativeItem
38 QVariant itemChange(GraphicsItemChange, const QVariant &);
39
40 public:
37 public:
41 void setSeriesType(SeriesType type);
38 void setSeriesType(SeriesType type);
42 SeriesType seriesType() { return m_seriesType; }
39 SeriesType seriesType() { return m_seriesType; }
43
40
44 private:
41 private:
45 void initSeries();
42 void initSeries();
46 SeriesType m_seriesType;
43 SeriesType m_seriesType;
47 QChart *m_chart;
44 QChart *m_chart;
48 QChartSeries *m_series;
45 QChartSeries *m_series;
49 };
46 };
50
47
51 QTCOMMERCIALCHART_END_NAMESPACE
48 QTCOMMERCIALCHART_END_NAMESPACE
52
49
53 #endif // DECLARATIVESERIES_H
50 #endif // DECLARATIVESERIES_H
@@ -1,27 +1,30
1 #include <QtDeclarative/qdeclarativeextensionplugin.h>
1 #include <QtDeclarative/qdeclarativeextensionplugin.h>
2 #include <QtDeclarative/qdeclarative.h>
2 #include <QtDeclarative/qdeclarative.h>
3 #include "declarativechart.h"
3 #include "declarativechart.h"
4 #include "declarativeseries.h"
4 #include "declarativeseries.h"
5 #include "scatterelement.h"
6 #include "declarativescatterseries.h"
5
7
6 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
7
9
8 class ChartQmlPlugin : public QDeclarativeExtensionPlugin
10 class ChartQmlPlugin : public QDeclarativeExtensionPlugin
9 {
11 {
10 Q_OBJECT
12 Q_OBJECT
11 public:
13 public:
12 virtual void registerTypes(const char *uri)
14 virtual void registerTypes(const char *uri)
13 {
15 {
14 Q_ASSERT(QLatin1String(uri) == QLatin1String("QtCommercial.Chart"));
16 Q_ASSERT(QLatin1String(uri) == QLatin1String("QtCommercial.Chart"));
15 qmlRegisterType<DeclarativeChart>(uri, 1, 0, "Chart");
17 qmlRegisterType<DeclarativeChart>(uri, 1, 0, "Chart");
16 qmlRegisterType<DeclarativeSeries>(uri, 1, 0, "Series");
18 qmlRegisterType<DeclarativeSeries>(uri, 1, 0, "Series");
17 //qmlRegisterUncreatableType<QChartSeries::SeriesTypeBar>(uri, 1, 0, "Series.Se", QLatin1String("Do not create objects of this type."));
19 qmlRegisterType<DeclarativeScatterSeries>(uri, 1, 0, "ScatterSeries");
20 qmlRegisterType<ScatterElement>(uri, 1, 0, "ScatterElement");
18 }
21 }
19 };
22 };
20
23
21 #include "plugin.moc"
24 #include "plugin.moc"
22
25
23 QTCOMMERCIALCHART_END_NAMESPACE
26 QTCOMMERCIALCHART_END_NAMESPACE
24
27
25 QTCOMMERCIALCHART_USE_NAMESPACE
28 QTCOMMERCIALCHART_USE_NAMESPACE
26
29
27 Q_EXPORT_PLUGIN2(qtcommercialchartqml, QT_PREPEND_NAMESPACE(ChartQmlPlugin))
30 Q_EXPORT_PLUGIN2(qtcommercialchartqml, QT_PREPEND_NAMESPACE(ChartQmlPlugin))
@@ -1,39 +1,57
1 !include( ../common.pri ) {
1 !include( ../common.pri ) {
2 error( "Couldn't find the common.pri file!" )
2 error( "Couldn't find the common.pri file!" )
3 }
3 }
4 !include( ../integrated.pri ) {
4 !include( ../integrated.pri ) {
5 error( "Couldn't find the integrated.pri file !")
5 error( "Couldn't find the integrated.pri file !")
6 }
6 }
7
7
8 TEMPLATE = lib
8 TEMPLATE = lib
9 TARGET = qtcommercialchartqml
9 TARGET = qtcommercialchartqml
10
10
11 CONFIG += qt plugin
11 CONFIG += qt plugin
12 QT += declarative
12 QT += declarative
13
13
14 contains(QT_MAJOR_VERSION, 5) {
14 contains(QT_MAJOR_VERSION, 5) {
15 # TODO: QtQuick2 not supported by the implementation currently
15 # TODO: QtQuick2 not supported by the implementation currently
16 DEFINES += QTQUICK2
16 DEFINES += QTQUICK2
17 }
17 }
18
18
19 OBJECTS_DIR = $$CHART_BUILD_DIR/lib
19 OBJECTS_DIR = $$CHART_BUILD_DIR/lib
20 MOC_DIR = $$CHART_BUILD_DIR/lib
20 MOC_DIR = $$CHART_BUILD_DIR/lib
21 UI_DIR = $$CHART_BUILD_DIR/lib
21 UI_DIR = $$CHART_BUILD_DIR/lib
22 RCC_DIR = $$CHART_BUILD_DIR/lib
22 RCC_DIR = $$CHART_BUILD_DIR/lib
23
23
24 SOURCES += \
24 SOURCES += \
25 plugin.cpp \
25 plugin.cpp \
26 declarativechart.cpp \
26 declarativechart.cpp \
27 declarativeseries.cpp
27 declarativeseries.cpp \
28 declarativescatterseries.cpp \
29 scatterelement.cpp
28 HEADERS += \
30 HEADERS += \
29 declarativechart.h \
31 declarativechart.h \
30 declarativeseries.h
32 declarativeseries.h \
33 declarativescatterseries.h \
34 scatterelement.h
31
35
32 TARGETPATH = QtCommercial/Chart
36 TARGETPATH = QtCommercial/Chart
33 target.path = $$[QT_INSTALL_IMPORTS]/$$TARGETPATH
37 target.path = $$[QT_INSTALL_IMPORTS]/$$TARGETPATH
34 qmldir.files += $$PWD/qmldir
38 qmldir.files += $$PWD/qmldir
35 qmldir.path += $$[QT_INSTALL_IMPORTS]/$$TARGETPATH
39 qmldir.path += $$[QT_INSTALL_IMPORTS]/$$TARGETPATH
36
40
37 INSTALLS += target qmldir
41 INSTALLS += target qmldir
38
42
39
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
@@ -1,162 +1,163
1 #include "chartdataset_p.h"
1 #include "chartdataset_p.h"
2 //series
2 //series
3 #include "qlinechartseries.h"
3 #include "qlinechartseries.h"
4 #include "barchartseries.h"
4 #include "barchartseries.h"
5 #include "stackedbarchartseries.h"
5 #include "stackedbarchartseries.h"
6 #include "percentbarchartseries.h"
6 #include "percentbarchartseries.h"
7 #include "qpieseries.h"
7 #include "qpieseries.h"
8 #include "qscatterseries.h"
8 #include "qscatterseries.h"
9
9
10 QTCOMMERCIALCHART_BEGIN_NAMESPACE
10 QTCOMMERCIALCHART_BEGIN_NAMESPACE
11
11
12 ChartDataSet::ChartDataSet(QObject *parent):QObject(parent)
12 ChartDataSet::ChartDataSet(QObject *parent):QObject(parent)
13 {
13 {
14 Domain domain;
14 Domain domain;
15 m_domains<<domain;
15 m_domains<<domain;
16 }
16 }
17
17
18 ChartDataSet::~ChartDataSet()
18 ChartDataSet::~ChartDataSet()
19 {
19 {
20 // TODO Auto-generated destructor stub
20 // TODO Auto-generated destructor stub
21 }
21 }
22
22
23 const Domain& ChartDataSet::domain() const
23 const Domain& ChartDataSet::domain() const
24 {
24 {
25 return m_domains[m_domainIndex];
25 return m_domains[m_domainIndex];
26 }
26 }
27
27
28 void ChartDataSet::addSeries(QChartSeries* series)
28 void ChartDataSet::addSeries(QChartSeries* series)
29 {
29 {
30 // TODO: we should check the series not already added
30 // TODO: we should check the series not already added
31 m_chartSeries << series;
31 m_chartSeries << series;
32 series->setParent(this); // take ownership
32 m_domainIndex = 0;
33 m_domainIndex = 0;
33 m_domains.resize(1);
34 m_domains.resize(1);
34
35
35 Domain& domain = m_domains[m_domainIndex];
36 Domain& domain = m_domains[m_domainIndex];
36
37
37 switch(series->type())
38 switch(series->type())
38 {
39 {
39 case QChartSeries::SeriesTypeLine: {
40 case QChartSeries::SeriesTypeLine: {
40
41
41 QLineChartSeries* xyseries = static_cast<QLineChartSeries*>(series);
42 QLineChartSeries* xyseries = static_cast<QLineChartSeries*>(series);
42
43
43 for (int i = 0; i < xyseries->count(); i++)
44 for (int i = 0; i < xyseries->count(); i++)
44 {
45 {
45 qreal x = xyseries->x(i);
46 qreal x = xyseries->x(i);
46 qreal y = xyseries->y(i);
47 qreal y = xyseries->y(i);
47 domain.m_minX = qMin(domain.m_minX,x);
48 domain.m_minX = qMin(domain.m_minX,x);
48 domain.m_minY = qMin(domain.m_minY,y);
49 domain.m_minY = qMin(domain.m_minY,y);
49 domain.m_maxX = qMax(domain.m_maxX,x);
50 domain.m_maxX = qMax(domain.m_maxX,x);
50 domain.m_maxY = qMax(domain.m_maxY,y);
51 domain.m_maxY = qMax(domain.m_maxY,y);
51 }
52 }
52 break;
53 break;
53 }
54 }
54 case QChartSeries::SeriesTypeBar: {
55 case QChartSeries::SeriesTypeBar: {
55 qDebug() << "QChartSeries::SeriesTypeBar";
56 qDebug() << "QChartSeries::SeriesTypeBar";
56 BarChartSeries* barSeries = static_cast<BarChartSeries*>(series);
57 BarChartSeries* barSeries = static_cast<BarChartSeries*>(series);
57 qreal x = barSeries->countCategories();
58 qreal x = barSeries->countCategories();
58 qreal y = barSeries->max();
59 qreal y = barSeries->max();
59 domain.m_minX = qMin(domain.m_minX,x);
60 domain.m_minX = qMin(domain.m_minX,x);
60 domain.m_minY = qMin(domain.m_minY,y);
61 domain.m_minY = qMin(domain.m_minY,y);
61 domain.m_maxX = qMax(domain.m_maxX,x);
62 domain.m_maxX = qMax(domain.m_maxX,x);
62 domain.m_maxY = qMax(domain.m_maxY,y);
63 domain.m_maxY = qMax(domain.m_maxY,y);
63 break;
64 break;
64 }
65 }
65 case QChartSeries::SeriesTypeStackedBar: {
66 case QChartSeries::SeriesTypeStackedBar: {
66 qDebug() << "QChartSeries::SeriesTypeStackedBar";
67 qDebug() << "QChartSeries::SeriesTypeStackedBar";
67
68
68 StackedBarChartSeries* stackedBarSeries = static_cast<StackedBarChartSeries*>(series);
69 StackedBarChartSeries* stackedBarSeries = static_cast<StackedBarChartSeries*>(series);
69 qreal x = stackedBarSeries->countCategories();
70 qreal x = stackedBarSeries->countCategories();
70 qreal y = stackedBarSeries->maxCategorySum();
71 qreal y = stackedBarSeries->maxCategorySum();
71 domain.m_minX = qMin(domain.m_minX,x);
72 domain.m_minX = qMin(domain.m_minX,x);
72 domain.m_minY = qMin(domain.m_minY,y);
73 domain.m_minY = qMin(domain.m_minY,y);
73 domain.m_maxX = qMax(domain.m_maxX,x);
74 domain.m_maxX = qMax(domain.m_maxX,x);
74 domain.m_maxY = qMax(domain.m_maxY,y);
75 domain.m_maxY = qMax(domain.m_maxY,y);
75 break;
76 break;
76 }
77 }
77 case QChartSeries::SeriesTypePercentBar: {
78 case QChartSeries::SeriesTypePercentBar: {
78 qDebug() << "QChartSeries::SeriesTypePercentBar";
79 qDebug() << "QChartSeries::SeriesTypePercentBar";
79
80
80 PercentBarChartSeries* percentBarSeries = static_cast<PercentBarChartSeries*>(series);
81 PercentBarChartSeries* percentBarSeries = static_cast<PercentBarChartSeries*>(series);
81 qreal x = percentBarSeries->countCategories();
82 qreal x = percentBarSeries->countCategories();
82 domain.m_minX = qMin(domain.m_minX,x);
83 domain.m_minX = qMin(domain.m_minX,x);
83 domain.m_minY = 0;
84 domain.m_minY = 0;
84 domain.m_maxX = qMax(domain.m_maxX,x);
85 domain.m_maxX = qMax(domain.m_maxX,x);
85 domain.m_maxY = 100;
86 domain.m_maxY = 100;
86 break;
87 break;
87 }
88 }
88
89
89 case QChartSeries::SeriesTypePie: {
90 case QChartSeries::SeriesTypePie: {
90 QPieSeries *pieSeries = static_cast<QPieSeries *>(series);
91 QPieSeries *pieSeries = static_cast<QPieSeries *>(series);
91 // TODO: domain stuff
92 // TODO: domain stuff
92 break;
93 break;
93 }
94 }
94
95
95 case QChartSeries::SeriesTypeScatter: {
96 case QChartSeries::SeriesTypeScatter: {
96 QScatterSeries *scatterSeries = qobject_cast<QScatterSeries *>(series);
97 QScatterSeries *scatterSeries = qobject_cast<QScatterSeries *>(series);
97 Q_ASSERT(scatterSeries);
98 Q_ASSERT(scatterSeries);
98 foreach (QPointF point, scatterSeries->data()) {
99 foreach (QPointF point, scatterSeries->data()) {
99 domain.m_minX = qMin(domain.m_minX, point.x());
100 domain.m_minX = qMin(domain.m_minX, point.x());
100 domain.m_maxX = qMax(domain.m_maxX, point.x());
101 domain.m_maxX = qMax(domain.m_maxX, point.x());
101 domain.m_minY = qMin(domain.m_minY, point.y());
102 domain.m_minY = qMin(domain.m_minY, point.y());
102 domain.m_maxY = qMax(domain.m_maxY, point.y());
103 domain.m_maxY = qMax(domain.m_maxY, point.y());
103 }
104 }
104 break;
105 break;
105 }
106 }
106
107
107 default: {
108 default: {
108 qDebug()<<__FUNCTION__<<"type" << series->type()<<"not supported";
109 qDebug()<<__FUNCTION__<<"type" << series->type()<<"not supported";
109 return;
110 return;
110 break;
111 break;
111 }
112 }
112
113
113 }
114 }
114
115
115 emit seriesAdded(series);
116 emit seriesAdded(series);
116 emit domainChanged(domain);
117 emit domainChanged(domain);
117 }
118 }
118
119
119 bool ChartDataSet::nextDomain()
120 bool ChartDataSet::nextDomain()
120 {
121 {
121 if (m_domainIndex < m_domains.count() - 1) {
122 if (m_domainIndex < m_domains.count() - 1) {
122 m_domainIndex++;
123 m_domainIndex++;
123 emit domainChanged(m_domains[m_domainIndex]);
124 emit domainChanged(m_domains[m_domainIndex]);
124 return true;
125 return true;
125 }
126 }
126 else {
127 else {
127 return false;
128 return false;
128 }
129 }
129 }
130 }
130
131
131 bool ChartDataSet::previousDomain()
132 bool ChartDataSet::previousDomain()
132 {
133 {
133 if (m_domainIndex > 0) {
134 if (m_domainIndex > 0) {
134 m_domainIndex--;
135 m_domainIndex--;
135 emit domainChanged(m_domains[m_domainIndex]);
136 emit domainChanged(m_domains[m_domainIndex]);
136 return true;
137 return true;
137 }
138 }
138 else {
139 else {
139 return false;
140 return false;
140 }
141 }
141 }
142 }
142
143
143 void ChartDataSet::clearDomains()
144 void ChartDataSet::clearDomains()
144 {
145 {
145 if (m_domainIndex > 0) {
146 if (m_domainIndex > 0) {
146 m_domainIndex = 0;
147 m_domainIndex = 0;
147 emit domainChanged(m_domains[m_domainIndex]);
148 emit domainChanged(m_domains[m_domainIndex]);
148 }
149 }
149 }
150 }
150
151
151 void ChartDataSet::addDomain(const Domain& domain)
152 void ChartDataSet::addDomain(const Domain& domain)
152 {
153 {
153 m_domains.resize(m_domainIndex + 1);
154 m_domains.resize(m_domainIndex + 1);
154 m_domains << domain;
155 m_domains << domain;
155 m_domainIndex++;
156 m_domainIndex++;
156
157
157 emit domainChanged(domain);
158 emit domainChanged(domain);
158 }
159 }
159
160
160 #include "moc_chartdataset_p.cpp"
161 #include "moc_chartdataset_p.cpp"
161
162
162 QTCOMMERCIALCHART_END_NAMESPACE
163 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,272 +1,269
1 #include "qchart.h"
1 #include "qchart.h"
2 #include "qchartaxis.h"
2 #include "qchartaxis.h"
3 #include "chartpresenter_p.h"
3 #include "chartpresenter_p.h"
4 #include "chartdataset_p.h"
4 #include "chartdataset_p.h"
5 #include "charttheme_p.h"
5 #include "charttheme_p.h"
6 //series
6 //series
7 #include "barchartseries.h"
7 #include "barchartseries.h"
8 #include "stackedbarchartseries.h"
8 #include "stackedbarchartseries.h"
9 #include "percentbarchartseries.h"
9 #include "percentbarchartseries.h"
10 #include "qlinechartseries.h"
10 #include "qlinechartseries.h"
11 #include "qpieseries.h"
11 #include "qpieseries.h"
12 #include "qscatterseries.h"
12 #include "qscatterseries.h"
13 //items
13 //items
14 #include "axisitem_p.h"
14 #include "axisitem_p.h"
15 #include "bargroup.h"
15 #include "bargroup.h"
16 #include "stackedbargroup.h"
16 #include "stackedbargroup.h"
17 #include "linechartitem_p.h"
17 #include "linechartitem_p.h"
18 #include "percentbargroup.h"
18 #include "percentbargroup.h"
19 #include "linechartanimationitem_p.h"
19 #include "linechartanimationitem_p.h"
20 #include "piepresenter.h"
20 #include "piepresenter.h"
21 #include "scatterpresenter.h"
21 #include "scatterpresenter_p.h"
22
22
23 QTCOMMERCIALCHART_BEGIN_NAMESPACE
23 QTCOMMERCIALCHART_BEGIN_NAMESPACE
24
24
25 ChartPresenter::ChartPresenter(QChart* chart,ChartDataSet* dataset):QObject(chart),
25 ChartPresenter::ChartPresenter(QChart* chart,ChartDataSet* dataset):QObject(chart),
26 m_chart(chart),
26 m_chart(chart),
27 m_dataset(dataset),
27 m_dataset(dataset),
28 m_chartTheme(0),
28 m_chartTheme(0),
29 m_axisXItem(new AxisItem(AxisItem::X_AXIS,m_chart)),
29 m_axisXItem(new AxisItem(AxisItem::X_AXIS,m_chart)),
30 m_axisYItem(new AxisItem(AxisItem::Y_AXIS,m_chart)),
30 m_axisYItem(new AxisItem(AxisItem::Y_AXIS,m_chart)),
31 m_domainIndex(0),
31 m_domainIndex(0),
32 m_marginSize(0),
32 m_marginSize(0),
33 m_rect(QRectF(QPoint(0,0),m_chart->size()))
33 m_rect(QRectF(QPoint(0,0),m_chart->size()))
34 {
34 {
35 setChartTheme(QChart::ChartThemeDefault);
35 setChartTheme(QChart::ChartThemeDefault);
36 createConnections();
36 createConnections();
37 }
37 }
38
38
39 ChartPresenter::~ChartPresenter()
39 ChartPresenter::~ChartPresenter()
40 {
40 {
41 }
41 }
42
42
43 void ChartPresenter::createConnections()
43 void ChartPresenter::createConnections()
44 {
44 {
45 QObject::connect(m_chart,SIGNAL(geometryChanged()),this,SLOT(handleGeometryChanged()));
45 QObject::connect(m_chart,SIGNAL(geometryChanged()),this,SLOT(handleGeometryChanged()));
46 QObject::connect(m_dataset,SIGNAL(seriesAdded(QChartSeries*)),this,SLOT(handleSeriesAdded(QChartSeries*)));
46 QObject::connect(m_dataset,SIGNAL(seriesAdded(QChartSeries*)),this,SLOT(handleSeriesAdded(QChartSeries*)));
47 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),m_axisXItem,SLOT(handleGeometryChanged(const QRectF&)));
47 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),m_axisXItem,SLOT(handleGeometryChanged(const QRectF&)));
48 QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),m_axisXItem,SLOT(handleDomainChanged(const Domain&)));
48 QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),m_axisXItem,SLOT(handleDomainChanged(const Domain&)));
49 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),m_axisYItem,SLOT(handleGeometryChanged(const QRectF&)));
49 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),m_axisYItem,SLOT(handleGeometryChanged(const QRectF&)));
50 QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),m_axisYItem,SLOT(handleDomainChanged(const Domain&)));
50 QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),m_axisYItem,SLOT(handleDomainChanged(const Domain&)));
51 }
51 }
52
52
53 void ChartPresenter::handleGeometryChanged()
53 void ChartPresenter::handleGeometryChanged()
54 {
54 {
55 m_rect = QRectF(QPoint(0,0),m_chart->size());
55 m_rect = QRectF(QPoint(0,0),m_chart->size());
56 m_rect.adjust(m_marginSize,m_marginSize, -m_marginSize, -m_marginSize);
56 m_rect.adjust(m_marginSize,m_marginSize, -m_marginSize, -m_marginSize);
57 Q_ASSERT(m_rect.isValid());
57 Q_ASSERT(m_rect.isValid());
58 emit geometryChanged(m_rect);
58 emit geometryChanged(m_rect);
59 }
59 }
60
60
61 int ChartPresenter::margin() const
61 int ChartPresenter::margin() const
62 {
62 {
63 return m_marginSize;
63 return m_marginSize;
64 }
64 }
65
65
66 void ChartPresenter::setMargin(int margin)
66 void ChartPresenter::setMargin(int margin)
67 {
67 {
68 m_marginSize = margin;
68 m_marginSize = margin;
69 }
69 }
70
70
71 void ChartPresenter::handleSeriesAdded(QChartSeries* series)
71 void ChartPresenter::handleSeriesAdded(QChartSeries* series)
72 {
72 {
73 qDebug() << " ChartPresenter::handleSeriesAdded";
73 qDebug() << " ChartPresenter::handleSeriesAdded";
74 switch(series->type())
74 switch(series->type())
75 {
75 {
76 case QChartSeries::SeriesTypeLine: {
76 case QChartSeries::SeriesTypeLine: {
77 QLineChartSeries* lineSeries = static_cast<QLineChartSeries*>(series);
77 QLineChartSeries* lineSeries = static_cast<QLineChartSeries*>(series);
78 LineChartItem* item = new LineChartAnimationItem(this,lineSeries,m_chart);
78 LineChartItem* item = new LineChartAnimationItem(this,lineSeries,m_chart);
79 m_chartTheme->decorate(item,lineSeries,m_chartItems.count());
79 m_chartTheme->decorate(item,lineSeries,m_chartItems.count());
80 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
80 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
81 QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),item,SLOT(handleDomainChanged(const Domain&)));
81 QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),item,SLOT(handleDomainChanged(const Domain&)));
82 QObject::connect(lineSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int)));
82 QObject::connect(lineSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int)));
83 m_chartItems.insert(series,item);
83 m_chartItems.insert(series,item);
84 break;
84 break;
85 }
85 }
86
86
87 case QChartSeries::SeriesTypeBar: {
87 case QChartSeries::SeriesTypeBar: {
88 BarChartSeries* barSeries = static_cast<BarChartSeries*>(series);
88 BarChartSeries* barSeries = static_cast<BarChartSeries*>(series);
89 BarGroup* item = new BarGroup(barSeries->model(),m_chart);
89 BarGroup* item = new BarGroup(barSeries->model(),m_chart);
90 m_chartTheme->decorate(item,barSeries,m_chartItems.count());
90 m_chartTheme->decorate(item,barSeries,m_chartItems.count());
91 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
91 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
92 QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),item,SLOT(handleDomainChanged(const Domain&)));
92 QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),item,SLOT(handleDomainChanged(const Domain&)));
93 QObject::connect(barSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int)));
93 QObject::connect(barSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int)));
94 m_chartItems.insert(series,item);
94 m_chartItems.insert(series,item);
95 // m_axisXItem->setVisible(false);
95 // m_axisXItem->setVisible(false);
96 break;
96 break;
97 }
97 }
98
98
99 case QChartSeries::SeriesTypeStackedBar: {
99 case QChartSeries::SeriesTypeStackedBar: {
100
100
101 StackedBarChartSeries* stackedBarSeries = static_cast<StackedBarChartSeries*>(series);
101 StackedBarChartSeries* stackedBarSeries = static_cast<StackedBarChartSeries*>(series);
102 StackedBarGroup* item = new StackedBarGroup(stackedBarSeries->model(),m_chart);
102 StackedBarGroup* item = new StackedBarGroup(stackedBarSeries->model(),m_chart);
103 m_chartTheme->decorate(item,stackedBarSeries,m_chartItems.count());
103 m_chartTheme->decorate(item,stackedBarSeries,m_chartItems.count());
104 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
104 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
105 QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),item,SLOT(handleDomainChanged(const Domain&)));
105 QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),item,SLOT(handleDomainChanged(const Domain&)));
106 QObject::connect(stackedBarSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int)));
106 QObject::connect(stackedBarSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int)));
107 m_chartItems.insert(series,item);
107 m_chartItems.insert(series,item);
108 break;
108 break;
109 }
109 }
110
110
111 case QChartSeries::SeriesTypePercentBar: {
111 case QChartSeries::SeriesTypePercentBar: {
112
112
113 PercentBarChartSeries* percentBarSeries = static_cast<PercentBarChartSeries*>(series);
113 PercentBarChartSeries* percentBarSeries = static_cast<PercentBarChartSeries*>(series);
114 PercentBarGroup* item = new PercentBarGroup(percentBarSeries->model(),m_chart);
114 PercentBarGroup* item = new PercentBarGroup(percentBarSeries->model(),m_chart);
115 m_chartTheme->decorate(item,percentBarSeries ,m_chartItems.count());
115 m_chartTheme->decorate(item,percentBarSeries ,m_chartItems.count());
116 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
116 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
117 QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),item,SLOT(handleDomainChanged(const Domain&)));
117 QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),item,SLOT(handleDomainChanged(const Domain&)));
118 QObject::connect(percentBarSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int)));
118 QObject::connect(percentBarSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int)));
119 m_chartItems.insert(series,item);
119 m_chartItems.insert(series,item);
120 break;
120 break;
121 }
121 }
122 case QChartSeries::SeriesTypeScatter: {
122 case QChartSeries::SeriesTypeScatter: {
123 QScatterSeries *scatterSeries = qobject_cast<QScatterSeries *>(series);
123 QScatterSeries *scatterSeries = qobject_cast<QScatterSeries *>(series);
124 ScatterPresenter *scatterPresenter = new ScatterPresenter(scatterSeries, m_chart);
124 ScatterPresenter *scatterPresenter = new ScatterPresenter(scatterSeries, m_chart);
125 QObject::connect(this, SIGNAL(geometryChanged(const QRectF&)),
125 QObject::connect(this, SIGNAL(geometryChanged(const QRectF&)),
126 scatterPresenter, SLOT(handleGeometryChanged(const QRectF&)));
126 scatterPresenter, SLOT(handleGeometryChanged(const QRectF&)));
127 QObject::connect(m_dataset, SIGNAL(domainChanged(const Domain&)),
127 QObject::connect(m_dataset, SIGNAL(domainChanged(const Domain&)),
128 scatterPresenter, SLOT(handleDomainChanged(const Domain&)));
128 scatterPresenter, SLOT(handleDomainChanged(const Domain&)));
129 m_chartTheme->decorate(scatterPresenter, scatterSeries, m_chartItems.count());
129 m_chartTheme->decorate(scatterPresenter, scatterSeries, m_chartItems.count());
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.insert(scatterSeries, scatterPresenter);
130 m_chartItems.insert(scatterSeries, scatterPresenter);
134 break;
131 break;
135 }
132 }
136 case QChartSeries::SeriesTypePie: {
133 case QChartSeries::SeriesTypePie: {
137 QPieSeries *s = qobject_cast<QPieSeries *>(series);
134 QPieSeries *s = qobject_cast<QPieSeries *>(series);
138 PiePresenter* pie = new PiePresenter(m_chart, s);
135 PiePresenter* pie = new PiePresenter(m_chart, s);
139 m_chartTheme->decorate(pie, s, m_chartItems.count());
136 m_chartTheme->decorate(pie, s, m_chartItems.count());
140 QObject::connect(this, SIGNAL(geometryChanged(const QRectF&)), pie, SLOT(handleGeometryChanged(const QRectF&)));
137 QObject::connect(this, SIGNAL(geometryChanged(const QRectF&)), pie, SLOT(handleGeometryChanged(const QRectF&)));
141 QObject::connect(m_dataset, SIGNAL(domainChanged(const Domain&)), pie, SLOT(handleDomainChanged(const Domain&)));
138 QObject::connect(m_dataset, SIGNAL(domainChanged(const Domain&)), pie, SLOT(handleDomainChanged(const Domain&)));
142 m_chartItems.insert(series, pie);
139 m_chartItems.insert(series, pie);
143 break;
140 break;
144 }
141 }
145 default: {
142 default: {
146 qDebug()<< "Series type" << series->type() << "not implemented.";
143 qDebug()<< "Series type" << series->type() << "not implemented.";
147 break;
144 break;
148 }
145 }
149 }
146 }
150
147
151 if(m_rect.isValid()) emit geometryChanged(m_rect);
148 if(m_rect.isValid()) emit geometryChanged(m_rect);
152 }
149 }
153
150
154 void ChartPresenter::handleSeriesChanged(QChartSeries* series)
151 void ChartPresenter::handleSeriesChanged(QChartSeries* series)
155 {
152 {
156 //TODO:
153 //TODO:
157 }
154 }
158
155
159 void ChartPresenter::zoomInToRect(const QRectF& rect)
156 void ChartPresenter::zoomInToRect(const QRectF& rect)
160 {
157 {
161 if(!rect.isValid()) return;
158 if(!rect.isValid()) return;
162 QRectF r = rect.normalized();
159 QRectF r = rect.normalized();
163 r.translate(-m_marginSize, -m_marginSize);
160 r.translate(-m_marginSize, -m_marginSize);
164 Domain domain (m_dataset->domain().subDomain(r,m_rect.width(),m_rect.height()));
161 Domain domain (m_dataset->domain().subDomain(r,m_rect.width(),m_rect.height()));
165 m_dataset->addDomain(domain);
162 m_dataset->addDomain(domain);
166 }
163 }
167
164
168 void ChartPresenter::zoomIn()
165 void ChartPresenter::zoomIn()
169 {
166 {
170 if (!m_dataset->nextDomain()) {
167 if (!m_dataset->nextDomain()) {
171 QRectF rect = m_rect;
168 QRectF rect = m_rect;
172 rect.setWidth(rect.width()/2);
169 rect.setWidth(rect.width()/2);
173 rect.setHeight(rect.height()/2);
170 rect.setHeight(rect.height()/2);
174 rect.moveCenter(m_rect.center());
171 rect.moveCenter(m_rect.center());
175 Domain domain (m_dataset->domain().subDomain(rect,m_rect.width(),m_rect.height()));
172 Domain domain (m_dataset->domain().subDomain(rect,m_rect.width(),m_rect.height()));
176 m_dataset->addDomain(domain);
173 m_dataset->addDomain(domain);
177 }
174 }
178 }
175 }
179
176
180 void ChartPresenter::zoomOut()
177 void ChartPresenter::zoomOut()
181 {
178 {
182 m_dataset->previousDomain();
179 m_dataset->previousDomain();
183 }
180 }
184
181
185 void ChartPresenter::zoomReset()
182 void ChartPresenter::zoomReset()
186 {
183 {
187 m_dataset->clearDomains();
184 m_dataset->clearDomains();
188 }
185 }
189
186
190 void ChartPresenter::setChartTheme(QChart::ChartTheme theme)
187 void ChartPresenter::setChartTheme(QChart::ChartTheme theme)
191 {
188 {
192 delete m_chartTheme;
189 delete m_chartTheme;
193
190
194 m_chartTheme = ChartTheme::createTheme(theme);
191 m_chartTheme = ChartTheme::createTheme(theme);
195
192
196 m_chartTheme->decorate(m_chart);
193 m_chartTheme->decorate(m_chart);
197 QMapIterator<QChartSeries*,ChartItem*> i(m_chartItems);
194 QMapIterator<QChartSeries*,ChartItem*> i(m_chartItems);
198
195
199 int index=0;
196 int index=0;
200 while (i.hasNext()) {
197 while (i.hasNext()) {
201 i.next();
198 i.next();
202 index++;
199 index++;
203 m_chartTheme->decorate(i.value(),i.key(),index);
200 m_chartTheme->decorate(i.value(),i.key(),index);
204 }
201 }
205
202
206 m_chartTheme->decorate(m_axisX, m_axisXItem);
203 m_chartTheme->decorate(m_axisX, m_axisXItem);
207 m_chartTheme->decorate(m_axisY, m_axisYItem);
204 m_chartTheme->decorate(m_axisY, m_axisYItem);
208
205
209 }
206 }
210
207
211
208
212 QChart::ChartTheme ChartPresenter::chartTheme()
209 QChart::ChartTheme ChartPresenter::chartTheme()
213 {
210 {
214 return m_chartTheme->id();
211 return m_chartTheme->id();
215 }
212 }
216
213
217 void ChartPresenter::setDefaultAxisX(const QChartAxis& axis)
214 void ChartPresenter::setDefaultAxisX(const QChartAxis& axis)
218 {
215 {
219 //if(m_axisX != axis) {
216 //if(m_axisX != axis) {
220 m_axisX = axis;
217 m_axisX = axis;
221 m_axisXItem->handleAxisChanged(m_axisX);
218 m_axisXItem->handleAxisChanged(m_axisX);
222 //}
219 //}
223 }
220 }
224
221
225 void ChartPresenter::setDefaultAxisY(const QChartAxis& axis)
222 void ChartPresenter::setDefaultAxisY(const QChartAxis& axis)
226 {
223 {
227 // if(m_axisY != axis) {
224 // if(m_axisY != axis) {
228 m_axisY = axis;
225 m_axisY = axis;
229 m_axisYItem->handleAxisChanged(m_axisY);
226 m_axisYItem->handleAxisChanged(m_axisY);
230 //}
227 //}
231 }
228 }
232
229
233 QChartAxis ChartPresenter::defaultAxisX() const
230 QChartAxis ChartPresenter::defaultAxisX() const
234 {
231 {
235 return m_axisX;
232 return m_axisX;
236 }
233 }
237
234
238 QChartAxis ChartPresenter::defaultAxisY() const
235 QChartAxis ChartPresenter::defaultAxisY() const
239 {
236 {
240 return m_axisY;
237 return m_axisY;
241 }
238 }
242
239
243 QChartAxis ChartPresenter::axisY(int id) const
240 QChartAxis ChartPresenter::axisY(int id) const
244 {
241 {
245 return m_axis.value(id);
242 return m_axis.value(id);
246 }
243 }
247
244
248 int ChartPresenter::addAxisY(const QChartAxis& axis)
245 int ChartPresenter::addAxisY(const QChartAxis& axis)
249 {
246 {
250 int key =0 ;
247 int key =0 ;
251
248
252 while(m_axis.contains(key)){
249 while(m_axis.contains(key)){
253 key++;
250 key++;
254 //TODO overflow
251 //TODO overflow
255 }
252 }
256
253
257 m_axis.insert(key,axis);
254 m_axis.insert(key,axis);
258 m_axisItems.insert(key,new AxisItem(AxisItem::Y_AXIS,m_chart));
255 m_axisItems.insert(key,new AxisItem(AxisItem::Y_AXIS,m_chart));
259
256
260 return key;
257 return key;
261 }
258 }
262
259
263
260
264 void ChartPresenter::removeAxisY(int id)
261 void ChartPresenter::removeAxisY(int id)
265 {
262 {
266 m_axis.remove(id);
263 m_axis.remove(id);
267 delete m_axisItems.take(id);
264 delete m_axisItems.take(id);
268 }
265 }
269
266
270 #include "moc_chartpresenter_p.cpp"
267 #include "moc_chartpresenter_p.cpp"
271
268
272 QTCOMMERCIALCHART_END_NAMESPACE
269 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,247 +1,254
1 #include "charttheme_p.h"
1 #include "charttheme_p.h"
2 #include "qchart.h"
2 #include "qchart.h"
3 #include "qchartaxis.h"
3 #include "qchartaxis.h"
4
4
5
5
6 //series
6 //series
7 #include "barchartseries.h"
7 #include "barchartseries.h"
8 #include "stackedbarchartseries.h"
8 #include "stackedbarchartseries.h"
9 #include "percentbarchartseries.h"
9 #include "percentbarchartseries.h"
10 #include "qlinechartseries.h"
10 #include "qlinechartseries.h"
11 #include "qscatterseries.h"
11 #include "qscatterseries.h"
12 #include "qpieseries.h"
12 #include "qpieseries.h"
13 #include "qpieslice.h"
13
14
14 //items
15 //items
15 #include "axisitem_p.h"
16 #include "axisitem_p.h"
16 #include "bargroup.h"
17 #include "bargroup.h"
17 #include "stackedbargroup.h"
18 #include "stackedbargroup.h"
18 #include "linechartitem_p.h"
19 #include "linechartitem_p.h"
19 #include "percentbargroup.h"
20 #include "percentbargroup.h"
20 #include "scatterpresenter.h"
21 #include "scatterpresenter_p.h"
21 #include "piepresenter.h"
22 #include "piepresenter.h"
22
23
23 //themes
24 //themes
24 #include "chartthemevanilla_p.h"
25 #include "chartthemevanilla_p.h"
25 #include "chartthemeicy_p.h"
26 #include "chartthemeicy_p.h"
26 #include "chartthemegrayscale_p.h"
27 #include "chartthemegrayscale_p.h"
27 #include "chartthemescientific_p.h"
28 #include "chartthemescientific_p.h"
28
29
29
30
30 QTCOMMERCIALCHART_BEGIN_NAMESPACE
31 QTCOMMERCIALCHART_BEGIN_NAMESPACE
31
32
32 /* TODO
33 /* TODO
33 case QChart::ChartThemeUnnamed1:
34 case QChart::ChartThemeUnnamed1:
34 m_seriesThemes.append(SeriesTheme(QColor(QRgb(0xff3fa9f5)), 2));
35 m_seriesThemes.append(SeriesTheme(QColor(QRgb(0xff3fa9f5)), 2));
35 m_seriesThemes.append(SeriesTheme(QColor(QRgb(0xff7AC943)), 2));
36 m_seriesThemes.append(SeriesTheme(QColor(QRgb(0xff7AC943)), 2));
36 m_seriesThemes.append(SeriesTheme(QColor(QRgb(0xffFF931E)), 2));
37 m_seriesThemes.append(SeriesTheme(QColor(QRgb(0xffFF931E)), 2));
37 m_seriesThemes.append(SeriesTheme(QColor(QRgb(0xffFF1D25)), 2));
38 m_seriesThemes.append(SeriesTheme(QColor(QRgb(0xffFF1D25)), 2));
38 m_seriesThemes.append(SeriesTheme(QColor(QRgb(0xffFF7BAC)), 2));
39 m_seriesThemes.append(SeriesTheme(QColor(QRgb(0xffFF7BAC)), 2));
39
40
40 m_gradientStartColor = QColor(QRgb(0xfff3dc9e));
41 m_gradientStartColor = QColor(QRgb(0xfff3dc9e));
41 m_gradientEndColor = QColor(QRgb(0xffafafaf));
42 m_gradientEndColor = QColor(QRgb(0xffafafaf));
42 */
43 */
43
44
44 ChartTheme::ChartTheme(QChart::ChartTheme id)
45 ChartTheme::ChartTheme(QChart::ChartTheme id)
45 {
46 {
46 m_id = id;
47 m_id = id;
47 m_seriesColor.append(QRgb(0xff000000));
48 m_seriesColor.append(QRgb(0xff000000));
48 m_seriesColor.append(QRgb(0xff707070));
49 m_seriesColor.append(QRgb(0xff707070));
49 m_gradientStartColor = QColor(QRgb(0xffffffff));
50 m_gradientStartColor = QColor(QRgb(0xffffffff));
50 m_gradientEndColor = QColor(QRgb(0xffafafaf));
51 m_gradientEndColor = QColor(QRgb(0xffafafaf));
51 }
52 }
52
53
53
54
54 ChartTheme* ChartTheme::createTheme(QChart::ChartTheme theme)
55 ChartTheme* ChartTheme::createTheme(QChart::ChartTheme theme)
55 {
56 {
56 switch(theme) {
57 switch(theme) {
57 case QChart::ChartThemeDefault:
58 case QChart::ChartThemeDefault:
58 return new ChartTheme();
59 return new ChartTheme();
59 case QChart::ChartThemeVanilla:
60 case QChart::ChartThemeVanilla:
60 return new ChartThemeVanilla();
61 return new ChartThemeVanilla();
61 case QChart::ChartThemeIcy:
62 case QChart::ChartThemeIcy:
62 return new ChartThemeIcy();
63 return new ChartThemeIcy();
63 case QChart::ChartThemeGrayscale:
64 case QChart::ChartThemeGrayscale:
64 return new ChartThemeGrayscale();
65 return new ChartThemeGrayscale();
65 case QChart::ChartThemeScientific:
66 case QChart::ChartThemeScientific:
66 return new ChartThemeScientific();
67 return new ChartThemeScientific();
67 }
68 }
68 }
69 }
69
70
70 void ChartTheme::decorate(QChart* chart)
71 void ChartTheme::decorate(QChart* chart)
71 {
72 {
72 QLinearGradient backgroundGradient;
73 QLinearGradient backgroundGradient;
73 backgroundGradient.setColorAt(0.0, m_gradientStartColor);
74 backgroundGradient.setColorAt(0.0, m_gradientStartColor);
74 backgroundGradient.setColorAt(1.0, m_gradientEndColor);
75 backgroundGradient.setColorAt(1.0, m_gradientEndColor);
75 backgroundGradient.setCoordinateMode(QGradient::ObjectBoundingMode);
76 backgroundGradient.setCoordinateMode(QGradient::ObjectBoundingMode);
76 chart->setChartBackgroundBrush(backgroundGradient);
77 chart->setChartBackgroundBrush(backgroundGradient);
77 }
78 }
78 //TODO helper to by removed later
79 //TODO helper to by removed later
79 void ChartTheme::decorate(ChartItem* item, QChartSeries* series,int count)
80 void ChartTheme::decorate(ChartItem* item, QChartSeries* series,int count)
80 {
81 {
81 switch(series->type())
82 switch(series->type())
82 {
83 {
83 case QChartSeries::SeriesTypeLine: {
84 case QChartSeries::SeriesTypeLine: {
84 QLineChartSeries* s = static_cast<QLineChartSeries*>(series);
85 QLineChartSeries* s = static_cast<QLineChartSeries*>(series);
85 LineChartItem* i = static_cast<LineChartItem*>(item);
86 LineChartItem* i = static_cast<LineChartItem*>(item);
86 decorate(i,s,count);
87 decorate(i,s,count);
87 break;
88 break;
88 }
89 }
89 case QChartSeries::SeriesTypeBar: {
90 case QChartSeries::SeriesTypeBar: {
90 BarChartSeries* b = static_cast<BarChartSeries*>(series);
91 BarChartSeries* b = static_cast<BarChartSeries*>(series);
91 BarGroup* i = static_cast<BarGroup*>(item);
92 BarGroup* i = static_cast<BarGroup*>(item);
92 decorate(i,b,count);
93 decorate(i,b,count);
93 break;
94 break;
94 }
95 }
95 case QChartSeries::SeriesTypeStackedBar: {
96 case QChartSeries::SeriesTypeStackedBar: {
96 StackedBarChartSeries* s = static_cast<StackedBarChartSeries*>(series);
97 StackedBarChartSeries* s = static_cast<StackedBarChartSeries*>(series);
97 StackedBarGroup* i = static_cast<StackedBarGroup*>(item);
98 StackedBarGroup* i = static_cast<StackedBarGroup*>(item);
98 decorate(i,s,count);
99 decorate(i,s,count);
99 break;
100 break;
100 }
101 }
101 case QChartSeries::SeriesTypePercentBar: {
102 case QChartSeries::SeriesTypePercentBar: {
102 PercentBarChartSeries* s = static_cast<PercentBarChartSeries*>(series);
103 PercentBarChartSeries* s = static_cast<PercentBarChartSeries*>(series);
103 PercentBarGroup* i = static_cast<PercentBarGroup*>(item);
104 PercentBarGroup* i = static_cast<PercentBarGroup*>(item);
104 decorate(i,s,count);
105 decorate(i,s,count);
105 break;
106 break;
106 }
107 }
108 case QChartSeries::SeriesTypeScatter: {
109 QScatterSeries* s = qobject_cast<QScatterSeries*>(series);
110 Q_ASSERT(s);
111 ScatterPresenter* i = static_cast<ScatterPresenter*>(item);
112 Q_ASSERT(i);
113 decorate(i, s, count);
114 break;
115 }
107 case QChartSeries::SeriesTypePie: {
116 case QChartSeries::SeriesTypePie: {
108 QPieSeries* s = static_cast<QPieSeries*>(series);
117 QPieSeries* s = static_cast<QPieSeries*>(series);
109 PiePresenter* i = static_cast<PiePresenter*>(item);
118 PiePresenter* i = static_cast<PiePresenter*>(item);
110 decorate(i,s,count);
119 decorate(i,s,count);
111 break;
120 break;
112 }
121 }
113 default:
122 default:
114 qDebug()<<"Wrong item to be decorated by theme";
123 qDebug()<<"Wrong item to be decorated by theme";
115 break;
124 break;
116 }
125 }
117
126
118 }
127 }
119
128
120 void ChartTheme::decorate(LineChartItem* item, QLineChartSeries* series,int count)
129 void ChartTheme::decorate(LineChartItem* item, QLineChartSeries* series,int count)
121 {
130 {
122 QPen pen;
131 QPen pen;
123 if(pen != series->pen()){
132 if(pen != series->pen()){
124 item->setPen(series->pen());
133 item->setPen(series->pen());
125 return;
134 return;
126 }
135 }
127 pen.setColor(m_seriesColor.at(count%m_seriesColor.size()));
136 pen.setColor(m_seriesColor.at(count%m_seriesColor.size()));
128 pen.setWidthF(2);
137 pen.setWidthF(2);
129 item->setPen(pen);
138 item->setPen(pen);
130 }
139 }
131
140
132 void ChartTheme::decorate(BarGroup* item, BarChartSeries* series,int count)
141 void ChartTheme::decorate(BarGroup* item, BarChartSeries* series,int count)
133 {
142 {
134 // TODO: better way to descide series color and remove hard coded colors.
143 // TODO: better way to descide series color and remove hard coded colors.
135 item->resetBrushes();
144 item->resetBrushes();
136 for (int i=0; i<m_seriesColor.count(); i++) {
145 for (int i=0; i<m_seriesColor.count(); i++) {
137 QBrush brush(m_seriesColor.at(i));
146 QBrush brush(m_seriesColor.at(i));
138 item->addBrush(brush);
147 item->addBrush(brush);
139 }
148 }
140 item->addBrush(QBrush(QColor(255,0,0,128)));
149 item->addBrush(QBrush(QColor(255,0,0,128)));
141 item->addBrush(QBrush(QColor(255,255,0,128)));
150 item->addBrush(QBrush(QColor(255,255,0,128)));
142 item->addBrush(QBrush(QColor(0,255,0,128)));
151 item->addBrush(QBrush(QColor(0,255,0,128)));
143 item->addBrush(QBrush(QColor(0,0,255,128)));
152 item->addBrush(QBrush(QColor(0,0,255,128)));
144 item->addBrush(QBrush(QColor(255,128,0,128)));
153 item->addBrush(QBrush(QColor(255,128,0,128)));
145 }
154 }
146
155
147 void ChartTheme::decorate(StackedBarGroup* item, StackedBarChartSeries* series,int count)
156 void ChartTheme::decorate(StackedBarGroup* item, StackedBarChartSeries* series,int count)
148 {
157 {
149 // TODO: better way to descide series color and remove hard coded colors.
158 // TODO: better way to descide series color and remove hard coded colors.
150 item->resetBrushes();
159 item->resetBrushes();
151 for (int i=0; i<m_seriesColor.count(); i++) {
160 for (int i=0; i<m_seriesColor.count(); i++) {
152 QBrush brush(m_seriesColor.at(i));
161 QBrush brush(m_seriesColor.at(i));
153 item->addBrush(brush);
162 item->addBrush(brush);
154 }
163 }
155 item->addBrush(QBrush(QColor(255,0,0,128)));
164 item->addBrush(QBrush(QColor(255,0,0,128)));
156 item->addBrush(QBrush(QColor(255,255,0,128)));
165 item->addBrush(QBrush(QColor(255,255,0,128)));
157 item->addBrush(QBrush(QColor(0,255,0,128)));
166 item->addBrush(QBrush(QColor(0,255,0,128)));
158 item->addBrush(QBrush(QColor(0,0,255,128)));
167 item->addBrush(QBrush(QColor(0,0,255,128)));
159 item->addBrush(QBrush(QColor(255,128,0,128)));
168 item->addBrush(QBrush(QColor(255,128,0,128)));
160 }
169 }
161
170
162 void ChartTheme::decorate(PercentBarGroup* item, PercentBarChartSeries* series,int count)
171 void ChartTheme::decorate(PercentBarGroup* item, PercentBarChartSeries* series,int count)
163 {
172 {
164 // TODO: better way to descide series color and remove hard coded colors.
173 // TODO: better way to descide series color and remove hard coded colors.
165 item->resetBrushes();
174 item->resetBrushes();
166 for (int i=0; i<m_seriesColor.count(); i++) {
175 for (int i=0; i<m_seriesColor.count(); i++) {
167 QBrush brush(m_seriesColor.at(i));
176 QBrush brush(m_seriesColor.at(i));
168 item->addBrush(brush);
177 item->addBrush(brush);
169 }
178 }
170 item->addBrush(QBrush(QColor(255,0,0,128)));
179 item->addBrush(QBrush(QColor(255,0,0,128)));
171 item->addBrush(QBrush(QColor(255,255,0,128)));
180 item->addBrush(QBrush(QColor(255,255,0,128)));
172 item->addBrush(QBrush(QColor(0,255,0,128)));
181 item->addBrush(QBrush(QColor(0,255,0,128)));
173 item->addBrush(QBrush(QColor(0,0,255,128)));
182 item->addBrush(QBrush(QColor(0,0,255,128)));
174 item->addBrush(QBrush(QColor(255,128,0,128)));
183 item->addBrush(QBrush(QColor(255,128,0,128)));
175 }
184 }
176
185
177 void ChartTheme::decorate(ScatterPresenter* presenter, QScatterSeries* series, int count)
186 void ChartTheme::decorate(ScatterPresenter* presenter, QScatterSeries* series, int count)
178 {
187 {
179 Q_ASSERT(presenter);
188 Q_ASSERT(presenter);
180 Q_ASSERT(series);
189 Q_ASSERT(series);
181
190
182 presenter->m_markerPen.setColor(m_seriesColor.at(count % m_seriesColor.size()));
191 QColor color = m_seriesColor.at(count % m_seriesColor.size());
192 // TODO: define alpha in the theme? or in the series?
193 color.setAlpha(120);
194
195 QBrush brush(color, Qt::SolidPattern);
196 presenter->m_markerBrush = brush;
183
197
184 // QPen pen;
198 QPen pen(brush, 1);
185 // if(pen != series->pen()){
199 pen.setColor(color);
186 // item->setPen(series->pen());
200 presenter->m_markerPen = pen;
187 // return;
188 // }
189 // pen.setColor(m_seriesColor.at(count%m_seriesColor.size()));
190 // pen.setWidthF(2);
191 // item->setPen(pen);
192 }
201 }
193
202
194 void ChartTheme::decorate(PiePresenter* item, QPieSeries* series, int /*count*/)
203 void ChartTheme::decorate(PiePresenter* item, QPieSeries* series, int /*count*/)
195 {
204 {
196 // create a list of slice colors based on current theme
205 // create a list of slice colors based on current theme
197 int i = 0;
206 int i = 0;
198 QList<QColor> colors;
207 QList<QColor> colors;
199 while (colors.count() < series->count()) {
208 while (colors.count() < series->count()) {
200
209
201 // get base color
210 // get base color
202 QColor c = m_seriesColor[i++];
211 QColor c = m_seriesColor[i++];
203 i = i % m_seriesColor.count();
212 i = i % m_seriesColor.count();
204
213
205 // -1 means achromatic color -> cannot manipulate lightness
214 // -1 means achromatic color -> cannot manipulate lightness
206 // TODO: find a better way to randomize lightness
215 // TODO: find a better way to randomize lightness
207 if (c.toHsv().hue() == -1)
216 if (c.toHsv().hue() == -1)
208 qWarning() << "ChartTheme::decorate() warning: achromatic theme color";
217 qWarning() << "ChartTheme::decorate() warning: achromatic theme color";
209
218
210 // randomize lightness
219 // randomize lightness
211 qreal f = 50 + (qrand() % 100); // 50 is 50% darker, 100 is the same, 150 is 50% lighter
220 qreal f = 50 + (qrand() % 100); // 50 is 50% darker, 100 is the same, 150 is 50% lighter
212 c = c.lighter(f);
221 c = c.lighter(f);
213
222
214 // find duplicates
223 // find duplicates
215 bool isUnique = true;
224 bool isUnique = true;
216 foreach (QColor color, colors) {
225 foreach (QColor color, colors) {
217 if (c == color)
226 if (c == color)
218 isUnique = false;
227 isUnique = false;
219 }
228 }
220
229
221 // add to array if unique
230 // add to array if unique
222 //if (isUnique)
231 //if (isUnique)
223 colors << c;
232 colors << c;
224 }
233 }
225
234
226 // finally update colors
235 // finally update colors
227 foreach (QPieSliceId id, series->ids()) {
236 foreach (QPieSlice* s, series->slices()) {
228 QPieSlice s = series->slice(id);
237 s->setPen(QPen(Qt::black)); // TODO: get from theme
229 s.setPen(QPen(Qt::black)); // TODO: get from theme
238 s->setBrush(colors.takeFirst());
230 s.setBrush(colors.takeFirst());
231 series->update(s);
232 }
239 }
233 }
240 }
234
241
235
242
236 void ChartTheme::decorate(QChartAxis& axis,AxisItem* item)
243 void ChartTheme::decorate(QChartAxis& axis,AxisItem* item)
237 {
244 {
238 //TODO: dummy defults for now
245 //TODO: dummy defults for now
239
246
240 axis.setLabelsBrush(Qt::black);
247 axis.setLabelsBrush(Qt::black);
241 axis.setLabelsPen(Qt::NoPen);
248 axis.setLabelsPen(Qt::NoPen);
242 axis.setShadesPen(Qt::NoPen);
249 axis.setShadesPen(Qt::NoPen);
243 axis.setShadesOpacity(0.5);
250 axis.setShadesOpacity(0.5);
244 item->handleAxisChanged(axis);
251 item->handleAxisChanged(axis);
245 }
252 }
246
253
247 QTCOMMERCIALCHART_END_NAMESPACE
254 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,16 +1,18
1 INCLUDEPATH += $$PWD
1 INCLUDEPATH += $$PWD
2 DEPENDPATH += $$PWD
2 DEPENDPATH += $$PWD
3
3
4 SOURCES += \
4 SOURCES += \
5 $$PWD/qpieseries.cpp \
5 $$PWD/qpieseries.cpp \
6 $$PWD/pieslice.cpp \
6 $$PWD/pieslice.cpp \
7 $$PWD/piepresenter.cpp \
7 $$PWD/piepresenter.cpp \
8 $$PWD/pieslicelabel.cpp
8 $$PWD/pieslicelabel.cpp \
9 $$PWD/qpieslice.cpp
9
10
10 PRIVATE_HEADERS += \
11 PRIVATE_HEADERS += \
11 $$PWD/piepresenter.h \
12 $$PWD/piepresenter.h \
12 $$PWD/pieslice.h \
13 $$PWD/pieslice.h \
13 $$PWD/pieslicelabel.h
14 $$PWD/pieslicelabel.h
14
15
15 PUBLIC_HEADERS += \
16 PUBLIC_HEADERS += \
16 $$PWD/qpieseries.h
17 $$PWD/qpieseries.h \
18 $$PWD/qpieslice.h
@@ -1,170 +1,155
1
1
2 #include "piepresenter.h"
2 #include "piepresenter.h"
3 #include "pieslice.h"
3 #include "pieslice.h"
4 #include "qpieslice.h"
4 #include <QDebug>
5 #include <QDebug>
5 #include <QTime>
6 #include <QTime>
6
7
7 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8
9
9 PiePresenter::PiePresenter(QGraphicsItem *parent, QPieSeries *series)
10 PiePresenter::PiePresenter(QGraphicsItem *parent, QPieSeries *series)
10 :ChartItem(parent),
11 :ChartItem(parent),
11 m_series(series)
12 m_series(series)
12 {
13 {
13 Q_ASSERT(series);
14 Q_ASSERT(series);
14 connect(series, SIGNAL(changed(const QPieSeries::ChangeSet&)), this, SLOT(handleSeriesChanged(const QPieSeries::ChangeSet&)));
15 connect(series, SIGNAL(changed(const QPieSeries::ChangeSet&)), this, SLOT(handleSeriesChanged(const QPieSeries::ChangeSet&)));
15 connect(series, SIGNAL(sizeFactorChanged()), this, SLOT(updateGeometry()));
16 connect(series, SIGNAL(sizeFactorChanged()), this, SLOT(updateGeometry()));
16 connect(series, SIGNAL(positionChanged()), this, SLOT(updateGeometry()));
17 connect(series, SIGNAL(positionChanged()), this, SLOT(updateGeometry()));
17 }
18 }
18
19
19 PiePresenter::~PiePresenter()
20 PiePresenter::~PiePresenter()
20 {
21 {
21 // slices deleted automatically through QGraphicsItem
22 // slices deleted automatically through QGraphicsItem
22 }
23 }
23
24
24 void PiePresenter::paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *)
25 void PiePresenter::paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *)
25 {
26 {
26 // TODO: paint shadows for all components
27 // TODO: paint shadows for all components
27 // - get paths from items & merge & offset and draw with shadow color?
28 // - get paths from items & merge & offset and draw with shadow color?
28 }
29 }
29
30
30 void PiePresenter::handleSeriesChanged(const QPieSeries::ChangeSet& changeSet)
31 void PiePresenter::handleSeriesChanged(const QPieSeries::ChangeSet& changeSet)
31 {
32 {
32 qDebug() << "PiePresenter::handleSeriesChanged()";
33 //qDebug() << "PiePresenter::handleSeriesChanged()";
33 qDebug() << " added : " << changeSet.m_added;
34 //qDebug() << " added : " << changeSet.added();
34 qDebug() << " changed: " << changeSet.m_changed;
35 //qDebug() << " changed: " << changeSet.changed();
35 qDebug() << " removed: " << changeSet.m_removed;
36 //qDebug() << " removed: " << changeSet.removed();
36
37
37 // ignore changeset when there are no visual slices
38 // ignore changeset when there are no visual slices
38 // changeset might not be valid about the added slices
39 // changeset might not be valid about the added slices
39 if (m_slices.count() == 0) {
40 if (m_slices.count() == 0) {
40 foreach (QPieSliceId id, m_series->m_slices.keys())
41 foreach (QPieSlice* s, m_series->m_slices)
41 addSlice(id);
42 addSlice(s);
42 return;
43 return;
43 }
44 }
44
45
45 foreach (QPieSliceId id, changeSet.m_removed)
46 foreach (QPieSlice* s, changeSet.removed())
46 deleteSlice(id);
47 deleteSlice(s);
47
48
48 foreach (QPieSliceId id, changeSet.m_changed)
49 foreach (QPieSlice* s, changeSet.added())
49 updateSlice(id);
50 addSlice(s);
51 }
50
52
51 foreach (QPieSliceId id, changeSet.m_added)
53 void PiePresenter::handleDomainChanged(const Domain& domain)
52 addSlice(id);
54 {
55 // TODO
56 }
57
58 void PiePresenter::handleGeometryChanged(const QRectF& rect)
59 {
60 m_rect = rect;
61 updateGeometry();
53 }
62 }
54
63
55 void PiePresenter::updateGeometry()
64 void PiePresenter::updateGeometry()
56 {
65 {
57 prepareGeometryChange();
66 prepareGeometryChange();
58
67
59 m_pieRect = m_rect;
68 QRectF pieRect = m_rect;
60
69
61 if (m_pieRect.width() < m_pieRect.height()) {
70 if (pieRect.width() < pieRect.height()) {
62 m_pieRect.setWidth(m_pieRect.width() * m_series->sizeFactor());
71 pieRect.setWidth(pieRect.width() * m_series->sizeFactor());
63 m_pieRect.setHeight(m_pieRect.width());
72 pieRect.setHeight(pieRect.width());
64 m_pieRect.moveCenter(m_rect.center());
73 pieRect.moveCenter(m_rect.center());
65 } else {
74 } else {
66 m_pieRect.setHeight(m_pieRect.height() * m_series->sizeFactor());
75 pieRect.setHeight(pieRect.height() * m_series->sizeFactor());
67 m_pieRect.setWidth(m_pieRect.height());
76 pieRect.setWidth(pieRect.height());
68 m_pieRect.moveCenter(m_rect.center());
77 pieRect.moveCenter(m_rect.center());
69 }
78 }
70
79
71 switch (m_series->position()) {
80 switch (m_series->position()) {
72 case QPieSeries::PiePositionTopLeft: {
81 case QPieSeries::PiePositionTopLeft: {
73 m_pieRect.setHeight(m_pieRect.height() / 2);
82 pieRect.setHeight(pieRect.height() / 2);
74 m_pieRect.setWidth(m_pieRect.height());
83 pieRect.setWidth(pieRect.height());
75 m_pieRect.moveCenter(QPointF(m_rect.center().x() / 2, m_rect.center().y() / 2));
84 pieRect.moveCenter(QPointF(m_rect.center().x() / 2, m_rect.center().y() / 2));
76 break;
85 break;
77 }
86 }
78 case QPieSeries::PiePositionTopRight: {
87 case QPieSeries::PiePositionTopRight: {
79 m_pieRect.setHeight(m_pieRect.height() / 2);
88 pieRect.setHeight(pieRect.height() / 2);
80 m_pieRect.setWidth(m_pieRect.height());
89 pieRect.setWidth(pieRect.height());
81 m_pieRect.moveCenter(QPointF((m_rect.center().x() / 2) * 3, m_rect.center().y() / 2));
90 pieRect.moveCenter(QPointF((m_rect.center().x() / 2) * 3, m_rect.center().y() / 2));
82 break;
91 break;
83 }
92 }
84 case QPieSeries::PiePositionBottomLeft: {
93 case QPieSeries::PiePositionBottomLeft: {
85 m_pieRect.setHeight(m_pieRect.height() / 2);
94 pieRect.setHeight(pieRect.height() / 2);
86 m_pieRect.setWidth(m_pieRect.height());
95 pieRect.setWidth(pieRect.height());
87 m_pieRect.moveCenter(QPointF(m_rect.center().x() / 2, (m_rect.center().y() / 2) * 3));
96 pieRect.moveCenter(QPointF(m_rect.center().x() / 2, (m_rect.center().y() / 2) * 3));
88 break;
97 break;
89 }
98 }
90 case QPieSeries::PiePositionBottomRight: {
99 case QPieSeries::PiePositionBottomRight: {
91 m_pieRect.setHeight(m_pieRect.height() / 2);
100 pieRect.setHeight(pieRect.height() / 2);
92 m_pieRect.setWidth(m_pieRect.height());
101 pieRect.setWidth(pieRect.height());
93 m_pieRect.moveCenter(QPointF((m_rect.center().x() / 2) * 3, (m_rect.center().y() / 2) * 3));
102 pieRect.moveCenter(QPointF((m_rect.center().x() / 2) * 3, (m_rect.center().y() / 2) * 3));
94 break;
103 break;
95 }
104 }
96 default:
105 default:
97 break;
106 break;
98 }
107 }
99
108
100 // update slice geometry
109 if (m_pieRect != pieRect) {
101 const qreal fullPie = 360;
110 m_pieRect = pieRect;
102 qreal angle = 0;
111 //qDebug() << "PiePresenter::updateGeometry()" << m_pieRect;
103 foreach (QPieSliceId id, m_slices.keys()) {
112 foreach (PieSlice* s, m_slices.values()) {
104 qreal span = fullPie * m_series->slice(id).percentage();
113 s->setPieRect(m_pieRect);
105 m_slices[id]->updateGeometry(m_pieRect, angle, span);
114 s->updateGeometry();
106 angle += span;
115 }
107 }
116 }
108
109 //qDebug() << "PiePresenter::updateGeometry" << m_rect << m_pieRect;
110 }
117 }
111
118
112 void PiePresenter::handleDomainChanged(const Domain& domain)
119 void PiePresenter::addSlice(QPieSlice* sliceData)
113 {
120 {
114 // TODO
121 //qDebug() << "PiePresenter::addSlice()" << sliceData;
115 }
116
122
117 void PiePresenter::handleGeometryChanged(const QRectF& rect)
123 if (m_slices.keys().contains(sliceData)) {
118 {
124 //qWarning() << "PiePresenter::addSlice(): slice already exists!" << sliceData;
119 m_rect = rect;
125 Q_ASSERT(0);
120 updateGeometry();
121 }
122
123 void PiePresenter::addSlice(QPieSliceId id)
124 {
125 qDebug() << "PiePresenter::addSlice()" << id;
126
127 if (m_slices.contains(id)) {
128 qWarning() << "PiePresenter::addSlice(): slice already exists!" << id;
129 updateSlice(id);
130 return;
126 return;
131 }
127 }
132
128
133 // create slice
129 // create slice
134 PieSlice *slice = new PieSlice(id, m_series, this);
130 PieSlice *slice = new PieSlice(this);
135 m_slices.insert(id, slice);
131 slice->updateData(sliceData);
136
132 m_slices.insert(sliceData, slice);
137 updateGeometry();
133
134 // connect signals
135 connect(sliceData, SIGNAL(changed()), slice, SLOT(handleSliceDataChanged()));
136 connect(slice, SIGNAL(clicked()), sliceData, SIGNAL(clicked()));
137 connect(slice, SIGNAL(hoverEnter()), sliceData, SIGNAL(hoverEnter()));
138 connect(slice, SIGNAL(hoverLeave()), sliceData, SIGNAL(hoverLeave()));
138 }
139 }
139
140
140 void PiePresenter::updateSlice(QPieSliceId id)
141 void PiePresenter::deleteSlice(QPieSlice* sliceData)
141 {
142 {
142 qDebug() << "PiePresenter::updateSlice()" << id;
143 //qDebug() << "PiePresenter::deleteSlice()" << sliceData;
143
144
144 // TODO: animation
145 if (m_slices.contains(sliceData))
145 if (m_slices.contains(id))
146 delete m_slices.take(sliceData);
146 m_slices.value(id)->updateData();
147 else {
147 else {
148 qWarning() << "PiePresenter::updateSlice(): slice does not exist!" << id;
148 // nothing to remove
149 addSlice(id);
149 Q_ASSERT(0); // TODO: remove before release
150 }
150 }
151
152 updateGeometry();
153 }
154
155 void PiePresenter::deleteSlice(QPieSliceId id)
156 {
157 qDebug() << "PiePresenter::deleteSlice()" << id;
158
159 // TODO: animation
160 if (m_slices.contains(id))
161 delete m_slices.take(id);
162 else
163 qWarning() << "PiePresenter::deleteSlice(): slice does not exist!" << id;
164
165 updateGeometry();
166 }
151 }
167
152
168 #include "moc_piepresenter.cpp"
153 #include "moc_piepresenter.cpp"
169
154
170 QTCOMMERCIALCHART_END_NAMESPACE
155 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,49 +1,48
1 #ifndef PIEPRESENTER_H
1 #ifndef PIEPRESENTER_H
2 #define PIEPRESENTER_H
2 #define PIEPRESENTER_H
3
3
4 #include "chartitem_p.h"
4 #include "chartitem_p.h"
5 #include "qpieseries.h"
5 #include "qpieseries.h"
6 #include <QSignalMapper>
6 #include <QSignalMapper>
7
7
8 class QGraphicsItem;
8 class QGraphicsItem;
9 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9 QTCOMMERCIALCHART_BEGIN_NAMESPACE
10 class PieSlice;
10 class PieSlice;
11
11
12 class PiePresenter : public QObject, public ChartItem
12 class PiePresenter : public QObject, public ChartItem
13 {
13 {
14 Q_OBJECT
14 Q_OBJECT
15
15
16 public:
16 public:
17 // TODO: use a generic data class instead of x and y
17 // TODO: use a generic data class instead of x and y
18 PiePresenter(QGraphicsItem *parent, QPieSeries *series);
18 PiePresenter(QGraphicsItem *parent, QPieSeries *series);
19 ~PiePresenter();
19 ~PiePresenter();
20
20
21 public: // from QGraphicsItem
21 public: // from QGraphicsItem
22 QRectF boundingRect() const { return m_rect; }
22 QRectF boundingRect() const { return m_rect; }
23 void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
23 void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
24
24
25 public:
25 public:
26 QRectF pieRect() const { return m_pieRect; }
26 QRectF pieRect() const { return m_pieRect; }
27
27
28 public Q_SLOTS:
28 public Q_SLOTS:
29 void handleSeriesChanged(const QPieSeries::ChangeSet& changeSet);
29 void handleSeriesChanged(const QPieSeries::ChangeSet& changeSet);
30 void handleDomainChanged(const Domain& domain);
30 void handleDomainChanged(const Domain& domain);
31 void handleGeometryChanged(const QRectF& rect);
31 void handleGeometryChanged(const QRectF& rect);
32 void updateGeometry();
32 void updateGeometry();
33
33
34 private:
34 private:
35 void addSlice(QPieSliceId id);
35 void addSlice(QPieSlice* sliceData);
36 void updateSlice(QPieSliceId id);
36 void deleteSlice(QPieSlice* sliceData);
37 void deleteSlice(QPieSliceId id);
38
37
39 private:
38 private:
40 friend class PieSlice;
39 friend class PieSlice;
41 QHash<QPieSliceId, PieSlice*> m_slices;
40 QHash<QPieSlice*, PieSlice*> m_slices;
42 QPieSeries *m_series;
41 QPieSeries *m_series;
43 QRectF m_rect;
42 QRectF m_rect;
44 QRectF m_pieRect;
43 QRectF m_pieRect;
45 };
44 };
46
45
47 QTCOMMERCIALCHART_END_NAMESPACE
46 QTCOMMERCIALCHART_END_NAMESPACE
48
47
49 #endif // PIEPRESENTER_H
48 #endif // PIEPRESENTER_H
@@ -1,142 +1,143
1 #include "pieslice.h"
1 #include "pieslice.h"
2 #include "pieslicelabel.h"
2 #include "pieslicelabel.h"
3 #include "piepresenter.h"
3 #include "piepresenter.h"
4 #include "qpieseries.h"
4 #include "qpieseries.h"
5 #include "qpieslice.h"
5 #include <QPainter>
6 #include <QPainter>
6 #include <QDebug>
7 #include <QDebug>
7 #include <qmath.h>
8 #include <qmath.h>
8 #include <QGraphicsSceneEvent>
9 #include <QGraphicsSceneEvent>
9 #include <QTime>
10 #include <QTime>
10
11
11 QTCOMMERCIALCHART_BEGIN_NAMESPACE
12 QTCOMMERCIALCHART_BEGIN_NAMESPACE
12
13
13 #define PI 3.14159265
14 #define PI 3.14159265
14 #define EXPLODE_OFFSET 20
15 #define EXPLODE_OFFSET 20
15
16
16 QPointF offset(qreal angle, qreal length)
17 QPointF offset(qreal angle, qreal length)
17 {
18 {
18 qreal dx = qSin(angle*(PI/180)) * length;
19 qreal dx = qSin(angle*(PI/180)) * length;
19 qreal dy = qCos(angle*(PI/180)) * length;
20 qreal dy = qCos(angle*(PI/180)) * length;
20 return QPointF(dx, -dy);
21 return QPointF(dx, -dy);
21 }
22 }
22
23
23 PieSlice::PieSlice(QPieSliceId id, QPieSeries *series, QGraphicsItem* parent)
24 PieSlice::PieSlice(QGraphicsItem* parent)
24 :QGraphicsObject(parent),
25 :QGraphicsObject(parent),
25 m_id(id),
26 m_series(series),
27 m_slicelabel(new PieSliceLabel(this)),
26 m_slicelabel(new PieSliceLabel(this)),
28 m_isHovering(false)
27 m_angle(0),
28 m_span(0),
29 m_isExploded(false)
29 {
30 {
30 Q_ASSERT(series);
31 setAcceptHoverEvents(true);
31 setAcceptHoverEvents(true);
32 setAcceptedMouseButtons(Qt::LeftButton);
32 setAcceptedMouseButtons(Qt::LeftButton);
33 updateData();
34 }
33 }
35
34
36 PieSlice::~PieSlice()
35 PieSlice::~PieSlice()
37 {
36 {
38 qDebug() << "~PieSlice()" << m_id;
37
39 }
38 }
40
39
41 QRectF PieSlice::boundingRect() const
40 QRectF PieSlice::boundingRect() const
42 {
41 {
43 return m_rect;
42 return m_path.boundingRect();
44 }
43 }
45
44
46 QPainterPath PieSlice::shape() const
45 QPainterPath PieSlice::shape() const
47 {
46 {
48 return m_path;
47 return m_path;
49 }
48 }
50
49
51 void PieSlice::paint(QPainter* painter, const QStyleOptionGraphicsItem* /*option*/, QWidget* /*widget*/)
50 void PieSlice::paint(QPainter* painter, const QStyleOptionGraphicsItem* /*option*/, QWidget* /*widget*/)
52 {
51 {
53 // set hover brush
54 // TODO: what if we are using gradients...
55 QBrush brush = m_data.brush();
56 if (m_isHovering)
57 brush.setColor(brush.color().lighter());
58
59 painter->setRenderHint(QPainter::Antialiasing);
52 painter->setRenderHint(QPainter::Antialiasing);
60 painter->setPen(m_data.pen());
53 painter->setPen(m_pen);
61 painter->setBrush(brush);
54 painter->setBrush(m_brush);
62 painter->drawPath(m_path);
55 painter->drawPath(m_path);
63 }
56 }
64
57
65 void PieSlice::hoverEnterEvent(QGraphicsSceneHoverEvent* /*event*/)
58 void PieSlice::hoverEnterEvent(QGraphicsSceneHoverEvent* /*event*/)
66 {
59 {
67 m_isHovering = true;
60 emit hoverEnter();
68 update();
69 // TODO: emit hoverEnter()
70 }
61 }
71
62
72 void PieSlice::hoverLeaveEvent(QGraphicsSceneHoverEvent* /*event*/)
63 void PieSlice::hoverLeaveEvent(QGraphicsSceneHoverEvent* /*event*/)
73 {
64 {
74 m_isHovering = false;
65 emit hoverLeave();
75 update();
76 // TODO: emit hoverLeave()
77 }
66 }
78
67
79 void PieSlice::mousePressEvent(QGraphicsSceneMouseEvent* /*event*/)
68 void PieSlice::mousePressEvent(QGraphicsSceneMouseEvent* /*event*/)
80 {
69 {
81 // TODO: emit clicked
70 emit clicked();
82 // TODO: should we let the user decide if this can be exploded?
71 }
83 m_data.setExploded(!m_data.isExploded());
72
84 m_series->update(m_data);
73 void PieSlice::setPieRect(QRectF rect)
74 {
75 m_pieRect = rect;
85 }
76 }
86
77
87 void PieSlice::updateGeometry(QRectF rect, qreal startAngle, qreal span)
78 void PieSlice::updateGeometry()
88 {
79 {
89 prepareGeometryChange();
80 prepareGeometryChange();
90
81
91 // calculate center angle
82 // calculate center angle
92 qreal centerAngle = startAngle + (span/2);
83 qreal centerAngle = m_angle + (m_span/2);
93
84
94 // adjust rect for exploding
85 // adjust rect for exploding
86 QRectF rect = m_pieRect;
95 rect.adjust(EXPLODE_OFFSET, EXPLODE_OFFSET, -EXPLODE_OFFSET ,-EXPLODE_OFFSET);
87 rect.adjust(EXPLODE_OFFSET, EXPLODE_OFFSET, -EXPLODE_OFFSET ,-EXPLODE_OFFSET);
96 if (m_data.isExploded()) {
88 if (m_isExploded) {
97 QPointF d = offset((centerAngle), EXPLODE_OFFSET);
89 QPointF d = offset((centerAngle), EXPLODE_OFFSET);
98 rect.translate(d.x(), d.y());
90 rect.translate(d.x(), d.y());
99 }
91 }
100
92
101 // update slice path
93 // update slice path
102 // TODO: draw the shape so that it might have a hole in the center
94 // TODO: draw the shape so that it might have a hole in the center
103 QPainterPath path;
95 QPainterPath path;
104 path.moveTo(rect.center());
96 path.moveTo(rect.center());
105 path.arcTo(rect, -startAngle + 90, -span);
97 path.arcTo(rect, -m_angle + 90, -m_span);
98 path.closeSubpath();
106 m_path = path;
99 m_path = path;
107 m_rect = path.boundingRect();
108
100
109 // update label position
101 // update label position
110 qreal radius = rect.height() / 2;
102 qreal radius = rect.height() / 2;
111 QPointF edgeCenter = rect.center() + offset(centerAngle, radius + 5);
103 QPointF edgeCenter = rect.center() + offset(centerAngle, radius + 5);
112
104
113 m_slicelabel->setArmStartPoint(edgeCenter);
105 m_slicelabel->setArmStartPoint(edgeCenter);
114 m_slicelabel->setArmAngle(centerAngle);
106 m_slicelabel->setArmAngle(centerAngle);
115 m_slicelabel->setArmLength(50);
116 m_slicelabel->updateGeometry();
107 m_slicelabel->updateGeometry();
117
108
118 //qDebug() << "PieSlice::updateGeometry" << m_rect;
109 //qDebug() << "PieSlice::updateGeometry" << m_slicelabel->text() << boundingRect() << m_angle << m_span;
110 }
111
112 void PieSlice::handleSliceDataChanged()
113 {
114 QPieSlice *slice = qobject_cast<QPieSlice*>(sender());
115 Q_ASSERT(slice);
116 updateData(slice);
119 }
117 }
120
118
121 void PieSlice::updateData()
119 void PieSlice::updateData(const QPieSlice* sliceData)
122 {
120 {
123 if (!m_series->m_slices.contains(m_id))
121 // TODO: compare what has changes to avoid unneccesary geometry updates
124 qWarning() << "PieSlice::updateData(): cannot find slice data!" << m_id;
125
122
126 QPieSlice data = m_series->slice(m_id);
123 m_angle = sliceData->angle();
127 // TODO: find out what has changed and trigger some animation
124 m_span = sliceData->span();
128 m_data = data;
125 m_isExploded = sliceData->isExploded();
126 m_pen = sliceData->pen();
127 m_brush = sliceData->brush();
129
128
129 updateGeometry();
130 update();
130 update();
131
131
132 m_slicelabel->setVisible(m_data.isLabelVisible());
132 m_slicelabel->setVisible(sliceData->isLabelVisible());
133 m_slicelabel->setText(m_data.label());
133 m_slicelabel->setText(sliceData->label());
134 //m_slicelabel->setPen(m_data.labelPen());
134 m_slicelabel->setPen(sliceData->labelPen());
135 //m_slicelabel->setFont(m_data.labelFont());
135 m_slicelabel->setFont(sliceData->labelFont());
136 m_slicelabel->setArmLength(sliceData->labelArmLenght());
136 m_slicelabel->updateGeometry(); // text size & font modifies the geometry
137 m_slicelabel->updateGeometry(); // text size & font modifies the geometry
137 m_slicelabel->update();
138 m_slicelabel->update();
138 }
139 }
139
140
140 #include "moc_pieslice.cpp"
141 #include "moc_pieslice.cpp"
141
142
142 QTCOMMERCIALCHART_END_NAMESPACE
143 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,51 +1,60
1 #ifndef PIESLICE_H
1 #ifndef PIESLICE_H
2 #define PIESLICE_H
2 #define PIESLICE_H
3
3
4 #include "qchartglobal.h"
4 #include "qchartglobal.h"
5 #include "charttheme_p.h"
5 #include "charttheme_p.h"
6 #include "qpieseries.h"
6 #include "qpieseries.h"
7 #include <QGraphicsItem>
7 #include <QGraphicsItem>
8 #include <QRectF>
8 #include <QRectF>
9 #include <QColor>
9 #include <QColor>
10 #include <QPen>
10 #include <QPen>
11
11
12 QTCOMMERCIALCHART_BEGIN_NAMESPACE
12 QTCOMMERCIALCHART_BEGIN_NAMESPACE
13 class PiePresenter;
13 class PiePresenter;
14 class PieSliceLabel;
14 class PieSliceLabel;
15 class QPieSlice;
15
16
16 class PieSlice : public QGraphicsObject
17 class PieSlice : public QGraphicsObject
17 {
18 {
18 Q_OBJECT
19 Q_OBJECT
19
20
20 public:
21 public:
21 PieSlice(QPieSliceId id, QPieSeries *series, QGraphicsItem* parent = 0);
22 PieSlice(QGraphicsItem* parent = 0);
22 ~PieSlice();
23 ~PieSlice();
23
24
24 public: // from QGraphicsItem
25 public: // from QGraphicsItem
25 QRectF boundingRect() const;
26 QRectF boundingRect() const;
26 QPainterPath shape() const;
27 QPainterPath shape() const;
27 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
28 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
28 void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
29 void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
29 void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
30 void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
30 void mousePressEvent(QGraphicsSceneMouseEvent *event);
31 void mousePressEvent(QGraphicsSceneMouseEvent *event);
31
32
32 Q_SIGNALS:
33 Q_SIGNALS:
33 void clicked();
34 void clicked();
35 void hoverEnter();
36 void hoverLeave();
34
37
35 public:
38 public Q_SLOTS:
36 void updateGeometry(QRectF rect, qreal startAngle, qreal span);
39 void handleSliceDataChanged();
37 void updateData();
40 void setPieRect(QRectF rect);
41 void updateGeometry();
42 void updateData(const QPieSlice *sliceData);
38
43
39 private:
44 private:
40 QPieSliceId m_id;
41 QPieSeries* m_series;
42 QPieSlice m_data;
43 PieSliceLabel* m_slicelabel;
45 PieSliceLabel* m_slicelabel;
46
47 QRectF m_pieRect;
44 QPainterPath m_path;
48 QPainterPath m_path;
45 QRectF m_rect;
49
46 bool m_isHovering;
50 qreal m_angle;
51 qreal m_span;
52 bool m_isExploded;
53
54 QPen m_pen;
55 QBrush m_brush;
47 };
56 };
48
57
49 QTCOMMERCIALCHART_END_NAMESPACE
58 QTCOMMERCIALCHART_END_NAMESPACE
50
59
51 #endif // PIESLICE_H
60 #endif // PIESLICE_H
@@ -1,152 +1,299
1 #include "qpieseries.h"
1 #include "qpieseries.h"
2 #include "qpieslice.h"
2 #include "piepresenter.h"
3 #include "piepresenter.h"
3 #include "pieslice.h"
4 #include "pieslice.h"
4 #include <QDebug>
5 #include <QDebug>
5
6
6 QTCOMMERCIALCHART_BEGIN_NAMESPACE
7 QTCOMMERCIALCHART_BEGIN_NAMESPACE
7
8
8 QPieSeries::QPieSeries(QObject *parent) :
9 void QPieSeries::ChangeSet::appendAdded(QPieSlice* slice)
9 QChartSeries(parent),
10 m_sizeFactor(1.0),
11 m_position(PiePositionMaximized),
12 m_sliceIdSeed(0)
13 {
10 {
11 if (!m_added.contains(slice))
12 m_added << slice;
14 }
13 }
15
14
16 QPieSeries::~QPieSeries()
15 void QPieSeries::ChangeSet::appendChanged(QPieSlice* slice)
16 {
17 if (!m_changed.contains(slice))
18 m_changed << slice;
19 }
20
21 void QPieSeries::ChangeSet::appendRemoved(QPieSlice* slice)
17 {
22 {
23 if (!m_removed.contains(slice))
24 m_removed << slice;
25 }
18
26
27 QList<QPieSlice*> QPieSeries::ChangeSet::added() const
28 {
29 return m_added;
19 }
30 }
20
31
21 bool QPieSeries::setData(QList<qreal> data)
32 QList<QPieSlice*> QPieSeries::ChangeSet::changed() const
22 {
33 {
23 // TODO: remove this function
34 return m_changed;
24 QList<QPieSlice> slices;
25 foreach (int value, data)
26 slices << QPieSlice(value, QString::number(value));
27 return set(slices);
28 }
35 }
29
36
30 bool QPieSeries::set(const QList<QPieSlice>& slices)
37 QList<QPieSlice*> QPieSeries::ChangeSet::removed() const
31 {
38 {
32 if (!slices.count())
39 return m_removed;
40 }
41
42 bool QPieSeries::ChangeSet::isEmpty() const
43 {
44 if (m_added.count() || m_changed.count() || m_removed.count())
33 return false;
45 return false;
46 return true;
47 }
34
48
35 ChangeSet changeSet;
36
49
37 foreach (QPieSlice s, m_slices.values())
50 QPieSeries::QPieSeries(QObject *parent) :
38 changeSet.m_removed << s.id();
51 QChartSeries(parent),
52 m_sizeFactor(1.0),
53 m_position(PiePositionMaximized),
54 m_pieStartAngle(0),
55 m_pieSpan(360)
56 {
39
57
40 m_slices.clear();
58 }
41
59
42 foreach (QPieSlice s, slices) {
60 QPieSeries::~QPieSeries()
43 s.m_id = generateSliceId();
61 {
44 m_slices.insert(s.id(), s);
45 changeSet.m_added << s.id();
46 }
47
62
48 updateDerivativeData();
63 }
49 emit changed(changeSet);
50
64
65 bool QPieSeries::setData(QList<qreal> data)
66 {
67 // TODO: remove this function
68 QList<QPieSlice*> slices;
69 foreach (int value, data)
70 slices << new QPieSlice(value, QString::number(value));
71 set(slices);
51 return true;
72 return true;
52 }
73 }
53
74
54 bool QPieSeries::add(const QList<QPieSlice>& slices)
75 void QPieSeries::set(QList<QPieSlice*> slices)
55 {
76 {
56 if (!slices.count())
77 clear();
57 return false;
78 add(slices);
79 }
58
80
81 void QPieSeries::add(QList<QPieSlice*> slices)
82 {
59 ChangeSet changeSet;
83 ChangeSet changeSet;
60 foreach (QPieSlice s, slices) {
84 foreach (QPieSlice* s, slices) {
61 s.m_id = generateSliceId();
85 s->setParent(this);
62 m_slices.insert(s.id(), s);
86 m_slices << s;
63 changeSet.m_added << s.id();
87 changeSet.appendAdded(s);
64 }
88 }
65
89
66 updateDerivativeData();
90 updateDerivativeData();
67 emit changed(changeSet);
68
91
69 return true;
92 foreach (QPieSlice* s, slices) {
93 connect(s, SIGNAL(changed()), this, SLOT(sliceChanged()));
94 connect(s, SIGNAL(clicked()), this, SLOT(sliceClicked()));
95 connect(s, SIGNAL(hoverEnter()), this, SLOT(sliceHoverEnter()));
96 connect(s, SIGNAL(hoverLeave()), this, SLOT(sliceHoverLeave()));
97 }
98
99 emit changed(changeSet);
70 }
100 }
71
101
72 bool QPieSeries::add(const QPieSlice& slice)
102 void QPieSeries::add(QPieSlice* slice)
73 {
103 {
74 return add(QList<QPieSlice>() << slice);
104 add(QList<QPieSlice*>() << slice);
75 }
105 }
76
106
77 bool QPieSeries::update(const QPieSlice& slice)
107 QPieSlice* QPieSeries::add(qreal value, QString name)
78 {
108 {
79 if (!m_slices.contains(slice.id()))
109 QPieSlice* slice = new QPieSlice(value, name);
80 return false; // series does not contain this slice
110 add(slice);
111 return slice;
112 }
81
113
82 m_slices[slice.id()] = slice;
114 void QPieSeries::remove(QPieSlice* slice)
115 {
116 if (!m_slices.removeOne(slice)) {
117 Q_ASSERT(0); // TODO: remove before release
118 return;
119 }
83
120
84 ChangeSet changeSet;
121 ChangeSet changeSet;
85 changeSet.m_changed << slice.id();
122 changeSet.appendRemoved(slice);
86 updateDerivativeData();
87 emit changed(changeSet);
123 emit changed(changeSet);
88
124
89 return true;
125 delete slice;
126 slice = NULL;
127
128 updateDerivativeData();
90 }
129 }
91
130
92 bool QPieSeries::remove(QPieSliceId id)
131 void QPieSeries::clear()
93 {
132 {
94 if (!m_slices.contains(id))
133 if (m_slices.count() == 0)
95 return false; // series does not contain this slice
134 return;
96
97 m_slices.remove(id);
98
135
99 ChangeSet changeSet;
136 ChangeSet changeSet;
100 changeSet.m_removed << id;
137 foreach (QPieSlice* s, m_slices) {
101 updateDerivativeData();
138 changeSet.appendRemoved(s);
139 m_slices.removeOne(s);
140 delete s;
141 }
102 emit changed(changeSet);
142 emit changed(changeSet);
103
143 updateDerivativeData();
104 return true;
105 }
106
107 QPieSlice QPieSeries::slice(QPieSliceId id) const
108 {
109 return m_slices.value(id);
110 }
144 }
111
145
112 void QPieSeries::setSizeFactor(qreal factor)
146 void QPieSeries::setSizeFactor(qreal factor)
113 {
147 {
114 if (factor < 0.0)
148 if (factor < 0.0)
115 return;
149 return;
116
150
117 if (m_sizeFactor != factor) {
151 if (m_sizeFactor != factor) {
118 m_sizeFactor = factor;
152 m_sizeFactor = factor;
119 emit sizeFactorChanged();
153 emit sizeFactorChanged();
120 }
154 }
121 }
155 }
122
156
123 void QPieSeries::setPosition(PiePosition position)
157 void QPieSeries::setPosition(PiePosition position)
124 {
158 {
125 if (m_position != position) {
159 if (m_position != position) {
126 m_position = position;
160 m_position = position;
127 emit positionChanged();
161 emit positionChanged();
128 }
162 }
129 }
163 }
130
164
131 QPieSliceId QPieSeries::generateSliceId()
165 void QPieSeries::setSpan(qreal startAngle, qreal span)
166 {
167 if (startAngle >= 0 && startAngle < 360 &&
168 span > 0 && span <= 360) {
169 m_pieStartAngle = startAngle;
170 m_pieSpan = span;
171 updateDerivativeData();
172 }
173 }
174
175 void QPieSeries::setLabelsVisible(bool visible)
176 {
177 foreach (QPieSlice* s, m_slices)
178 s->setLabelVisible(visible);
179 }
180
181 void QPieSeries::enableClickExplodes(bool enable)
132 {
182 {
133 // Id is quint64 so it should be enough for us.
183 if (enable)
134 // Note that id is not unique between pie series.
184 connect(this, SIGNAL(clicked(QPieSlice*)), this, SLOT(toggleExploded(QPieSlice*)));
135 return m_sliceIdSeed++;
185 else
186 disconnect(this, SLOT(toggleExploded(QPieSlice*)));
187 }
188
189 void QPieSeries::enableHoverHighlight(bool enable)
190 {
191 if (enable) {
192 connect(this, SIGNAL(hoverEnter(QPieSlice*)), this, SLOT(highlightOn(QPieSlice*)));
193 connect(this, SIGNAL(hoverLeave(QPieSlice*)), this, SLOT(highlightOff(QPieSlice*)));
194 } else {
195 disconnect(this, SLOT(hoverEnter(QPieSlice*)));
196 disconnect(this, SLOT(hoverLeave(QPieSlice*)));
197 }
198 }
199
200 void QPieSeries::sliceChanged()
201 {
202 QPieSlice* slice = qobject_cast<QPieSlice *>(sender());
203 Q_ASSERT(m_slices.contains(slice));
204
205 ChangeSet changeSet;
206 changeSet.appendChanged(slice);
207 emit changed(changeSet);
208
209 updateDerivativeData();
210 }
211
212 void QPieSeries::sliceClicked()
213 {
214 QPieSlice* slice = qobject_cast<QPieSlice *>(sender());
215 Q_ASSERT(m_slices.contains(slice));
216 emit clicked(slice);
217 }
218
219 void QPieSeries::sliceHoverEnter()
220 {
221 QPieSlice* slice = qobject_cast<QPieSlice *>(sender());
222 Q_ASSERT(m_slices.contains(slice));
223 emit hoverEnter(slice);
224 }
225
226 void QPieSeries::sliceHoverLeave()
227 {
228 QPieSlice* slice = qobject_cast<QPieSlice *>(sender());
229 Q_ASSERT(m_slices.contains(slice));
230 emit hoverLeave(slice);
231 }
232
233 void QPieSeries::toggleExploded(QPieSlice* slice)
234 {
235 Q_ASSERT(slice);
236 slice->setExploded(!slice->isExploded());
237 }
238
239 void QPieSeries::highlightOn(QPieSlice* slice)
240 {
241 Q_ASSERT(slice);
242 QColor c = slice->brush().color().lighter();
243 slice->setBrush(c);
244 }
245
246 void QPieSeries::highlightOff(QPieSlice* slice)
247 {
248 Q_ASSERT(slice);
249 QColor c = slice->brush().color().darker(150);
250 slice->setBrush(c);
136 }
251 }
137
252
138 void QPieSeries::updateDerivativeData()
253 void QPieSeries::updateDerivativeData()
139 {
254 {
140 m_total = 0;
255 m_total = 0;
141 foreach (const QPieSlice& s, m_slices.values())
142 m_total += s.value();
143
256
144 Q_ASSERT(m_total > 0); // TODO: remove this before release
257 // nothing to do?
258 if (m_slices.count() == 0)
259 return;
260
261 // calculate total
262 foreach (QPieSlice* s, m_slices)
263 m_total += s->value();
264
265 // we must have some values
266 Q_ASSERT(m_total > 0); // TODO
145
267
146 foreach (QPieSliceId id, m_slices.keys())
268 // update slice attributes
147 m_slices[id].m_percentage = m_slices.value(id).value() / m_total;
269 qreal sliceAngle = m_pieStartAngle;
270 foreach (QPieSlice* s, m_slices) {
271
272 bool changed = false;
273
274 qreal percentage = s->value() / m_total;
275 if (s->m_percentage != percentage) {
276 s->m_percentage = percentage;
277 changed = true;
278 }
279
280 qreal sliceSpan = m_pieSpan * percentage;
281 if (s->m_span != sliceSpan) {
282 s->m_span = sliceSpan;
283 changed = true;
284 }
285
286 if (s->m_angle != sliceAngle) {
287 s->m_angle = sliceAngle;
288 changed = true;
289 }
290 sliceAngle += sliceSpan;
291
292 if (changed)
293 emit s->changed();
294 }
148 }
295 }
149
296
150 #include "moc_qpieseries.cpp"
297 #include "moc_qpieseries.cpp"
151
298
152 QTCOMMERCIALCHART_END_NAMESPACE
299 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,163 +1,127
1 #ifndef PIESERIES_H
1 #ifndef PIESERIES_H
2 #define PIESERIES_H
2 #define PIESERIES_H
3
3
4 #include "qchartseries.h"
4 #include "qchartseries.h"
5 #include <QObject>
5 #include <QObject>
6 #include <QRectF>
6 #include <QRectF>
7 #include <QColor>
7 #include <QColor>
8 #include <QPen>
8 #include <QPen>
9 #include <QBrush>
9 #include <QBrush>
10 #include <QSignalMapper>
10
11
11 class QGraphicsObject;
12 class QGraphicsObject;
12 QTCOMMERCIALCHART_BEGIN_NAMESPACE
13 QTCOMMERCIALCHART_BEGIN_NAMESPACE
13 class PiePresenter;
14 class PiePresenter;
14 class PieSlice;
15 class PieSlice;
15
16 class QPieSlice;
16 typedef quint64 QPieSliceId;
17
18 class QPieSlice
19 {
20 public:
21 QPieSlice()
22 :m_id(-1), m_value(0), m_isLabelVisible(true), m_isExploded(false), m_percentage(0) {}
23
24 QPieSlice(qreal value, QString label = QString(), bool labelVisible = true, bool exploded = false, QPen pen = QPen(), QBrush brush = QBrush())
25 :m_id(-1), m_value(value), m_label(label), m_isLabelVisible(labelVisible), m_isExploded(exploded), m_pen(pen), m_brush(brush), m_percentage(0) {}
26
27 QPieSliceId id() const { return m_id; }
28
29 void setValue(qreal value) { m_value = value; }
30 qreal value() const { return m_value; }
31
32 void setLabel(QString label) { m_label = label; }
33 QString label() const { return m_label; }
34
35 void setLabelVisible(bool visible) { m_isLabelVisible = visible; }
36 bool isLabelVisible() const { return m_isLabelVisible; }
37
38 // TODO:
39 //void setLabelPen(QPen pen) {};
40 //QPen labelPen() const {};
41 //void setLabelFont(QFont font);
42 //QFont labelFont() const;
43 //void setLabelArmLenght(qreal len) {};
44 //qreal labelArmLenght() const {};
45
46 void setExploded(bool exploded) { m_isExploded = exploded; }
47 bool isExploded() const { return m_isExploded; }
48
49 void setPen(QPen pen) { m_pen = pen; }
50 QPen pen() const { return m_pen; }
51
52 void setBrush(QBrush brush) { m_brush = brush; }
53 QBrush brush() const { return m_brush; }
54
55 qreal percentage() const { return m_percentage; }
56
57 private:
58
59 // TODO: use private class
60 friend class QPieSeries;
61
62 QPieSliceId m_id;
63 qreal m_value;
64 QString m_label;
65 bool m_isLabelVisible;
66 bool m_isExploded;
67
68 QPen m_pen;
69 QBrush m_brush;
70
71 qreal m_percentage; // generated content
72 };
73
17
74 class QTCOMMERCIALCHART_EXPORT QPieSeries : public QChartSeries
18 class QTCOMMERCIALCHART_EXPORT QPieSeries : public QChartSeries
75 {
19 {
76 Q_OBJECT
20 Q_OBJECT
77
21
78 public:
22 public:
79 enum PiePosition {
23 enum PiePosition {
80 PiePositionMaximized = 0,
24 PiePositionMaximized = 0,
81 PiePositionTopLeft,
25 PiePositionTopLeft,
82 PiePositionTopRight,
26 PiePositionTopRight,
83 PiePositionBottomLeft,
27 PiePositionBottomLeft,
84 PiePositionBottomRight
28 PiePositionBottomRight
85 };
29 };
86
30
87 class ChangeSet
31 class ChangeSet
88 {
32 {
89 public:
33 public:
90 QList<QPieSliceId> m_added;
34 void appendAdded(QPieSlice* slice);
91 QList<QPieSliceId> m_removed;
35 void appendChanged(QPieSlice* slice);
92 QList<QPieSliceId> m_changed;
36 void appendRemoved(QPieSlice* slice);
37
38 QList<QPieSlice*> added() const;
39 QList<QPieSlice*> changed() const;
40 QList<QPieSlice*> removed() const;
41
42 bool isEmpty() const;
43
44 private:
45 QList<QPieSlice*> m_added;
46 QList<QPieSlice*> m_changed;
47 QList<QPieSlice*> m_removed;
93 };
48 };
94
49
95 public:
50 public:
96 QPieSeries(QObject *parent = 0);
51 QPieSeries(QObject *parent = 0);
97 ~QPieSeries();
52 virtual ~QPieSeries();
98
53
99 public: // from QChartSeries
54 public: // from QChartSeries
100 QChartSeriesType type() const { return QChartSeries::SeriesTypePie; }
55 QChartSeriesType type() const { return QChartSeries::SeriesTypePie; }
101 virtual bool setData(QList<qreal> data); // TODO: remove this
56 virtual bool setData(QList<qreal> data); // TODO: remove this
102
57
103 public:
58 public:
104 // TODO: should we return id/bool or what?
59 void set(QList<QPieSlice*> slices);
105 // TODO: should we prefer passing a modifiable reference?
60 void add(QList<QPieSlice*> slices);
106 bool set(const QList<QPieSlice>& slices);
61 void add(QPieSlice* slice);
107 bool add(const QList<QPieSlice>& slices);
62 QPieSlice* add(qreal value, QString name);
108 bool add(const QPieSlice& slice);
63 void remove(QPieSlice* slice);
109 bool update(const QPieSlice& slice);
64 void clear();
110 bool remove(QPieSliceId id);
111
65
112 int count() const { return m_slices.count(); }
66 int count() const { return m_slices.count(); }
113
67
114 QList<QPieSlice> slices() const { return m_slices.values(); }
68 QList<QPieSlice*> slices() const { return m_slices; }
115 QList<QPieSliceId> ids() const { return m_slices.keys(); }
116 QPieSlice slice(QPieSliceId id) const;
117
69
118 // TODO: sorting?
70 // TODO: find slices?
71 // QList<QPieSlice*> findByValue(qreal value);
72 // ...
119
73
120 // TODO: convenience functions?
74 // TODO: sorting slices?
121 //void setValue(QPieSliceId id, qreal value);
75 // void sort(QPieSeries::SortByValue)
122 //void setLabel(QPieSliceId id, QString label);
123 //void setPen(QPieSliceId id, QPen pen);
124 //void setBrush(QPieSliceId id, QBrush brush);
125 //void setExploded(QPieSliceId id, bool exploded);
126
76
127 void setSizeFactor(qreal sizeFactor);
77 void setSizeFactor(qreal sizeFactor);
128 qreal sizeFactor() const { return m_sizeFactor; }
78 qreal sizeFactor() const { return m_sizeFactor; }
129
79
130 void setPosition(PiePosition position);
80 void setPosition(PiePosition position);
131 PiePosition position() const { return m_position; }
81 PiePosition position() const { return m_position; }
132
82
83 void setSpan(qreal startAngle, qreal span);
84
85 void setLabelsVisible(bool visible);
86 void enableClickExplodes(bool enable);
87 void enableHoverHighlight(bool enable);
88
133 Q_SIGNALS:
89 Q_SIGNALS:
134 void changed(const QPieSeries::ChangeSet& changeSet);
90 void changed(const QPieSeries::ChangeSet& changeSet);
91 void clicked(QPieSlice* slice);
92 void hoverEnter(QPieSlice* slice);
93 void hoverLeave(QPieSlice* slice);
135 void sizeFactorChanged();
94 void sizeFactorChanged();
136 void positionChanged();
95 void positionChanged();
137
96
138 // TODO:
97 private Q_SLOTS: // should be private and not in the interface
139 //void sliceClicked(QPieSliceId id);
98 void sliceChanged();
140 // ?? void sliceHoverEnter(QPieSliceId id);
99 void sliceClicked();
141 // ?? void sliceHoverLeave(QPieSliceId id);
100 void sliceHoverEnter();
101 void sliceHoverLeave();
102
103 void toggleExploded(QPieSlice* slice);
104 void highlightOn(QPieSlice* slice);
105 void highlightOff(QPieSlice* slice);
142
106
143 private:
107 private:
144 QPieSliceId generateSliceId();
145 void updateDerivativeData();
108 void updateDerivativeData();
146
109
147 private:
110 private:
148 Q_DISABLE_COPY(QPieSeries)
111 Q_DISABLE_COPY(QPieSeries)
149
112
150 // TODO: use PIML
113 // TODO: use PIML
151 friend class PiePresenter;
114 friend class PiePresenter;
152 friend class PieSlice;
115 friend class PieSlice;
153
116
154 QHash<QPieSliceId, QPieSlice> m_slices;
117 QList<QPieSlice*> m_slices;
155 qreal m_sizeFactor;
118 qreal m_sizeFactor;
156 PiePosition m_position;
119 PiePosition m_position;
157 qreal m_total;
120 qreal m_total;
158 QPieSliceId m_sliceIdSeed;
121 qreal m_pieStartAngle;
122 qreal m_pieSpan;
159 };
123 };
160
124
161 QTCOMMERCIALCHART_END_NAMESPACE
125 QTCOMMERCIALCHART_END_NAMESPACE
162
126
163 #endif // PIESERIES_H
127 #endif // PIESERIES_H
@@ -1,209 +1,209
1 #include "qchart.h"
1 #include "qchart.h"
2 #include "qscatterseries.h"
3 #include "qscatterseries_p.h"
4 #include "qpieseries.h"
5 #include "qchartaxis.h"
2 #include "qchartaxis.h"
6 #include "chartpresenter_p.h"
3 #include "chartpresenter_p.h"
7 #include "chartdataset_p.h"
4 #include "chartdataset_p.h"
8
5
9 //series
6 //series
10 #include "barchartseries.h"
7 #include "barchartseries.h"
11 #include "stackedbarchartseries.h"
8 #include "stackedbarchartseries.h"
12 #include "percentbarchartseries.h"
9 #include "percentbarchartseries.h"
13 #include "qlinechartseries.h"
10 #include "qlinechartseries.h"
11 #include "qscatterseries.h"
12 //#include "scatterseries_p.h"
13 #include "qpieseries.h"
14
14
15 #include <QGraphicsScene>
15 #include <QGraphicsScene>
16 #include <QGraphicsSceneResizeEvent>
16 #include <QGraphicsSceneResizeEvent>
17 #include <QDebug>
17 #include <QDebug>
18
18
19 QTCOMMERCIALCHART_BEGIN_NAMESPACE
19 QTCOMMERCIALCHART_BEGIN_NAMESPACE
20
20
21 QChart::QChart(QGraphicsItem *parent, Qt::WindowFlags wFlags) : QGraphicsWidget(parent,wFlags),
21 QChart::QChart(QGraphicsItem *parent, Qt::WindowFlags wFlags) : QGraphicsWidget(parent,wFlags),
22 m_backgroundItem(0),
22 m_backgroundItem(0),
23 m_titleItem(0),
23 m_titleItem(0),
24 m_dataset(new ChartDataSet(this)),
24 m_dataset(new ChartDataSet(this)),
25 m_presenter(new ChartPresenter(this,m_dataset))
25 m_presenter(new ChartPresenter(this,m_dataset))
26 {
26 {
27 }
27 }
28
28
29 QChart::~QChart() {}
29 QChart::~QChart() {}
30
30
31 void QChart::addSeries(QChartSeries* series)
31 void QChart::addSeries(QChartSeries* series)
32 {
32 {
33 m_dataset->addSeries(series);
33 m_dataset->addSeries(series);
34 }
34 }
35
35
36 //TODO on review, is it really needed ??
36 //TODO on review, is it really needed ??
37 QChartSeries* QChart::createSeries(QChartSeries::QChartSeriesType type)
37 QChartSeries* QChart::createSeries(QChartSeries::QChartSeriesType type)
38 {
38 {
39 QChartSeries *series(0);
39 QChartSeries *series(0);
40
40
41 switch (type) {
41 switch (type) {
42 case QChartSeries::SeriesTypeLine: {
42 case QChartSeries::SeriesTypeLine: {
43 series = new QLineChartSeries(this);
43 series = new QLineChartSeries(this);
44 break;
44 break;
45 }
45 }
46 case QChartSeries::SeriesTypeBar: {
46 case QChartSeries::SeriesTypeBar: {
47 //series = new BarChartSeries(this);
47 //series = new BarChartSeries(this);
48 break;
48 break;
49 }
49 }
50 case QChartSeries::SeriesTypeStackedBar: {
50 case QChartSeries::SeriesTypeStackedBar: {
51 //series = new StackedBarChartSeries(this);
51 //series = new StackedBarChartSeries(this);
52 break;
52 break;
53 }
53 }
54 case QChartSeries::SeriesTypePercentBar: {
54 case QChartSeries::SeriesTypePercentBar: {
55 //series = new PercentBarChartSeries(this);
55 //series = new PercentBarChartSeries(this);
56 break;
56 break;
57 }
57 }
58 case QChartSeries::SeriesTypeScatter: {
58 case QChartSeries::SeriesTypeScatter: {
59 series = new QScatterSeries(this);
59 series = new QScatterSeries(this);
60 break;
60 break;
61 }
61 }
62 case QChartSeries::SeriesTypePie: {
62 case QChartSeries::SeriesTypePie: {
63 series = new QPieSeries(this);
63 series = new QPieSeries(this);
64 break;
64 break;
65 }
65 }
66 default:
66 default:
67 Q_ASSERT(false);
67 Q_ASSERT(false);
68 break;
68 break;
69 }
69 }
70
70
71 addSeries(series);
71 addSeries(series);
72 return series;
72 return series;
73 }
73 }
74
74
75 void QChart::setChartBackgroundBrush(const QBrush& brush)
75 void QChart::setChartBackgroundBrush(const QBrush& brush)
76 {
76 {
77
77
78 if(!m_backgroundItem) {
78 if(!m_backgroundItem) {
79 m_backgroundItem = new QGraphicsRectItem(this);
79 m_backgroundItem = new QGraphicsRectItem(this);
80 m_backgroundItem->setZValue(-1);
80 m_backgroundItem->setZValue(-1);
81 }
81 }
82
82
83 m_backgroundItem->setBrush(brush);
83 m_backgroundItem->setBrush(brush);
84 m_backgroundItem->update();
84 m_backgroundItem->update();
85 }
85 }
86
86
87 void QChart::setChartBackgroundPen(const QPen& pen)
87 void QChart::setChartBackgroundPen(const QPen& pen)
88 {
88 {
89
89
90 if(!m_backgroundItem) {
90 if(!m_backgroundItem) {
91 m_backgroundItem = new QGraphicsRectItem(this);
91 m_backgroundItem = new QGraphicsRectItem(this);
92 m_backgroundItem->setZValue(-1);
92 m_backgroundItem->setZValue(-1);
93 }
93 }
94
94
95 m_backgroundItem->setPen(pen);
95 m_backgroundItem->setPen(pen);
96 m_backgroundItem->update();
96 m_backgroundItem->update();
97 }
97 }
98
98
99 void QChart::setChartTitle(const QString& title)
99 void QChart::setChartTitle(const QString& title)
100 {
100 {
101 if(!m_titleItem) m_titleItem = new QGraphicsTextItem(this);
101 if(!m_titleItem) m_titleItem = new QGraphicsTextItem(this);
102 m_titleItem->setPlainText(title);
102 m_titleItem->setPlainText(title);
103 }
103 }
104
104
105 void QChart::setChartTitleFont(const QFont& font)
105 void QChart::setChartTitleFont(const QFont& font)
106 {
106 {
107 if(!m_titleItem) m_titleItem = new QGraphicsTextItem(this);
107 if(!m_titleItem) m_titleItem = new QGraphicsTextItem(this);
108 m_titleItem->setFont(font);
108 m_titleItem->setFont(font);
109 }
109 }
110
110
111 int QChart::margin() const
111 int QChart::margin() const
112 {
112 {
113 return m_presenter->margin();
113 return m_presenter->margin();
114 }
114 }
115
115
116 void QChart::setMargin(int margin)
116 void QChart::setMargin(int margin)
117 {
117 {
118 m_presenter->setMargin(margin);
118 m_presenter->setMargin(margin);
119 }
119 }
120
120
121 void QChart::setChartTheme(QChart::ChartTheme theme)
121 void QChart::setChartTheme(QChart::ChartTheme theme)
122 {
122 {
123 m_presenter->setChartTheme(theme);
123 m_presenter->setChartTheme(theme);
124 }
124 }
125
125
126 QChart::ChartTheme QChart::chartTheme() const
126 QChart::ChartTheme QChart::chartTheme() const
127 {
127 {
128 return m_presenter->chartTheme();
128 return m_presenter->chartTheme();
129 }
129 }
130
130
131 void QChart::zoomInToRect(const QRectF& rectangle)
131 void QChart::zoomInToRect(const QRectF& rectangle)
132 {
132 {
133 m_presenter->zoomInToRect(rectangle);
133 m_presenter->zoomInToRect(rectangle);
134 }
134 }
135
135
136 void QChart::zoomIn()
136 void QChart::zoomIn()
137 {
137 {
138 m_presenter->zoomIn();
138 m_presenter->zoomIn();
139 }
139 }
140
140
141 void QChart::zoomOut()
141 void QChart::zoomOut()
142 {
142 {
143 m_presenter->zoomOut();
143 m_presenter->zoomOut();
144 }
144 }
145
145
146 void QChart::zoomReset()
146 void QChart::zoomReset()
147 {
147 {
148 m_presenter->zoomReset();
148 m_presenter->zoomReset();
149 }
149 }
150
150
151 void QChart::setDefaultAxisX(const QChartAxis& axis)
151 void QChart::setDefaultAxisX(const QChartAxis& axis)
152 {
152 {
153 m_presenter->setDefaultAxisX(axis);
153 m_presenter->setDefaultAxisX(axis);
154 }
154 }
155
155
156 void QChart::setDefaultAxisY(const QChartAxis& axis)
156 void QChart::setDefaultAxisY(const QChartAxis& axis)
157 {
157 {
158 m_presenter->setDefaultAxisY(axis);
158 m_presenter->setDefaultAxisY(axis);
159 }
159 }
160
160
161 QChartAxis QChart::defaultAxisX() const
161 QChartAxis QChart::defaultAxisX() const
162 {
162 {
163 return m_presenter->defaultAxisX();
163 return m_presenter->defaultAxisX();
164 }
164 }
165
165
166 QChartAxis QChart::defaultAxisY() const
166 QChartAxis QChart::defaultAxisY() const
167 {
167 {
168 return m_presenter->defaultAxisY();
168 return m_presenter->defaultAxisY();
169 }
169 }
170
170
171 int QChart::addAxisY(const QChartAxis& axis)
171 int QChart::addAxisY(const QChartAxis& axis)
172 {
172 {
173 return m_presenter->addAxisY(axis);
173 return m_presenter->addAxisY(axis);
174 }
174 }
175
175
176 QChartAxis QChart::axisY(int id) const
176 QChartAxis QChart::axisY(int id) const
177 {
177 {
178 return m_presenter->axisY(id);
178 return m_presenter->axisY(id);
179 }
179 }
180
180
181 void QChart::removeAxisY(int id)
181 void QChart::removeAxisY(int id)
182 {
182 {
183 m_presenter->removeAxisY(id);
183 m_presenter->removeAxisY(id);
184 }
184 }
185
185
186 void QChart::resizeEvent(QGraphicsSceneResizeEvent *event)
186 void QChart::resizeEvent(QGraphicsSceneResizeEvent *event)
187 {
187 {
188
188
189 m_rect = QRectF(QPoint(0,0),event->newSize());
189 m_rect = QRectF(QPoint(0,0),event->newSize());
190 QRectF rect = m_rect.adjusted(margin(),margin(), -margin(), -margin());
190 QRectF rect = m_rect.adjusted(margin(),margin(), -margin(), -margin());
191
191
192 // recalculate title position
192 // recalculate title position
193 if (m_titleItem) {
193 if (m_titleItem) {
194 QPointF center = m_rect.center() -m_titleItem->boundingRect().center();
194 QPointF center = m_rect.center() -m_titleItem->boundingRect().center();
195 m_titleItem->setPos(center.x(),m_rect.top()/2 + margin()/2);
195 m_titleItem->setPos(center.x(),m_rect.top()/2 + margin()/2);
196 }
196 }
197
197
198 //recalculate background gradient
198 //recalculate background gradient
199 if (m_backgroundItem) {
199 if (m_backgroundItem) {
200 m_backgroundItem->setRect(rect);
200 m_backgroundItem->setRect(rect);
201 }
201 }
202
202
203 QGraphicsWidget::resizeEvent(event);
203 QGraphicsWidget::resizeEvent(event);
204 update();
204 update();
205 }
205 }
206
206
207 #include "moc_qchart.cpp"
207 #include "moc_qchart.cpp"
208
208
209 QTCOMMERCIALCHART_END_NAMESPACE
209 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,241 +1,241
1 #include "qchartview.h"
1 #include "qchartview.h"
2 #include "qchart.h"
2 #include "qchart.h"
3 #include "qchartaxis.h"
3 #include "qchartaxis.h"
4 #include <QGraphicsView>
4 #include <QGraphicsView>
5 #include <QGraphicsScene>
5 #include <QGraphicsScene>
6 #include <QRubberBand>
6 #include <QRubberBand>
7 #include <QResizeEvent>
7 #include <QResizeEvent>
8 #include <QDebug>
8 #include <QDebug>
9
9
10 QTCOMMERCIALCHART_BEGIN_NAMESPACE
10 QTCOMMERCIALCHART_BEGIN_NAMESPACE
11
11
12 QChartView::QChartView(QWidget *parent) :
12 QChartView::QChartView(QWidget *parent) :
13 QGraphicsView(parent),
13 QGraphicsView(parent),
14 m_scene(new QGraphicsScene()),
14 m_scene(new QGraphicsScene(this)),
15 m_chart(new QChart()),
15 m_chart(new QChart()),
16 m_rubberBand(0),
16 m_rubberBand(0),
17 m_verticalRubberBand(false),
17 m_verticalRubberBand(false),
18 m_horizonalRubberBand(false)
18 m_horizonalRubberBand(false)
19 {
19 {
20 setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
20 setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
21 setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
21 setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
22 setScene(m_scene);
22 setScene(m_scene);
23 m_chart->setMargin(50);
23 m_chart->setMargin(50);
24 m_scene->addItem(m_chart);
24 m_scene->addItem(m_chart);
25 setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
25 setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
26 }
26 }
27
27
28 QChartView::~QChartView()
28 QChartView::~QChartView()
29 {
29 {
30 }
30 }
31
31
32 void QChartView::resizeEvent(QResizeEvent *event)
32 void QChartView::resizeEvent(QResizeEvent *event)
33 {
33 {
34 m_scene->setSceneRect(0,0,size().width(),size().height());
34 m_scene->setSceneRect(0,0,size().width(),size().height());
35 m_chart->resize(size());
35 m_chart->resize(size());
36 QWidget::resizeEvent(event);
36 QWidget::resizeEvent(event);
37 }
37 }
38
38
39 void QChartView::addSeries(QChartSeries* series)
39 void QChartView::addSeries(QChartSeries* series)
40 {
40 {
41 m_chart->addSeries(series);
41 m_chart->addSeries(series);
42 }
42 }
43
43
44 QChartSeries* QChartView::createSeries(QChartSeries::QChartSeriesType type)
44 QChartSeries* QChartView::createSeries(QChartSeries::QChartSeriesType type)
45 {
45 {
46
46
47 return m_chart->createSeries(type);
47 return m_chart->createSeries(type);
48 }
48 }
49
49
50 void QChartView::zoomInToRect(const QRect& rectangle)
50 void QChartView::zoomInToRect(const QRect& rectangle)
51 {
51 {
52 m_chart->zoomInToRect(rectangle);
52 m_chart->zoomInToRect(rectangle);
53 }
53 }
54
54
55 void QChartView::zoomIn()
55 void QChartView::zoomIn()
56 {
56 {
57 m_chart->zoomIn();
57 m_chart->zoomIn();
58 }
58 }
59
59
60 void QChartView::zoomOut()
60 void QChartView::zoomOut()
61 {
61 {
62 m_chart->zoomOut();
62 m_chart->zoomOut();
63 }
63 }
64
64
65 int QChartView::margin() const
65 int QChartView::margin() const
66 {
66 {
67 return m_chart->margin();
67 return m_chart->margin();
68 }
68 }
69
69
70 void QChartView::setChartTitle(const QString& title)
70 void QChartView::setChartTitle(const QString& title)
71 {
71 {
72 m_chart->setChartTitle(title);
72 m_chart->setChartTitle(title);
73 }
73 }
74
74
75 void QChartView::setChartTitleFont(const QFont& font)
75 void QChartView::setChartTitleFont(const QFont& font)
76 {
76 {
77 m_chart->setChartTitleFont(font);
77 m_chart->setChartTitleFont(font);
78 }
78 }
79
79
80 void QChartView::setChartBackgroundBrush(const QBrush& brush)
80 void QChartView::setChartBackgroundBrush(const QBrush& brush)
81 {
81 {
82 m_chart->setChartBackgroundBrush(brush);
82 m_chart->setChartBackgroundBrush(brush);
83 }
83 }
84 void QChartView::setChartBackgroundPen(const QPen& pen)
84 void QChartView::setChartBackgroundPen(const QPen& pen)
85 {
85 {
86 m_chart->setChartBackgroundPen(pen);
86 m_chart->setChartBackgroundPen(pen);
87 }
87 }
88
88
89 void QChartView::setRubberBandPolicy(const RubberBandPolicy policy)
89 void QChartView::setRubberBandPolicy(const RubberBandPolicy policy)
90 {
90 {
91 switch(policy) {
91 switch(policy) {
92 case VerticalRubberBand:
92 case VerticalRubberBand:
93 m_verticalRubberBand = true;
93 m_verticalRubberBand = true;
94 m_horizonalRubberBand = false;
94 m_horizonalRubberBand = false;
95 break;
95 break;
96 case HorizonalRubberBand:
96 case HorizonalRubberBand:
97 m_verticalRubberBand = false;
97 m_verticalRubberBand = false;
98 m_horizonalRubberBand = true;
98 m_horizonalRubberBand = true;
99 break;
99 break;
100 case RectangleRubberBand:
100 case RectangleRubberBand:
101 m_verticalRubberBand = true;
101 m_verticalRubberBand = true;
102 m_horizonalRubberBand = true;
102 m_horizonalRubberBand = true;
103 break;
103 break;
104 case NoRubberBand:
104 case NoRubberBand:
105 default:
105 default:
106 delete m_rubberBand;
106 delete m_rubberBand;
107 m_rubberBand=0;
107 m_rubberBand=0;
108 m_horizonalRubberBand = false;
108 m_horizonalRubberBand = false;
109 m_verticalRubberBand = false;
109 m_verticalRubberBand = false;
110 return;
110 return;
111 }
111 }
112 if(!m_rubberBand) {
112 if(!m_rubberBand) {
113 m_rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
113 m_rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
114 m_rubberBand->setEnabled(true);
114 m_rubberBand->setEnabled(true);
115 }
115 }
116 }
116 }
117
117
118 QChartView::RubberBandPolicy QChartView::rubberBandPolicy() const
118 QChartView::RubberBandPolicy QChartView::rubberBandPolicy() const
119 {
119 {
120 if(m_horizonalRubberBand && m_verticalRubberBand) return RectangleRubberBand;
120 if(m_horizonalRubberBand && m_verticalRubberBand) return RectangleRubberBand;
121 if(m_horizonalRubberBand) return HorizonalRubberBand;
121 if(m_horizonalRubberBand) return HorizonalRubberBand;
122 if(m_verticalRubberBand) return VerticalRubberBand;
122 if(m_verticalRubberBand) return VerticalRubberBand;
123 return NoRubberBand;
123 return NoRubberBand;
124 }
124 }
125
125
126 void QChartView::mousePressEvent(QMouseEvent *event)
126 void QChartView::mousePressEvent(QMouseEvent *event)
127 {
127 {
128 if(m_rubberBand && m_rubberBand->isEnabled() && event->button() == Qt::LeftButton) {
128 if(m_rubberBand && m_rubberBand->isEnabled() && event->button() == Qt::LeftButton) {
129
129
130 int margin = m_chart->margin();
130 int margin = m_chart->margin();
131 QRect rect(margin, margin, width() - 2 * margin, height() - 2 * margin);
131 QRect rect(margin, margin, width() - 2 * margin, height() - 2 * margin);
132
132
133 if (rect.contains(event->pos())) {
133 if (rect.contains(event->pos())) {
134 m_rubberBandOrigin = event->pos();
134 m_rubberBandOrigin = event->pos();
135 m_rubberBand->setGeometry(QRect(m_rubberBandOrigin, QSize()));
135 m_rubberBand->setGeometry(QRect(m_rubberBandOrigin, QSize()));
136 m_rubberBand->show();
136 m_rubberBand->show();
137 event->accept();
137 event->accept();
138 }
138 }
139 }
139 }
140 }
140 }
141
141
142 void QChartView::mouseMoveEvent(QMouseEvent *event)
142 void QChartView::mouseMoveEvent(QMouseEvent *event)
143 {
143 {
144 if(m_rubberBand && m_rubberBand->isVisible()) {
144 if(m_rubberBand && m_rubberBand->isVisible()) {
145 int margin = m_chart->margin();
145 int margin = m_chart->margin();
146 QRect rect(margin, margin, width() - 2 * margin, height() - 2 * margin);
146 QRect rect(margin, margin, width() - 2 * margin, height() - 2 * margin);
147 int width = event->pos().x() - m_rubberBandOrigin.x();
147 int width = event->pos().x() - m_rubberBandOrigin.x();
148 int height = event->pos().y() - m_rubberBandOrigin.y();
148 int height = event->pos().y() - m_rubberBandOrigin.y();
149 if(!m_verticalRubberBand) {
149 if(!m_verticalRubberBand) {
150 m_rubberBandOrigin.setY(rect.top());
150 m_rubberBandOrigin.setY(rect.top());
151 height = rect.height();
151 height = rect.height();
152 }
152 }
153 if(!m_horizonalRubberBand) {
153 if(!m_horizonalRubberBand) {
154 m_rubberBandOrigin.setX(rect.left());
154 m_rubberBandOrigin.setX(rect.left());
155 width= rect.width();
155 width= rect.width();
156 }
156 }
157 m_rubberBand->setGeometry(QRect(m_rubberBandOrigin.x(),m_rubberBandOrigin.y(), width,height).normalized());
157 m_rubberBand->setGeometry(QRect(m_rubberBandOrigin.x(),m_rubberBandOrigin.y(), width,height).normalized());
158 }
158 }
159 else {
159 else {
160 QGraphicsView::mouseMoveEvent(event);
160 QGraphicsView::mouseMoveEvent(event);
161 }
161 }
162 }
162 }
163
163
164 void QChartView::mouseReleaseEvent(QMouseEvent *event)
164 void QChartView::mouseReleaseEvent(QMouseEvent *event)
165 {
165 {
166 if(m_rubberBand) {
166 if(m_rubberBand) {
167 if (event->button() == Qt::LeftButton && m_rubberBand->isVisible()) {
167 if (event->button() == Qt::LeftButton && m_rubberBand->isVisible()) {
168 m_rubberBand->hide();
168 m_rubberBand->hide();
169 QRect rect = m_rubberBand->geometry();
169 QRect rect = m_rubberBand->geometry();
170 m_chart->zoomInToRect(rect);
170 m_chart->zoomInToRect(rect);
171 event->accept();
171 event->accept();
172 }
172 }
173
173
174 if(event->button()==Qt::RightButton)
174 if(event->button()==Qt::RightButton)
175 m_chart->zoomReset();
175 m_chart->zoomReset();
176 }
176 }
177 else {
177 else {
178 QGraphicsView::mouseReleaseEvent(event);
178 QGraphicsView::mouseReleaseEvent(event);
179 }
179 }
180 }
180 }
181
181
182 void QChartView::keyPressEvent(QKeyEvent *event)
182 void QChartView::keyPressEvent(QKeyEvent *event)
183 {
183 {
184 switch (event->key()) {
184 switch (event->key()) {
185 case Qt::Key_Plus:
185 case Qt::Key_Plus:
186 zoomIn();
186 zoomIn();
187 break;
187 break;
188 case Qt::Key_Minus:
188 case Qt::Key_Minus:
189 zoomOut();
189 zoomOut();
190 break;
190 break;
191 default:
191 default:
192 QGraphicsView::keyPressEvent(event);
192 QGraphicsView::keyPressEvent(event);
193 break;
193 break;
194 }
194 }
195 }
195 }
196
196
197 void QChartView::setChartTheme(QChart::ChartTheme theme)
197 void QChartView::setChartTheme(QChart::ChartTheme theme)
198 {
198 {
199 m_chart->setChartTheme(theme);
199 m_chart->setChartTheme(theme);
200 }
200 }
201
201
202 QChart::ChartTheme QChartView::chartTheme() const
202 QChart::ChartTheme QChartView::chartTheme() const
203 {
203 {
204 return m_chart->chartTheme();
204 return m_chart->chartTheme();
205 }
205 }
206
206
207 void QChartView::setDefaultAxisX(const QChartAxis& axis)
207 void QChartView::setDefaultAxisX(const QChartAxis& axis)
208 {
208 {
209 m_chart->setDefaultAxisX(axis);
209 m_chart->setDefaultAxisX(axis);
210 }
210 }
211
211
212 void QChartView::setDefaultAxisY(const QChartAxis& axis)
212 void QChartView::setDefaultAxisY(const QChartAxis& axis)
213 {
213 {
214 m_chart->setDefaultAxisY(axis);
214 m_chart->setDefaultAxisY(axis);
215 }
215 }
216
216
217 QChartAxis QChartView::defaultAxisX() const
217 QChartAxis QChartView::defaultAxisX() const
218 {
218 {
219 return m_chart->defaultAxisX();
219 return m_chart->defaultAxisX();
220 }
220 }
221
221
222 QChartAxis QChartView::defaultAxisY() const
222 QChartAxis QChartView::defaultAxisY() const
223 {
223 {
224 return m_chart->defaultAxisY();
224 return m_chart->defaultAxisY();
225 }
225 }
226
226
227 int QChartView::addAxisY(const QChartAxis& axis)
227 int QChartView::addAxisY(const QChartAxis& axis)
228 {
228 {
229 return m_chart->addAxisY(axis);
229 return m_chart->addAxisY(axis);
230 }
230 }
231
231
232 QChartAxis QChartView::axisY(int id) const
232 QChartAxis QChartView::axisY(int id) const
233 {
233 {
234 return m_chart->axisY(id);
234 return m_chart->axisY(id);
235 }
235 }
236
236
237 void QChartView::removeAxisY(int id)
237 void QChartView::removeAxisY(int id)
238 {
238 {
239 m_chart->removeAxisY(id);
239 m_chart->removeAxisY(id);
240 }
240 }
241 QTCOMMERCIALCHART_END_NAMESPACE
241 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,78 +1,78
1 #ifndef QCHARTWIDGET_H
1 #ifndef QCHARTWIDGET_H
2 #define QCHARTWIDGET_H
2 #define QCHARTWIDGET_H
3
3
4 #include "qchartglobal.h"
4 #include "qchartglobal.h"
5 #include "qchartseries.h"
5 #include "qchartseries.h"
6 #include "qchart.h"
6 #include "qchart.h"
7 #include <QGraphicsView>
7 #include <QGraphicsView>
8
8
9 class QGraphicsScene;
9 class QGraphicsScene;
10 class QRubberBand;
10 class QRubberBand;
11
11
12 QTCOMMERCIALCHART_BEGIN_NAMESPACE
12 QTCOMMERCIALCHART_BEGIN_NAMESPACE
13
13
14 class QChart;
14 class QChart;
15
15
16 class QTCOMMERCIALCHART_EXPORT QChartView : public QGraphicsView
16 class QTCOMMERCIALCHART_EXPORT QChartView : public QGraphicsView
17 {
17 {
18 public:
18 public:
19 enum RubberBandPolicy { NoRubberBand, VerticalRubberBand, HorizonalRubberBand, RectangleRubberBand };
19 enum RubberBandPolicy { NoRubberBand, VerticalRubberBand, HorizonalRubberBand, RectangleRubberBand };
20
20
21 explicit QChartView(QWidget *parent = 0);
21 explicit QChartView(QWidget *parent = 0);
22 ~QChartView();
22 ~QChartView();
23
23
24 //implement from QWidget
24 //implement from QWidget
25 void resizeEvent(QResizeEvent *event);
25 void resizeEvent(QResizeEvent *event);
26
26
27 void addSeries(QChartSeries* series);
27 void addSeries(QChartSeries* series); // takes ownership
28
28
29 // Convenience function
29 // Convenience function
30 QChartSeries* createSeries(QChartSeries::QChartSeriesType type);
30 QChartSeries* createSeries(QChartSeries::QChartSeriesType type);
31
31
32 int margin() const;
32 int margin() const;
33
33
34 void setChartTitle(const QString& title);
34 void setChartTitle(const QString& title);
35 void setChartTitleFont(const QFont& font);
35 void setChartTitleFont(const QFont& font);
36 void setChartBackgroundBrush(const QBrush& brush);
36 void setChartBackgroundBrush(const QBrush& brush);
37 void setChartBackgroundPen(const QPen& pen);
37 void setChartBackgroundPen(const QPen& pen);
38
38
39 void zoomInToRect(const QRect& rectangle);
39 void zoomInToRect(const QRect& rectangle);
40 void zoomIn();
40 void zoomIn();
41 void zoomOut();
41 void zoomOut();
42
42
43 void setRubberBandPolicy(const RubberBandPolicy );
43 void setRubberBandPolicy(const RubberBandPolicy );
44 RubberBandPolicy rubberBandPolicy() const;
44 RubberBandPolicy rubberBandPolicy() const;
45
45
46 void setChartTheme(QChart::ChartTheme theme);
46 void setChartTheme(QChart::ChartTheme theme);
47 QChart::ChartTheme chartTheme() const;
47 QChart::ChartTheme chartTheme() const;
48
48
49 void setDefaultAxisX(const QChartAxis& axis);
49 void setDefaultAxisX(const QChartAxis& axis);
50 void setDefaultAxisY(const QChartAxis& axis);
50 void setDefaultAxisY(const QChartAxis& axis);
51 QChartAxis defaultAxisX() const;
51 QChartAxis defaultAxisX() const;
52 QChartAxis defaultAxisY() const;
52 QChartAxis defaultAxisY() const;
53 QChartAxis axisY(int id) const;
53 QChartAxis axisY(int id) const;
54 int addAxisY(const QChartAxis& axis);
54 int addAxisY(const QChartAxis& axis);
55 void removeAxisY(int id);
55 void removeAxisY(int id);
56
56
57 protected:
57 protected:
58 void mousePressEvent(QMouseEvent *event);
58 void mousePressEvent(QMouseEvent *event);
59 void mouseMoveEvent(QMouseEvent *event);
59 void mouseMoveEvent(QMouseEvent *event);
60 void mouseReleaseEvent(QMouseEvent *event);
60 void mouseReleaseEvent(QMouseEvent *event);
61 void keyPressEvent(QKeyEvent *event);
61 void keyPressEvent(QKeyEvent *event);
62
62
63
63
64 private:
64 private:
65 QGraphicsScene *m_scene;
65 QGraphicsScene *m_scene;
66 QChart* m_chart;
66 QChart* m_chart;
67 QPoint m_rubberBandOrigin;
67 QPoint m_rubberBandOrigin;
68 QRubberBand* m_rubberBand;
68 QRubberBand* m_rubberBand;
69 bool m_verticalRubberBand;
69 bool m_verticalRubberBand;
70 bool m_horizonalRubberBand;
70 bool m_horizonalRubberBand;
71 Q_DISABLE_COPY(QChartView)
71 Q_DISABLE_COPY(QChartView)
72
72
73
73
74 };
74 };
75
75
76 QTCOMMERCIALCHART_END_NAMESPACE
76 QTCOMMERCIALCHART_END_NAMESPACE
77
77
78 #endif // QCHARTWIDGET_H
78 #endif // QCHARTWIDGET_H
@@ -1,59 +1,85
1 #include "qscatterseries.h"
1 #include "qscatterseries.h"
2 #include "qscatterseries_p.h"
2 #include "scatterseries_p.h"
3 #include "qchart.h"
3 #include "qchart.h"
4
4
5 QTCOMMERCIALCHART_BEGIN_NAMESPACE
5 QTCOMMERCIALCHART_BEGIN_NAMESPACE
6
6
7 QScatterSeriesPrivate::QScatterSeriesPrivate() :
7 QScatterSeriesPrivate::QScatterSeriesPrivate() :
8 m_data(QList<QPointF>())
8 m_data(QList<QPointF>()),
9 m_markerPen(QPen()),
10 m_markerBrush(QBrush()),
11 m_markerShape(QScatterSeries::MarkerShapeDefault)
9 {
12 {
13 // Initialize pen color to invalid to use a theme color by default
14 m_markerPen.setColor(QColor::Invalid);
15 m_markerBrush.setColor(QColor::Invalid);
10 }
16 }
11
17
12 QScatterSeries::QScatterSeries(QObject *parent) :
18 QScatterSeries::QScatterSeries(QObject *parent) :
13 QChartSeries(parent),
19 QChartSeries(parent),
14 d(new QScatterSeriesPrivate())
20 d(new QScatterSeriesPrivate())
15 {
21 {
16 }
22 }
17
23
18 QScatterSeries::~QScatterSeries()
24 QScatterSeries::~QScatterSeries()
19 {
25 {
20 delete d;
26 delete d;
21 }
27 }
22
28
23 void QScatterSeries::addData(QPointF value)
29 void QScatterSeries::addData(QPointF value)
24 {
30 {
25 d->m_data.append(value);
31 d->m_data.append(value);
26 emit changed();
32 emit changed();
27 }
33 }
28
34
29 QScatterSeries& QScatterSeries::operator << (const QPointF &value)
35 QScatterSeries& QScatterSeries::operator << (const QPointF &value)
30 {
36 {
31 d->m_data.append(value);
37 d->m_data.append(value);
32 emit changed();
38 emit changed();
33 return *this;
39 return *this;
34 }
40 }
35
41
36 void QScatterSeries::setData(QList<QPointF> data)
42 void QScatterSeries::setData(QList<QPointF> data)
37 {
43 {
38 d->m_data = data;
44 d->m_data = data;
39 emit changed();
45 emit changed();
40 }
46 }
41
47
42 QList<QPointF> QScatterSeries::data()
48 QList<QPointF> QScatterSeries::data()
43 {
49 {
44 return d->m_data;
50 return d->m_data;
45 }
51 }
46
52
47 void QScatterSeries::setMarkerPen(QPen pen)
53 void QScatterSeries::setMarkerPen(QPen pen)
48 {
54 {
49 d->m_markerPen = pen;
55 d->m_markerPen = pen;
50 }
56 }
51
57
52 QPen QScatterSeries::markerPen()
58 QPen QScatterSeries::markerPen()
53 {
59 {
54 return d->m_markerPen;
60 return d->m_markerPen;
55 }
61 }
56
62
63 void QScatterSeries::setMarkerBrush(QBrush brush)
64 {
65 d->m_markerBrush = brush;
66 }
67
68 QBrush QScatterSeries::markerBrush()
69 {
70 return d->m_markerBrush;
71 }
72
73 void QScatterSeries::setMarkerShape(MarkerShape shape)
74 {
75 d->m_markerShape = shape;
76 }
77
78 QScatterSeries::MarkerShape QScatterSeries::markerShape()
79 {
80 return (QScatterSeries::MarkerShape) d->m_markerShape;
81 }
82
57 #include "moc_qscatterseries.cpp"
83 #include "moc_qscatterseries.cpp"
58
84
59 QTCOMMERCIALCHART_END_NAMESPACE
85 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,50 +1,66
1 #ifndef QSCATTERSERIES_H
1 #ifndef QSCATTERSERIES_H
2 #define QSCATTERSERIES_H
2 #define QSCATTERSERIES_H
3
3
4 #include "qchartseries.h"
4 #include "qchartseries.h"
5 #include <QRectF>
5 #include <QRectF>
6 #include <QColor>
6 #include <QColor>
7
7
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9 class QScatterSeriesPrivate;
9 class QScatterSeriesPrivate;
10
10
11 class QTCOMMERCIALCHART_EXPORT QScatterSeries : public QChartSeries
11 class QTCOMMERCIALCHART_EXPORT QScatterSeries : public QChartSeries
12 {
12 {
13 Q_OBJECT
13 Q_OBJECT
14
15 public:
16 enum MarkerShape {
17 // TODO: to be defined by the graphics design
18 // TODO: marker shapes: "x", star, rectangle, tilted rect, triangle, circle, dot
19 MarkerShapeDefault = 0,
20 MarkerShapePoint,
21 MarkerShapeX,
22 MarkerShapeRectangle,
23 MarkerShapeTiltedRectangle,
24 MarkerShapeTriangle,
25 MarkerShapeCircle
26 };
27
14 public:
28 public:
15 //QScatterSeries(QSeriesData *data, QObject *chart);
16 QScatterSeries(QObject *parent = 0);
29 QScatterSeries(QObject *parent = 0);
17 ~QScatterSeries();
30 ~QScatterSeries();
18
31
19 public: // from QChartSeries
32 public: // from QChartSeries
20 QChartSeriesType type() const { return QChartSeries::SeriesTypeScatter; }
33 QChartSeriesType type() const { return QChartSeries::SeriesTypeScatter; }
21
34
22 public:
35 public:
23 // TODO: the name of the function? addPoint? addData? addValue?
36 // TODO: the name of the function? addPoint? addData? addValue?
24 void addData(QPointF value);
37 void addData(QPointF value);
25 QScatterSeries& operator << (const QPointF &value);
38 QScatterSeries& operator << (const QPointF &value);
26 void setData(QList<QPointF> data);
39 void setData(QList<QPointF> data);
27 QList<QPointF> data();
40 QList<QPointF> data();
28
41 //TODO: insertData?
29 //TODO? void insertData(int index, QPointF data);
30
42
31 void setMarkerPen(QPen pen);
43 void setMarkerPen(QPen pen);
32 QPen markerPen();
44 QPen markerPen();
33 // TODO: marker shapes: "x", star, rectangle, tilted rect, triangle, circle, dot
45 void setMarkerBrush(QBrush brush);
34 //void setMarkerShape(MarkerShape shape);
46 QBrush markerBrush();
47 void setMarkerShape(MarkerShape shape);
48 MarkerShape markerShape();
49 // TODO: marker size?
35
50
36 Q_SIGNALS:
51 Q_SIGNALS:
37 // TODO: move to PIMPL?
52 // TODO: move to PIMPL for simplicity or does the user ever need these signals?
38 // TODO: more finegrained signaling for performance reasons
53 // TODO: more finegrained signaling for performance reasons
54 // (check QPieSeries implementation with change sets)
39 void changed();
55 void changed();
40
56
41 //public Q_SLOTS:
57 //public Q_SLOTS:
42 private:
58 private:
43 Q_DECLARE_PRIVATE(QScatterSeries)
59 Q_DECLARE_PRIVATE(QScatterSeries)
44 Q_DISABLE_COPY(QScatterSeries)
60 Q_DISABLE_COPY(QScatterSeries)
45 QScatterSeriesPrivate *const d;
61 QScatterSeriesPrivate *const d;
46 };
62 };
47
63
48 QTCOMMERCIALCHART_END_NAMESPACE
64 QTCOMMERCIALCHART_END_NAMESPACE
49
65
50 #endif // QSCATTERSERIES_H
66 #endif // QSCATTERSERIES_H
@@ -1,94 +1,112
1 #include "scatterpresenter.h"
1 #include "scatterpresenter_p.h"
2 #include "qscatterseries.h"
2 #include "qscatterseries.h"
3 #include <QPen>
3 #include <QPen>
4 #include <QPainter>
4 #include <QPainter>
5 #include <QGraphicsScene>
5 #include <QGraphicsScene>
6 #include <QDebug>
6 #include <QDebug>
7
7
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9
9
10 ScatterPresenter::ScatterPresenter(QScatterSeries *series, QGraphicsObject *parent) :
10 ScatterPresenter::ScatterPresenter(QScatterSeries *series, QGraphicsObject *parent) :
11 ChartItem(parent),
11 ChartItem(parent),
12 m_series(series),
12 m_series(series),
13 m_boundingRect(),
13 m_boundingRect(),
14 //m_markerColor(QColor()),
14 //m_markerColor(QColor()),
15 // m_markerColor(QColor(255, 0, 0)),
15 // m_markerColor(QColor(255, 0, 0)),
16 m_visibleChartArea()
16 m_visibleChartArea()
17 {
17 {
18 if (parent)
18 if (parent)
19 m_boundingRect = parent->boundingRect();
19 m_boundingRect = parent->boundingRect();
20
20
21 if (series) {
21 if (series) {
22 connect(series, SIGNAL(changed()), this, SLOT(handleModelChanged()));
22 connect(series, SIGNAL(changed()), this, SLOT(handleModelChanged()));
23 }
23 }
24 }
24 }
25
25
26 void ScatterPresenter::handleDomainChanged(const Domain& domain)
26 void ScatterPresenter::handleDomainChanged(const Domain& domain)
27 {
27 {
28 m_visibleChartArea = domain;
28 m_visibleChartArea = domain;
29 changeGeometry();
29 changeGeometry();
30 }
30 }
31
31
32 void ScatterPresenter::handleGeometryChanged(const QRectF& rect)
32 void ScatterPresenter::handleGeometryChanged(const QRectF& rect)
33 {
33 {
34 m_boundingRect = rect;
34 m_boundingRect = rect;
35 changeGeometry();
35 changeGeometry();
36 }
36 }
37
37
38 void ScatterPresenter::handleModelChanged()
38 void ScatterPresenter::handleModelChanged()
39 {
39 {
40 // TODO: more fine grained modelChanged signaling
40 // TODO: more fine grained modelChanged signaling
41 changeGeometry();
41 changeGeometry();
42 }
42 }
43
43
44 void ScatterPresenter::paint(QPainter *painter, const QStyleOptionGraphicsItem */*option*/, QWidget */*widget*/)
44 void ScatterPresenter::paint(QPainter *painter, const QStyleOptionGraphicsItem */*option*/, QWidget */*widget*/)
45 {
45 {
46 // TODO: The opacity should be user definable?
46 // TODO: Optimization: avoid setting on every paint method call?
47 //brush.setColor(QColor(255, 82, 0, 100));
47 // The custom settings in series override those defined by the theme
48 //if (m_series->markerPen().isValid()) {
48 if (m_series->markerPen().color().isValid()) {
49 if (false) {
49 painter->setPen(m_series->markerPen());
50 QPen pen = painter->pen();
50 painter->setBrush(m_series->markerBrush());
51 QBrush brush = pen.brush();
51 } else {
52 brush.setColor(m_series->markerPen().color());
52 painter->setPen(m_markerPen);
53 pen.setBrush(brush);
53 painter->setBrush(m_markerBrush);
54 pen.setWidth(4);
55 painter->setPen(pen);
56 }
57 else {
58 // TODO: fix this
59 QPen pen = painter->pen();
60 QBrush brush = pen.brush();
61 brush.setColor(m_markerPen.color());
62 pen.setBrush(brush);
63 pen.setWidth(4);
64 painter->setPen(pen);
65 }
54 }
66
55
56 int shape = m_series->markerShape();
57
67 for (int i(0); i < m_scenex.count() && i < m_sceney.count(); i++) {
58 for (int i(0); i < m_scenex.count() && i < m_sceney.count(); i++) {
68 if (scene()->width() > m_scenex.at(i) && scene()->height() > m_sceney.at(i))
59 if (scene()->width() > m_scenex.at(i) && scene()->height() > m_sceney.at(i))
69 //painter->drawArc(m_scenex.at(i), m_sceney.at(i), 2, 2, 0, 5760);
60 // Paint a shape
70 painter->drawPoint(m_scenex.at(i), m_sceney.at(i));
61 switch (shape) {
62 case QScatterSeries::MarkerShapeDefault:
63 // Fallthrough, defaults to circle
64 case QScatterSeries::MarkerShapeCircle:
65 painter->drawChord(m_scenex.at(i), m_sceney.at(i), 9, 9, 0, 5760);
66 break;
67 case QScatterSeries::MarkerShapePoint:
68 painter->drawPoint(m_scenex.at(i), m_sceney.at(i));
69 break;
70 case QScatterSeries::MarkerShapeRectangle:
71 painter->drawRect(m_scenex.at(i), m_sceney.at(i), 9, 9);
72 break;
73 case QScatterSeries::MarkerShapeTiltedRectangle: {
74 // TODO:
75 static const QPointF points[4] = {
76 QPointF(-1.0 + m_scenex.at(i), 0.0 + m_sceney.at(i)),
77 QPointF(0.0 + m_scenex.at(i), 1.0 + m_sceney.at(i)),
78 QPointF(1.0 + m_scenex.at(i), 0.0 + m_sceney.at(i)),
79 QPointF(0.0 + m_scenex.at(i), -1.0 + m_sceney.at(i))
80 };
81 painter->drawPolygon(points, 4);
82 }
83 break;
84 default:
85 // TODO: implement the rest of the shapes
86 Q_ASSERT(false);
87 break;
88 }
71 }
89 }
72 }
90 }
73
91
74 void ScatterPresenter::changeGeometry()
92 void ScatterPresenter::changeGeometry()
75 {
93 {
76 if (m_boundingRect.isValid()) {
94 if (m_boundingRect.isValid()) {
77
95
78 prepareGeometryChange();
96 prepareGeometryChange();
79 qreal scalex = m_boundingRect.width() / m_visibleChartArea.spanX();
97 qreal scalex = m_boundingRect.width() / m_visibleChartArea.spanX();
80 qreal scaley = m_boundingRect.height() / m_visibleChartArea.spanY();
98 qreal scaley = m_boundingRect.height() / m_visibleChartArea.spanY();
81 m_scenex.clear();
99 m_scenex.clear();
82 m_sceney.clear();
100 m_sceney.clear();
83
101
84 // Convert relative coordinates to absolute pixel coordinates that can be used for drawing
102 // Convert relative coordinates to absolute pixel coordinates that can be used for drawing
85 foreach (QPointF point, m_series->data()) {
103 foreach (QPointF point, m_series->data()) {
86 m_scenex.append(m_boundingRect.left() + point.x() * scalex - m_visibleChartArea.m_minX * scalex);
104 m_scenex.append(m_boundingRect.left() + point.x() * scalex - m_visibleChartArea.m_minX * scalex);
87 m_sceney.append(m_boundingRect.bottom() - point.y() * scaley + m_visibleChartArea.m_minY * scaley);
105 m_sceney.append(m_boundingRect.bottom() - point.y() * scaley + m_visibleChartArea.m_minY * scaley);
88 }
106 }
89 }
107 }
90 }
108 }
91
109
92 #include "moc_scatterpresenter.cpp"
110 #include "moc_scatterpresenter_p.cpp"
93
111
94 QTCOMMERCIALCHART_END_NAMESPACE
112 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,47 +1,48
1 #ifndef SCATTERPRESENTER_H
1 #ifndef SCATTERPRESENTER_H
2 #define SCATTERPRESENTER_H
2 #define SCATTERPRESENTER_H
3
3
4 #include "qchartglobal.h"
4 #include "qchartglobal.h"
5 #include "chartitem_p.h"
5 #include "chartitem_p.h"
6 #include <QObject>
6 #include <QObject>
7 #include <QPen>
7 #include <QPen>
8
8
9 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9 QTCOMMERCIALCHART_BEGIN_NAMESPACE
10
10
11 class QScatterSeries;
11 class QScatterSeries;
12
12
13 /*!
13 /*!
14 * The "business logic" of scatter series. This is a QObject that does not have a parent QObject.
14 * The "business logic" of scatter series. This is a QObject that does not have a parent QObject.
15 * The QGraphicsItem parent owns the object instead.
15 * The QGraphicsItem parent owns the object instead.
16 */
16 */
17 class ScatterPresenter : public QObject, public ChartItem
17 class ScatterPresenter : public QObject, public ChartItem
18 {
18 {
19 Q_OBJECT
19 Q_OBJECT
20 public:
20 public:
21 explicit ScatterPresenter(QScatterSeries *series, QGraphicsObject *parent = 0);
21 explicit ScatterPresenter(QScatterSeries *series, QGraphicsObject *parent = 0);
22
22
23 public: // from ChartItem
23 public: // from ChartItem
24 QRectF boundingRect() const { return m_boundingRect; }
24 QRectF boundingRect() const { return m_boundingRect; }
25 void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
25 void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
26
26
27 signals:
27 signals:
28
28
29 public Q_SLOTS:
29 public Q_SLOTS:
30 void handleDomainChanged(const Domain& domain);
30 void handleDomainChanged(const Domain& domain);
31 void handleGeometryChanged(const QRectF& rect);
31 void handleGeometryChanged(const QRectF& rect);
32 void handleModelChanged();
32 void handleModelChanged();
33
33
34 public:
34 public:
35 void changeGeometry();
35 void changeGeometry();
36
36
37 QScatterSeries *m_series;
37 QScatterSeries *m_series;
38 QRectF m_boundingRect;
38 QRectF m_boundingRect;
39 QList<qreal> m_scenex;
39 QList<qreal> m_scenex;
40 QList<qreal> m_sceney;
40 QList<qreal> m_sceney;
41 Domain m_visibleChartArea;
41 Domain m_visibleChartArea;
42 QPen m_markerPen;
42 QPen m_markerPen;
43 QBrush m_markerBrush;
43 };
44 };
44
45
45 QTCOMMERCIALCHART_END_NAMESPACE
46 QTCOMMERCIALCHART_END_NAMESPACE
46
47
47 #endif // SCATTERPRESENTER_H
48 #endif // SCATTERPRESENTER_H
@@ -1,25 +1,27
1 #ifndef QSCATTERSERIESPRIVATE_H
1 #ifndef QSCATTERSERIESPRIVATE_H
2 #define QSCATTERSERIESPRIVATE_H
2 #define QSCATTERSERIESPRIVATE_H
3
3
4 #include "qchartglobal.h"
4 #include "qchartglobal.h"
5 #include "qchartseries.h"
5 #include "qchartseries.h"
6 #include <QPen>
6 #include <QPen>
7
7
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9
9
10 /*!
10 /*!
11 * The PIMPL class of QScatterSeries.
11 * The PIMPL class of QScatterSeries.
12 */
12 */
13 class QScatterSeriesPrivate
13 class QScatterSeriesPrivate
14 {
14 {
15 public:
15 public:
16 QScatterSeriesPrivate();
16 QScatterSeriesPrivate();
17
17
18 public:
18 public:
19 QList<QPointF> m_data;
19 QList<QPointF> m_data;
20 QPen m_markerPen;
20 QPen m_markerPen;
21 QBrush m_markerBrush;
22 int m_markerShape;
21 };
23 };
22
24
23 QTCOMMERCIALCHART_END_NAMESPACE
25 QTCOMMERCIALCHART_END_NAMESPACE
24
26
25 #endif // QSCATTERSERIESPRIVATE_H
27 #endif // QSCATTERSERIESPRIVATE_H
@@ -1,116 +1,119
1 !include( ../common.pri ):error( Couldn't find the common.pri file! )
1 !include( ../common.pri ):error( Couldn't find the common.pri file! )
2 TARGET = QtCommercialChart
2 TARGET = QtCommercialChart
3 DESTDIR = $$CHART_BUILD_LIB_DIR
3 DESTDIR = $$CHART_BUILD_LIB_DIR
4 TEMPLATE = lib
4 TEMPLATE = lib
5 QT += core \
5 QT += core \
6 gui
6 gui
7 CONFIG += debug_and_release
7 CONFIG += debug_and_release
8 CONFIG(debug, debug|release):TARGET = QtCommercialChartd
8 CONFIG(debug, debug|release):TARGET = QtCommercialChartd
9 SOURCES += barchart/barchartseries.cpp \
9 SOURCES += barchart/barchartseries.cpp \
10 barchart/bargroup.cpp \
10 barchart/bargroup.cpp \
11 barchart/bar.cpp \
11 barchart/bar.cpp \
12 barchart/stackedbarchartseries.cpp \
12 barchart/stackedbarchartseries.cpp \
13 barchart/stackedbargroup.cpp \
13 barchart/stackedbargroup.cpp \
14 barchart/percentbarchartseries.cpp \
14 barchart/percentbarchartseries.cpp \
15 barchart/percentbargroup.cpp \
15 barchart/percentbargroup.cpp \
16 barchart/barlabel.cpp \
16 barchart/barlabel.cpp \
17 barchart/barchartmodel.cpp \
17 barchart/barchartmodel.cpp \
18 barchart/separator.cpp \
18 barchart/separator.cpp \
19 barchart/bargroupbase.cpp \
19 barchart/bargroupbase.cpp \
20 barchart/qbarset.cpp \
20 barchart/qbarset.cpp \
21 barchart/qbarcategory.cpp \
21 barchart/qbarcategory.cpp \
22 linechart/linechartanimationitem.cpp \
22 linechart/linechartanimationitem.cpp \
23 linechart/linechartitem.cpp \
23 linechart/linechartitem.cpp \
24 linechart/qlinechartseries.cpp \
24 linechart/qlinechartseries.cpp \
25 qscatterseries.cpp \
26 #scatterpresentation.cpp \
27 qchart.cpp \
25 qchart.cpp \
28 axisitem.cpp \
26 axisitem.cpp \
29 qchartview.cpp \
27 qchartview.cpp \
30 qchartseries.cpp \
28 qchartseries.cpp \
31 qchartaxis.cpp \
29 qchartaxis.cpp \
32 charttheme.cpp \
30 charttheme.cpp \
33 chartdataset.cpp \
31 chartdataset.cpp \
34 chartpresenter.cpp \
32 chartpresenter.cpp \
35 domain.cpp \
33 domain.cpp
36 scatterpresenter.cpp
37 PRIVATE_HEADERS += linechart/linechartitem_p.h \
34 PRIVATE_HEADERS += linechart/linechartitem_p.h \
38 linechart/linechartanimationitem_p.h \
35 linechart/linechartanimationitem_p.h \
39 barchart/barlabel_p.h \
36 barchart/barlabel_p.h \
40 barchart/bar_p.h \
37 barchart/bar_p.h \
41 barchart/separator_p.h \
38 barchart/separator_p.h \
42 barchart/barchartmodel_p.h \
39 barchart/barchartmodel_p.h \
43 qscatterseries_p.h \
44 #scatterpresentation.h \
45 axisitem_p.h \
40 axisitem_p.h \
46 chartitem_p.h \
41 chartitem_p.h \
47 charttheme_p.h \
42 charttheme_p.h \
48 chartdataset_p.h \
43 chartdataset_p.h \
49 chartpresenter_p.h \
44 chartpresenter_p.h \
50 domain_p.h
45 domain_p.h
51 PUBLIC_HEADERS += linechart/qlinechartseries.h \
46 PUBLIC_HEADERS += linechart/qlinechartseries.h \
52 barchart/barchartseries.h \
47 barchart/barchartseries.h \
53 barchart/bargroup.h \
48 barchart/bargroup.h \
54 barchart/stackedbarchartseries.h \
49 barchart/stackedbarchartseries.h \
55 barchart/stackedbargroup.h \
50 barchart/stackedbargroup.h \
56 barchart/percentbarchartseries.h \
51 barchart/percentbarchartseries.h \
57 barchart/percentbargroup.h \
52 barchart/percentbargroup.h \
58 barchart/bargroupbase.h \
53 barchart/bargroupbase.h \
59 barchart/qbarset.h \
54 barchart/qbarset.h \
60 barchart/qbarcategory.h \
55 barchart/qbarcategory.h \
61 qchartseries.h \
56 qchartseries.h \
62 qscatterseries.h \
63 qchart.h \
57 qchart.h \
64 qchartglobal.h \
58 qchartglobal.h \
65 qchartview.h \
59 qchartview.h \
66 qchartaxis.h
60 qchartaxis.h
67
61
68 include(piechart/piechart.pri)
62 include(piechart/piechart.pri)
69
63 include(scatterseries/scatter.pri)
64
70 THEMES += themes/chartthemeicy_p.h \
65 THEMES += themes/chartthemeicy_p.h \
71 themes/chartthemegrayscale_p.h \
66 themes/chartthemegrayscale_p.h \
72 themes/chartthemescientific_p.h \
67 themes/chartthemescientific_p.h \
73 themes/chartthemevanilla_p.h
68 themes/chartthemevanilla_p.h
74 HEADERS += $$PUBLIC_HEADERS \
69 HEADERS += $$PUBLIC_HEADERS
75 scatterpresenter.h
76 HEADERS += $$PRIVATE_HEADERS
70 HEADERS += $$PRIVATE_HEADERS
77 HEADERS += $$THEMES
71 HEADERS += $$THEMES
78 INCLUDEPATH += linechart \
72 INCLUDEPATH += linechart \
79 barchart \
73 barchart \
80 themes \
74 themes \
81 .
75 .
82 OBJECTS_DIR = $$CHART_BUILD_DIR/lib
76 OBJECTS_DIR = $$CHART_BUILD_DIR/lib
83 MOC_DIR = $$CHART_BUILD_DIR/lib
77 MOC_DIR = $$CHART_BUILD_DIR/lib
84 UI_DIR = $$CHART_BUILD_DIR/lib
78 UI_DIR = $$CHART_BUILD_DIR/lib
85 RCC_DIR = $$CHART_BUILD_DIR/lib
79 RCC_DIR = $$CHART_BUILD_DIR/lib
86 DEFINES += QTCOMMERCIALCHART_LIBRARY
80 DEFINES += QTCOMMERCIALCHART_LIBRARY
87 public_headers.path = $$[QT_INSTALL_HEADERS]/QtCommercialChart
81 public_headers.path = $$[QT_INSTALL_HEADERS]/QtCommercialChart
88 public_headers.files = $$PUBLIC_HEADERS
82 public_headers.files = $$PUBLIC_HEADERS
89 target.path = $$[QT_INSTALL_LIBS]
83 target.path = $$[QT_INSTALL_LIBS]
90 INSTALLS += target \
84 INSTALLS += target \
91 public_headers
85 public_headers
92 install_build_headers.name = bild_headers
86 install_build_public_headers.name = bild_public_headers
93 install_build_headers.output = $$CHART_BUILD_HEADER_DIR/${QMAKE_FILE_BASE}.h
87 install_build_public_headers.output = $$CHART_BUILD_PUBLIC_HEADER_DIR/${QMAKE_FILE_BASE}.h
94 install_build_headers.input = PUBLIC_HEADERS
88 install_build_public_headers.input = PUBLIC_HEADERS
95 install_build_headers.commands = $$QMAKE_COPY \
89 install_build_public_headers.commands = $$QMAKE_COPY \
90 ${QMAKE_FILE_NAME} \
91 $$CHART_BUILD_PUBLIC_HEADER_DIR
92 install_build_public_headers.CONFIG += target_predeps \
93 no_link
94 install_build_private_headers.name = bild_private_headers
95 install_build_private_headers.output = $$CHART_BUILD_PRIVATE_HEADER_DIR/${QMAKE_FILE_BASE}.h
96 install_build_private_headers.input = PRIVATE_HEADERS
97 install_build_private_headers.commands = $$QMAKE_COPY \
96 ${QMAKE_FILE_NAME} \
98 ${QMAKE_FILE_NAME} \
97 $$CHART_BUILD_HEADER_DIR
99 $$CHART_BUILD_PRIVATE_HEADER_DIR
98 install_build_headers.CONFIG += target_predeps \
100 install_build_private_headers.CONFIG += target_predeps \
99 no_link
101 no_link
100 QMAKE_EXTRA_COMPILERS += install_build_headers
102 QMAKE_EXTRA_COMPILERS += install_build_public_headers install_build_private_headers
101 chartversion.target = qchartversion_p.h
103 chartversion.target = qchartversion_p.h
102 chartversion.commands = @echo \
104 chartversion.commands = @echo \
103 "build_time" \
105 "build_time" \
104 > \
106 > \
105 $$chartversion.target;
107 $$chartversion.target;
106 chartversion.depends = $$HEADERS \
108 chartversion.depends = $$HEADERS \
107 $$SOURCES
109 $$SOURCES
108 PRE_TARGETDEPS += qchartversion_p.h
110 PRE_TARGETDEPS += qchartversion_p.h
109 QMAKE_CLEAN += qchartversion_p.h
111 QMAKE_CLEAN += qchartversion_p.h
110 QMAKE_EXTRA_TARGETS += chartversion
112 QMAKE_EXTRA_TARGETS += chartversion
111 unix:QMAKE_DISTCLEAN += -r \
113 unix:QMAKE_DISTCLEAN += -r \
112 $$CHART_BUILD_HEADER_DIR \
114 $$CHART_BUILD_HEADER_DIR \
113 $$CHART_BUILD_LIB_DIR
115 $$CHART_BUILD_LIB_DIR
114 win32:QMAKE_DISTCLEAN += /Q \
116 win32:QMAKE_DISTCLEAN += /Q \
115 $$CHART_BUILD_HEADER_DIR \
117 $$CHART_BUILD_HEADER_DIR \
116 $$CHART_BUILD_LIB_DIR
118 $$CHART_BUILD_LIB_DIR
119
@@ -1,117 +1,96
1 import QtQuick 1.0
1 import QtQuick 1.0
2 import QtCommercial.Chart 1.0
2 import QtCommercial.Chart 1.0
3
3
4 Rectangle {
4 Rectangle {
5 width: 360
5 width: 360
6 height: 360
6 height: 360
7 Text {
8 text: qsTr("Hello World")
9 anchors.centerIn: parent
10 }
11
7
8 // Another option for QML data api:
12 // ListModel {
9 // ListModel {
13 // id: listModelForPie
10 // id: listModelForPie
14 // // PieDataElement
11 // // PieDataElement
15 // ListElement {
12 // ListElement {
16 // label: "Apple"
13 // label: "Apple"
17 // value: 40.3
14 // value: 4.3
18 // }
19 // ListElement {
20 // label: "Pumpkin"
21 // value: 10.1
22 // }
15 // }
23 // ListElement {
16 // ListElement {
24 // label: "Raspberry"
17 // label: "Blackberry"
25 // value: 15.1
18 // value: 15.1
26 // }
19 // }
27 // ListElement {
28 // label: "Strawberry"
29 // value: 29.9
30 // }
31 // }
20 // }
32
21
33 // ChartModel {
22 Component.onCompleted: {
34 // id: chartModel
23 // console.log("Component.onCompleted: " + scatterElement.x);
35 // ListElement {
24 // console.log("Component.onCompleted: " + scatterElement.y);
36 // label: "dada"
25 // console.log("Component.onCompleted: " + scatterElement.dataX);
37 // x: 1.1
26 // console.log("Component.onCompleted: " + scatterElement.dataY);
38 // y: 3.2
27 //console.log("Component.onCompleted: " + chartModel.get(0).x);
39 // }
28 //console.log("Component.onCompleted: " + chartModel.scatterElements);
40 // }
29 // console.log("Component.onCompleted: " + elementt.dataX);
41
30 // console.log("Component.onCompleted: " + chartModel.get(0).dataX);
42 // ChartModel {
43 // ScatterElement {x: 1.1; y: 1.2}
44 // ScatterElement {x: 1.3; y: 1.9}
45 // ScatterElement {x: 1.1; y: 1.2}
46 // }
47
48 ListModel {
49 id: listModelScatter
50 ListElement {
51 height: 154
52 weight: 54
53 }
54 ListElement {
55 height: 166
56 weight: 64
57 }
58 ListElement {
59 height: 199
60 weight: 97
61 }
62 }
31 }
63
32
64 // Chart {
65 // anchors.fill: parent
66 // theme: Chart.ThemeIcy
67 // ScatterSeries {
68 // model: listModelScatter
69 // name: "scatter"
70 // xValue: x
71 // yValue: y
72 // }
73 // }
74
75 Chart {
33 Chart {
76 anchors.fill: parent
34 id: chart1
35 anchors.top: parent.top
36 anchors.left: parent.left
37 anchors.right: parent.right
38 height: parent.height / 2
77 theme: Chart.ThemeIcy
39 theme: Chart.ThemeIcy
40 // opacity: 0.3
78
41
79 // PieSeries {
80 // labels: ["point1", "point2", "point3", "point4", "point5"]
81 // datax: [2, 1.5, 3, 3, 3]
82 // }
83 // PieSeries {
84 // name: "raspberry pie"
85 // seriesLabels: ["point1", "point2", "point3", "point4", "point5"]
86 // seriesData: [2, 1.5, 3, 3, 3]
87 // }
88 // ScatterSeries {
89 // name: "scatter1"
90 // datax: [2, 1.5, 3, 3, 3]
91 // datay: [2, 1.5, 3, 3, 3]
92 // }
93 // Series {
94 // labels: ["point1", "point2", "point3", "point4", "point5"]
95 // datax: [2, 1.5, 3, 3, 3]
96 // seriesType: Series.SeriesTypePie
97 // }
98 Series {
42 Series {
99 seriesType: Series.SeriesTypePie
43 seriesType: Series.SeriesTypePie
100 //model: listModelForPie
101 //seriesData: {11.0, 6.4, 12.6, 22.4}
102 //seriesLabels: {"Strawberry", "Blackberry", "Apple", "Pumpkin"}
103 }
44 }
104
45
105 Series {
46 // TODO: a bug: drawing order affects the drawing; if you draw chart1 first (by changing the
106 // data: {[1.2], "y":2.2 }
47 // z-order), then chart2 is not shown at all. By drawing chart2 first, both are visible.
107 seriesType: Series.SeriesTypeScatter
48 // Also, if you don't draw line series on chart1 (only pie), both charts are visible.
108 }
49 // Series {
109 Series {
50 // seriesType: Series.SeriesTypeLine
110 seriesType: Series.SeriesTypeLine
51 // }
111 }
112 // TODO:
52 // TODO:
113 // Series {
53 // Series {
114 // seriesType: Series.SeriesTypeBar
54 // seriesType: Series.SeriesTypeBar
115 // }
55 // }
116 }
56 }
57
58
59 Chart {
60 id: chart2
61 anchors.top: chart1.bottom
62 anchors.bottom: parent.bottom
63 anchors.left: parent.left
64 anchors.right: parent.right
65 theme: Chart.ThemeScientific
66
67 ScatterSeries {
68 data: [
69 ScatterElement { x: 1.1; y: 2.1 },
70 ScatterElement { x: 1.2; y: 2.0 },
71 ScatterElement { x: 1.4; y: 2.3 }
72 ]
73 }
74 ScatterSeries {
75 data: [
76 ScatterElement { x: 1.2; y: 2.2 },
77 ScatterElement { x: 1.3; y: 2.2 },
78 ScatterElement { x: 1.7; y: 2.6 }
79 ]
80 }
81 ScatterSeries {
82 data: [
83 ScatterElement { x: 1.3; y: 2.3 },
84 ScatterElement { x: 1.5; y: 2.4 },
85 ScatterElement { x: 2.0; y: 2.9 }
86 ]
87 }
88 ScatterSeries {
89 data: [
90 ScatterElement { x: 1.4; y: 2.4 },
91 ScatterElement { x: 1.8; y: 2.7 },
92 ScatterElement { x: 2.5; y: 3.2 }
93 ]
94 }
95 }
117 }
96 }
General Comments 0
You need to be logged in to leave comments. Login now