diff options
16 files changed, 757 insertions, 1 deletions
diff --git a/examples/examples.pro b/examples/examples.pro index 5ca239d5..4330ef4c 100644 --- a/examples/examples.pro +++ b/examples/examples.pro @@ -5,7 +5,8 @@ SUBDIRS += qmlbars \ qmlcustominput \ qmllegend \ qmlmultigraph \ - qmloscilloscope + qmloscilloscope \ + qmlsurfacelayers !android:!ios { SUBDIRS += bars \ diff --git a/examples/qmlsurfacelayers/doc/images/qmlsurfacelayers-example.png b/examples/qmlsurfacelayers/doc/images/qmlsurfacelayers-example.png Binary files differnew file mode 100644 index 00000000..cc3819f5 --- /dev/null +++ b/examples/qmlsurfacelayers/doc/images/qmlsurfacelayers-example.png diff --git a/examples/qmlsurfacelayers/doc/src/qmlsurfacelayers.qdoc b/examples/qmlsurfacelayers/doc/src/qmlsurfacelayers.qdoc new file mode 100644 index 00000000..eab9f17f --- /dev/null +++ b/examples/qmlsurfacelayers/doc/src/qmlsurfacelayers.qdoc @@ -0,0 +1,80 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +/*! + \example qmlsurfacelayers + \title Qt Quick 2 Surface Multiseries Example + \ingroup qtdatavisualization_examples + \brief Using multiple series with Surface3D in a QML application. + + The Qt Quick 2 surface example shows how to make a 3D surface plot displaying 3 layers using + Surface3D with Qt Quick 2. + + \image qmlsurfacelayers-example.png + + The focus in this example is on generating a multiseries surface plot from 3 different height + map images, so in this section we skip explaining the application creation. For a more detailed + QML example documentation, see \l{Qt Quick 2 Scatter Example}. + + \section1 Adding data to the graph + + This example shows how to add several surface series to one graph using using + HeightMapSurfaceDataProxies and how to control their visibilities individually. + + Let's start by creating a specific gradient for each layer: + + \snippet ../examples/qmlsurfacelayers/qml/qmlsurfacelayers/main.qml 0 + + Then we'll create the series themselves. It happens simply by adding 3 separate Surface3DSeries + to the Surface3D graph as children: + + \dots 0 + \snippet ../examples/qmlsurfacelayers/qml/qmlsurfacelayers/main.qml 1 + \dots 0 + + You'll notice we added the created gradients to the \c baseGradient properties of the series. + We could have added them to the \c baseGradients property of the Theme3D in Surface3D instead, + but doing it this way ensures each gradient is applied to a correct series: + + \snippet ../examples/qmlsurfacelayers/qml/qmlsurfacelayers/main.qml 2 + \dots + + \section1 Controlling the graph + + Let's add some checkboxes to control the visibility of layers: + + \snippet ../examples/qmlsurfacelayers/qml/qmlsurfacelayers/main.qml 3 + + We don't need to do anything on the \c onCheckedChanged as we bound the \c checked state to + the \c visible property of the series directly: + + \dots 0 + \snippet ../examples/qmlsurfacelayers/qml/qmlsurfacelayers/main.qml 4 + \dots 0 + + Let's add some more checkboxes to control how the layers are displayed, when visible: + + \snippet ../examples/qmlsurfacelayers/qml/qmlsurfacelayers/main.qml 5 + + In addition to these we have two buttons, one of which is of special interest to us. It is used + to control whether we want to slice into only one layer, or all of them: + + \snippet ../examples/qmlsurfacelayers/qml/qmlsurfacelayers/main.qml 6 + + \section1 Example contents +*/ diff --git a/examples/qmlsurfacelayers/layer_1.png b/examples/qmlsurfacelayers/layer_1.png Binary files differnew file mode 100644 index 00000000..9138c710 --- /dev/null +++ b/examples/qmlsurfacelayers/layer_1.png diff --git a/examples/qmlsurfacelayers/layer_2.png b/examples/qmlsurfacelayers/layer_2.png Binary files differnew file mode 100644 index 00000000..796df64d --- /dev/null +++ b/examples/qmlsurfacelayers/layer_2.png diff --git a/examples/qmlsurfacelayers/layer_3.png b/examples/qmlsurfacelayers/layer_3.png Binary files differnew file mode 100644 index 00000000..61631ae8 --- /dev/null +++ b/examples/qmlsurfacelayers/layer_3.png diff --git a/examples/qmlsurfacelayers/main.cpp b/examples/qmlsurfacelayers/main.cpp new file mode 100644 index 00000000..51925c45 --- /dev/null +++ b/examples/qmlsurfacelayers/main.cpp @@ -0,0 +1,50 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#include <QtDataVisualization/qutils.h> +#include <QtGui/QGuiApplication> +#include "qtquick2applicationviewer.h" + +#ifdef Q_OS_ANDROID +#include <QDir> +#include <QQmlEngine> +#endif + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + QtQuick2ApplicationViewer viewer; + + // Enable antialiasing + viewer.setFormat(QtDataVisualization::qDefaultSurfaceFormat()); + +#ifdef Q_OS_ANDROID + viewer.addImportPath(QString::fromLatin1("assets:/qml")); + viewer.engine()->addPluginPath(QString::fromLatin1("%1/../%2").arg(QDir::homePath(), + QString::fromLatin1("lib"))); +#endif + + viewer.setSource(QUrl("qrc:/qml/qmlsurfacelayers/main.qml")); + + viewer.setTitle(QStringLiteral("3-layered Terrain")); + viewer.setResizeMode(QQuickView::SizeRootObjectToView); + viewer.show(); + + return app.exec(); +} diff --git a/examples/qmlsurfacelayers/qml/qmlsurfacelayers/NewButton.qml b/examples/qmlsurfacelayers/qml/qmlsurfacelayers/NewButton.qml new file mode 100644 index 00000000..e4fb99d2 --- /dev/null +++ b/examples/qmlsurfacelayers/qml/qmlsurfacelayers/NewButton.qml @@ -0,0 +1,52 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +import QtQuick 2.1 +import QtQuick.Controls 1.0 +import QtQuick.Controls.Styles 1.0 + +Item { + id: newbutton + + property alias text: buttonText.text + + signal clicked + + implicitWidth: buttonText.implicitWidth + 5 + implicitHeight: buttonText.implicitHeight + 10 + + Button { + id: buttonText + width: parent.width + height: parent.height + + style: ButtonStyle { + label: Component { + Text { + text: buttonText.text + clip: true + wrapMode: Text.WordWrap + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + anchors.fill: parent + } + } + } + onClicked: newbutton.clicked() + } +} diff --git a/examples/qmlsurfacelayers/qml/qmlsurfacelayers/main.qml b/examples/qmlsurfacelayers/qml/qmlsurfacelayers/main.qml new file mode 100644 index 00000000..ba9961b5 --- /dev/null +++ b/examples/qmlsurfacelayers/qml/qmlsurfacelayers/main.qml @@ -0,0 +1,234 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +import QtQuick 2.1 +import QtQuick.Layouts 1.0 +import QtQuick.Controls 1.0 +import QtDataVisualization 1.0 +import "." + +Item { + id: mainview + width: 1280 + height: 720 + + Item { + id: surfaceView + width: mainview.width - buttonLayout.width + height: mainview.height + anchors.right: mainview.right; + + //! [0] + ColorGradient { + id: layerOneGradient + ColorGradientStop { position: 0.0; color: "black" } + ColorGradientStop { position: 0.31; color: "tan" } + ColorGradientStop { position: 0.32; color: "green" } + ColorGradientStop { position: 0.40; color: "darkslategray" } + ColorGradientStop { position: 1.0; color: "white" } + } + + ColorGradient { + id: layerTwoGradient + ColorGradientStop { position: 0.0; color: "red" } + ColorGradientStop { position: 0.15; color: "black" } + } + + ColorGradient { + id: layerThreeGradient + ColorGradientStop { position: 0.315; color: "blue" } + ColorGradientStop { position: 0.33; color: "white" } + } + //! [0] + + Surface3D { + id: surfaceLayers + width: surfaceView.width + height: surfaceView.height + theme: Theme3D { + type: Theme3D.ThemeEbony + font.pointSize: 35 + colorStyle: Theme3D.ColorStyleRangeGradient + } + shadowQuality: AbstractGraph3D.ShadowQualityNone + selectionMode: AbstractGraph3D.SelectionRow | AbstractGraph3D.SelectionSlice + scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeft + axisY.min: 20 + axisY.max: 200 + axisX.segmentCount: 5 + axisX.subSegmentCount: 2 + axisX.labelFormat: "%i" + axisZ.segmentCount: 5 + axisZ.subSegmentCount: 2 + axisZ.labelFormat: "%i" + axisY.segmentCount: 5 + axisY.subSegmentCount: 2 + axisY.labelFormat: "%i" + + //! [1] + //! [2] + Surface3DSeries { + id: layerOneSeries + baseGradient: layerOneGradient + //! [2] + HeightMapSurfaceDataProxy { + heightMapFile: ":/heightmaps/layer_1.png" + } + flatShadingEnabled: false + drawMode: Surface3DSeries.DrawSurface + //! [4] + visible: layerOneToggle.checked // bind to checkbox state + //! [4] + } + + Surface3DSeries { + id: layerTwoSeries + baseGradient: layerTwoGradient + HeightMapSurfaceDataProxy { + heightMapFile: ":/heightmaps/layer_2.png" + } + flatShadingEnabled: false + drawMode: Surface3DSeries.DrawSurface + visible: layerTwoToggle.checked // bind to checkbox state + } + + Surface3DSeries { + id: layerThreeSeries + baseGradient: layerThreeGradient + HeightMapSurfaceDataProxy { + heightMapFile: ":/heightmaps/layer_3.png" + } + flatShadingEnabled: false + drawMode: Surface3DSeries.DrawSurface + visible: layerThreeToggle.checked // bind to checkbox state + } + //! [1] + } + } + + ColumnLayout { + id: buttonLayout + anchors.top: parent.top + anchors.left: parent.left + spacing: 0 + + //! [3] + GroupBox { + title: "Layer Selection" + Layout.fillWidth: true + Column { + CheckBox { + id: layerOneToggle + text: "Show Ground Layer" + checked: true + } + + CheckBox { + id: layerTwoToggle + text: "Show Tectonic Layer" + checked: true + } + + CheckBox { + id: layerThreeToggle + text: "Show Sea Layer" + checked: true + } + } + } + //! [3] + + //! [5] + GroupBox { + title: "Layer Style" + Layout.fillWidth: true + Column { + CheckBox { + id: layerOneGrid + text: "Show Ground as Grid" + onCheckedChanged: { + if (checked) + layerOneSeries.drawMode = Surface3DSeries.DrawWireframe + else + layerOneSeries.drawMode = Surface3DSeries.DrawSurface + } + } + + CheckBox { + id: layerTwoGrid + text: "Show Tectonic as Grid" + onCheckedChanged: { + if (checked) + layerTwoSeries.drawMode = Surface3DSeries.DrawWireframe + else + layerTwoSeries.drawMode = Surface3DSeries.DrawSurface + } + } + + CheckBox { + id: layerThreeGrid + text: "Show Sea as Grid" + onCheckedChanged: { + if (checked) + layerThreeSeries.drawMode = Surface3DSeries.DrawWireframe + else + layerThreeSeries.drawMode = Surface3DSeries.DrawSurface + } + } + } + } + //! [5] + + //! [6] + NewButton { + id: sliceButton + text: "Slice All Layers" + Layout.fillWidth: true + Layout.minimumHeight: 40 + onClicked: { + if (surfaceLayers.selectionMode & AbstractGraph3D.SelectionMultiSeries) { + surfaceLayers.selectionMode = AbstractGraph3D.SelectionRow + | AbstractGraph3D.SelectionSlice + text: "Slice All Layers" + } else { + surfaceLayers.selectionMode = AbstractGraph3D.SelectionRow + | AbstractGraph3D.SelectionSlice + | AbstractGraph3D.SelectionMultiSeries + text: "Slice One Layer" + } + } + } + //! [6] + + NewButton { + id: shadowButton + text: "Show Shadows" + Layout.fillWidth: true + Layout.minimumHeight: 40 + onClicked: { + if (surfaceLayers.shadowQuality === AbstractGraph3D.ShadowQualityNone) { + surfaceLayers.shadowQuality = AbstractGraph3D.ShadowQualityLow + text: "Hide Shadows" + } else { + surfaceLayers.shadowQuality = AbstractGraph3D.ShadowQualityNone + text: "Show Shadows" + } + } + } + } +} diff --git a/examples/qmlsurfacelayers/qmlsurfacelayers.desktop b/examples/qmlsurfacelayers/qmlsurfacelayers.desktop new file mode 100644 index 00000000..bdd5c776 --- /dev/null +++ b/examples/qmlsurfacelayers/qmlsurfacelayers.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Encoding=UTF-8 +Version=1.0 +Type=Application +Terminal=false +Name=qmlsurfacelayers +Exec=/opt/qmlsurfacelayers/bin/qmlsurfacelayers +Icon=qmlsurfacelayers64 +X-Window-Icon= +X-HildonDesk-ShowInToolbar=true +X-Osso-Type=application/x-executable diff --git a/examples/qmlsurfacelayers/qmlsurfacelayers.pro b/examples/qmlsurfacelayers/qmlsurfacelayers.pro new file mode 100644 index 00000000..0ba37d1e --- /dev/null +++ b/examples/qmlsurfacelayers/qmlsurfacelayers.pro @@ -0,0 +1,23 @@ +!include( ../examples.pri ) { + error( "Couldn't find the examples.pri file!" ) +} + +# Add more folders to ship with the application, here +folder_01.source = qml/qmlsurfacelayers +folder_01.target = qml +DEPLOYMENTFOLDERS = folder_01 + +# Additional import path used to resolve QML modules in Creator's code model +QML_IMPORT_PATH = + +# The .cpp file which was generated for your project. Feel free to hack it. +SOURCES += main.cpp + +# Please do not modify the following two lines. Required for deployment. +include(qtquick2applicationviewer/qtquick2applicationviewer.pri) +qtcAddDeployment() + +RESOURCES += qmlsurfacelayers.qrc + +OTHER_FILES += doc/src/* \ + doc/images/* diff --git a/examples/qmlsurfacelayers/qmlsurfacelayers.qrc b/examples/qmlsurfacelayers/qmlsurfacelayers.qrc new file mode 100644 index 00000000..028a91db --- /dev/null +++ b/examples/qmlsurfacelayers/qmlsurfacelayers.qrc @@ -0,0 +1,11 @@ +<RCC> + <qresource prefix="/"> + <file>qml/qmlsurfacelayers/main.qml</file> + <file>qml/qmlsurfacelayers/NewButton.qml</file> + </qresource> + <qresource prefix="/heightmaps"> + <file>layer_1.png</file> + <file>layer_2.png</file> + <file>layer_3.png</file> + </qresource> +</RCC> diff --git a/examples/qmlsurfacelayers/qmlsurfacelayers64.png b/examples/qmlsurfacelayers/qmlsurfacelayers64.png Binary files differnew file mode 100644 index 00000000..707d5c4e --- /dev/null +++ b/examples/qmlsurfacelayers/qmlsurfacelayers64.png diff --git a/examples/qmlsurfacelayers/qtquick2applicationviewer/qtquick2applicationviewer.cpp b/examples/qmlsurfacelayers/qtquick2applicationviewer/qtquick2applicationviewer.cpp new file mode 100644 index 00000000..10709d7a --- /dev/null +++ b/examples/qmlsurfacelayers/qtquick2applicationviewer/qtquick2applicationviewer.cpp @@ -0,0 +1,81 @@ +// checksum 0x4f6f version 0x90005 +/* + This file was generated by the Qt Quick 2 Application wizard of Qt Creator. + QtQuick2ApplicationViewer is a convenience class containing mobile device specific + code such as screen orientation handling. Also QML paths and debugging are + handled here. + It is recommended not to modify this file, since newer versions of Qt Creator + may offer an updated version of it. +*/ + +#include "qtquick2applicationviewer.h" + +#include <QtCore/QCoreApplication> +#include <QtCore/QDir> +#include <QtQml/QQmlEngine> + +class QtQuick2ApplicationViewerPrivate +{ + QString mainQmlFile; + friend class QtQuick2ApplicationViewer; + static QString adjustPath(const QString &path); +}; + +QString QtQuick2ApplicationViewerPrivate::adjustPath(const QString &path) +{ +#if defined(Q_OS_MAC) + if (!QDir::isAbsolutePath(path)) + return QString::fromLatin1("%1/../Resources/%2") + .arg(QCoreApplication::applicationDirPath(), path); +#elif defined(Q_OS_BLACKBERRY) + if (!QDir::isAbsolutePath(path)) + return QString::fromLatin1("app/native/%1").arg(path); +#elif !defined(Q_OS_ANDROID) + QString pathInInstallDir = + QString::fromLatin1("%1/../%2").arg(QCoreApplication::applicationDirPath(), path); + if (QFileInfo(pathInInstallDir).exists()) + return pathInInstallDir; + pathInInstallDir = + QString::fromLatin1("%1/%2").arg(QCoreApplication::applicationDirPath(), path); + if (QFileInfo(pathInInstallDir).exists()) + return pathInInstallDir; +#endif + return path; +} + +QtQuick2ApplicationViewer::QtQuick2ApplicationViewer(QWindow *parent) + : QQuickView(parent) + , d(new QtQuick2ApplicationViewerPrivate()) +{ + connect(engine(), SIGNAL(quit()), SLOT(close())); + setResizeMode(QQuickView::SizeRootObjectToView); +} + +QtQuick2ApplicationViewer::~QtQuick2ApplicationViewer() +{ + delete d; +} + +void QtQuick2ApplicationViewer::setMainQmlFile(const QString &file) +{ + d->mainQmlFile = QtQuick2ApplicationViewerPrivate::adjustPath(file); +#ifdef Q_OS_ANDROID + setSource(QUrl(QLatin1String("assets:/")+d->mainQmlFile)); +#else + setSource(QUrl::fromLocalFile(d->mainQmlFile)); +#endif +} + +void QtQuick2ApplicationViewer::addImportPath(const QString &path) +{ + engine()->addImportPath(QtQuick2ApplicationViewerPrivate::adjustPath(path)); +} + +void QtQuick2ApplicationViewer::showExpanded() +{ +#if defined(Q_WS_SIMULATOR) || defined(Q_OS_QNX) + showFullScreen(); +#else + show(); +#endif +} diff --git a/examples/qmlsurfacelayers/qtquick2applicationviewer/qtquick2applicationviewer.h b/examples/qmlsurfacelayers/qtquick2applicationviewer/qtquick2applicationviewer.h new file mode 100644 index 00000000..cf66f140 --- /dev/null +++ b/examples/qmlsurfacelayers/qtquick2applicationviewer/qtquick2applicationviewer.h @@ -0,0 +1,33 @@ +// checksum 0xfde6 version 0x90005 +/* + This file was generated by the Qt Quick 2 Application wizard of Qt Creator. + QtQuick2ApplicationViewer is a convenience class containing mobile device specific + code such as screen orientation handling. Also QML paths and debugging are + handled here. + It is recommended not to modify this file, since newer versions of Qt Creator + may offer an updated version of it. +*/ + +#ifndef QTQUICK2APPLICATIONVIEWER_H +#define QTQUICK2APPLICATIONVIEWER_H + +#include <QtQuick/QQuickView> + +class QtQuick2ApplicationViewer : public QQuickView +{ + Q_OBJECT + +public: + explicit QtQuick2ApplicationViewer(QWindow *parent = 0); + virtual ~QtQuick2ApplicationViewer(); + + void setMainQmlFile(const QString &file); + void addImportPath(const QString &path); + + void showExpanded(); + +private: + class QtQuick2ApplicationViewerPrivate *d; +}; + +#endif // QTQUICK2APPLICATIONVIEWER_H diff --git a/examples/qmlsurfacelayers/qtquick2applicationviewer/qtquick2applicationviewer.pri b/examples/qmlsurfacelayers/qtquick2applicationviewer/qtquick2applicationviewer.pri new file mode 100644 index 00000000..e5f7990f --- /dev/null +++ b/examples/qmlsurfacelayers/qtquick2applicationviewer/qtquick2applicationviewer.pri @@ -0,0 +1,180 @@ +# checksum 0x7b0d version 0x90005 +# This file was generated by the Qt Quick 2 Application wizard of Qt Creator. +# The code below adds the QtQuick2ApplicationViewer to the project and handles +# the activation of QML debugging. +# It is recommended not to modify this file, since newer versions of Qt Creator +# may offer an updated version of it. + +QT += qml quick + +SOURCES += $$PWD/qtquick2applicationviewer.cpp +HEADERS += $$PWD/qtquick2applicationviewer.h +INCLUDEPATH += $$PWD +# This file was generated by an application wizard of Qt Creator. +# The code below handles deployment to Android and Maemo, aswell as copying +# of the application data to shadow build directories on desktop. +# It is recommended not to modify this file, since newer versions of Qt Creator +# may offer an updated version of it. + +defineTest(qtcAddDeployment) { +for(deploymentfolder, DEPLOYMENTFOLDERS) { + item = item$${deploymentfolder} + greaterThan(QT_MAJOR_VERSION, 4) { + itemsources = $${item}.files + } else { + itemsources = $${item}.sources + } + $$itemsources = $$eval($${deploymentfolder}.source) + itempath = $${item}.path + $$itempath= $$eval($${deploymentfolder}.target) + export($$itemsources) + export($$itempath) + DEPLOYMENT += $$item +} + +MAINPROFILEPWD = $$PWD + +android-no-sdk { + for(deploymentfolder, DEPLOYMENTFOLDERS) { + item = item$${deploymentfolder} + itemfiles = $${item}.files + $$itemfiles = $$eval($${deploymentfolder}.source) + itempath = $${item}.path + $$itempath = /data/user/qt/$$eval($${deploymentfolder}.target) + export($$itemfiles) + export($$itempath) + INSTALLS += $$item + } + + target.path = /data/user/qt + + export(target.path) + INSTALLS += target +} else:android { + for(deploymentfolder, DEPLOYMENTFOLDERS) { + item = item$${deploymentfolder} + itemfiles = $${item}.files + $$itemfiles = $$eval($${deploymentfolder}.source) + itempath = $${item}.path + $$itempath = /assets/$$eval($${deploymentfolder}.target) + export($$itemfiles) + export($$itempath) + INSTALLS += $$item + } + + x86 { + target.path = /libs/x86 + } else: armeabi-v7a { + target.path = /libs/armeabi-v7a + } else { + target.path = /libs/armeabi + } + + export(target.path) + INSTALLS += target +} else:win32 { + copyCommand = + for(deploymentfolder, DEPLOYMENTFOLDERS) { + source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source) + source = $$replace(source, /, \\) + sourcePathSegments = $$split(source, \\) + target = $$OUT_PWD/$$eval($${deploymentfolder}.target)/$$last(sourcePathSegments) + target = $$replace(target, /, \\) + target ~= s,\\\\\\.?\\\\,\\, + !isEqual(source,$$target) { + !isEmpty(copyCommand):copyCommand += && + isEqual(QMAKE_DIR_SEP, \\) { + copyCommand += $(COPY_DIR) \"$$source\" \"$$target\" + } else { + source = $$replace(source, \\\\, /) + target = $$OUT_PWD/$$eval($${deploymentfolder}.target) + target = $$replace(target, \\\\, /) + copyCommand += test -d \"$$target\" || mkdir -p \"$$target\" && cp -r \"$$source\" \"$$target\" + } + } + } + !isEmpty(copyCommand) { + copyCommand = @echo Copying application data... && $$copyCommand + copydeploymentfolders.commands = $$copyCommand + first.depends = $(first) copydeploymentfolders + export(first.depends) + export(copydeploymentfolders.commands) + QMAKE_EXTRA_TARGETS += first copydeploymentfolders + } +} else:unix { + maemo5 { + desktopfile.files = $${TARGET}.desktop + desktopfile.path = /usr/share/applications/hildon + icon.files = $${TARGET}64.png + icon.path = /usr/share/icons/hicolor/64x64/apps + } else:!isEmpty(MEEGO_VERSION_MAJOR) { + desktopfile.files = $${TARGET}_harmattan.desktop + desktopfile.path = /usr/share/applications + icon.files = $${TARGET}80.png + icon.path = /usr/share/icons/hicolor/80x80/apps + } else { # Assumed to be a Desktop Unix + copyCommand = + for(deploymentfolder, DEPLOYMENTFOLDERS) { + source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source) + source = $$replace(source, \\\\, /) + macx { + target = $$OUT_PWD/$${TARGET}.app/Contents/Resources/$$eval($${deploymentfolder}.target) + } else { + target = $$OUT_PWD/$$eval($${deploymentfolder}.target) + } + target = $$replace(target, \\\\, /) + sourcePathSegments = $$split(source, /) + targetFullPath = $$target/$$last(sourcePathSegments) + targetFullPath ~= s,/\\.?/,/, + !isEqual(source,$$targetFullPath) { + !isEmpty(copyCommand):copyCommand += && + copyCommand += $(MKDIR) \"$$target\" + copyCommand += && $(COPY_DIR) \"$$source\" \"$$target\" + } + } + !isEmpty(copyCommand) { + copyCommand = @echo Copying application data... && $$copyCommand + copydeploymentfolders.commands = $$copyCommand + first.depends = $(first) copydeploymentfolders + export(first.depends) + export(copydeploymentfolders.commands) + QMAKE_EXTRA_TARGETS += first copydeploymentfolders + } + } + !isEmpty(target.path) { + installPrefix = $${target.path} + } else { + installPrefix = /opt/$${TARGET} + } + for(deploymentfolder, DEPLOYMENTFOLDERS) { + item = item$${deploymentfolder} + itemfiles = $${item}.files + $$itemfiles = $$eval($${deploymentfolder}.source) + itempath = $${item}.path + $$itempath = $${installPrefix}/$$eval($${deploymentfolder}.target) + export($$itemfiles) + export($$itempath) + INSTALLS += $$item + } + + !isEmpty(desktopfile.path) { + export(icon.files) + export(icon.path) + export(desktopfile.files) + export(desktopfile.path) + INSTALLS += icon desktopfile + } + + isEmpty(target.path) { + target.path = $${installPrefix}/bin + export(target.path) + } + INSTALLS += target +} + +export (ICON) +export (INSTALLS) +export (DEPLOYMENT) +export (LIBS) +export (QMAKE_EXTRA_TARGETS) +} |