##// 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
1 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 1 !include(common.pri) {
2 2 error('missing common.pri')
3 3 }
4 4
5 5 TEMPLATE = subdirs
6 SUBDIRS += src example test
6 SUBDIRS += src qmlplugin example test
7 7 CONFIG += ordered
8 8 QMAKE_CXXFLAGS += -g -Wall
9 9 unix:QMAKE_DISTCLEAN += -r build bin
10 10 win32:QMAKE_DISTCLEAN += /Q build bin
11 11
12 12 # install feature file
13 13 feature.path = $$[QT_INSTALL_DATA]/mkspecs/features
14 14 feature.files = $$PWD/features/qtcommercialchart.prf
15 15 INSTALLS += feature
@@ -1,24 +1,23
1 1 CONFIG+=integrated_build #remove if you want to build against installed libs
2 2
3 3 CHART_BUILD_HEADER_DIR = $$PWD/include
4 4 CHART_BUILD_LIB_DIR = $$PWD/lib
5 5 CHART_BUILD_DIR = $$PWD/build
6 6 CHART_BUILD_BIN_DIR = $$PWD/bin
7 7
8 8 # hack to fix windows builds
9
10 9 win32:{
11 CHART_BUILD_HEADER_DIR = $$replace(CHART_BUILD_HEADER_DIR, "/","\\")
12 CHART_BUILD_LIB_DIR = $$replace(CHART_BUILD_LIB_DIR, "/","\\")
13 CHART_BUILD_BUILD_DIR = $$replace(CHART_BUILD_BUILD_DIR, "/","\\")
14 CHART_BUILD_BIN_DIR = $$replace(CHART_BUILD_BIN_DIR, "/","\\")
10 CHART_BUILD_HEADER_DIR = $$replace(CHART_BUILD_HEADER_DIR, "/","\\")
11 CHART_BUILD_LIB_DIR = $$replace(CHART_BUILD_LIB_DIR, "/","\\")
12 CHART_BUILD_BUILD_DIR = $$replace(CHART_BUILD_BUILD_DIR, "/","\\")
13 CHART_BUILD_BIN_DIR = $$replace(CHART_BUILD_BIN_DIR, "/","\\")
15 14 }
16 15
17 16 mac: {
18 17 # TODO: The following qmake flags are a work-around to make QtCommercial Charts compile on
19 18 # QtCommercial 4.8. On the other hand Charts builds successfully with Qt open source 4.8
20 19 # without these definitions, so this is probably a configuration issue on QtCommercial 4.8;
21 20 # it should probably define the minimum OSX version to be 10.5...
22 21 QMAKE_CXXFLAGS *= -mmacosx-version-min=10.5
23 22 QMAKE_LFLAGS *= -mmacosx-version-min=10.5
24 23 }
@@ -1,9 +1,7
1 message( "Configuring with QtCommercialChart addon..." )
2
3 1 INCLUDEPATH += $$[QT_INSTALL_HEADERS]/QtCommercialChart
4 2
5 3 CONFIG(debug, debug|release) {
6 4 LIBS += -lQtCommercialChartd
7 5 } else {
8 6 LIBS += -lQtCommercialChart
9 7 }
@@ -1,27 +1,29
1 1 #include "declarativechart.h"
2 #include <QPainter>
3 2
4 #ifndef QTQUICK2
3 QTCOMMERCIALCHART_BEGIN_NAMESPACE
4
5 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 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
20 void DeclarativeChart::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
21 #else
22 void DeclarativeChart::paint(QPainter *painter)
23 #endif
22 void DeclarativeChart::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
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 1 #ifndef DECLARATIVECHART_H
2 2 #define DECLARATIVECHART_H
3 3
4 4 #include <QtCore/QtGlobal>
5 #ifndef QTQUICK2
6 #include <QDeclarativeItem>
7 #else
8 #include <QtQuick/QQuickPaintedItem>
9 #endif
10 #include <QColor>
11 #include "../src/chart.h"
12
13 #ifndef QTQUICK2
14 class DeclarativeChart : public QDeclarativeItem, public Chart
15 #else
16 class DeclarativeChart : public QQuickPaintedItem, public Chart
17 #endif
5 #include <QDeclarativeItem>
6 #include <qchart.h>
7
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9
10 class DeclarativeChart : public QDeclarativeItem
11 // TODO: for QTQUICK2: extend QQuickPainterItem instead
12 //class DeclarativeChart : public QQuickPaintedItem, public Chart
18 13 {
19 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 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 28 DeclarativeChart(QDeclarativeItem *parent = 0);
25 #else
26 DeclarativeChart(QQuickItem *parent = 0);
27 #endif
28
29 #ifndef QTQUICK2
30 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
31 #else
32 void paint(QPainter *painter);
33 #endif
29
30 public: // From QDeclarativeItem/QGraphicsItem
31 void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry);
32
33 public:
34 void setTheme(ChartTheme theme) {m_chart->setTheme((QChart::ChartThemeId) theme);}
35 ChartTheme theme();
36
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 45 #endif // DECLARATIVECHART_H
@@ -1,22 +1,27
1 1 #include <QtDeclarative/qdeclarativeextensionplugin.h>
2 2 #include <QtDeclarative/qdeclarative.h>
3 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 10 Q_OBJECT
10 11 public:
11 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 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 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 8 TEMPLATE = lib
2 TARGET = qmlchartplugin
9 TARGET = qtcommercialchartqml
3 10
4 11 CONFIG += qt plugin
5 12 QT += declarative
6 13
7 14 contains(QT_MAJOR_VERSION, 5) {
15 # TODO: QtQuick2 not supported by the implementation currently
8 16 DEFINES += QTQUICK2
9 17 }
10 18
11 OBJECTS_DIR = tmp
12 MOC_DIR = tmp
19 OBJECTS_DIR = $$CHART_BUILD_DIR/lib
20 MOC_DIR = $$CHART_BUILD_DIR/lib
21 UI_DIR = $$CHART_BUILD_DIR/lib
22 RCC_DIR = $$CHART_BUILD_DIR/lib
13 23
14 24 SOURCES += \
15 25 plugin.cpp \
16 declarativechart.cpp
26 declarativechart.cpp \
27 declarativeseries.cpp
17 28 HEADERS += \
18 declarativechart.h
19 include(../src/chart.pri)
29 declarativechart.h \
30 declarativeseries.h
20 31
21 TARGETPATH = com/digia/charts
22
23 #DESTDIR = $$[QT_INSTALL_IMPORTS]/$$TARGETPATH
32 TARGETPATH = QtCommercial/Chart
24 33 target.path = $$[QT_INSTALL_IMPORTS]/$$TARGETPATH
25
26 34 qmldir.files += $$PWD/qmldir
27 35 qmldir.path += $$[QT_INSTALL_IMPORTS]/$$TARGETPATH
28 36
29 37 INSTALLS += target qmldir
30 38
39
@@ -1,405 +1,414
1 1 #include "qchart.h"
2 2 #include "qchartseries.h"
3 3 #include "qscatterseries.h"
4 4 #include "qscatterseries_p.h"
5 5 #include "qpieseries.h"
6 6 #include "qpieseries_p.h"
7 7 #include "qxychartseries.h"
8 8 #include "qchartaxis.h"
9 9 #include "barchartseries.h"
10 10 #include "bargroup.h"
11 11 #include "stackedbarchartseries.h"
12 12 #include "stackedbargroup.h"
13 13 #include "percentbarchartseries.h"
14 14 #include "percentbargroup.h"
15 15 #include "charttheme_p.h"
16 16 #include "chartitem_p.h"
17 17
18 18 #include "xylinechartitem_p.h"
19 19 #include "plotdomain_p.h"
20 20 #include "axisitem_p.h"
21 21 #include <QGraphicsScene>
22 22 #include <QGraphicsSceneResizeEvent>
23 23 #include <QDebug>
24 24
25 25 QTCOMMERCIALCHART_BEGIN_NAMESPACE
26 26
27 27 QChart::QChart(QGraphicsItem *parent, Qt::WindowFlags wFlags) : QGraphicsWidget(parent,wFlags),
28 28 m_backgroundItem(0),
29 29 m_titleItem(0),
30 30 m_axisXItem(new AxisItem(AxisItem::X_AXIS, this)),
31 31 m_plotDataIndex(0),
32 32 m_marginSize(0),
33 33 m_chartTheme(new ChartTheme(this))
34 34 {
35 35 // TODO: the default theme?
36 36 setTheme(QChart::ChartThemeDefault);
37 37
38 38 PlotDomain domain;
39 39 m_plotDomainList << domain;
40 40 m_axisYItem << new AxisItem(AxisItem::Y_AXIS,this);
41 41 m_chartItems << m_axisXItem;
42 42 m_chartItems << m_axisYItem.at(0);
43 43 }
44 44
45 45 QChart::~QChart(){}
46 46
47 47 void QChart::addSeries(QChartSeries* series)
48 48 {
49 49 // TODO: we should check the series not already added
50 Q_ASSERT(series);
51 Q_ASSERT(series->type() != QChartSeries::SeriesTypeInvalid);
50 52
51 53 m_chartSeries << series;
52 54
53 55 m_plotDataIndex = 0 ;
54 56 m_plotDomainList.resize(1);
55 57 PlotDomain& domain = m_plotDomainList[m_plotDataIndex];
56 58
57 59 switch(series->type())
58 60 {
59 61 case QChartSeries::SeriesTypeLine: {
60 62
61 63 QXYChartSeries* xyseries = static_cast<QXYChartSeries*>(series);
62 64
63 65 for (int i = 0 ; i < xyseries->count() ; i++) {
64 66 qreal x = xyseries->x(i);
65 67 qreal y = xyseries->y(i);
66 68 domain.m_minX = qMin(domain.m_minX,x);
67 69 domain.m_minY = qMin(domain.m_minY,y);
68 70 domain.m_maxX = qMax(domain.m_maxX,x);
69 71 domain.m_maxY = qMax(domain.m_maxY,y);
70 72 }
71 73
72 74 XYLineChartItem* item = new XYLineChartItem(xyseries,this);
73 75
74 76 m_chartItems << item;
75 77 // TODO:
76 78 //m_chartTheme->addObserver(xyseries);
77 79
78 80 break;
79 81 }
80 82 case QChartSeries::SeriesTypeBar: {
81 83
82 84 qDebug() << "barSeries added";
83 85 BarChartSeries* barSeries = static_cast<BarChartSeries*>(series);
84 86 BarGroup* barGroup = new BarGroup(*barSeries,this);
85 87
86 88 // Add some fugly colors for 5 fist series...
87 89 barGroup->addColor(QColor(255,0,0,128));
88 90 barGroup->addColor(QColor(255,255,0,128));
89 91 barGroup->addColor(QColor(0,255,0,128));
90 92 barGroup->addColor(QColor(0,0,255,128));
91 93 barGroup->addColor(QColor(255,128,0,128));
92 94
93 95 m_chartItems << barGroup;
94 96 childItems().append(barGroup);
95 97
96 98 qreal x = barSeries->countColumns();
97 99 qreal y = barSeries->max();
98 100 domain.m_minX = qMin(domain.m_minX,x);
99 101 domain.m_minY = qMin(domain.m_minY,y);
100 102 domain.m_maxX = qMax(domain.m_maxX,x);
101 103 domain.m_maxY = qMax(domain.m_maxY,y);
102 104 m_axisXItem->setVisible(false);
103 105 break;
104 106 }
105 107 case QChartSeries::SeriesTypeStackedBar: {
106 108
107 109 qDebug() << "barSeries added";
108 110 StackedBarChartSeries* stackedBarSeries = static_cast<StackedBarChartSeries*>(series);
109 111 StackedBarGroup* stackedBarGroup = new StackedBarGroup(*stackedBarSeries,this);
110 112
111 113 // Add some fugly colors for 5 fist series...
112 114 stackedBarGroup->addColor(QColor(255,0,0,128));
113 115 stackedBarGroup->addColor(QColor(255,255,0,128));
114 116 stackedBarGroup->addColor(QColor(0,255,0,128));
115 117 stackedBarGroup->addColor(QColor(0,0,255,128));
116 118 stackedBarGroup->addColor(QColor(255,128,0,128));
117 119
118 120 m_chartItems << stackedBarGroup;
119 121 childItems().append(stackedBarGroup);
120 122
121 123 qreal x = stackedBarSeries->countColumns();
122 124 qreal y = stackedBarSeries->maxColumnSum();
123 125 domain.m_minX = qMin(domain.m_minX,x);
124 126 domain.m_minY = qMin(domain.m_minY,y);
125 127 domain.m_maxX = qMax(domain.m_maxX,x);
126 128 domain.m_maxY = qMax(domain.m_maxY,y);
127 129 m_axisXItem->setVisible(false);
128 130 break;
129 131 }
130 132 case QChartSeries::SeriesTypePercentBar: {
131 133
132 134 qDebug() << "barSeries added";
133 135 PercentBarChartSeries* percentBarSeries = static_cast<PercentBarChartSeries*>(series);
134 136 PercentBarGroup* percentBarGroup = new PercentBarGroup(*percentBarSeries,this);
135 137
136 138 // Add some fugly colors for 5 fist series...
137 139 percentBarGroup->addColor(QColor(255,0,0,128));
138 140 percentBarGroup->addColor(QColor(255,255,0,128));
139 141 percentBarGroup->addColor(QColor(0,255,0,128));
140 142 percentBarGroup->addColor(QColor(0,0,255,128));
141 143 percentBarGroup->addColor(QColor(255,128,0,128));
142 144
143 145 m_chartItems << percentBarGroup;
144 146 childItems().append(percentBarGroup);
145 147
146 148 qreal x = percentBarSeries->countColumns();
147 149 domain.m_minX = qMin(domain.m_minX,x);
148 150 domain.m_minY = 0;
149 151 domain.m_maxX = qMax(domain.m_maxX,x);
150 152 domain.m_maxY = 100;
151 153 m_axisXItem->setVisible(false);
152 154 break;
153 155 }
154 156 case QChartSeries::SeriesTypeScatter: {
155 157 QScatterSeries *scatterSeries = qobject_cast<QScatterSeries *>(series);
156 158 scatterSeries->d->m_theme = m_chartTheme->themeForSeries();
157 159 scatterSeries->d->setParentItem(this);
158 160 scatterSeries->d->m_boundingRect = m_rect.adjusted(margin(),margin(), -margin(), -margin());
159 161 m_chartItems << scatterSeries->d;
160 162 m_chartTheme->addObserver(scatterSeries->d);
161 163
162 164 foreach (qreal x, scatterSeries->d->m_x) {
163 165 domain.m_minX = qMin(domain.m_minX, x);
164 166 domain.m_maxX = qMax(domain.m_maxX, x);
165 167 }
166 168 foreach (qreal y, scatterSeries->d->m_y) {
167 169 domain.m_minY = qMin(domain.m_minY, y);
168 170 domain.m_maxY = qMax(domain.m_maxY, y);
169 171 }
170 172
171 173 break;
172 174 }
173 175 case QChartSeries::SeriesTypePie: {
174 176 QPieSeries *pieSeries = qobject_cast<QPieSeries *>(series);
175 177 pieSeries->d->setParentItem(this);
176 178 m_chartItems << pieSeries->d;
177 179 pieSeries->d->m_chartTheme = m_chartTheme;
178 180 m_chartTheme->addObserver(pieSeries->d);
179 181 break;
180 182 }
183 default:
184 break;
181 185 }
182 186
183 187 // Update all the items to match the new visible area of the chart
184 188 foreach(ChartItem* i, m_chartItems)
185 189 i->setPlotDomain(m_plotDomainList.at(m_plotDataIndex));
186 190 }
187 191
188 192 QChartSeries* QChart::createSeries(QChartSeries::QChartSeriesType type)
189 193 {
190 194 // TODO: support also other types; not only scatter and pie
191 195
192 196 QChartSeries *series(0);
193 197
194 198 switch (type) {
195 199 case QChartSeries::SeriesTypeLine: {
196 200 series = QXYChartSeries::create();
197 201 break;
198 202 }
199 203 case QChartSeries::SeriesTypeBar: {
200 204 series = new BarChartSeries(this);
201 205 break;
202 206 }
203 207 case QChartSeries::SeriesTypeStackedBar: {
204 208 series = new StackedBarChartSeries(this);
205 209 break;
206 210 }
207 211 case QChartSeries::SeriesTypePercentBar: {
208 212 series = new PercentBarChartSeries(this);
209 213 break;
210 214 }
211 215 case QChartSeries::SeriesTypeScatter: {
212 216 series = new QScatterSeries(this);
213 217 break;
214 218 }
215 219 case QChartSeries::SeriesTypePie: {
216 220 series = new QPieSeries(this);
217 221 break;
218 222 }
219 223 default:
220 224 Q_ASSERT(false);
221 225 break;
222 226 }
223 227
224 228 addSeries(series);
225 229 return series;
226 230 }
227 231
228 232 void QChart::setBackground(const QColor& startColor, const QColor& endColor, GradientOrientation orientation)
229 233 {
230 234
231 235 if(!m_backgroundItem){
232 236 m_backgroundItem = new QGraphicsRectItem(this);
233 237 m_backgroundItem->setZValue(-1);
234 238 }
235 239
236 240 m_bacgroundOrinetation = orientation;
237 241 m_backgroundGradient.setColorAt(0.0, startColor);
238 242 m_backgroundGradient.setColorAt(1.0, endColor);
239 243 m_backgroundGradient.setStart(0,0);
240 244
241 245 if(orientation == VerticalGradientOrientation){
242 246 m_backgroundGradient.setFinalStop(0,m_rect.height());
243 247 }else{
244 248 m_backgroundGradient.setFinalStop(m_rect.width(),0);
245 249 }
246 250
247 251 m_backgroundItem->setBrush(m_backgroundGradient);
248 252 m_backgroundItem->setPen(Qt::NoPen);
249 253 m_backgroundItem->update();
250 254 }
251 255
252 256 void QChart::setTitle(const QString& title,const QFont& font)
253 257 {
254 258 if(!m_titleItem) m_titleItem = new QGraphicsTextItem(this);
255 259 m_titleItem->setPlainText(title);
256 260 m_titleItem->setFont(font);
257 261 }
258 262
259 263 int QChart::margin() const
260 264 {
261 265 return m_marginSize;
262 266 }
263 267
264 268 void QChart::setMargin(int margin)
265 269 {
266 270 m_marginSize = margin;
267 271 }
268 272
269 273 void QChart::setTheme(QChart::ChartThemeId theme)
270 274 {
271 275 m_chartTheme->setTheme(theme);
272 276 setBackground(m_chartTheme->d->m_gradientStartColor,
273 277 m_chartTheme->d->m_gradientEndColor,
274 278 m_bacgroundOrinetation);
275 279
276 280 // TODO: Move the controlling of the series presentations into private implementation of the
277 281 // series instead of QChart controlling themes for each
278 282 // In other words, the following should be used when creating xy series:
279 283 // m_chartTheme->addObserver(xyseries)
280 284 foreach (QChartSeries *series, m_chartSeries) {
281 285 if (series->type() == QChartSeries::SeriesTypeLine) {
282 286 QXYChartSeries *xyseries = static_cast<QXYChartSeries *>(series);
283 287 SeriesTheme seriesTheme = m_chartTheme->themeForSeries();
284 288 xyseries->setPen(seriesTheme.linePen);
285 289 }
286 290 }
287 291
288 292 update();
289 293 }
290 294
295 QChart::ChartThemeId QChart::theme()
296 {
297 return (QChart::ChartThemeId) m_chartTheme->d->m_currentTheme;
298 }
299
291 300 void QChart::zoomInToRect(const QRectF& rectangle)
292 301 {
293 302
294 303 if(!rectangle.isValid()) return;
295 304
296 305 qreal margin = this->margin();
297 306
298 307 QRectF rect = rectangle.normalized();
299 308 rect.translate(-margin, -margin);
300 309
301 310 PlotDomain& oldDomain = m_plotDomainList[m_plotDataIndex];
302 311
303 312 PlotDomain domain = oldDomain.subDomain(rect,m_rect.width() - 2 * margin,m_rect.height() - 2 * margin);
304 313
305 314 m_plotDomainList.resize(m_plotDataIndex + 1);
306 315 m_plotDomainList<<domain;
307 316 m_plotDataIndex++;
308 317
309 318 foreach (ChartItem* item, m_chartItems)
310 319 item->setPlotDomain(m_plotDomainList[m_plotDataIndex]);
311 320 update();
312 321 }
313 322
314 323 void QChart::zoomIn()
315 324 {
316 325 if (m_plotDataIndex < m_plotDomainList.count() - 1) {
317 326 m_plotDataIndex++;
318 327 foreach (ChartItem* item, m_chartItems)
319 328 item->setPlotDomain(m_plotDomainList[m_plotDataIndex]);
320 329 update();
321 330 } else {
322 331 QRectF rect = m_rect.adjusted(margin(),margin(), -margin(), -margin());
323 332 rect.setWidth(rect.width()/2);
324 333 rect.setHeight(rect.height()/2);
325 334 rect.moveCenter(m_rect.center());
326 335 zoomInToRect(rect);
327 336 }
328 337 }
329 338
330 339 void QChart::zoomOut()
331 340 {
332 341 if (m_plotDataIndex > 0) {
333 342 m_plotDataIndex--;
334 343 foreach (ChartItem* item, m_chartItems)
335 344 item->setPlotDomain(m_plotDomainList[m_plotDataIndex]);
336 345 update();
337 346 }
338 347 }
339 348
340 349 void QChart::zoomReset()
341 350 {
342 351 if (m_plotDataIndex > 0) {
343 352 m_plotDataIndex = 0;
344 353 foreach (ChartItem* item, m_chartItems)
345 354 item->setPlotDomain(m_plotDomainList[m_plotDataIndex]);
346 355 update();
347 356 }
348 357 }
349 358
350 359 void QChart::setAxisX(const QChartAxis& axis)
351 360 {
352 361 setAxis(m_axisXItem,axis);
353 362 }
354 363 void QChart::setAxisY(const QChartAxis& axis)
355 364 {
356 365 setAxis(m_axisYItem.at(0),axis);
357 366 }
358 367
359 368 void QChart::setAxisY(const QList<QChartAxis>& axis)
360 369 {
361 370 //TODO not implemented
362 371 }
363 372
364 373 void QChart::setAxis(AxisItem *item, const QChartAxis& axis)
365 374 {
366 375 item->setVisible(axis.isAxisVisible());
367 376 }
368 377
369 378 void QChart::resizeEvent(QGraphicsSceneResizeEvent *event)
370 379 {
371 380
372 381 m_rect = QRectF(QPoint(0,0),event->newSize());
373 382 QRectF rect = m_rect.adjusted(margin(),margin(), -margin(), -margin());
374 383
375 384 // recalculate title position
376 385 if (m_titleItem) {
377 386 QPointF center = m_rect.center() -m_titleItem->boundingRect().center();
378 387 m_titleItem->setPos(center.x(),m_rect.top()/2 + margin()/2);
379 388 }
380 389
381 390 //recalculate background gradient
382 391 if (m_backgroundItem) {
383 392 m_backgroundItem->setRect(rect);
384 393 if (m_bacgroundOrinetation == HorizonatlGradientOrientation)
385 394 m_backgroundGradient.setFinalStop(m_backgroundItem->rect().width(), 0);
386 395 else
387 396 m_backgroundGradient.setFinalStop(0, m_backgroundItem->rect().height());
388 397 m_backgroundItem->setBrush(m_backgroundGradient);
389 398 }
390 399
391 400 // resize and reposition childs
392 401 foreach (ChartItem *item, m_chartItems) {
393 402 item->setPos(rect.topLeft());
394 403 item->setSize(rect.size());
395 404 }
396 405
397 406 QGraphicsWidget::resizeEvent(event);
398 407 update();
399 408 }
400 409
401 410
402 411
403 412 #include "moc_qchart.cpp"
404 413
405 414 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,99 +1,100
1 1 #ifndef CHART_H
2 2 #define CHART_H
3 3
4 4 #include <qchartglobal.h>
5 5 #include <qchartseries.h>
6 6 #include <QGraphicsWidget>
7 7 #include <QLinearGradient>
8 8 #include <QFont>
9 9
10 10 class QGraphicsSceneResizeEvent;
11 11
12 12 QTCOMMERCIALCHART_BEGIN_NAMESPACE
13 13
14 14 class AxisItem;
15 15 class QChartSeries;
16 16 class PlotDomain;
17 17 class BarGroup;
18 18 class QChartAxis;
19 19 class ChartTheme;
20 20 class ChartItem;
21 21
22 22 // TODO: We don't need to have QChart tied to QGraphicsItem:
23 23 //class QTCOMMERCIALCHART_EXPORT QChart
24 24 //class QTCOMMERCIALCHART_EXPORT QChartGraphicsItem : public QGraphicsItem {
25 25 // public: QChartGraphicsItem(QChart &chart);
26 26
27 27 /*!
28 28 * TODO: define the responsibilities
29 29 */
30 30 class QTCOMMERCIALCHART_EXPORT QChart : public QGraphicsWidget
31 31 {
32 32 Q_OBJECT
33 33 public:
34 34 enum GradientOrientation {
35 35 HorizonatlGradientOrientation,
36 36 VerticalGradientOrientation
37 37 };
38 38 enum ChartThemeId {
39 39 ChartThemeInvalid = -1,
40 40 /*! The default theme follows the GUI style of the Operating System */
41 41 ChartThemeDefault,
42 42 ChartThemeVanilla,
43 43 ChartThemeIcy,
44 44 ChartThemeGrayscale,
45 45 //ChartThemeScientific,
46 46 ChartThemeUnnamed1
47 47 };
48 48
49 49 public:
50 50 QChart(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0);
51 51 ~QChart();
52 52
53 53 void addSeries(QChartSeries* series);
54 54 //TODO: QChartSeries* createSeries(QSeriesData *data, QChartSeries::QChartSeriesType type);
55 55 // TODO: who owns the series now? maybe owned by chart and returned a reference instead...
56 56 QChartSeries* createSeries(QChartSeries::QChartSeriesType type);
57 57
58 58 void setMargin(int margin);
59 59 int margin() const;
60 60 void setTheme(QChart::ChartThemeId theme);
61 QChart::ChartThemeId theme();
61 62
62 63 void setTitle(const QString& title,const QFont& font = QFont());
63 64 void setBackground(const QColor& startColor, const QColor& endColor = Qt::white, GradientOrientation orientation = VerticalGradientOrientation);
64 65
65 66 void zoomInToRect(const QRectF& rectangle);
66 67 void zoomIn();
67 68 void zoomOut();
68 69 void zoomReset();
69 70
70 71 void setAxisX(const QChartAxis& axis);
71 72 void setAxisY(const QChartAxis& axis);
72 73 void setAxisY(const QList<QChartAxis>& axis);
73 74
74 75 protected:
75 76 void resizeEvent(QGraphicsSceneResizeEvent *event);
76 77
77 78 private:
78 79 void setAxis(AxisItem *item, const QChartAxis& axis);
79 80
80 81 private:
81 82 Q_DISABLE_COPY(QChart)
82 83 QGraphicsRectItem* m_backgroundItem;
83 84 QLinearGradient m_backgroundGradient;
84 85 GradientOrientation m_bacgroundOrinetation;
85 86 QGraphicsTextItem* m_titleItem;
86 87 AxisItem* m_axisXItem;
87 88 QList<AxisItem*> m_axisYItem;
88 89 QRectF m_rect;
89 90 QList<QChartSeries *> m_chartSeries;
90 91 QList<ChartItem *> m_chartItems;
91 92 QVector<PlotDomain> m_plotDomainList;
92 93 int m_plotDataIndex;
93 94 int m_marginSize;
94 95 ChartTheme *m_chartTheme;
95 96 };
96 97
97 98 QTCOMMERCIALCHART_END_NAMESPACE
98 99
99 100 #endif
@@ -1,49 +1,50
1 1 #ifndef QCHARTSERIES_H
2 2 #define QCHARTSERIES_H
3 3
4 4 #include "qchartglobal.h"
5 5 #include <QObject>
6 6 #include <QAbstractItemModel>
7 7
8 8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9 9
10 10 class QTCOMMERCIALCHART_EXPORT QChartSeries : public QObject
11 11 {
12 12 Q_OBJECT
13 13 public:
14 14 enum QChartSeriesType {
15 SeriesTypeLine = 0,
15 SeriesTypeInvalid = -1,
16 SeriesTypeLine,
16 17 // SeriesTypeArea,
17 18 SeriesTypeBar,
18 19 SeriesTypeStackedBar,
19 20 SeriesTypePercentBar,
20 21 SeriesTypePie,
21 22 SeriesTypeScatter
22 23 // SeriesTypeSpline
23 24 };
24 25
25 26 protected:
26 27 QChartSeries(QObject *parent = 0):QObject(parent){};
27 28
28 29 public:
29 30 virtual ~QChartSeries(){};
30 31
31 32 // Factory method
32 33 static QChartSeries* create(QChartSeriesType type, QObject* parent = 0 );
33 34
34 35 // Pure virtual
35 36 virtual QChartSeriesType type() const = 0;
36 37
37 38 virtual bool setData(QList<int> /*data*/) { return false; }
38 39 virtual bool setData(QList<qreal> /*data*/) { return false; }
39 40 virtual bool setData(QList<qreal> /*x*/, QList<qreal> /*y*/){ return false; }
40 41
41 42 // Prototype for data model. TODO: remove the other setData methods and use something like this for now?
42 43 virtual bool setData(QAbstractItemModel* /*model*/) { return false; }
43 44
44 45 };
45 46
46 47 QTCOMMERCIALCHART_END_NAMESPACE
47 48
48 49 #endif
49 50
@@ -1,5 +1,3
1 1 TEMPLATE = subdirs
2 SUBDIRS += chartwidgettest
3
4
5
2 SUBDIRS += chartwidgettest \
3 qmlchart
General Comments 0
You need to be logged in to leave comments. Login now