##// END OF EJS Templates
Proof-of-concept for QML api...
Tero Ahola -
r120:c64ea33f6f52
parent child
Show More
@@ -0,0 +1,96
1 #include "declarativeseries.h"
2 #include "declarativechart.h"
3 #include <qxychartseries.h>
4 #include <cmath>
5 #include <QDebug>
6
7 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8
9 DeclarativeSeries::DeclarativeSeries(QDeclarativeItem *parent) :
10 QDeclarativeItem(parent),
11 m_seriesType(SeriesTypeInvalid), // TODO: default type?
12 m_chart(0),
13 m_series(0)
14 {
15 setFlag(QGraphicsItem::ItemHasNoContents, false);
16 connect(this, SIGNAL(parentChanged()),
17 this, SLOT(setParentForSeries()));
18 }
19
20 void DeclarativeSeries::setSeriesType(SeriesType type)
21 {
22 if (!m_series || type != m_seriesType) {
23 m_seriesType = type;
24 initSeries();
25 }
26 }
27
28 void DeclarativeSeries::setParentForSeries()
29 {
30 initSeries();
31 }
32
33 void DeclarativeSeries::initSeries()
34 {
35 DeclarativeChart *declarativeChart = qobject_cast<DeclarativeChart *>(parent());
36
37 if (declarativeChart && m_seriesType != SeriesTypeInvalid) {
38 delete m_series;
39 m_series = 0;
40
41 QChart *chart = qobject_cast<QChart *>(declarativeChart->m_chart);
42 qDebug() << "creating series for chart: " << chart;
43 Q_ASSERT(chart);
44
45 switch (m_seriesType) {
46 case SeriesTypeLine: {
47 m_series = QXYChartSeries::create(this);
48 for (qreal i(0.0); i < 100.0; i += 1.0)
49 ((QXYChartSeries *)m_series)->add(i, i);
50 chart->addSeries(m_series);
51 break;
52 }
53 case SeriesTypeBar:
54 // fallthrough; bar and scatter use the same test data
55 case SeriesTypeScatter: {
56 m_series = chart->createSeries((QChartSeries::QChartSeriesType) m_seriesType);
57 QList<qreal> datax;
58 QList<qreal> datay;
59 for (qreal i = 0; i < 100; i += 0.1) {
60 datax.append(i + (rand() % 5));
61 datay.append(abs(sin(3.14159265358979 / 50 * i) * 100) + (rand() % 5));
62 }
63 Q_ASSERT(m_series->setData(datax, datay));
64 break;
65 }
66 case SeriesTypeStackedBar:
67 break;
68 case SeriesTypePercentBar:
69 break;
70 case SeriesTypePie: {
71 m_series = chart->createSeries((QChartSeries::QChartSeriesType) m_seriesType);
72 QList<qreal> data;
73 data << 1.0;
74 data << 12.0;
75 data << 4.0;
76 Q_ASSERT(m_series->setData(data));
77 break;
78 }
79 default:
80 break;
81 }
82 }
83 }
84
85 QVariant DeclarativeSeries::itemChange(GraphicsItemChange change,
86 const QVariant &value)
87 {
88 // For debugging purposes only:
89 // qDebug() << QString::number(change) << " : " << value.toString();
90 return QGraphicsItem::itemChange(change, value);
91 }
92
93
94 #include "moc_declarativeseries.cpp"
95
96 QTCOMMERCIALCHART_END_NAMESPACE
@@ -0,0 +1,53
1 #ifndef DECLARATIVESERIES_H
2 #define DECLARATIVESERIES_H
3
4 #include <QDeclarativeItem>
5 #include <qchart.h>
6 #include <qchartseries.h>
7
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9
10 class DeclarativeSeries : public QDeclarativeItem
11 {
12 Q_OBJECT
13 Q_ENUMS(SeriesType)
14 Q_PROPERTY(SeriesType seriesType READ seriesType WRITE setSeriesType)
15
16 public:
17 // TODO: how to re-use the existing enum from QChart?
18 enum SeriesType {
19 SeriesTypeInvalid = QChartSeries::SeriesTypeInvalid,
20 SeriesTypeLine,
21 // SeriesTypeArea,
22 SeriesTypeBar,
23 SeriesTypeStackedBar,
24 SeriesTypePercentBar,
25 SeriesTypePie,
26 SeriesTypeScatter
27 // SeriesTypeSpline
28 };
29
30 explicit DeclarativeSeries(QDeclarativeItem *parent = 0);
31
32 signals:
33
34 public slots:
35 void setParentForSeries();
36
37 public: // from QDeclarativeItem
38 QVariant itemChange(GraphicsItemChange, const QVariant &);
39
40 public:
41 void setSeriesType(SeriesType type);
42 SeriesType seriesType() { return m_seriesType; }
43
44 private:
45 void initSeries();
46 SeriesType m_seriesType;
47 QChart *m_chart;
48 QChartSeries *m_series;
49 };
50
51 QTCOMMERCIALCHART_END_NAMESPACE
52
53 #endif // DECLARATIVESERIES_H
@@ -0,0 +1,59
1 #ifndef CHART_H
2 #define CHART_H
3
4 #include <QDeclarativeItem>
5 #include <QPainter>
6
7 class Chart : public QDeclarativeItem
8 {
9 Q_OBJECT
10 Q_PROPERTY(int theme READ theme WRITE setTheme NOTIFY themeChanged)
11
12 public:
13 Chart(QDeclarativeItem *parent = 0) :
14 QDeclarativeItem(parent), m_theme(0)
15 {
16 setFlag(QGraphicsItem::ItemHasNoContents, false);
17 }
18
19 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
20 {
21 // TODO: remove
22 QPen pen(QColor(0, 0, 0), 10);
23 painter->setPen(pen);
24 if(smooth() == true) {
25 painter->setRenderHint(QPainter::Antialiasing, true);
26 }
27 painter->drawLine(0, 0, 100, 100);
28 }
29
30 int theme() const { return m_theme; }
31
32 // Set methods
33 void setTheme(int theme) {
34 if (theme != m_theme) {
35 m_theme = theme;
36 updateSize();
37 emit themeChanged();
38 update();
39 }
40 }
41
42 signals:
43 void themeChanged();
44
45 private:
46 void updateSize() {
47 // setX(qMin(m_x1, m_x2) - m_penWidth/2);
48 // setY(qMin(m_y1, m_y2) - m_penWidth/2);
49 // setWidth(qAbs(m_x2 - m_x1) + m_penWidth);
50 // setHeight(qAbs(m_y2 - m_y1) + m_penWidth);
51 }
52
53 private:
54 int m_theme;
55 };
56
57 QML_DECLARE_TYPE(Chart)
58
59 #endif // CHART_H
@@ -0,0 +1,16
1 #include <QtGui/QApplication>
2 #include <QDeclarativeEngine>
3 #include "qmlapplicationviewer.h"
4 #include "chart.h"
5
6 Q_DECL_EXPORT int main(int argc, char *argv[])
7 {
8 QScopedPointer<QApplication> app(createApplication(argc, argv));
9 QScopedPointer<QmlApplicationViewer> viewer(QmlApplicationViewer::create());
10
11 viewer->setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
12 viewer->setMainQmlFile(QLatin1String("qml/qmlchart/main.qml"));
13 viewer->showExpanded();
14
15 return app->exec();
16 }
@@ -0,0 +1,76
1 import QtQuick 1.0
2 import QtCommercial.Chart 1.0
3
4 Rectangle {
5 width: 360
6 height: 360
7 Text {
8 text: qsTr("Hello World")
9 anchors.centerIn: parent
10 }
11
12 // Component.onCompleted: {
13 // for (var i = 0.0; i < 100.0; i += 0.1) {
14 // var x = i + Math.random() * 5;
15 // var y = Math.abs(Math.sin(3.14159 / 50 * x) * 100) + (Math.random() * 5);
16 // myData.append({'x':x, 'y':y});
17 // }
18 // }
19
20 // ChartModel {
21 // id: chartData
22 // ChartElement {
23 // y: 1.2
24 // }
25 // ChartElement {
26 // x: 1.1
27 // y: 1.2
28 // }
29 // ChartElement {
30 // label: "February"
31 // y: 1.2
32 // }
33 // ChartElement {
34 // label: "January"
35 // x: 0.2
36 // y: 2.1
37 // }
38 // }
39
40 // Series {
41 // model: chartData
42 // seriesType: pie
43 // axis: Series.AxisSecondaryY
44 // }
45
46 ListModel {
47 id: myData
48 ListElement {
49 nnn: 55.2
50 mmm: 13.1
51 }
52 ListElement {
53 nnn: 15.3
54 mmm: 3.4
55 }
56 }
57
58 Chart {
59 anchors.fill: parent
60 theme: Chart.ThemeIcy
61
62 Series {
63 seriesType: Series.SeriesTypePie
64 }
65 Series {
66 seriesType: Series.SeriesTypeScatter
67 }
68 Series {
69 seriesType: Series.SeriesTypeLine
70 }
71 // TODO:
72 // Series {
73 // seriesType: Series.SeriesTypeBar
74 // }
75 }
76 }
@@ -0,0 +1,200
1 // checksum 0x78c version 0x60010
2 /*
3 This file was generated by the Qt Quick Application wizard of Qt Creator.
4 QmlApplicationViewer is a convenience class containing mobile device specific
5 code such as screen orientation handling. Also QML paths and debugging are
6 handled here.
7 It is recommended not to modify this file, since newer versions of Qt Creator
8 may offer an updated version of it.
9 */
10
11 #include "qmlapplicationviewer.h"
12
13 #include <QtCore/QDir>
14 #include <QtCore/QFileInfo>
15 #include <QtDeclarative/QDeclarativeComponent>
16 #include <QtDeclarative/QDeclarativeEngine>
17 #include <QtDeclarative/QDeclarativeContext>
18 #include <QtGui/QApplication>
19
20 #include <qplatformdefs.h> // MEEGO_EDITION_HARMATTAN
21
22 #ifdef HARMATTAN_BOOSTER
23 #include <MDeclarativeCache>
24 #endif
25
26 #if defined(QMLJSDEBUGGER) && QT_VERSION < 0x040800
27
28 #include <qt_private/qdeclarativedebughelper_p.h>
29
30 #if !defined(NO_JSDEBUGGER)
31 #include <jsdebuggeragent.h>
32 #endif
33 #if !defined(NO_QMLOBSERVER)
34 #include <qdeclarativeviewobserver.h>
35 #endif
36
37 // Enable debugging before any QDeclarativeEngine is created
38 struct QmlJsDebuggingEnabler
39 {
40 QmlJsDebuggingEnabler()
41 {
42 QDeclarativeDebugHelper::enableDebugging();
43 }
44 };
45
46 // Execute code in constructor before first QDeclarativeEngine is instantiated
47 static QmlJsDebuggingEnabler enableDebuggingHelper;
48
49 #endif // QMLJSDEBUGGER
50
51 class QmlApplicationViewerPrivate
52 {
53 QmlApplicationViewerPrivate(QDeclarativeView *view_) : view(view_) {}
54
55 QString mainQmlFile;
56 QDeclarativeView *view;
57 friend class QmlApplicationViewer;
58 QString adjustPath(const QString &path);
59 };
60
61 QString QmlApplicationViewerPrivate::adjustPath(const QString &path)
62 {
63 #ifdef Q_OS_UNIX
64 #ifdef Q_OS_MAC
65 if (!QDir::isAbsolutePath(path))
66 return QCoreApplication::applicationDirPath()
67 + QLatin1String("/../Resources/") + path;
68 #else
69 QString pathInInstallDir;
70 const QString applicationDirPath = QCoreApplication::applicationDirPath();
71 pathInInstallDir = QString::fromAscii("%1/../%2").arg(applicationDirPath, path);
72
73 if (QFileInfo(pathInInstallDir).exists())
74 return pathInInstallDir;
75 #endif
76 #endif
77 return path;
78 }
79
80 QmlApplicationViewer::QmlApplicationViewer(QWidget *parent)
81 : QDeclarativeView(parent)
82 , d(new QmlApplicationViewerPrivate(this))
83 {
84 connect(engine(), SIGNAL(quit()), SLOT(close()));
85 setResizeMode(QDeclarativeView::SizeRootObjectToView);
86 // Qt versions prior to 4.8.0 don't have QML/JS debugging services built in
87 #if defined(QMLJSDEBUGGER) && QT_VERSION < 0x040800
88 #if !defined(NO_JSDEBUGGER)
89 new QmlJSDebugger::JSDebuggerAgent(d->view->engine());
90 #endif
91 #if !defined(NO_QMLOBSERVER)
92 new QmlJSDebugger::QDeclarativeViewObserver(d->view, d->view);
93 #endif
94 #endif
95 }
96
97 QmlApplicationViewer::QmlApplicationViewer(QDeclarativeView *view, QWidget *parent)
98 : QDeclarativeView(parent)
99 , d(new QmlApplicationViewerPrivate(view))
100 {
101 connect(view->engine(), SIGNAL(quit()), view, SLOT(close()));
102 view->setResizeMode(QDeclarativeView::SizeRootObjectToView);
103 // Qt versions prior to 4.8.0 don't have QML/JS debugging services built in
104 #if defined(QMLJSDEBUGGER) && QT_VERSION < 0x040800
105 #if !defined(NO_JSDEBUGGER)
106 new QmlJSDebugger::JSDebuggerAgent(d->view->engine());
107 #endif
108 #if !defined(NO_QMLOBSERVER)
109 new QmlJSDebugger::QDeclarativeViewObserver(d->view, d->view);
110 #endif
111 #endif
112 }
113
114 QmlApplicationViewer::~QmlApplicationViewer()
115 {
116 delete d;
117 }
118
119 QmlApplicationViewer *QmlApplicationViewer::create()
120 {
121 #ifdef HARMATTAN_BOOSTER
122 return new QmlApplicationViewer(MDeclarativeCache::qDeclarativeView(), 0);
123 #else
124 return new QmlApplicationViewer();
125 #endif
126 }
127
128 void QmlApplicationViewer::setMainQmlFile(const QString &file)
129 {
130 d->mainQmlFile = d->adjustPath(file);
131 d->view->setSource(QUrl::fromLocalFile(d->mainQmlFile));
132 }
133
134 void QmlApplicationViewer::addImportPath(const QString &path)
135 {
136 d->view->engine()->addImportPath(d->adjustPath(path));
137 }
138
139 void QmlApplicationViewer::setOrientation(ScreenOrientation orientation)
140 {
141 #if defined(Q_OS_SYMBIAN)
142 // If the version of Qt on the device is < 4.7.2, that attribute won't work
143 if (orientation != ScreenOrientationAuto) {
144 const QStringList v = QString::fromAscii(qVersion()).split(QLatin1Char('.'));
145 if (v.count() == 3 && (v.at(0).toInt() << 16 | v.at(1).toInt() << 8 | v.at(2).toInt()) < 0x040702) {
146 qWarning("Screen orientation locking only supported with Qt 4.7.2 and above");
147 return;
148 }
149 }
150 #endif // Q_OS_SYMBIAN
151
152 Qt::WidgetAttribute attribute;
153 switch (orientation) {
154 #if QT_VERSION < 0x040702
155 // Qt < 4.7.2 does not yet have the Qt::WA_*Orientation attributes
156 case ScreenOrientationLockPortrait:
157 attribute = static_cast<Qt::WidgetAttribute>(128);
158 break;
159 case ScreenOrientationLockLandscape:
160 attribute = static_cast<Qt::WidgetAttribute>(129);
161 break;
162 default:
163 case ScreenOrientationAuto:
164 attribute = static_cast<Qt::WidgetAttribute>(130);
165 break;
166 #else // QT_VERSION < 0x040702
167 case ScreenOrientationLockPortrait:
168 attribute = Qt::WA_LockPortraitOrientation;
169 break;
170 case ScreenOrientationLockLandscape:
171 attribute = Qt::WA_LockLandscapeOrientation;
172 break;
173 default:
174 case ScreenOrientationAuto:
175 attribute = Qt::WA_AutoOrientation;
176 break;
177 #endif // QT_VERSION < 0x040702
178 };
179 setAttribute(attribute, true);
180 }
181
182 void QmlApplicationViewer::showExpanded()
183 {
184 #if defined(Q_OS_SYMBIAN) || defined(MEEGO_EDITION_HARMATTAN) || defined(Q_WS_SIMULATOR)
185 d->view->showFullScreen();
186 #elif defined(Q_WS_MAEMO_5)
187 d->view->showMaximized();
188 #else
189 d->view->show();
190 #endif
191 }
192
193 QApplication *createApplication(int &argc, char **argv)
194 {
195 #ifdef HARMATTAN_BOOSTER
196 return MDeclarativeCache::qApplication(argc, argv);
197 #else
198 return new QApplication(argc, argv);
199 #endif
200 }
@@ -0,0 +1,47
1 // checksum 0x82ed version 0x60010
2 /*
3 This file was generated by the Qt Quick Application wizard of Qt Creator.
4 QmlApplicationViewer is a convenience class containing mobile device specific
5 code such as screen orientation handling. Also QML paths and debugging are
6 handled here.
7 It is recommended not to modify this file, since newer versions of Qt Creator
8 may offer an updated version of it.
9 */
10
11 #ifndef QMLAPPLICATIONVIEWER_H
12 #define QMLAPPLICATIONVIEWER_H
13
14 #include <QtDeclarative/QDeclarativeView>
15
16 class QmlApplicationViewer : public QDeclarativeView
17 {
18 Q_OBJECT
19
20 public:
21 enum ScreenOrientation {
22 ScreenOrientationLockPortrait,
23 ScreenOrientationLockLandscape,
24 ScreenOrientationAuto
25 };
26
27 explicit QmlApplicationViewer(QWidget *parent = 0);
28 virtual ~QmlApplicationViewer();
29
30 static QmlApplicationViewer *create();
31
32 void setMainQmlFile(const QString &file);
33 void addImportPath(const QString &path);
34
35 // Note that this will only have an effect on Symbian and Fremantle.
36 void setOrientation(ScreenOrientation orientation);
37
38 void showExpanded();
39
40 private:
41 explicit QmlApplicationViewer(QDeclarativeView *view, QWidget *parent);
42 class QmlApplicationViewerPrivate *d;
43 };
44
45 QApplication *createApplication(int &argc, char **argv);
46
47 #endif // QMLAPPLICATIONVIEWER_H
@@ -0,0 +1,146
1 # checksum 0x368d version 0x60010
2 # This file was generated by the Qt Quick Application wizard of Qt Creator.
3 # The code below adds the QmlApplicationViewer to the project and handles the
4 # activation of QML debugging.
5 # It is recommended not to modify this file, since newer versions of Qt Creator
6 # may offer an updated version of it.
7
8 QT += declarative
9
10 SOURCES += $$PWD/qmlapplicationviewer.cpp
11 HEADERS += $$PWD/qmlapplicationviewer.h
12 INCLUDEPATH += $$PWD
13
14 # Include JS debugger library if QMLJSDEBUGGER_PATH is set
15 !isEmpty(QMLJSDEBUGGER_PATH) {
16 include($$QMLJSDEBUGGER_PATH/qmljsdebugger-lib.pri)
17 } else {
18 DEFINES -= QMLJSDEBUGGER
19 }
20
21 contains(CONFIG,qdeclarative-boostable):contains(MEEGO_EDITION,harmattan) {
22 DEFINES += HARMATTAN_BOOSTER
23 }
24 # This file was generated by an application wizard of Qt Creator.
25 # The code below handles deployment to Symbian and Maemo, aswell as copying
26 # of the application data to shadow build directories on desktop.
27 # It is recommended not to modify this file, since newer versions of Qt Creator
28 # may offer an updated version of it.
29
30 defineTest(qtcAddDeployment) {
31 for(deploymentfolder, DEPLOYMENTFOLDERS) {
32 item = item$${deploymentfolder}
33 itemsources = $${item}.sources
34 $$itemsources = $$eval($${deploymentfolder}.source)
35 itempath = $${item}.path
36 $$itempath= $$eval($${deploymentfolder}.target)
37 export($$itemsources)
38 export($$itempath)
39 DEPLOYMENT += $$item
40 }
41
42 MAINPROFILEPWD = $$PWD
43
44 symbian {
45 isEmpty(ICON):exists($${TARGET}.svg):ICON = $${TARGET}.svg
46 isEmpty(TARGET.EPOCHEAPSIZE):TARGET.EPOCHEAPSIZE = 0x20000 0x2000000
47 } else:win32 {
48 copyCommand =
49 for(deploymentfolder, DEPLOYMENTFOLDERS) {
50 source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
51 source = $$replace(source, /, \\)
52 sourcePathSegments = $$split(source, \\)
53 target = $$OUT_PWD/$$eval($${deploymentfolder}.target)/$$last(sourcePathSegments)
54 target = $$replace(target, /, \\)
55 !isEqual(source,$$target) {
56 !isEmpty(copyCommand):copyCommand += &&
57 isEqual(QMAKE_DIR_SEP, \\) {
58 copyCommand += $(COPY_DIR) \"$$source\" \"$$target\"
59 } else {
60 source = $$replace(source, \\\\, /)
61 target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
62 target = $$replace(target, \\\\, /)
63 copyCommand += test -d \"$$target\" || mkdir -p \"$$target\" && cp -r \"$$source\" \"$$target\"
64 }
65 }
66 }
67 !isEmpty(copyCommand) {
68 copyCommand = @echo Copying application data... && $$copyCommand
69 copydeploymentfolders.commands = $$copyCommand
70 first.depends = $(first) copydeploymentfolders
71 export(first.depends)
72 export(copydeploymentfolders.commands)
73 QMAKE_EXTRA_TARGETS += first copydeploymentfolders
74 }
75 } else:unix {
76 maemo5 {
77 desktopfile.files = $${TARGET}.desktop
78 desktopfile.path = /usr/share/applications/hildon
79 icon.files = $${TARGET}64.png
80 icon.path = /usr/share/icons/hicolor/64x64/apps
81 } else:!isEmpty(MEEGO_VERSION_MAJOR) {
82 desktopfile.files = $${TARGET}_harmattan.desktop
83 desktopfile.path = /usr/share/applications
84 icon.files = $${TARGET}80.png
85 icon.path = /usr/share/icons/hicolor/80x80/apps
86 } else { # Assumed to be a Desktop Unix
87 copyCommand =
88 for(deploymentfolder, DEPLOYMENTFOLDERS) {
89 source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
90 source = $$replace(source, \\\\, /)
91 macx {
92 target = $$OUT_PWD/$${TARGET}.app/Contents/Resources/$$eval($${deploymentfolder}.target)
93 } else {
94 target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
95 }
96 target = $$replace(target, \\\\, /)
97 sourcePathSegments = $$split(source, /)
98 targetFullPath = $$target/$$last(sourcePathSegments)
99 !isEqual(source,$$targetFullPath) {
100 !isEmpty(copyCommand):copyCommand += &&
101 copyCommand += $(MKDIR) \"$$target\"
102 copyCommand += && $(COPY_DIR) \"$$source\" \"$$target\"
103 }
104 }
105 !isEmpty(copyCommand) {
106 copyCommand = @echo Copying application data... && $$copyCommand
107 copydeploymentfolders.commands = $$copyCommand
108 first.depends = $(first) copydeploymentfolders
109 export(first.depends)
110 export(copydeploymentfolders.commands)
111 QMAKE_EXTRA_TARGETS += first copydeploymentfolders
112 }
113 }
114 installPrefix = /opt/$${TARGET}
115 for(deploymentfolder, DEPLOYMENTFOLDERS) {
116 item = item$${deploymentfolder}
117 itemfiles = $${item}.files
118 $$itemfiles = $$eval($${deploymentfolder}.source)
119 itempath = $${item}.path
120 $$itempath = $${installPrefix}/$$eval($${deploymentfolder}.target)
121 export($$itemfiles)
122 export($$itempath)
123 INSTALLS += $$item
124 }
125
126 !isEmpty(desktopfile.path) {
127 export(icon.files)
128 export(icon.path)
129 export(desktopfile.files)
130 export(desktopfile.path)
131 INSTALLS += icon desktopfile
132 }
133
134 target.path = $${installPrefix}/bin
135 export(target.path)
136 INSTALLS += target
137 }
138
139 export (ICON)
140 export (INSTALLS)
141 export (DEPLOYMENT)
142 export (TARGET.EPOCHEAPSIZE)
143 export (TARGET.CAPABILITY)
144 export (LIBS)
145 export (QMAKE_EXTRA_TARGETS)
146 }
@@ -0,0 +1,11
1 [Desktop Entry]
2 Encoding=UTF-8
3 Version=1.0
4 Type=Application
5 Terminal=false
6 Name=qmlchart
7 Exec=/opt/qmlchart/bin/qmlchart
8 Icon=qmlchart64
9 X-Window-Icon=
10 X-HildonDesk-ShowInToolbar=true
11 X-Osso-Type=application/x-executable
@@ -0,0 +1,56
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 integrated_build: {
9 # cannot use integrated build for now; we would need the qml files copied to
10 # charts/bin folder also to make this work. And even in that case I'm not sure if
11 # the chart qml plugin can be found or if it needs to be installed to the qt's plugin
12 # folder always.
13 warning("TODO: Charts qml test app does not work with integrated builds")
14 }
15
16 # Add more folders to ship with the application, here
17 folder_01.source = qml/qmlchart
18 folder_01.target = qml
19 DEPLOYMENTFOLDERS = folder_01
20
21 # Additional import path used to resolve QML modules in Creator's code model
22 QML_IMPORT_PATH =
23
24 symbian:TARGET.UID3 = 0xE421236E
25
26 # Smart Installer package's UID
27 # This UID is from the protected range and therefore the package will
28 # fail to install if self-signed. By default qmake uses the unprotected
29 # range value if unprotected UID is defined for the application and
30 # 0x2002CCCF value if protected UID is given to the application
31 #symbian:DEPLOYMENT.installer_header = 0x2002CCCF
32
33 # Allow network access on Symbian
34 symbian:TARGET.CAPABILITY += NetworkServices
35
36 # If your application uses the Qt Mobility libraries, uncomment the following
37 # lines and add the respective components to the MOBILITY variable.
38 # CONFIG += mobility
39 # MOBILITY +=
40
41 # Speed up launching on MeeGo/Harmattan when using applauncherd daemon
42 # CONFIG += qdeclarative-boostable
43
44 # Add dependency to Symbian components
45 # CONFIG += qt-components
46
47 # The .cpp file which was generated for your project. Feel free to hack it.
48 SOURCES += main.cpp
49
50 # Please do not modify the following two lines. Required for deployment.
51 include(qmlapplicationviewer/qmlapplicationviewer.pri)
52 qtcAddDeployment()
53
54 #HEADERS += \
55 # chart.h
56
@@ -0,0 +1,93
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2 <svg
3 xmlns:dc="http://purl.org/dc/elements/1.1/"
4 xmlns:cc="http://creativecommons.org/ns#"
5 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
6 xmlns:svg="http://www.w3.org/2000/svg"
7 xmlns="http://www.w3.org/2000/svg"
8 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
9 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
10 height="44px"
11 version="1.1"
12 viewBox="0 0 44 44"
13 width="44px"
14 x="0px"
15 y="0px"
16 id="svg2"
17 inkscape:version="0.47 r22583"
18 sodipodi:docname="qt.svg">
19 <metadata
20 id="metadata18">
21 <rdf:RDF>
22 <cc:Work
23 rdf:about="">
24 <dc:format>image/svg+xml</dc:format>
25 <dc:type
26 rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
27 </cc:Work>
28 </rdf:RDF>
29 </metadata>
30 <defs
31 id="defs16">
32 <inkscape:perspective
33 sodipodi:type="inkscape:persp3d"
34 inkscape:vp_x="0 : 22 : 1"
35 inkscape:vp_y="0 : 1000 : 0"
36 inkscape:vp_z="44 : 22 : 1"
37 inkscape:persp3d-origin="22 : 14.666667 : 1"
38 id="perspective2836" />
39 </defs>
40 <sodipodi:namedview
41 pagecolor="#ffffff"
42 bordercolor="#666666"
43 borderopacity="1"
44 objecttolerance="10"
45 gridtolerance="10"
46 guidetolerance="10"
47 inkscape:pageopacity="0"
48 inkscape:pageshadow="2"
49 inkscape:window-width="1920"
50 inkscape:window-height="1020"
51 id="namedview14"
52 showgrid="false"
53 inkscape:zoom="21.454545"
54 inkscape:cx="49.412871"
55 inkscape:cy="21.894358"
56 inkscape:window-x="-4"
57 inkscape:window-y="-4"
58 inkscape:window-maximized="1"
59 inkscape:current-layer="g3" />
60 <g
61 transform="matrix(0.18308778,0,0,0.18308778,6.6100946,3.2385199)"
62 id="g3">
63 <path
64 d="M 43.09,0.3586 C 40.94,0.0036 38.84,-0.0824 36.81,0.0776 31.968136,0.39505671 27.122677,0.73638425 22.28,1.0696 9.62,2.0816 0,12.4996 0,26.8896 l 0,169.7 14.19,13.2 28.87,-209.42 0.03,-0.011 z"
65 style="fill:#006225"
66 id="path5"
67 sodipodi:nodetypes="cccccccc" />
68 <path
69 d="m 174.4,160 c 0,12.5 -7.75,24.07 -17.57,25.77 L 14.23,209.73 V 25.93 C 14.23,9.21 27.57,-2.27 43.12,0.3 l 131.3,21.52 v 138.2 z"
70 style="fill:#80c342"
71 id="path7" />
72 <path
73 d="m 154.9,80.96 -12.96,-0.598 0,0.278 6.945,0.32 6.016,0 z"
74 style="fill:#006225"
75 id="path11" />
76 <path
77 d="m 144.6,135.6 c 0.66,0.328 1.43,0.476 2.351,0.476 0.161,0 0.329,-0.004 0.497,-0.016 2.55,-0.148 5.32,-0.933 8.343,-2.308 h -6.015 c -1.821,0.832 -3.532,1.457 -5.176,1.848 z"
78 style="fill:#006225"
79 id="path13" />
80 <path
81 id="path17"
82 style="fill:#ffffff"
83 d="m 91.15,132.4 c 2.351,-6.051 3.511,-17.91 3.511,-35.62 0,-15.89 -1.148,-26.82 -3.484,-32.81 -2.336,-6.027 -5.832,-9.281 -10.52,-9.691 -0.359,-0.031 -0.714,-0.051 -1.058,-0.051 -4.34,0 -7.68,2.535 -10.01,7.625 -2.52,5.543 -3.793,17.04 -3.793,34.44 0,16.82 1.238,28.75 3.734,35.75 2.356,6.672 5.879,9.976 10.5,9.976 0.207,0 0.41,-0.008 0.621,-0.019 4.633,-0.293 8.121,-3.496 10.49,-9.602 m 17.98,3.75 c -4.117,9.707 -10.39,16.06 -18.99,19 0.867,4.449 2.176,7.441 3.922,9.019 1.351,1.211 3.433,1.821 6.222,1.821 0.805,0 1.668,-0.055 2.59,-0.157 v 13.12 l -5.961,0.782 c -1.758,0.23 -3.426,0.343 -5.004,0.343 -5.218,0 -9.445,-1.265 -12.62,-3.824 -4.207,-3.379 -7.308,-9.894 -9.297,-19.54 -9.136,-1.945 -16.26,-7.754 -21.19,-17.5 -5.004,-9.902 -7.551,-24.39 -7.551,-43.34 0,-20.43 3.484,-35.51 10.34,-45.07 5.789,-8.07 13.86,-12.04 24.02,-12.04 1.629,0 3.309,0.102 5.043,0.305 11.95,1.375 20.62,7.016 26.26,16.79 5.535,9.562 8.254,23.27 8.254,41.26 0,16.48 -2,29.45 -6.043,39.02 z M 130.4,45.91 l 11.52,1.238 0,20.21 12.96,0.914 0,12.68 -12.96,-0.598 0,46.33 c 0,4.032 0.445,6.625 1.34,7.789 0.8,1.067 2.046,1.594 3.71,1.594 0.161,0 0.329,-0.004 0.497,-0.016 2.55,-0.148 5.32,-0.933 8.343,-2.308 v 11.65 c -5.136,2.258 -10.18,3.598 -15.12,4.02 -0.718,0.055 -1.41,0.086 -2.078,0.086 -4.48,0 -7.906,-1.301 -10.25,-3.934 -2.73,-3.051 -4.09,-7.949 -4.09,-14.67 V 79.535 L 118.046,79.25 V 65.66 l 7.586,0.547 4.773,-20.3 z" />
84 <path
85 d="m 100.3,166 c 0.809,0 1.672,-0.055 2.59,-0.157 H 98.054 C 98.73,165.949 99.507,166 100.3,166 z"
86 style="fill:#006225"
87 id="path19" />
88 <path
89 id="path21"
90 style="fill:#006225"
91 d="m 84.85,63.98 c 2.336,5.997 3.484,16.92 3.484,32.81 0,17.7 -1.16,29.57 -3.512,35.62 -1.894,4.879 -4.527,7.902 -7.863,9.07 0.965,0.368 1.992,0.551 3.078,0.551 0.207,0 0.41,-0.008 0.621,-0.019 4.633,-0.293 8.121,-3.496 10.49,-9.602 2.351,-6.051 3.511,-17.91 3.511,-35.62 0,-15.89 -1.148,-26.82 -3.484,-32.81 -2.336,-6.027 -5.832,-9.281 -10.52,-9.691 -0.359,-0.031 -0.714,-0.051 -1.058,-0.051 -1.09,0 -2.117,0.16 -3.082,0.481 h -0.004 c 3.601,1.121 6.379,4.215 8.336,9.261 z m -2.344,114.3 c -0.113,-0.05 -0.227,-0.105 -0.336,-0.16 -0.012,-0.004 -0.023,-0.012 -0.035,-0.015 -0.102,-0.051 -0.207,-0.106 -0.309,-0.157 -0.019,-0.011 -0.039,-0.019 -0.058,-0.031 -0.09,-0.051 -0.184,-0.098 -0.278,-0.148 -0.027,-0.016 -0.054,-0.036 -0.086,-0.051 -0.082,-0.043 -0.164,-0.09 -0.242,-0.137 -0.039,-0.023 -0.078,-0.047 -0.113,-0.07 -0.07,-0.039 -0.145,-0.082 -0.215,-0.125 -0.047,-0.031 -0.094,-0.059 -0.14,-0.09 -0.059,-0.039 -0.118,-0.074 -0.176,-0.113 -0.059,-0.039 -0.114,-0.075 -0.168,-0.114 -0.051,-0.031 -0.102,-0.066 -0.149,-0.097 -0.066,-0.047 -0.132,-0.094 -0.195,-0.137 -0.039,-0.027 -0.078,-0.055 -0.113,-0.082 -0.078,-0.055 -0.153,-0.113 -0.231,-0.172 -0.023,-0.016 -0.05,-0.035 -0.078,-0.055 -0.098,-0.078 -0.199,-0.156 -0.297,-0.234 -4.207,-3.379 -7.308,-9.894 -9.297,-19.54 -9.136,-1.945 -16.26,-7.754 -21.19,-17.5 -5.004,-9.902 -7.551,-24.39 -7.551,-43.34 0,-20.43 3.484,-35.51 10.34,-45.07 5.789,-8.07 13.86,-12.04 24.02,-12.04 h -6.351 c -10.15,0.008 -18.22,3.977 -24,12.04 -6.855,9.563 -10.34,24.64 -10.34,45.07 0,18.95 2.547,33.44 7.551,43.34 4.934,9.75 12.05,15.56 21.19,17.5 1.989,9.641 5.09,16.16 9.297,19.54 3.176,2.559 7.403,3.824 12.62,3.824 0.098,0 0.199,0 0.297,-0.004 h 5.539 c -3.406,-0.05 -6.383,-0.66 -8.906,-1.828 L 82.498,178.28 z M 128.4,145.6 c -2.73,-3.051 -4.09,-7.949 -4.09,-14.67 V 79.57 l -6.226,-0.285 v -13.59 h -6.016 v 3.035 c 0.871,3.273 1.555,6.82 2.063,10.64 l 4.164,0.192 v 51.36 c 0,6.723 1.367,11.62 4.09,14.67 2.343,2.633 5.765,3.934 10.25,3.934 h 6.015 c -4.48,0 -7.906,-1.301 -10.25,-3.934 z m 2.043,-99.66 -6.016,0 -4.668,19.88 5.911,0.422 4.773,-20.3 z" />
92 </g>
93 </svg>
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
@@ -0,0 +1,11
1 [Desktop Entry]
2 Encoding=UTF-8
3 Version=1.0
4 Type=Application
5 Terminal=false
6 Name=qmlchart
7 Exec=/usr/bin/single-instance /opt/qmlchart/bin/qmlchart
8 Icon=/usr/share/icons/hicolor/80x80/apps/qmlchart80.png
9 X-Window-Icon=
10 X-HildonDesk-ShowInToolbar=true
11 X-Osso-Type=application/x-executable
@@ -1,15 +1,15
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 example test
6 SUBDIRS += src qmlplugin example test
7 CONFIG += ordered
7 CONFIG += ordered
8 QMAKE_CXXFLAGS += -g -Wall
8 QMAKE_CXXFLAGS += -g -Wall
9 unix:QMAKE_DISTCLEAN += -r build bin
9 unix:QMAKE_DISTCLEAN += -r build bin
10 win32:QMAKE_DISTCLEAN += /Q build bin
10 win32:QMAKE_DISTCLEAN += /Q build bin
11
11
12 # install feature file
12 # install feature file
13 feature.path = $$[QT_INSTALL_DATA]/mkspecs/features
13 feature.path = $$[QT_INSTALL_DATA]/mkspecs/features
14 feature.files = $$PWD/features/qtcommercialchart.prf
14 feature.files = $$PWD/features/qtcommercialchart.prf
15 INSTALLS += feature
15 INSTALLS += feature
@@ -1,24 +1,23
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_HEADER_DIR = $$PWD/include
4 CHART_BUILD_LIB_DIR = $$PWD/lib
4 CHART_BUILD_LIB_DIR = $$PWD/lib
5 CHART_BUILD_DIR = $$PWD/build
5 CHART_BUILD_DIR = $$PWD/build
6 CHART_BUILD_BIN_DIR = $$PWD/bin
6 CHART_BUILD_BIN_DIR = $$PWD/bin
7
7
8 # hack to fix windows builds
8 # hack to fix windows builds
9
10 win32:{
9 win32:{
11 CHART_BUILD_HEADER_DIR = $$replace(CHART_BUILD_HEADER_DIR, "/","\\")
10 CHART_BUILD_HEADER_DIR = $$replace(CHART_BUILD_HEADER_DIR, "/","\\")
12 CHART_BUILD_LIB_DIR = $$replace(CHART_BUILD_LIB_DIR, "/","\\")
11 CHART_BUILD_LIB_DIR = $$replace(CHART_BUILD_LIB_DIR, "/","\\")
13 CHART_BUILD_BUILD_DIR = $$replace(CHART_BUILD_BUILD_DIR, "/","\\")
12 CHART_BUILD_BUILD_DIR = $$replace(CHART_BUILD_BUILD_DIR, "/","\\")
14 CHART_BUILD_BIN_DIR = $$replace(CHART_BUILD_BIN_DIR, "/","\\")
13 CHART_BUILD_BIN_DIR = $$replace(CHART_BUILD_BIN_DIR, "/","\\")
15 }
14 }
16
15
17 mac: {
16 mac: {
18 # TODO: The following qmake flags are a work-around to make QtCommercial Charts compile on
17 # TODO: The following qmake flags are a work-around to make QtCommercial Charts compile on
19 # QtCommercial 4.8. On the other hand Charts builds successfully with Qt open source 4.8
18 # QtCommercial 4.8. On the other hand Charts builds successfully with Qt open source 4.8
20 # without these definitions, so this is probably a configuration issue on QtCommercial 4.8;
19 # without these definitions, so this is probably a configuration issue on QtCommercial 4.8;
21 # it should probably define the minimum OSX version to be 10.5...
20 # it should probably define the minimum OSX version to be 10.5...
22 QMAKE_CXXFLAGS *= -mmacosx-version-min=10.5
21 QMAKE_CXXFLAGS *= -mmacosx-version-min=10.5
23 QMAKE_LFLAGS *= -mmacosx-version-min=10.5
22 QMAKE_LFLAGS *= -mmacosx-version-min=10.5
24 }
23 }
@@ -1,9 +1,7
1 message( "Configuring with QtCommercialChart addon..." )
2
3 INCLUDEPATH += $$[QT_INSTALL_HEADERS]/QtCommercialChart
1 INCLUDEPATH += $$[QT_INSTALL_HEADERS]/QtCommercialChart
4
2
5 CONFIG(debug, debug|release) {
3 CONFIG(debug, debug|release) {
6 LIBS += -lQtCommercialChartd
4 LIBS += -lQtCommercialChartd
7 } else {
5 } else {
8 LIBS += -lQtCommercialChart
6 LIBS += -lQtCommercialChart
9 }
7 }
@@ -1,27 +1,29
1 #include "declarativechart.h"
1 #include "declarativechart.h"
2 #include <QPainter>
3
2
4 #ifndef QTQUICK2
3 QTCOMMERCIALCHART_BEGIN_NAMESPACE
4
5 DeclarativeChart::DeclarativeChart(QDeclarativeItem *parent)
5 DeclarativeChart::DeclarativeChart(QDeclarativeItem *parent)
6 : QDeclarativeItem(parent)
6 : QDeclarativeItem(parent),
7 m_chart(new QChart(this))
7 {
8 {
8 // need to disable this flag to draw inside a QDeclarativeItem
9 setFlag(QGraphicsItem::ItemHasNoContents, false);
9 setFlag(QGraphicsItem::ItemHasNoContents, false);
10 m_chart->resize(QSize(height(), width()));
11 m_chart->setMargin(25); // TODO: should not be needed?
10 }
12 }
11 #else
12 DeclarativeChart::DeclarativeChart(QQuickItem *parent)
13 : QQuickPaintedItem(parent)
14 {
15
13
14 DeclarativeChart::ChartTheme DeclarativeChart::theme()
15 {
16 if (m_chart)
17 return (ChartTheme) m_chart->theme();
18 else
19 return ThemeInvalid;
16 }
20 }
17 #endif
18
21
19 #ifndef QTQUICK2
22 void DeclarativeChart::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
20 void DeclarativeChart::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
21 #else
22 void DeclarativeChart::paint(QPainter *painter)
23 #endif
24 {
23 {
25 drawChart(painter, boundingRect());
24 m_chart->resize(QSize(newGeometry.width(), newGeometry.height()));
26 }
25 }
27
26
27 #include "moc_declarativechart.cpp"
28
29 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,37 +1,45
1 #ifndef DECLARATIVECHART_H
1 #ifndef DECLARATIVECHART_H
2 #define DECLARATIVECHART_H
2 #define DECLARATIVECHART_H
3
3
4 #include <QtCore/QtGlobal>
4 #include <QtCore/QtGlobal>
5 #ifndef QTQUICK2
6 #include <QDeclarativeItem>
5 #include <QDeclarativeItem>
7 #else
6 #include <qchart.h>
8 #include <QtQuick/QQuickPaintedItem>
7
9 #endif
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
10 #include <QColor>
9
11 #include "../src/chart.h"
10 class DeclarativeChart : public QDeclarativeItem
12
11 // TODO: for QTQUICK2: extend QQuickPainterItem instead
13 #ifndef QTQUICK2
12 //class DeclarativeChart : public QQuickPaintedItem, public Chart
14 class DeclarativeChart : public QDeclarativeItem, public Chart
15 #else
16 class DeclarativeChart : public QQuickPaintedItem, public Chart
17 #endif
18 {
13 {
19 Q_OBJECT
14 Q_OBJECT
20 Q_PROPERTY(QColor color READ color WRITE setColor)
15 Q_ENUMS(ChartTheme)
16 Q_PROPERTY(ChartTheme theme READ theme WRITE setTheme)
21
17
22 public:
18 public:
23 #ifndef QTQUICK2
19 enum ChartTheme {
20 ThemeInvalid = QChart::ChartThemeInvalid,
21 ThemeDefault,
22 ThemeVanilla,
23 ThemeIcy,
24 ThemeGrayscale,
25 //ThemeScientific,
26 ThemeUnnamed1
27 };
24 DeclarativeChart(QDeclarativeItem *parent = 0);
28 DeclarativeChart(QDeclarativeItem *parent = 0);
25 #else
29
26 DeclarativeChart(QQuickItem *parent = 0);
30 public: // From QDeclarativeItem/QGraphicsItem
27 #endif
31 void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry);
28
32
29 #ifndef QTQUICK2
33 public:
30 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
34 void setTheme(ChartTheme theme) {m_chart->setTheme((QChart::ChartThemeId) theme);}
31 #else
35 ChartTheme theme();
32 void paint(QPainter *painter);
36
33 #endif
37 public:
38 // Extending QChart with DeclarativeChart is not possible because QObject does not support
39 // multi inheritance, so we now have a QChart as a member instead
40 QChart *m_chart;
34 };
41 };
35
42
43 QTCOMMERCIALCHART_END_NAMESPACE
36
44
37 #endif // DECLARATIVECHART_H
45 #endif // DECLARATIVECHART_H
@@ -1,22 +1,27
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
5
5 QT_BEGIN_NAMESPACE
6 QTCOMMERCIALCHART_BEGIN_NAMESPACE
6
7
7 class QmlChartPlugin : public QDeclarativeExtensionPlugin
8 class ChartQmlPlugin : public QDeclarativeExtensionPlugin
8 {
9 {
9 Q_OBJECT
10 Q_OBJECT
10 public:
11 public:
11 virtual void registerTypes(const char *uri)
12 virtual void registerTypes(const char *uri)
12 {
13 {
13 Q_ASSERT(QLatin1String(uri) == QLatin1String("com.digia.charts"));
14 Q_ASSERT(QLatin1String(uri) == QLatin1String("QtCommercial.Chart"));
14 qmlRegisterType<DeclarativeChart>(uri, 1, 0, "Chart");
15 qmlRegisterType<DeclarativeChart>(uri, 1, 0, "Chart");
16 qmlRegisterType<DeclarativeSeries>(uri, 1, 0, "Series");
17 //qmlRegisterUncreatableType<QChartSeries::SeriesTypeBar>(uri, 1, 0, "Series.Se", QLatin1String("Do not create objects of this type."));
15 }
18 }
16 };
19 };
17
20
18 QT_END_NAMESPACE
19
20 #include "plugin.moc"
21 #include "plugin.moc"
21
22
22 Q_EXPORT_PLUGIN2(qmlchartplugin, QT_PREPEND_NAMESPACE(QmlChartPlugin));
23 QTCOMMERCIALCHART_END_NAMESPACE
24
25 QTCOMMERCIALCHART_USE_NAMESPACE
26
27 Q_EXPORT_PLUGIN2(qtcommercialchartqml, QT_PREPEND_NAMESPACE(ChartQmlPlugin))
@@ -1,1 +1,1
1 plugin qmlchartplugin
1 plugin qtcommercialchartqml
@@ -1,30 +1,39
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
1 TEMPLATE = lib
8 TEMPLATE = lib
2 TARGET = qmlchartplugin
9 TARGET = qtcommercialchartqml
3
10
4 CONFIG += qt plugin
11 CONFIG += qt plugin
5 QT += declarative
12 QT += declarative
6
13
7 contains(QT_MAJOR_VERSION, 5) {
14 contains(QT_MAJOR_VERSION, 5) {
15 # TODO: QtQuick2 not supported by the implementation currently
8 DEFINES += QTQUICK2
16 DEFINES += QTQUICK2
9 }
17 }
10
18
11 OBJECTS_DIR = tmp
19 OBJECTS_DIR = $$CHART_BUILD_DIR/lib
12 MOC_DIR = tmp
20 MOC_DIR = $$CHART_BUILD_DIR/lib
21 UI_DIR = $$CHART_BUILD_DIR/lib
22 RCC_DIR = $$CHART_BUILD_DIR/lib
13
23
14 SOURCES += \
24 SOURCES += \
15 plugin.cpp \
25 plugin.cpp \
16 declarativechart.cpp
26 declarativechart.cpp \
27 declarativeseries.cpp
17 HEADERS += \
28 HEADERS += \
18 declarativechart.h
29 declarativechart.h \
19 include(../src/chart.pri)
30 declarativeseries.h
20
31
21 TARGETPATH = com/digia/charts
32 TARGETPATH = QtCommercial/Chart
22
23 #DESTDIR = $$[QT_INSTALL_IMPORTS]/$$TARGETPATH
24 target.path = $$[QT_INSTALL_IMPORTS]/$$TARGETPATH
33 target.path = $$[QT_INSTALL_IMPORTS]/$$TARGETPATH
25
26 qmldir.files += $$PWD/qmldir
34 qmldir.files += $$PWD/qmldir
27 qmldir.path += $$[QT_INSTALL_IMPORTS]/$$TARGETPATH
35 qmldir.path += $$[QT_INSTALL_IMPORTS]/$$TARGETPATH
28
36
29 INSTALLS += target qmldir
37 INSTALLS += target qmldir
30
38
39
@@ -1,405 +1,414
1 #include "qchart.h"
1 #include "qchart.h"
2 #include "qchartseries.h"
2 #include "qchartseries.h"
3 #include "qscatterseries.h"
3 #include "qscatterseries.h"
4 #include "qscatterseries_p.h"
4 #include "qscatterseries_p.h"
5 #include "qpieseries.h"
5 #include "qpieseries.h"
6 #include "qpieseries_p.h"
6 #include "qpieseries_p.h"
7 #include "qxychartseries.h"
7 #include "qxychartseries.h"
8 #include "qchartaxis.h"
8 #include "qchartaxis.h"
9 #include "barchartseries.h"
9 #include "barchartseries.h"
10 #include "bargroup.h"
10 #include "bargroup.h"
11 #include "stackedbarchartseries.h"
11 #include "stackedbarchartseries.h"
12 #include "stackedbargroup.h"
12 #include "stackedbargroup.h"
13 #include "percentbarchartseries.h"
13 #include "percentbarchartseries.h"
14 #include "percentbargroup.h"
14 #include "percentbargroup.h"
15 #include "charttheme_p.h"
15 #include "charttheme_p.h"
16 #include "chartitem_p.h"
16 #include "chartitem_p.h"
17
17
18 #include "xylinechartitem_p.h"
18 #include "xylinechartitem_p.h"
19 #include "plotdomain_p.h"
19 #include "plotdomain_p.h"
20 #include "axisitem_p.h"
20 #include "axisitem_p.h"
21 #include <QGraphicsScene>
21 #include <QGraphicsScene>
22 #include <QGraphicsSceneResizeEvent>
22 #include <QGraphicsSceneResizeEvent>
23 #include <QDebug>
23 #include <QDebug>
24
24
25 QTCOMMERCIALCHART_BEGIN_NAMESPACE
25 QTCOMMERCIALCHART_BEGIN_NAMESPACE
26
26
27 QChart::QChart(QGraphicsItem *parent, Qt::WindowFlags wFlags) : QGraphicsWidget(parent,wFlags),
27 QChart::QChart(QGraphicsItem *parent, Qt::WindowFlags wFlags) : QGraphicsWidget(parent,wFlags),
28 m_backgroundItem(0),
28 m_backgroundItem(0),
29 m_titleItem(0),
29 m_titleItem(0),
30 m_axisXItem(new AxisItem(AxisItem::X_AXIS, this)),
30 m_axisXItem(new AxisItem(AxisItem::X_AXIS, this)),
31 m_plotDataIndex(0),
31 m_plotDataIndex(0),
32 m_marginSize(0),
32 m_marginSize(0),
33 m_chartTheme(new ChartTheme(this))
33 m_chartTheme(new ChartTheme(this))
34 {
34 {
35 // TODO: the default theme?
35 // TODO: the default theme?
36 setTheme(QChart::ChartThemeDefault);
36 setTheme(QChart::ChartThemeDefault);
37
37
38 PlotDomain domain;
38 PlotDomain domain;
39 m_plotDomainList << domain;
39 m_plotDomainList << domain;
40 m_axisYItem << new AxisItem(AxisItem::Y_AXIS,this);
40 m_axisYItem << new AxisItem(AxisItem::Y_AXIS,this);
41 m_chartItems << m_axisXItem;
41 m_chartItems << m_axisXItem;
42 m_chartItems << m_axisYItem.at(0);
42 m_chartItems << m_axisYItem.at(0);
43 }
43 }
44
44
45 QChart::~QChart(){}
45 QChart::~QChart(){}
46
46
47 void QChart::addSeries(QChartSeries* series)
47 void QChart::addSeries(QChartSeries* series)
48 {
48 {
49 // TODO: we should check the series not already added
49 // TODO: we should check the series not already added
50 Q_ASSERT(series);
51 Q_ASSERT(series->type() != QChartSeries::SeriesTypeInvalid);
50
52
51 m_chartSeries << series;
53 m_chartSeries << series;
52
54
53 m_plotDataIndex = 0 ;
55 m_plotDataIndex = 0 ;
54 m_plotDomainList.resize(1);
56 m_plotDomainList.resize(1);
55 PlotDomain& domain = m_plotDomainList[m_plotDataIndex];
57 PlotDomain& domain = m_plotDomainList[m_plotDataIndex];
56
58
57 switch(series->type())
59 switch(series->type())
58 {
60 {
59 case QChartSeries::SeriesTypeLine: {
61 case QChartSeries::SeriesTypeLine: {
60
62
61 QXYChartSeries* xyseries = static_cast<QXYChartSeries*>(series);
63 QXYChartSeries* xyseries = static_cast<QXYChartSeries*>(series);
62
64
63 for (int i = 0 ; i < xyseries->count() ; i++) {
65 for (int i = 0 ; i < xyseries->count() ; i++) {
64 qreal x = xyseries->x(i);
66 qreal x = xyseries->x(i);
65 qreal y = xyseries->y(i);
67 qreal y = xyseries->y(i);
66 domain.m_minX = qMin(domain.m_minX,x);
68 domain.m_minX = qMin(domain.m_minX,x);
67 domain.m_minY = qMin(domain.m_minY,y);
69 domain.m_minY = qMin(domain.m_minY,y);
68 domain.m_maxX = qMax(domain.m_maxX,x);
70 domain.m_maxX = qMax(domain.m_maxX,x);
69 domain.m_maxY = qMax(domain.m_maxY,y);
71 domain.m_maxY = qMax(domain.m_maxY,y);
70 }
72 }
71
73
72 XYLineChartItem* item = new XYLineChartItem(xyseries,this);
74 XYLineChartItem* item = new XYLineChartItem(xyseries,this);
73
75
74 m_chartItems << item;
76 m_chartItems << item;
75 // TODO:
77 // TODO:
76 //m_chartTheme->addObserver(xyseries);
78 //m_chartTheme->addObserver(xyseries);
77
79
78 break;
80 break;
79 }
81 }
80 case QChartSeries::SeriesTypeBar: {
82 case QChartSeries::SeriesTypeBar: {
81
83
82 qDebug() << "barSeries added";
84 qDebug() << "barSeries added";
83 BarChartSeries* barSeries = static_cast<BarChartSeries*>(series);
85 BarChartSeries* barSeries = static_cast<BarChartSeries*>(series);
84 BarGroup* barGroup = new BarGroup(*barSeries,this);
86 BarGroup* barGroup = new BarGroup(*barSeries,this);
85
87
86 // Add some fugly colors for 5 fist series...
88 // Add some fugly colors for 5 fist series...
87 barGroup->addColor(QColor(255,0,0,128));
89 barGroup->addColor(QColor(255,0,0,128));
88 barGroup->addColor(QColor(255,255,0,128));
90 barGroup->addColor(QColor(255,255,0,128));
89 barGroup->addColor(QColor(0,255,0,128));
91 barGroup->addColor(QColor(0,255,0,128));
90 barGroup->addColor(QColor(0,0,255,128));
92 barGroup->addColor(QColor(0,0,255,128));
91 barGroup->addColor(QColor(255,128,0,128));
93 barGroup->addColor(QColor(255,128,0,128));
92
94
93 m_chartItems << barGroup;
95 m_chartItems << barGroup;
94 childItems().append(barGroup);
96 childItems().append(barGroup);
95
97
96 qreal x = barSeries->countColumns();
98 qreal x = barSeries->countColumns();
97 qreal y = barSeries->max();
99 qreal y = barSeries->max();
98 domain.m_minX = qMin(domain.m_minX,x);
100 domain.m_minX = qMin(domain.m_minX,x);
99 domain.m_minY = qMin(domain.m_minY,y);
101 domain.m_minY = qMin(domain.m_minY,y);
100 domain.m_maxX = qMax(domain.m_maxX,x);
102 domain.m_maxX = qMax(domain.m_maxX,x);
101 domain.m_maxY = qMax(domain.m_maxY,y);
103 domain.m_maxY = qMax(domain.m_maxY,y);
102 m_axisXItem->setVisible(false);
104 m_axisXItem->setVisible(false);
103 break;
105 break;
104 }
106 }
105 case QChartSeries::SeriesTypeStackedBar: {
107 case QChartSeries::SeriesTypeStackedBar: {
106
108
107 qDebug() << "barSeries added";
109 qDebug() << "barSeries added";
108 StackedBarChartSeries* stackedBarSeries = static_cast<StackedBarChartSeries*>(series);
110 StackedBarChartSeries* stackedBarSeries = static_cast<StackedBarChartSeries*>(series);
109 StackedBarGroup* stackedBarGroup = new StackedBarGroup(*stackedBarSeries,this);
111 StackedBarGroup* stackedBarGroup = new StackedBarGroup(*stackedBarSeries,this);
110
112
111 // Add some fugly colors for 5 fist series...
113 // Add some fugly colors for 5 fist series...
112 stackedBarGroup->addColor(QColor(255,0,0,128));
114 stackedBarGroup->addColor(QColor(255,0,0,128));
113 stackedBarGroup->addColor(QColor(255,255,0,128));
115 stackedBarGroup->addColor(QColor(255,255,0,128));
114 stackedBarGroup->addColor(QColor(0,255,0,128));
116 stackedBarGroup->addColor(QColor(0,255,0,128));
115 stackedBarGroup->addColor(QColor(0,0,255,128));
117 stackedBarGroup->addColor(QColor(0,0,255,128));
116 stackedBarGroup->addColor(QColor(255,128,0,128));
118 stackedBarGroup->addColor(QColor(255,128,0,128));
117
119
118 m_chartItems << stackedBarGroup;
120 m_chartItems << stackedBarGroup;
119 childItems().append(stackedBarGroup);
121 childItems().append(stackedBarGroup);
120
122
121 qreal x = stackedBarSeries->countColumns();
123 qreal x = stackedBarSeries->countColumns();
122 qreal y = stackedBarSeries->maxColumnSum();
124 qreal y = stackedBarSeries->maxColumnSum();
123 domain.m_minX = qMin(domain.m_minX,x);
125 domain.m_minX = qMin(domain.m_minX,x);
124 domain.m_minY = qMin(domain.m_minY,y);
126 domain.m_minY = qMin(domain.m_minY,y);
125 domain.m_maxX = qMax(domain.m_maxX,x);
127 domain.m_maxX = qMax(domain.m_maxX,x);
126 domain.m_maxY = qMax(domain.m_maxY,y);
128 domain.m_maxY = qMax(domain.m_maxY,y);
127 m_axisXItem->setVisible(false);
129 m_axisXItem->setVisible(false);
128 break;
130 break;
129 }
131 }
130 case QChartSeries::SeriesTypePercentBar: {
132 case QChartSeries::SeriesTypePercentBar: {
131
133
132 qDebug() << "barSeries added";
134 qDebug() << "barSeries added";
133 PercentBarChartSeries* percentBarSeries = static_cast<PercentBarChartSeries*>(series);
135 PercentBarChartSeries* percentBarSeries = static_cast<PercentBarChartSeries*>(series);
134 PercentBarGroup* percentBarGroup = new PercentBarGroup(*percentBarSeries,this);
136 PercentBarGroup* percentBarGroup = new PercentBarGroup(*percentBarSeries,this);
135
137
136 // Add some fugly colors for 5 fist series...
138 // Add some fugly colors for 5 fist series...
137 percentBarGroup->addColor(QColor(255,0,0,128));
139 percentBarGroup->addColor(QColor(255,0,0,128));
138 percentBarGroup->addColor(QColor(255,255,0,128));
140 percentBarGroup->addColor(QColor(255,255,0,128));
139 percentBarGroup->addColor(QColor(0,255,0,128));
141 percentBarGroup->addColor(QColor(0,255,0,128));
140 percentBarGroup->addColor(QColor(0,0,255,128));
142 percentBarGroup->addColor(QColor(0,0,255,128));
141 percentBarGroup->addColor(QColor(255,128,0,128));
143 percentBarGroup->addColor(QColor(255,128,0,128));
142
144
143 m_chartItems << percentBarGroup;
145 m_chartItems << percentBarGroup;
144 childItems().append(percentBarGroup);
146 childItems().append(percentBarGroup);
145
147
146 qreal x = percentBarSeries->countColumns();
148 qreal x = percentBarSeries->countColumns();
147 domain.m_minX = qMin(domain.m_minX,x);
149 domain.m_minX = qMin(domain.m_minX,x);
148 domain.m_minY = 0;
150 domain.m_minY = 0;
149 domain.m_maxX = qMax(domain.m_maxX,x);
151 domain.m_maxX = qMax(domain.m_maxX,x);
150 domain.m_maxY = 100;
152 domain.m_maxY = 100;
151 m_axisXItem->setVisible(false);
153 m_axisXItem->setVisible(false);
152 break;
154 break;
153 }
155 }
154 case QChartSeries::SeriesTypeScatter: {
156 case QChartSeries::SeriesTypeScatter: {
155 QScatterSeries *scatterSeries = qobject_cast<QScatterSeries *>(series);
157 QScatterSeries *scatterSeries = qobject_cast<QScatterSeries *>(series);
156 scatterSeries->d->m_theme = m_chartTheme->themeForSeries();
158 scatterSeries->d->m_theme = m_chartTheme->themeForSeries();
157 scatterSeries->d->setParentItem(this);
159 scatterSeries->d->setParentItem(this);
158 scatterSeries->d->m_boundingRect = m_rect.adjusted(margin(),margin(), -margin(), -margin());
160 scatterSeries->d->m_boundingRect = m_rect.adjusted(margin(),margin(), -margin(), -margin());
159 m_chartItems << scatterSeries->d;
161 m_chartItems << scatterSeries->d;
160 m_chartTheme->addObserver(scatterSeries->d);
162 m_chartTheme->addObserver(scatterSeries->d);
161
163
162 foreach (qreal x, scatterSeries->d->m_x) {
164 foreach (qreal x, scatterSeries->d->m_x) {
163 domain.m_minX = qMin(domain.m_minX, x);
165 domain.m_minX = qMin(domain.m_minX, x);
164 domain.m_maxX = qMax(domain.m_maxX, x);
166 domain.m_maxX = qMax(domain.m_maxX, x);
165 }
167 }
166 foreach (qreal y, scatterSeries->d->m_y) {
168 foreach (qreal y, scatterSeries->d->m_y) {
167 domain.m_minY = qMin(domain.m_minY, y);
169 domain.m_minY = qMin(domain.m_minY, y);
168 domain.m_maxY = qMax(domain.m_maxY, y);
170 domain.m_maxY = qMax(domain.m_maxY, y);
169 }
171 }
170
172
171 break;
173 break;
172 }
174 }
173 case QChartSeries::SeriesTypePie: {
175 case QChartSeries::SeriesTypePie: {
174 QPieSeries *pieSeries = qobject_cast<QPieSeries *>(series);
176 QPieSeries *pieSeries = qobject_cast<QPieSeries *>(series);
175 pieSeries->d->setParentItem(this);
177 pieSeries->d->setParentItem(this);
176 m_chartItems << pieSeries->d;
178 m_chartItems << pieSeries->d;
177 pieSeries->d->m_chartTheme = m_chartTheme;
179 pieSeries->d->m_chartTheme = m_chartTheme;
178 m_chartTheme->addObserver(pieSeries->d);
180 m_chartTheme->addObserver(pieSeries->d);
179 break;
181 break;
180 }
182 }
183 default:
184 break;
181 }
185 }
182
186
183 // Update all the items to match the new visible area of the chart
187 // Update all the items to match the new visible area of the chart
184 foreach(ChartItem* i, m_chartItems)
188 foreach(ChartItem* i, m_chartItems)
185 i->setPlotDomain(m_plotDomainList.at(m_plotDataIndex));
189 i->setPlotDomain(m_plotDomainList.at(m_plotDataIndex));
186 }
190 }
187
191
188 QChartSeries* QChart::createSeries(QChartSeries::QChartSeriesType type)
192 QChartSeries* QChart::createSeries(QChartSeries::QChartSeriesType type)
189 {
193 {
190 // TODO: support also other types; not only scatter and pie
194 // TODO: support also other types; not only scatter and pie
191
195
192 QChartSeries *series(0);
196 QChartSeries *series(0);
193
197
194 switch (type) {
198 switch (type) {
195 case QChartSeries::SeriesTypeLine: {
199 case QChartSeries::SeriesTypeLine: {
196 series = QXYChartSeries::create();
200 series = QXYChartSeries::create();
197 break;
201 break;
198 }
202 }
199 case QChartSeries::SeriesTypeBar: {
203 case QChartSeries::SeriesTypeBar: {
200 series = new BarChartSeries(this);
204 series = new BarChartSeries(this);
201 break;
205 break;
202 }
206 }
203 case QChartSeries::SeriesTypeStackedBar: {
207 case QChartSeries::SeriesTypeStackedBar: {
204 series = new StackedBarChartSeries(this);
208 series = new StackedBarChartSeries(this);
205 break;
209 break;
206 }
210 }
207 case QChartSeries::SeriesTypePercentBar: {
211 case QChartSeries::SeriesTypePercentBar: {
208 series = new PercentBarChartSeries(this);
212 series = new PercentBarChartSeries(this);
209 break;
213 break;
210 }
214 }
211 case QChartSeries::SeriesTypeScatter: {
215 case QChartSeries::SeriesTypeScatter: {
212 series = new QScatterSeries(this);
216 series = new QScatterSeries(this);
213 break;
217 break;
214 }
218 }
215 case QChartSeries::SeriesTypePie: {
219 case QChartSeries::SeriesTypePie: {
216 series = new QPieSeries(this);
220 series = new QPieSeries(this);
217 break;
221 break;
218 }
222 }
219 default:
223 default:
220 Q_ASSERT(false);
224 Q_ASSERT(false);
221 break;
225 break;
222 }
226 }
223
227
224 addSeries(series);
228 addSeries(series);
225 return series;
229 return series;
226 }
230 }
227
231
228 void QChart::setBackground(const QColor& startColor, const QColor& endColor, GradientOrientation orientation)
232 void QChart::setBackground(const QColor& startColor, const QColor& endColor, GradientOrientation orientation)
229 {
233 {
230
234
231 if(!m_backgroundItem){
235 if(!m_backgroundItem){
232 m_backgroundItem = new QGraphicsRectItem(this);
236 m_backgroundItem = new QGraphicsRectItem(this);
233 m_backgroundItem->setZValue(-1);
237 m_backgroundItem->setZValue(-1);
234 }
238 }
235
239
236 m_bacgroundOrinetation = orientation;
240 m_bacgroundOrinetation = orientation;
237 m_backgroundGradient.setColorAt(0.0, startColor);
241 m_backgroundGradient.setColorAt(0.0, startColor);
238 m_backgroundGradient.setColorAt(1.0, endColor);
242 m_backgroundGradient.setColorAt(1.0, endColor);
239 m_backgroundGradient.setStart(0,0);
243 m_backgroundGradient.setStart(0,0);
240
244
241 if(orientation == VerticalGradientOrientation){
245 if(orientation == VerticalGradientOrientation){
242 m_backgroundGradient.setFinalStop(0,m_rect.height());
246 m_backgroundGradient.setFinalStop(0,m_rect.height());
243 }else{
247 }else{
244 m_backgroundGradient.setFinalStop(m_rect.width(),0);
248 m_backgroundGradient.setFinalStop(m_rect.width(),0);
245 }
249 }
246
250
247 m_backgroundItem->setBrush(m_backgroundGradient);
251 m_backgroundItem->setBrush(m_backgroundGradient);
248 m_backgroundItem->setPen(Qt::NoPen);
252 m_backgroundItem->setPen(Qt::NoPen);
249 m_backgroundItem->update();
253 m_backgroundItem->update();
250 }
254 }
251
255
252 void QChart::setTitle(const QString& title,const QFont& font)
256 void QChart::setTitle(const QString& title,const QFont& font)
253 {
257 {
254 if(!m_titleItem) m_titleItem = new QGraphicsTextItem(this);
258 if(!m_titleItem) m_titleItem = new QGraphicsTextItem(this);
255 m_titleItem->setPlainText(title);
259 m_titleItem->setPlainText(title);
256 m_titleItem->setFont(font);
260 m_titleItem->setFont(font);
257 }
261 }
258
262
259 int QChart::margin() const
263 int QChart::margin() const
260 {
264 {
261 return m_marginSize;
265 return m_marginSize;
262 }
266 }
263
267
264 void QChart::setMargin(int margin)
268 void QChart::setMargin(int margin)
265 {
269 {
266 m_marginSize = margin;
270 m_marginSize = margin;
267 }
271 }
268
272
269 void QChart::setTheme(QChart::ChartThemeId theme)
273 void QChart::setTheme(QChart::ChartThemeId theme)
270 {
274 {
271 m_chartTheme->setTheme(theme);
275 m_chartTheme->setTheme(theme);
272 setBackground(m_chartTheme->d->m_gradientStartColor,
276 setBackground(m_chartTheme->d->m_gradientStartColor,
273 m_chartTheme->d->m_gradientEndColor,
277 m_chartTheme->d->m_gradientEndColor,
274 m_bacgroundOrinetation);
278 m_bacgroundOrinetation);
275
279
276 // TODO: Move the controlling of the series presentations into private implementation of the
280 // TODO: Move the controlling of the series presentations into private implementation of the
277 // series instead of QChart controlling themes for each
281 // series instead of QChart controlling themes for each
278 // In other words, the following should be used when creating xy series:
282 // In other words, the following should be used when creating xy series:
279 // m_chartTheme->addObserver(xyseries)
283 // m_chartTheme->addObserver(xyseries)
280 foreach (QChartSeries *series, m_chartSeries) {
284 foreach (QChartSeries *series, m_chartSeries) {
281 if (series->type() == QChartSeries::SeriesTypeLine) {
285 if (series->type() == QChartSeries::SeriesTypeLine) {
282 QXYChartSeries *xyseries = static_cast<QXYChartSeries *>(series);
286 QXYChartSeries *xyseries = static_cast<QXYChartSeries *>(series);
283 SeriesTheme seriesTheme = m_chartTheme->themeForSeries();
287 SeriesTheme seriesTheme = m_chartTheme->themeForSeries();
284 xyseries->setPen(seriesTheme.linePen);
288 xyseries->setPen(seriesTheme.linePen);
285 }
289 }
286 }
290 }
287
291
288 update();
292 update();
289 }
293 }
290
294
295 QChart::ChartThemeId QChart::theme()
296 {
297 return (QChart::ChartThemeId) m_chartTheme->d->m_currentTheme;
298 }
299
291 void QChart::zoomInToRect(const QRectF& rectangle)
300 void QChart::zoomInToRect(const QRectF& rectangle)
292 {
301 {
293
302
294 if(!rectangle.isValid()) return;
303 if(!rectangle.isValid()) return;
295
304
296 qreal margin = this->margin();
305 qreal margin = this->margin();
297
306
298 QRectF rect = rectangle.normalized();
307 QRectF rect = rectangle.normalized();
299 rect.translate(-margin, -margin);
308 rect.translate(-margin, -margin);
300
309
301 PlotDomain& oldDomain = m_plotDomainList[m_plotDataIndex];
310 PlotDomain& oldDomain = m_plotDomainList[m_plotDataIndex];
302
311
303 PlotDomain domain = oldDomain.subDomain(rect,m_rect.width() - 2 * margin,m_rect.height() - 2 * margin);
312 PlotDomain domain = oldDomain.subDomain(rect,m_rect.width() - 2 * margin,m_rect.height() - 2 * margin);
304
313
305 m_plotDomainList.resize(m_plotDataIndex + 1);
314 m_plotDomainList.resize(m_plotDataIndex + 1);
306 m_plotDomainList<<domain;
315 m_plotDomainList<<domain;
307 m_plotDataIndex++;
316 m_plotDataIndex++;
308
317
309 foreach (ChartItem* item, m_chartItems)
318 foreach (ChartItem* item, m_chartItems)
310 item->setPlotDomain(m_plotDomainList[m_plotDataIndex]);
319 item->setPlotDomain(m_plotDomainList[m_plotDataIndex]);
311 update();
320 update();
312 }
321 }
313
322
314 void QChart::zoomIn()
323 void QChart::zoomIn()
315 {
324 {
316 if (m_plotDataIndex < m_plotDomainList.count() - 1) {
325 if (m_plotDataIndex < m_plotDomainList.count() - 1) {
317 m_plotDataIndex++;
326 m_plotDataIndex++;
318 foreach (ChartItem* item, m_chartItems)
327 foreach (ChartItem* item, m_chartItems)
319 item->setPlotDomain(m_plotDomainList[m_plotDataIndex]);
328 item->setPlotDomain(m_plotDomainList[m_plotDataIndex]);
320 update();
329 update();
321 } else {
330 } else {
322 QRectF rect = m_rect.adjusted(margin(),margin(), -margin(), -margin());
331 QRectF rect = m_rect.adjusted(margin(),margin(), -margin(), -margin());
323 rect.setWidth(rect.width()/2);
332 rect.setWidth(rect.width()/2);
324 rect.setHeight(rect.height()/2);
333 rect.setHeight(rect.height()/2);
325 rect.moveCenter(m_rect.center());
334 rect.moveCenter(m_rect.center());
326 zoomInToRect(rect);
335 zoomInToRect(rect);
327 }
336 }
328 }
337 }
329
338
330 void QChart::zoomOut()
339 void QChart::zoomOut()
331 {
340 {
332 if (m_plotDataIndex > 0) {
341 if (m_plotDataIndex > 0) {
333 m_plotDataIndex--;
342 m_plotDataIndex--;
334 foreach (ChartItem* item, m_chartItems)
343 foreach (ChartItem* item, m_chartItems)
335 item->setPlotDomain(m_plotDomainList[m_plotDataIndex]);
344 item->setPlotDomain(m_plotDomainList[m_plotDataIndex]);
336 update();
345 update();
337 }
346 }
338 }
347 }
339
348
340 void QChart::zoomReset()
349 void QChart::zoomReset()
341 {
350 {
342 if (m_plotDataIndex > 0) {
351 if (m_plotDataIndex > 0) {
343 m_plotDataIndex = 0;
352 m_plotDataIndex = 0;
344 foreach (ChartItem* item, m_chartItems)
353 foreach (ChartItem* item, m_chartItems)
345 item->setPlotDomain(m_plotDomainList[m_plotDataIndex]);
354 item->setPlotDomain(m_plotDomainList[m_plotDataIndex]);
346 update();
355 update();
347 }
356 }
348 }
357 }
349
358
350 void QChart::setAxisX(const QChartAxis& axis)
359 void QChart::setAxisX(const QChartAxis& axis)
351 {
360 {
352 setAxis(m_axisXItem,axis);
361 setAxis(m_axisXItem,axis);
353 }
362 }
354 void QChart::setAxisY(const QChartAxis& axis)
363 void QChart::setAxisY(const QChartAxis& axis)
355 {
364 {
356 setAxis(m_axisYItem.at(0),axis);
365 setAxis(m_axisYItem.at(0),axis);
357 }
366 }
358
367
359 void QChart::setAxisY(const QList<QChartAxis>& axis)
368 void QChart::setAxisY(const QList<QChartAxis>& axis)
360 {
369 {
361 //TODO not implemented
370 //TODO not implemented
362 }
371 }
363
372
364 void QChart::setAxis(AxisItem *item, const QChartAxis& axis)
373 void QChart::setAxis(AxisItem *item, const QChartAxis& axis)
365 {
374 {
366 item->setVisible(axis.isAxisVisible());
375 item->setVisible(axis.isAxisVisible());
367 }
376 }
368
377
369 void QChart::resizeEvent(QGraphicsSceneResizeEvent *event)
378 void QChart::resizeEvent(QGraphicsSceneResizeEvent *event)
370 {
379 {
371
380
372 m_rect = QRectF(QPoint(0,0),event->newSize());
381 m_rect = QRectF(QPoint(0,0),event->newSize());
373 QRectF rect = m_rect.adjusted(margin(),margin(), -margin(), -margin());
382 QRectF rect = m_rect.adjusted(margin(),margin(), -margin(), -margin());
374
383
375 // recalculate title position
384 // recalculate title position
376 if (m_titleItem) {
385 if (m_titleItem) {
377 QPointF center = m_rect.center() -m_titleItem->boundingRect().center();
386 QPointF center = m_rect.center() -m_titleItem->boundingRect().center();
378 m_titleItem->setPos(center.x(),m_rect.top()/2 + margin()/2);
387 m_titleItem->setPos(center.x(),m_rect.top()/2 + margin()/2);
379 }
388 }
380
389
381 //recalculate background gradient
390 //recalculate background gradient
382 if (m_backgroundItem) {
391 if (m_backgroundItem) {
383 m_backgroundItem->setRect(rect);
392 m_backgroundItem->setRect(rect);
384 if (m_bacgroundOrinetation == HorizonatlGradientOrientation)
393 if (m_bacgroundOrinetation == HorizonatlGradientOrientation)
385 m_backgroundGradient.setFinalStop(m_backgroundItem->rect().width(), 0);
394 m_backgroundGradient.setFinalStop(m_backgroundItem->rect().width(), 0);
386 else
395 else
387 m_backgroundGradient.setFinalStop(0, m_backgroundItem->rect().height());
396 m_backgroundGradient.setFinalStop(0, m_backgroundItem->rect().height());
388 m_backgroundItem->setBrush(m_backgroundGradient);
397 m_backgroundItem->setBrush(m_backgroundGradient);
389 }
398 }
390
399
391 // resize and reposition childs
400 // resize and reposition childs
392 foreach (ChartItem *item, m_chartItems) {
401 foreach (ChartItem *item, m_chartItems) {
393 item->setPos(rect.topLeft());
402 item->setPos(rect.topLeft());
394 item->setSize(rect.size());
403 item->setSize(rect.size());
395 }
404 }
396
405
397 QGraphicsWidget::resizeEvent(event);
406 QGraphicsWidget::resizeEvent(event);
398 update();
407 update();
399 }
408 }
400
409
401
410
402
411
403 #include "moc_qchart.cpp"
412 #include "moc_qchart.cpp"
404
413
405 QTCOMMERCIALCHART_END_NAMESPACE
414 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,99 +1,100
1 #ifndef CHART_H
1 #ifndef CHART_H
2 #define CHART_H
2 #define CHART_H
3
3
4 #include <qchartglobal.h>
4 #include <qchartglobal.h>
5 #include <qchartseries.h>
5 #include <qchartseries.h>
6 #include <QGraphicsWidget>
6 #include <QGraphicsWidget>
7 #include <QLinearGradient>
7 #include <QLinearGradient>
8 #include <QFont>
8 #include <QFont>
9
9
10 class QGraphicsSceneResizeEvent;
10 class QGraphicsSceneResizeEvent;
11
11
12 QTCOMMERCIALCHART_BEGIN_NAMESPACE
12 QTCOMMERCIALCHART_BEGIN_NAMESPACE
13
13
14 class AxisItem;
14 class AxisItem;
15 class QChartSeries;
15 class QChartSeries;
16 class PlotDomain;
16 class PlotDomain;
17 class BarGroup;
17 class BarGroup;
18 class QChartAxis;
18 class QChartAxis;
19 class ChartTheme;
19 class ChartTheme;
20 class ChartItem;
20 class ChartItem;
21
21
22 // TODO: We don't need to have QChart tied to QGraphicsItem:
22 // TODO: We don't need to have QChart tied to QGraphicsItem:
23 //class QTCOMMERCIALCHART_EXPORT QChart
23 //class QTCOMMERCIALCHART_EXPORT QChart
24 //class QTCOMMERCIALCHART_EXPORT QChartGraphicsItem : public QGraphicsItem {
24 //class QTCOMMERCIALCHART_EXPORT QChartGraphicsItem : public QGraphicsItem {
25 // public: QChartGraphicsItem(QChart &chart);
25 // public: QChartGraphicsItem(QChart &chart);
26
26
27 /*!
27 /*!
28 * TODO: define the responsibilities
28 * TODO: define the responsibilities
29 */
29 */
30 class QTCOMMERCIALCHART_EXPORT QChart : public QGraphicsWidget
30 class QTCOMMERCIALCHART_EXPORT QChart : public QGraphicsWidget
31 {
31 {
32 Q_OBJECT
32 Q_OBJECT
33 public:
33 public:
34 enum GradientOrientation {
34 enum GradientOrientation {
35 HorizonatlGradientOrientation,
35 HorizonatlGradientOrientation,
36 VerticalGradientOrientation
36 VerticalGradientOrientation
37 };
37 };
38 enum ChartThemeId {
38 enum ChartThemeId {
39 ChartThemeInvalid = -1,
39 ChartThemeInvalid = -1,
40 /*! The default theme follows the GUI style of the Operating System */
40 /*! The default theme follows the GUI style of the Operating System */
41 ChartThemeDefault,
41 ChartThemeDefault,
42 ChartThemeVanilla,
42 ChartThemeVanilla,
43 ChartThemeIcy,
43 ChartThemeIcy,
44 ChartThemeGrayscale,
44 ChartThemeGrayscale,
45 //ChartThemeScientific,
45 //ChartThemeScientific,
46 ChartThemeUnnamed1
46 ChartThemeUnnamed1
47 };
47 };
48
48
49 public:
49 public:
50 QChart(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0);
50 QChart(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0);
51 ~QChart();
51 ~QChart();
52
52
53 void addSeries(QChartSeries* series);
53 void addSeries(QChartSeries* series);
54 //TODO: QChartSeries* createSeries(QSeriesData *data, QChartSeries::QChartSeriesType type);
54 //TODO: QChartSeries* createSeries(QSeriesData *data, QChartSeries::QChartSeriesType type);
55 // TODO: who owns the series now? maybe owned by chart and returned a reference instead...
55 // TODO: who owns the series now? maybe owned by chart and returned a reference instead...
56 QChartSeries* createSeries(QChartSeries::QChartSeriesType type);
56 QChartSeries* createSeries(QChartSeries::QChartSeriesType type);
57
57
58 void setMargin(int margin);
58 void setMargin(int margin);
59 int margin() const;
59 int margin() const;
60 void setTheme(QChart::ChartThemeId theme);
60 void setTheme(QChart::ChartThemeId theme);
61 QChart::ChartThemeId theme();
61
62
62 void setTitle(const QString& title,const QFont& font = QFont());
63 void setTitle(const QString& title,const QFont& font = QFont());
63 void setBackground(const QColor& startColor, const QColor& endColor = Qt::white, GradientOrientation orientation = VerticalGradientOrientation);
64 void setBackground(const QColor& startColor, const QColor& endColor = Qt::white, GradientOrientation orientation = VerticalGradientOrientation);
64
65
65 void zoomInToRect(const QRectF& rectangle);
66 void zoomInToRect(const QRectF& rectangle);
66 void zoomIn();
67 void zoomIn();
67 void zoomOut();
68 void zoomOut();
68 void zoomReset();
69 void zoomReset();
69
70
70 void setAxisX(const QChartAxis& axis);
71 void setAxisX(const QChartAxis& axis);
71 void setAxisY(const QChartAxis& axis);
72 void setAxisY(const QChartAxis& axis);
72 void setAxisY(const QList<QChartAxis>& axis);
73 void setAxisY(const QList<QChartAxis>& axis);
73
74
74 protected:
75 protected:
75 void resizeEvent(QGraphicsSceneResizeEvent *event);
76 void resizeEvent(QGraphicsSceneResizeEvent *event);
76
77
77 private:
78 private:
78 void setAxis(AxisItem *item, const QChartAxis& axis);
79 void setAxis(AxisItem *item, const QChartAxis& axis);
79
80
80 private:
81 private:
81 Q_DISABLE_COPY(QChart)
82 Q_DISABLE_COPY(QChart)
82 QGraphicsRectItem* m_backgroundItem;
83 QGraphicsRectItem* m_backgroundItem;
83 QLinearGradient m_backgroundGradient;
84 QLinearGradient m_backgroundGradient;
84 GradientOrientation m_bacgroundOrinetation;
85 GradientOrientation m_bacgroundOrinetation;
85 QGraphicsTextItem* m_titleItem;
86 QGraphicsTextItem* m_titleItem;
86 AxisItem* m_axisXItem;
87 AxisItem* m_axisXItem;
87 QList<AxisItem*> m_axisYItem;
88 QList<AxisItem*> m_axisYItem;
88 QRectF m_rect;
89 QRectF m_rect;
89 QList<QChartSeries *> m_chartSeries;
90 QList<QChartSeries *> m_chartSeries;
90 QList<ChartItem *> m_chartItems;
91 QList<ChartItem *> m_chartItems;
91 QVector<PlotDomain> m_plotDomainList;
92 QVector<PlotDomain> m_plotDomainList;
92 int m_plotDataIndex;
93 int m_plotDataIndex;
93 int m_marginSize;
94 int m_marginSize;
94 ChartTheme *m_chartTheme;
95 ChartTheme *m_chartTheme;
95 };
96 };
96
97
97 QTCOMMERCIALCHART_END_NAMESPACE
98 QTCOMMERCIALCHART_END_NAMESPACE
98
99
99 #endif
100 #endif
@@ -1,49 +1,50
1 #ifndef QCHARTSERIES_H
1 #ifndef QCHARTSERIES_H
2 #define QCHARTSERIES_H
2 #define QCHARTSERIES_H
3
3
4 #include "qchartglobal.h"
4 #include "qchartglobal.h"
5 #include <QObject>
5 #include <QObject>
6 #include <QAbstractItemModel>
6 #include <QAbstractItemModel>
7
7
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9
9
10 class QTCOMMERCIALCHART_EXPORT QChartSeries : public QObject
10 class QTCOMMERCIALCHART_EXPORT QChartSeries : public QObject
11 {
11 {
12 Q_OBJECT
12 Q_OBJECT
13 public:
13 public:
14 enum QChartSeriesType {
14 enum QChartSeriesType {
15 SeriesTypeLine = 0,
15 SeriesTypeInvalid = -1,
16 SeriesTypeLine,
16 // SeriesTypeArea,
17 // SeriesTypeArea,
17 SeriesTypeBar,
18 SeriesTypeBar,
18 SeriesTypeStackedBar,
19 SeriesTypeStackedBar,
19 SeriesTypePercentBar,
20 SeriesTypePercentBar,
20 SeriesTypePie,
21 SeriesTypePie,
21 SeriesTypeScatter
22 SeriesTypeScatter
22 // SeriesTypeSpline
23 // SeriesTypeSpline
23 };
24 };
24
25
25 protected:
26 protected:
26 QChartSeries(QObject *parent = 0):QObject(parent){};
27 QChartSeries(QObject *parent = 0):QObject(parent){};
27
28
28 public:
29 public:
29 virtual ~QChartSeries(){};
30 virtual ~QChartSeries(){};
30
31
31 // Factory method
32 // Factory method
32 static QChartSeries* create(QChartSeriesType type, QObject* parent = 0 );
33 static QChartSeries* create(QChartSeriesType type, QObject* parent = 0 );
33
34
34 // Pure virtual
35 // Pure virtual
35 virtual QChartSeriesType type() const = 0;
36 virtual QChartSeriesType type() const = 0;
36
37
37 virtual bool setData(QList<int> /*data*/) { return false; }
38 virtual bool setData(QList<int> /*data*/) { return false; }
38 virtual bool setData(QList<qreal> /*data*/) { return false; }
39 virtual bool setData(QList<qreal> /*data*/) { return false; }
39 virtual bool setData(QList<qreal> /*x*/, QList<qreal> /*y*/){ return false; }
40 virtual bool setData(QList<qreal> /*x*/, QList<qreal> /*y*/){ return false; }
40
41
41 // Prototype for data model. TODO: remove the other setData methods and use something like this for now?
42 // Prototype for data model. TODO: remove the other setData methods and use something like this for now?
42 virtual bool setData(QAbstractItemModel* /*model*/) { return false; }
43 virtual bool setData(QAbstractItemModel* /*model*/) { return false; }
43
44
44 };
45 };
45
46
46 QTCOMMERCIALCHART_END_NAMESPACE
47 QTCOMMERCIALCHART_END_NAMESPACE
47
48
48 #endif
49 #endif
49
50
@@ -1,5 +1,3
1 TEMPLATE = subdirs
1 TEMPLATE = subdirs
2 SUBDIRS += chartwidgettest
2 SUBDIRS += chartwidgettest \
3
3 qmlchart
4
5
General Comments 0
You need to be logged in to leave comments. Login now