From e83ba4d4ece9dd2206ca67e399d5dfeb881472f7 Mon Sep 17 00:00:00 2001 From: Christian Kandeler <christian.kandeler@nokia.com> Date: Mon, 13 Sep 2010 11:20:13 +0200 Subject: [PATCH] Mobile wizard: Model after QML wizard. Nodded-at-by: dt --- .../qtcreator/templates/mobileapp/app.desktop | 11 + share/qtcreator/templates/mobileapp/app.pri | 23 + share/qtcreator/templates/mobileapp/app.pro | 18 + .../templates/mobileapp/maemoicon.png | Bin 0 -> 3400 bytes share/qtcreator/templates/mobileapp/main.cpp | 20 + .../templates/mobileapp/mainwindow.cpp | 59 +++ .../templates/mobileapp/mainwindow.h | 28 ++ .../templates/mobileapp/mainwindow.ui | 24 + .../templates/mobileapp/symbianicon.svg | 93 ++++ .../qt4projectmanager/qt4projectmanager.cpp | 4 +- .../qt4projectmanager/qt4projectmanager.pro | 9 +- .../qt4projectmanagerplugin.cpp | 6 +- .../qt4projectmanager/wizards/mobileapp.cpp | 410 ++++++++++++++++++ .../qt4projectmanager/wizards/mobileapp.h | 143 ++++++ .../wizards/mobileappwizard.cpp | 164 +++++++ .../wizards/mobileappwizard.h | 65 +++ .../wizards/mobileappwizardoptionspage.ui | 233 ++++++++++ .../wizards/mobileappwizardpages.cpp | 170 ++++++++ .../wizards/mobileappwizardpages.h | 71 +++ .../wizards/qmlstandaloneapp.cpp | 72 +-- .../wizards/qmlstandaloneapp.h | 10 +- 21 files changed, 1585 insertions(+), 48 deletions(-) create mode 100644 share/qtcreator/templates/mobileapp/app.desktop create mode 100644 share/qtcreator/templates/mobileapp/app.pri create mode 100644 share/qtcreator/templates/mobileapp/app.pro create mode 100644 share/qtcreator/templates/mobileapp/maemoicon.png create mode 100644 share/qtcreator/templates/mobileapp/main.cpp create mode 100644 share/qtcreator/templates/mobileapp/mainwindow.cpp create mode 100644 share/qtcreator/templates/mobileapp/mainwindow.h create mode 100644 share/qtcreator/templates/mobileapp/mainwindow.ui create mode 100644 share/qtcreator/templates/mobileapp/symbianicon.svg create mode 100644 src/plugins/qt4projectmanager/wizards/mobileapp.cpp create mode 100644 src/plugins/qt4projectmanager/wizards/mobileapp.h create mode 100644 src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp create mode 100644 src/plugins/qt4projectmanager/wizards/mobileappwizard.h create mode 100644 src/plugins/qt4projectmanager/wizards/mobileappwizardoptionspage.ui create mode 100644 src/plugins/qt4projectmanager/wizards/mobileappwizardpages.cpp create mode 100644 src/plugins/qt4projectmanager/wizards/mobileappwizardpages.h diff --git a/share/qtcreator/templates/mobileapp/app.desktop b/share/qtcreator/templates/mobileapp/app.desktop new file mode 100644 index 00000000000..e9d9304f6be --- /dev/null +++ b/share/qtcreator/templates/mobileapp/app.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Encoding=UTF-8 +Version=1.0 +Type=Application +Terminal=false +Name=thisApp +Exec=/opt/bin/thisApp +Icon=thisApp +X-Window-Icon= +X-HildonDesk-ShowInToolbar=true +X-Osso-Type=application/x-executable diff --git a/share/qtcreator/templates/mobileapp/app.pri b/share/qtcreator/templates/mobileapp/app.pri new file mode 100644 index 00000000000..b46ce3227e3 --- /dev/null +++ b/share/qtcreator/templates/mobileapp/app.pri @@ -0,0 +1,23 @@ +# This file should not be edited. +# Following versions of Qt Creator might offer new version. + +INCLUDEPATH += $$PWD + +symbian { + TARGET.EPOCHEAPSIZE = 0x20000 0x2000000 + contains(DEFINES, ORIENTATIONLOCK):LIBS += -lavkon -leikcore -leiksrv -lcone + contains(DEFINES, NETWORKACCESS):TARGET.CAPABILITY += NetworkServices +} else:unix { + maemo5 { + installPrefix = /opt/usr + desktopfile.path = /usr/share/applications/hildon + } else { + installPrefix = /usr/local + desktopfile.path = /usr/share/applications + } + icon.files = $${TARGET}.png + icon.path = /usr/share/icons/hicolor/64x64 + desktopfile.files = $${TARGET}.desktop + target.path = $${installPrefix}/bin + INSTALLS += desktopfile icon target +} diff --git a/share/qtcreator/templates/mobileapp/app.pro b/share/qtcreator/templates/mobileapp/app.pro new file mode 100644 index 00000000000..cd05a35c681 --- /dev/null +++ b/share/qtcreator/templates/mobileapp/app.pro @@ -0,0 +1,18 @@ +# Avoid auto screen rotation +# ORIENTATIONLOCK # +DEFINES += ORIENTATIONLOCK + +# Needs to be defined for Symbian +# NETWORKACCESS # +DEFINES += NETWORKACCESS + +# TARGETUID3 # +symbian:TARGET.UID3 = 0xE1111234 + +symbian:ICON = symbianicon.svg + +SOURCES += main.cpp mainwindow.cpp +HEADERS += mainwindow.h +FORMS += mainwindow.ui + +include(app.pri) diff --git a/share/qtcreator/templates/mobileapp/maemoicon.png b/share/qtcreator/templates/mobileapp/maemoicon.png new file mode 100644 index 0000000000000000000000000000000000000000..707d5c4e85d82959740b243a8a36d5071c277299 GIT binary patch literal 3400 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 literal 0 HcmV?d00001 diff --git a/share/qtcreator/templates/mobileapp/main.cpp b/share/qtcreator/templates/mobileapp/main.cpp new file mode 100644 index 00000000000..59b739482aa --- /dev/null +++ b/share/qtcreator/templates/mobileapp/main.cpp @@ -0,0 +1,20 @@ +#include "mainwindow.h" + +#include <QtGui/QApplication> + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + MainWindow mainWindow; + mainWindow.setOrientation(MainWindow::Auto); // ORIENTATION + +#ifdef Q_OS_SYMBIAN + mainWindow.showFullScreen(); +#elif defined(Q_WS_MAEMO_5) + mainWindow.showMaximized(); +#else + mainWindow.show(); +#endif + return app.exec(); +} diff --git a/share/qtcreator/templates/mobileapp/mainwindow.cpp b/share/qtcreator/templates/mobileapp/mainwindow.cpp new file mode 100644 index 00000000000..d08587ce9b2 --- /dev/null +++ b/share/qtcreator/templates/mobileapp/mainwindow.cpp @@ -0,0 +1,59 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" + +#include <QtCore/QCoreApplication> + +#if defined(Q_OS_SYMBIAN) && defined(ORIENTATIONLOCK) +#include <eikenv.h> +#include <eikappui.h> +#include <aknenv.h> +#include <aknappui.h> +#endif // Q_OS_SYMBIAN && ORIENTATIONLOCK + +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent), ui(new Ui::MainWindow) +{ + ui->setupUi(this); +} + +MainWindow::~MainWindow() +{ + delete ui; +} + +void MainWindow::setOrientation(Orientation orientation) +{ +#ifdef Q_OS_SYMBIAN + if (orientation != Auto) { +#if defined(ORIENTATIONLOCK) + const CAknAppUiBase::TAppUiOrientation uiOrientation = + (orientation == LockPortrait) ? CAknAppUi::EAppUiOrientationPortrait + : CAknAppUi::EAppUiOrientationLandscape; + CAknAppUi* appUi = dynamic_cast<CAknAppUi*> (CEikonEnv::Static()->AppUi()); + TRAPD(error, + if (appUi) + appUi->SetOrientationL(uiOrientation); + ); +#else // ORIENTATIONLOCK + qWarning("'ORIENTATIONLOCK' needs to be defined on Symbian when locking the orientation."); +#endif // ORIENTATIONLOCK + } +#elif defined(Q_WS_MAEMO_5) + Qt::WidgetAttribute attribute; + switch (orientation) { + case LockPortrait: + attribute = Qt::WA_Maemo5PortraitOrientation; + break; + case LockLandscape: + attribute = Qt::WA_Maemo5LandscapeOrientation; + break; + case Auto: + default: + attribute = Qt::WA_Maemo5AutoOrientation; + break; + } + setAttribute(attribute, true); +#else // Q_OS_SYMBIAN + Q_UNUSED(orientation); +#endif // Q_OS_SYMBIAN +} diff --git a/share/qtcreator/templates/mobileapp/mainwindow.h b/share/qtcreator/templates/mobileapp/mainwindow.h new file mode 100644 index 00000000000..dc9813dbb77 --- /dev/null +++ b/share/qtcreator/templates/mobileapp/mainwindow.h @@ -0,0 +1,28 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include <QtGui/QMainWindow> + +namespace Ui { + class MainWindow; +} + +class MainWindow : public QMainWindow +{ +public: + enum Orientation { + LockPortrait, + LockLandscape, + Auto + }; + + MainWindow(QWidget *parent = 0); + ~MainWindow(); + + void setOrientation(Orientation orientation); + +private: + Ui::MainWindow *ui; +}; + +#endif // MAINWINDOW_H diff --git a/share/qtcreator/templates/mobileapp/mainwindow.ui b/share/qtcreator/templates/mobileapp/mainwindow.ui new file mode 100644 index 00000000000..d2ae706e129 --- /dev/null +++ b/share/qtcreator/templates/mobileapp/mainwindow.ui @@ -0,0 +1,24 @@ +<ui version="4.0"> + <class>MainWindow</class> + <widget class="QMainWindow" name="MainWindow" > + <property name="geometry" > + <rect> + <x>0</x> + <y>0</y> + <width>200</width> + <height>320</height> + </rect> + </property> + <property name="windowTitle" > + <string>MainWindow</string> + </property> + <widget class="QMenuBar" name="menuBar" /> + <widget class="QToolBar" name="mainToolBar" /> + <widget class="QWidget" name="centralWidget" /> + <widget class="QStatusBar" name="statusBar" /> + </widget> + <layoutDefault spacing="6" margin="11" /> + <pixmapfunction></pixmapfunction> + <resources/> + <connections/> +</ui> diff --git a/share/qtcreator/templates/mobileapp/symbianicon.svg b/share/qtcreator/templates/mobileapp/symbianicon.svg new file mode 100644 index 00000000000..566acfada01 --- /dev/null +++ b/share/qtcreator/templates/mobileapp/symbianicon.svg @@ -0,0 +1,93 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="44px" + version="1.1" + viewBox="0 0 44 44" + width="44px" + x="0px" + y="0px" + id="svg2" + inkscape:version="0.47 r22583" + sodipodi:docname="qt.svg"> + <metadata + id="metadata18"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs16"> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 22 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="44 : 22 : 1" + inkscape:persp3d-origin="22 : 14.666667 : 1" + id="perspective2836" /> + </defs> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1020" + id="namedview14" + showgrid="false" + inkscape:zoom="21.454545" + inkscape:cx="49.412871" + inkscape:cy="21.894358" + inkscape:window-x="-4" + inkscape:window-y="-4" + inkscape:window-maximized="1" + inkscape:current-layer="g3" /> + <g + transform="matrix(0.18308778,0,0,0.18308778,6.6100946,3.2385199)" + id="g3"> + <path + 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" + style="fill:#006225" + id="path5" + sodipodi:nodetypes="cccccccc" /> + <path + 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" + style="fill:#80c342" + id="path7" /> + <path + d="m 154.9,80.96 -12.96,-0.598 0,0.278 6.945,0.32 6.016,0 z" + style="fill:#006225" + id="path11" /> + <path + 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" + style="fill:#006225" + id="path13" /> + <path + id="path17" + style="fill:#ffffff" + 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" /> + <path + 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" + style="fill:#006225" + id="path19" /> + <path + id="path21" + style="fill:#006225" + 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" /> + </g> +</svg> diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.cpp b/src/plugins/qt4projectmanager/qt4projectmanager.cpp index 6454625d721..b708ebd901e 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.cpp +++ b/src/plugins/qt4projectmanager/qt4projectmanager.cpp @@ -187,13 +187,13 @@ QString Qt4Manager::mimeType() const // When removing this, also remove the inclusions of "wizards/qmlstandaloneapp.h" and QtGui/QMessageBox inline void updateQmlApplicationViewerFiles(const QString proFile) { - const QList<GeneratedFileInfo> updates = + const QList<QmlAppGeneratedFileInfo> updates = QmlStandaloneApp::fileUpdates(proFile); if (!updates.empty()) { // TODO Translate the folloing strings when we want to keep the code QString message = QLatin1String("The following files are either outdated or have been modified:"); message.append(QLatin1String("<ul>")); - foreach (const GeneratedFileInfo &info, updates) { + foreach (const QmlAppGeneratedFileInfo &info, updates) { QStringList reasons; if (info.wasModified()) reasons.append(QLatin1String("modified")); diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.pro b/src/plugins/qt4projectmanager/qt4projectmanager.pro index 93086252983..18136288610 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.pro +++ b/src/plugins/qt4projectmanager/qt4projectmanager.pro @@ -16,7 +16,9 @@ HEADERS += qt4deployconfiguration.h \ profilereader.h \ wizards/qtprojectparameters.h \ wizards/guiappwizard.h \ - wizards/mobileguiappwizard.h \ + wizards/mobileapp.h \ + wizards/mobileappwizard.h \ + wizards/mobileappwizardpages.h \ wizards/consoleappwizard.h \ wizards/consoleappwizarddialog.h \ wizards/libraryparameters.h \ @@ -68,7 +70,9 @@ SOURCES += qt4projectmanagerplugin.cpp \ profilereader.cpp \ wizards/qtprojectparameters.cpp \ wizards/guiappwizard.cpp \ - wizards/mobileguiappwizard.cpp \ + wizards/mobileapp.cpp \ + wizards/mobileappwizard.cpp \ + wizards/mobileappwizardpages.cpp \ wizards/consoleappwizard.cpp \ wizards/consoleappwizarddialog.cpp \ wizards/libraryparameters.cpp \ @@ -116,6 +120,7 @@ FORMS += makestep.ui \ wizards/targetsetuppage.ui \ wizards/qmlstandaloneappwizardoptionspage.ui \ wizards/qmlstandaloneappwizardsourcespage.ui \ + wizards/mobileappwizardoptionspage.ui \ librarydetailswidget.ui RESOURCES += qt4projectmanager.qrc \ wizards/wizards.qrc diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp index 8d69eb703f6..0ed22615959 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp +++ b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp @@ -34,7 +34,7 @@ #include "makestep.h" #include "wizards/consoleappwizard.h" #include "wizards/guiappwizard.h" -#include "wizards/mobileguiappwizard.h" +#include "wizards/mobileappwizard.h" #include "wizards/librarywizard.h" #include "wizards/testwizard.h" #include "wizards/emptyprojectwizard.h" @@ -137,8 +137,8 @@ bool Qt4ProjectManagerPlugin::initialize(const QStringList &arguments, QString * ConsoleAppWizard *consoleWizard = new ConsoleAppWizard; addAutoReleasedObject(consoleWizard); - MobileGuiAppWizard *mobileGuiWizard = new MobileGuiAppWizard(); - addAutoReleasedObject(mobileGuiWizard); + MobileAppWizard *mobileWizard = new MobileAppWizard; + addAutoReleasedObject(mobileWizard); addAutoReleasedObject(new QmlStandaloneAppWizard(QmlStandaloneAppWizard::NewQmlFile)); addAutoReleasedObject(new QmlStandaloneAppWizard(QmlStandaloneAppWizard::ImportQmlFile)); diff --git a/src/plugins/qt4projectmanager/wizards/mobileapp.cpp b/src/plugins/qt4projectmanager/wizards/mobileapp.cpp new file mode 100644 index 00000000000..1634e1384d0 --- /dev/null +++ b/src/plugins/qt4projectmanager/wizards/mobileapp.cpp @@ -0,0 +1,410 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "mobileapp.h" + +#include <coreplugin/icore.h> + +#include <QtCore/QDir> +#include <QtCore/QFile> +#include <QtCore/QRegExp> +#include <QtCore/QTextStream> + +namespace Qt4ProjectManager { +namespace Internal { + +const QString mainWindowBaseName(QLatin1String("mainwindow")); + +const QString mainWindowCppFileName(mainWindowBaseName + QLatin1String(".cpp")); +const QString mainWindowHFileName(mainWindowBaseName + QLatin1String(".h")); +const QString mainWindowUiFileName(mainWindowBaseName + QLatin1String(".ui")); +const QString fileChecksum(QLatin1String("checksum")); +const QString fileStubVersion(QLatin1String("version")); + + +MobileAppGeneratedFileInfo::MobileAppGeneratedFileInfo() + : file(MainWindowCppFile) + , version(-1) + , dataChecksum(0) + , statedChecksum(0) +{ +} + +bool MobileAppGeneratedFileInfo::isUpToDate() const +{ + return !isOutdated() && !wasModified(); +} + +bool MobileAppGeneratedFileInfo::isOutdated() const +{ + return version < MobileApp::stubVersion(); +} + +bool MobileAppGeneratedFileInfo::wasModified() const +{ + return dataChecksum != statedChecksum; +} + +MobileApp::MobileApp() : m_orientation(Auto), m_networkEnabled(false) +{ +} + +MobileApp::~MobileApp() +{ +} + +QString MobileApp::symbianUidForPath(const QString &path) +{ + quint32 hash = 5381; + for (int i = 0; i < path.size(); ++i) { + const char c = path.at(i).toAscii(); + hash ^= c + ((c - i) << i % 20) + ((c + i) << (i + 5) % 20) + ((c - 2 * i) << (i + 10) % 20) + ((c + 2 * i) << (i + 15) % 20); + } + return QString::fromLatin1("0xE") + + QString::fromLatin1("%1").arg(hash, 7, 16, QLatin1Char('0')).right(7); +} + +void MobileApp::setOrientation(Orientation orientation) +{ + m_orientation = orientation; +} + +MobileApp::Orientation MobileApp::orientation() const +{ + return m_orientation; +} + +void MobileApp::setProjectName(const QString &name) +{ + m_projectName = name; +} + +QString MobileApp::projectName() const +{ + return m_projectName; +} + +void MobileApp::setProjectPath(const QString &path) +{ + m_projectPath.setFile(path); +} + +void MobileApp::setSymbianSvgIcon(const QString &icon) +{ + m_symbianSvgIcon = icon; +} + +QString MobileApp::symbianSvgIcon() const +{ + return path(SymbianSvgIconOrigin); +} + +void MobileApp::setMaemoPngIcon(const QString &icon) +{ + m_maemoPngIcon = icon; +} + +QString MobileApp::maemoPngIcon() const +{ + return path(MaemoPngIconOrigin); +} + +void MobileApp::setSymbianTargetUid(const QString &uid) +{ + m_symbianTargetUid = uid; +} + +QString MobileApp::symbianTargetUid() const +{ + return !m_symbianTargetUid.isEmpty() ? m_symbianTargetUid + : symbianUidForPath(path(AppPro)); +} + +void MobileApp::setNetworkEnabled(bool enabled) +{ + m_networkEnabled = enabled; +} + +bool MobileApp::networkEnabled() const +{ + return m_networkEnabled; +} + + +QString MobileApp::path(Path path) const +{ + const QString originsRoot = templatesRoot(); + const QString mainCppFileName = QLatin1String("main.cpp"); + const QString symbianIconFileName = QLatin1String("symbianicon.svg"); + const QString pathBase = m_projectPath.absoluteFilePath() + QLatin1Char('/') + + m_projectName + QLatin1Char('/'); + + switch (path) { + case MainCpp: return pathBase + mainCppFileName; + case MainCppOrigin: return originsRoot + mainCppFileName; + case AppPro: return pathBase + m_projectName + QLatin1String(".pro"); + case AppProOrigin: return originsRoot + QLatin1String("app.pro"); + case AppProPath: return pathBase; + case AppPri: return pathBase + m_projectName + QLatin1String(".pri"); + case AppPriOrigin: return originsRoot + QLatin1String("app.pri"); + case Desktop: return pathBase + m_projectName + QLatin1String(".desktop"); + case DesktopOrigin: return originsRoot + QLatin1String("app.desktop"); + case MainWindowCpp: return pathBase + mainWindowCppFileName; + case MainWindowCppOrigin: return originsRoot + mainWindowCppFileName; + case MainWindowH: return pathBase + mainWindowHFileName; + case MainWindowHOrigin: return originsRoot + mainWindowHFileName; + case MainWindowUi: return pathBase + mainWindowUiFileName; + case MainWindowUiOrigin: return originsRoot + mainWindowUiFileName; + case SymbianSvgIcon: return pathBase + symbianIconFileName; + case SymbianSvgIconOrigin: return !m_symbianSvgIcon.isEmpty() ? m_symbianSvgIcon + : originsRoot + symbianIconFileName; + case MaemoPngIcon: return pathBase + projectName() + QLatin1String(".png"); + case MaemoPngIconOrigin: return !m_maemoPngIcon.isEmpty() ? m_maemoPngIcon + : originsRoot + QLatin1String("maemoicon.png"); + default: qFatal("MobileApp::path() needs more work"); + } + return QString(); +} + +static QString insertParameter(const QString &line, const QString ¶meter) +{ + return QString(line).replace(QRegExp(QLatin1String("\\([^()]+\\)")), + QLatin1Char('(') + parameter + QLatin1Char(')')); +} + +QByteArray MobileApp::generateMainCpp(const QString *errorMessage) const +{ + Q_UNUSED(errorMessage) + + QFile sourceFile(path(MainCppOrigin)); + sourceFile.open(QIODevice::ReadOnly); + Q_ASSERT(sourceFile.isOpen()); + QTextStream in(&sourceFile); + + QByteArray mainCppContent; + QTextStream out(&mainCppContent, QIODevice::WriteOnly); + + QString line; + while (!(line = in.readLine()).isNull()) { + if (line.contains(QLatin1String("// ORIENTATION"))) { + const char *orientationString; + switch (m_orientation) { + case LockLandscape: + orientationString = "LockLandscape"; + break; + case LockPortrait: + orientationString = "LockPortrait"; + break; + case Auto: + orientationString = "Auto"; + break; + } + line = insertParameter(line, QLatin1String("MainWindow::") + + QLatin1String(orientationString)); + } + const int commentIndex = line.indexOf(QLatin1String(" //")); + if (commentIndex != -1) + line.truncate(commentIndex); + out << line << endl; + }; + + return mainCppContent; +} + +QByteArray MobileApp::generateProFile(const QString *errorMessage) const +{ + Q_UNUSED(errorMessage) + + const QChar comment = QLatin1Char('#'); + QFile proFile(path(AppProOrigin)); + proFile.open(QIODevice::ReadOnly); + Q_ASSERT(proFile.isOpen()); + QTextStream in(&proFile); + + QByteArray proFileContent; + QTextStream out(&proFileContent, QIODevice::WriteOnly); + + QString valueOnNextLine; + bool uncommentNextLine = false; + QString line; + while (!(line = in.readLine()).isNull()) { + if (line.contains(QLatin1String("# TARGETUID3"))) { + valueOnNextLine = symbianTargetUid(); + } else if (line.contains(QLatin1String("# ORIENTATIONLOCK")) && m_orientation == MobileApp::Auto) { + uncommentNextLine = true; + } else if (line.contains(QLatin1String("# NETWORKACCESS")) && !m_networkEnabled) { + uncommentNextLine = true; + } + + // Remove all marker comments + if (line.trimmed().startsWith(comment) + && line.trimmed().endsWith(comment)) + continue; + + if (!valueOnNextLine.isEmpty()) { + out << line.left(line.indexOf(QLatin1Char('=')) + 2) + << QDir::fromNativeSeparators(valueOnNextLine) << endl; + valueOnNextLine.clear(); + continue; + } + + if (uncommentNextLine) { + out << comment << line << endl; + uncommentNextLine = false; + continue; + } + out << line << endl; + }; + + return proFileContent.replace("include(app.pri)", "include(" + + m_projectName.toLocal8Bit() + ".pri)"); +} + +QByteArray MobileApp::generateDesktopFile(const QString *errorMessage) const +{ + Q_UNUSED(errorMessage); + + QFile desktopTemplate(path(DesktopOrigin)); + desktopTemplate.open(QIODevice::ReadOnly); + Q_ASSERT(desktopTemplate.isOpen()); + QByteArray desktopFileContent = desktopTemplate.readAll(); + return desktopFileContent.replace("thisApp", projectName().toUtf8()); +} + +QString MobileApp::templatesRoot() +{ + return Core::ICore::instance()->resourcePath() + QLatin1String("/templates/mobileapp/"); +} + +static Core::GeneratedFile file(const QByteArray &data, const QString &targetFile) +{ + Core::GeneratedFile generatedFile(targetFile); + generatedFile.setBinary(true); + generatedFile.setBinaryContents(data); + return generatedFile; +} + +Core::GeneratedFiles MobileApp::generateFiles(QString *errorMessage) const +{ + Core::GeneratedFiles files; + + files.append(file(generateFile(MobileAppGeneratedFileInfo::AppProFile, errorMessage), path(AppPro))); + files.last().setAttributes(Core::GeneratedFile::OpenProjectAttribute); + files.append(file(generateFile(MobileAppGeneratedFileInfo::MainCppFile, errorMessage), path(MainCpp))); + files.append(file(generateFile(MobileAppGeneratedFileInfo::SymbianSvgIconFile, errorMessage), path(SymbianSvgIcon))); + files.append(file(generateFile(MobileAppGeneratedFileInfo::MaemoPngIconFile, errorMessage), path(MaemoPngIcon))); + files.append(file(generateFile(MobileAppGeneratedFileInfo::DesktopFile, errorMessage), path(Desktop))); + files.append(file(generateFile(MobileAppGeneratedFileInfo::AppPriFile, errorMessage), path(AppPri))); + files.append(file(generateFile(MobileAppGeneratedFileInfo::MainWindowCppFile, errorMessage), path(MainWindowCpp))); + files.append(file(generateFile(MobileAppGeneratedFileInfo::MainWindowHFile, errorMessage), path(MainWindowH))); + files.append(file(generateFile(MobileAppGeneratedFileInfo::MainWindowUiFile, errorMessage), path(MainWindowUi))); + files.last().setAttributes(Core::GeneratedFile::OpenEditorAttribute); + + return files; +} + +QString MobileApp::error() const +{ + return m_error; +} + +static QByteArray readBlob(const QString &source) +{ + QFile sourceFile(source); + sourceFile.open(QIODevice::ReadOnly); + Q_ASSERT(sourceFile.isOpen()); + return sourceFile.readAll(); +} + +QByteArray MobileApp::generateFile(MobileAppGeneratedFileInfo::File file, + const QString *errorMessage) const +{ + QByteArray data; + const QString cFileComment = QLatin1String("//"); + const QString proFileComment = QLatin1String("#"); + QString comment = cFileComment; + bool versionAndChecksum = false; + switch (file) { + case MobileAppGeneratedFileInfo::MainCppFile: + data = generateMainCpp(errorMessage); + break; + case MobileAppGeneratedFileInfo::SymbianSvgIconFile: + data = readBlob(path(SymbianSvgIconOrigin)); + break; + case MobileAppGeneratedFileInfo::MaemoPngIconFile: + data = readBlob(path(MaemoPngIconOrigin)); + break; + case MobileAppGeneratedFileInfo::DesktopFile: + data = generateDesktopFile(errorMessage); + break; + case MobileAppGeneratedFileInfo::AppProFile: + data = generateProFile(errorMessage); + comment = proFileComment; + break; + case MobileAppGeneratedFileInfo::AppPriFile: + data = readBlob(path(AppPriOrigin)); + comment = proFileComment; + versionAndChecksum = true; + break; + case MobileAppGeneratedFileInfo::MainWindowCppFile: + data = readBlob(path(MainWindowCppOrigin)); + versionAndChecksum = true; + break; + case MobileAppGeneratedFileInfo::MainWindowHFile: + data = readBlob(path(MainWindowHOrigin)); + versionAndChecksum = true; + break; + case MobileAppGeneratedFileInfo::MainWindowUiFile: + data = readBlob(path(MainWindowUiOrigin)); + break; + default: + Q_ASSERT_X(false, Q_FUNC_INFO, "Whoops, case missing!"); + } + if (!versionAndChecksum) + return data; + QByteArray versioned = data; + versioned.replace('\x0D', ""); + versioned.replace('\x0A', ""); + const quint16 checkSum = qChecksum(versioned.constData(), versioned.length()); + const QString checkSumString = QString::number(checkSum, 16); + const QString versionString = QString::number(stubVersion()); + const QChar sep = QLatin1Char(' '); + const QString versionLine = + comment + sep + fileChecksum + sep + QLatin1String("0x") + checkSumString + + sep + fileStubVersion + sep + versionString + QLatin1Char('\x0A'); + return versionLine.toAscii() + data; +} + +int MobileApp::stubVersion() +{ + return 1; +} + +} // namespace Internal +} // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/wizards/mobileapp.h b/src/plugins/qt4projectmanager/wizards/mobileapp.h new file mode 100644 index 00000000000..9452bc361f7 --- /dev/null +++ b/src/plugins/qt4projectmanager/wizards/mobileapp.h @@ -0,0 +1,143 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef MOBILEAPP_H +#define MOBILEAPP_H + +#include <coreplugin/basefilewizard.h> + +#include <QtCore/QStringList> +#include <QtCore/QFileInfo> +#include <QtCore/QHash> + +namespace Qt4ProjectManager { +namespace Internal { + +struct MobileAppGeneratedFileInfo +{ + enum File { + MainCppFile, + AppProFile, + AppPriFile, + MainWindowCppFile, + MainWindowHFile, + MainWindowUiFile, + SymbianSvgIconFile, + MaemoPngIconFile, + DesktopFile + }; + + MobileAppGeneratedFileInfo(); + + bool isUpToDate() const; + bool isOutdated() const; + bool wasModified() const; + + File file; + QFileInfo fileInfo; + int version; + quint16 dataChecksum; + quint16 statedChecksum; +}; + +class MobileApp: public QObject +{ +public: + enum Orientation { + LockLandscape, + LockPortrait, + Auto + }; + + enum Path { + MainCpp, + MainCppOrigin, + AppPro, + AppProOrigin, + AppProPath, + Desktop, + DesktopOrigin, + AppPri, + AppPriOrigin, + MainWindowCpp, + MainWindowCppOrigin, + MainWindowH, + MainWindowHOrigin, + MainWindowUi, + MainWindowUiOrigin, + SymbianSvgIcon, + SymbianSvgIconOrigin, + MaemoPngIcon, + MaemoPngIconOrigin, + }; + + MobileApp(); + ~MobileApp(); + + void setOrientation(Orientation orientation); + Orientation orientation() const; + void setProjectName(const QString &name); + QString projectName() const; + void setProjectPath(const QString &path); + void setSymbianSvgIcon(const QString &icon); + QString symbianSvgIcon() const; + void setMaemoPngIcon(const QString &icon); + QString maemoPngIcon() const; + void setSymbianTargetUid(const QString &uid); + QString symbianTargetUid() const; + void setNetworkEnabled(bool enabled); + bool networkEnabled() const; + + static QString symbianUidForPath(const QString &path); + Core::GeneratedFiles generateFiles(QString *errorMessage) const; + QString path(Path path) const; + QString error() const; + QByteArray generateFile(MobileAppGeneratedFileInfo::File file, + const QString *errorMessage) const; + static int stubVersion(); +private: + QByteArray generateMainCpp(const QString *errorMessage) const; + QByteArray generateProFile(const QString *errorMessage) const; + QByteArray generateDesktopFile(const QString *errorMessage) const; + static QString templatesRoot(); + + QString m_projectName; + QFileInfo m_projectPath; + QString m_symbianSvgIcon; + QString m_maemoPngIcon; + QString m_symbianTargetUid; + Orientation m_orientation; + bool m_networkEnabled; + QString m_error; +}; + +} // end of namespace Internal +} // end of namespace Qt4ProjectManager + +#endif // MOBILEAPP_H diff --git a/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp b/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp new file mode 100644 index 00000000000..5e06c1e451d --- /dev/null +++ b/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp @@ -0,0 +1,164 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "mobileappwizard.h" +#include "mobileappwizardpages.h" +#include "mobileapp.h" + +#include "qt4projectmanagerconstants.h" + +#include <projectexplorer/baseprojectwizarddialog.h> +#include <projectexplorer/customwizard/customwizard.h> +#include <projectexplorer/projectexplorer.h> +#include <coreplugin/editormanager/editormanager.h> + +#include <QtGui/QIcon> + +#include <QtCore/QTextStream> +#include <QtCore/QCoreApplication> +#include <QtCore/QDir> +#include <QtCore/QFile> + +namespace Qt4ProjectManager { +namespace Internal { +namespace { +const QString DisplayName + = QCoreApplication::translate("MobileAppWizard", "Mobile Qt Application"); +const QString Description + = QCoreApplication::translate("MobileAppWizard", + "Creates a Qt application optimized for mobile devices " + "with a Qt Designer-based main window.\n\n" + "Preselects Qt for Simulator and mobile targets if available."); +} + +class MobileAppWizardDialog : public ProjectExplorer::BaseProjectWizardDialog +{ + Q_OBJECT + +public: + explicit MobileAppWizardDialog(QWidget *parent = 0); + +private: + class MobileAppWizardOptionsPage *m_optionsPage; + friend class MobileAppWizard; +}; + +MobileAppWizardDialog::MobileAppWizardDialog(QWidget *parent) + : ProjectExplorer::BaseProjectWizardDialog(parent) +{ + setWindowTitle(DisplayName); + setIntroDescription(Description); + m_optionsPage = new MobileAppWizardOptionsPage; + const int optionsPagePageId = addPage(m_optionsPage); + wizardProgress()->item(optionsPagePageId)->setTitle(tr("App options")); +} + +class MobileAppWizardPrivate +{ + class MobileApp *mobileApp; + class MobileAppWizardDialog *wizardDialog; + friend class MobileAppWizard; +}; + +MobileAppWizard::MobileAppWizard() + : Core::BaseFileWizard(parameters()) + , m_d(new MobileAppWizardPrivate) +{ + m_d->mobileApp = new MobileApp; + m_d->wizardDialog = 0; +} + +MobileAppWizard::~MobileAppWizard() +{ + delete m_d->mobileApp; +} + +Core::BaseFileWizardParameters MobileAppWizard::parameters() +{ + Core::BaseFileWizardParameters parameters(ProjectWizard); + parameters.setIcon(QIcon(QLatin1String(Constants::ICON_QT_PROJECT))); + parameters.setDisplayName(DisplayName); + parameters.setId(QLatin1String("C.Qt4GuiMobile")); + parameters.setDescription(Description); + parameters.setCategory(QLatin1String(Constants::QT_APP_WIZARD_CATEGORY)); + parameters.setDisplayCategory(QCoreApplication::translate(Constants::QT_APP_WIZARD_TR_SCOPE, + Constants::QT_APP_WIZARD_TR_CATEGORY)); + return parameters; +} + +QWizard *MobileAppWizard::createWizardDialog(QWidget *parent, + const QString &defaultPath, const WizardPageList &extensionPages) const +{ + m_d->wizardDialog = new MobileAppWizardDialog(parent); + + m_d->wizardDialog->setPath(defaultPath); + m_d->wizardDialog->setProjectName(MobileAppWizardDialog::uniqueProjectName(defaultPath)); + m_d->wizardDialog->m_optionsPage->setSymbianSvgIcon(m_d->mobileApp->symbianSvgIcon()); + m_d->wizardDialog->m_optionsPage->setMaemoPngIcon(m_d->mobileApp->maemoPngIcon()); + m_d->wizardDialog->m_optionsPage->setOrientation(m_d->mobileApp->orientation()); + m_d->wizardDialog->m_optionsPage->setNetworkEnabled(m_d->mobileApp->networkEnabled()); + connect(m_d->wizardDialog, SIGNAL(introPageLeft(QString, QString)), SLOT(useProjectPath(QString, QString))); + foreach (QWizardPage *p, extensionPages) + BaseFileWizard::applyExtensionPageShortTitle(m_d->wizardDialog, m_d->wizardDialog->addPage(p)); + + return m_d->wizardDialog; +} + +Core::GeneratedFiles MobileAppWizard::generateFiles(const QWizard *w, + QString *errorMessage) const +{ + Q_UNUSED(errorMessage) + + const MobileAppWizardDialog *wizard = qobject_cast<const MobileAppWizardDialog*>(w); + + m_d->mobileApp->setProjectName(wizard->projectName()); + m_d->mobileApp->setProjectPath(wizard->path()); + m_d->mobileApp->setSymbianTargetUid(wizard->m_optionsPage->symbianUid()); + m_d->mobileApp->setSymbianSvgIcon(wizard->m_optionsPage->symbianSvgIcon()); + m_d->mobileApp->setOrientation(wizard->m_optionsPage->orientation()); + m_d->mobileApp->setNetworkEnabled(wizard->m_optionsPage->networkEnabled()); + + return m_d->mobileApp->generateFiles(errorMessage); +} + +bool MobileAppWizard::postGenerateFiles(const QWizard *wizard, const Core::GeneratedFiles &l, QString *errorMessage) +{ + Q_UNUSED(wizard) + return ProjectExplorer::CustomProjectWizard::postGenerateOpen(l, errorMessage); +} + +void MobileAppWizard::useProjectPath(const QString &projectName, const QString &projectPath) +{ + m_d->wizardDialog->m_optionsPage->setSymbianUid(MobileApp::symbianUidForPath(projectPath + projectName)); +} + +} // namespace Internal +} // namespace Qt4ProjectManager + +#include "mobileappwizard.moc" diff --git a/src/plugins/qt4projectmanager/wizards/mobileappwizard.h b/src/plugins/qt4projectmanager/wizards/mobileappwizard.h new file mode 100644 index 00000000000..cfb2b4afd6e --- /dev/null +++ b/src/plugins/qt4projectmanager/wizards/mobileappwizard.h @@ -0,0 +1,65 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef MOBILEAPPWIZARD_H +#define MOBILEAPPWIZARD_H + +#include <coreplugin/basefilewizard.h> + +namespace Qt4ProjectManager { +namespace Internal { + +class MobileAppWizard : public Core::BaseFileWizard +{ + Q_OBJECT + +public: + MobileAppWizard(); + virtual ~MobileAppWizard(); + static Core::BaseFileWizardParameters parameters(); + +protected: + QWizard *createWizardDialog(QWidget *parent, const QString &defaultPath, + const WizardPageList &extensionPages) const; + Core::GeneratedFiles generateFiles(const QWizard *wizard, + QString *errorMessage) const; + bool postGenerateFiles(const QWizard *w, const Core::GeneratedFiles &l, + QString *errorMessage); + +private slots: + void useProjectPath(const QString &projectName, const QString &projectPath); + +private: + class MobileAppWizardPrivate *m_d; +}; + +} // end of namespace Internal +} // end of namespace Qt4ProjectManager + +#endif // MOBILEAPPWIZARD_H diff --git a/src/plugins/qt4projectmanager/wizards/mobileappwizardoptionspage.ui b/src/plugins/qt4projectmanager/wizards/mobileappwizardoptionspage.ui new file mode 100644 index 00000000000..78878deca39 --- /dev/null +++ b/src/plugins/qt4projectmanager/wizards/mobileappwizardoptionspage.ui @@ -0,0 +1,233 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>MobileAppWizardOptionPage</class> + <widget class="QWizardPage" name="MobileAppWizardOptionPage"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>404</width> + <height>548</height> + </rect> + </property> + <property name="windowTitle"> + <string>WizardPage</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>General</string> + </property> + <layout class="QGridLayout" name="gridLayout_2"> + <property name="verticalSpacing"> + <number>12</number> + </property> + <item row="0" column="0"> + <widget class="QLabel" name="orientationBehaviorLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Orientation Behavior:</string> + </property> + <property name="buddy"> + <cstring>orientationBehaviorComboBox</cstring> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QComboBox" name="orientationBehaviorComboBox"/> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QTabWidget" name="platformsTabWidget"> + <property name="currentIndex"> + <number>0</number> + </property> + <widget class="QWidget" name="tab"> + <attribute name="title"> + <string>Symbian specific</string> + </attribute> + <layout class="QFormLayout" name="formLayout"> + <item row="0" column="0"> + <widget class="QLabel" name="symbianAppIconLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Application Icon (.svg):</string> + </property> + <property name="buddy"> + <cstring>symbianAppIconLoadToolButton</cstring> + </property> + </widget> + </item> + <item row="0" column="1"> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="symbianAppIconPreview"> + <property name="minimumSize"> + <size> + <width>45</width> + <height>45</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>45</width> + <height>45</height> + </size> + </property> + <property name="frameShape"> + <enum>QFrame::Panel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Sunken</enum> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="symbianAppIconLoadToolButton"> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="symbianTargetUid3Label"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Target UID3:</string> + </property> + <property name="buddy"> + <cstring>symbianTargetUid3LineEdit</cstring> + </property> + </widget> + </item> + <item row="1" column="1"> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QLineEdit" name="symbianTargetUid3LineEdit"/> + </item> + <item> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item row="2" column="0" colspan="2"> + <widget class="QCheckBox" name="symbianEnableNetworkChackBox"> + <property name="text"> + <string>Enable network access</string> + </property> + </widget> + </item> + </layout> + </widget> + <widget class="QWidget" name="tab_2"> + <attribute name="title"> + <string>Maemo specific</string> + </attribute> + <widget class="QLabel" name="maemoAppIconLabel"> + <property name="geometry"> + <rect> + <x>9</x> + <y>9</y> + <width>155</width> + <height>16</height> + </rect> + </property> + <property name="text"> + <string>Application Icon (64x64):</string> + </property> + </widget> + <widget class="QToolButton" name="maemoPngIconButton"> + <property name="geometry"> + <rect> + <x>171</x> + <y>10</y> + <width>71</width> + <height>70</height> + </rect> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>16777215</width> + <height>16777215</height> + </size> + </property> + <property name="text"> + <string/> + </property> + <property name="iconSize"> + <size> + <width>64</width> + <height>64</height> + </size> + </property> + </widget> + </widget> + </widget> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/plugins/qt4projectmanager/wizards/mobileappwizardpages.cpp b/src/plugins/qt4projectmanager/wizards/mobileappwizardpages.cpp new file mode 100644 index 00000000000..a9684d94d6b --- /dev/null +++ b/src/plugins/qt4projectmanager/wizards/mobileappwizardpages.cpp @@ -0,0 +1,170 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "mobileappwizardpages.h" +#include "ui_mobileappwizardoptionspage.h" +#include <coreplugin/coreconstants.h> + +#include <QtGui/QDesktopServices> +#include <QtGui/QFileDialog> +#include <QtGui/QFileDialog> +#include <QtGui/QMessageBox> + +namespace Qt4ProjectManager { +namespace Internal { + +class MobileAppWizardOptionsPagePrivate +{ + Ui::MobileAppWizardOptionPage ui; + QString symbianSvgIcon; + QString maemoPngIcon; + friend class MobileAppWizardOptionsPage; +}; + +MobileAppWizardOptionsPage::MobileAppWizardOptionsPage(QWidget *parent) + : QWizardPage(parent) + , m_d(new MobileAppWizardOptionsPagePrivate) +{ + m_d->ui.setupUi(this); + + const QIcon open = QApplication::style()->standardIcon(QStyle::SP_DirOpenIcon); + m_d->ui.symbianAppIconLoadToolButton->setIcon(open); + connect(m_d->ui.symbianAppIconLoadToolButton, SIGNAL(clicked()), SLOT(openSymbianSvgIcon())); + connect(m_d->ui.maemoPngIconButton, SIGNAL(clicked()), this, + SLOT(openMaemoPngIcon())); + + m_d->ui.orientationBehaviorComboBox->addItem(tr("Auto rotate orientation"), + MobileApp::Auto); + m_d->ui.orientationBehaviorComboBox->addItem(tr("Lock to landscape orientation"), + MobileApp::LockLandscape); + m_d->ui.orientationBehaviorComboBox->addItem(tr("Lock to portrait orientation"), + MobileApp::LockPortrait); +} + +MobileAppWizardOptionsPage::~MobileAppWizardOptionsPage() +{ + delete m_d; +} + +void MobileAppWizardOptionsPage::setOrientation(MobileApp::Orientation orientation) +{ + QComboBox *const comboBox = m_d->ui.orientationBehaviorComboBox; + for (int i = 0; i < comboBox->count(); ++i) + if (comboBox->itemData(i).toInt() == static_cast<int>(orientation)) { + comboBox->setCurrentIndex(i); + break; + } +} + +MobileApp::Orientation MobileAppWizardOptionsPage::orientation() const +{ + const int index = m_d->ui.orientationBehaviorComboBox->currentIndex(); + return static_cast<MobileApp::Orientation>(m_d->ui.orientationBehaviorComboBox->itemData(index).toInt()); +} + +QString MobileAppWizardOptionsPage::symbianSvgIcon() const +{ + return m_d->symbianSvgIcon; +} + +void MobileAppWizardOptionsPage::setSymbianSvgIcon(const QString &icon) +{ + QPixmap iconPixmap(icon); + if (!iconPixmap.isNull()) { + const int symbianIconSize = 44; + if (iconPixmap.height() > symbianIconSize || iconPixmap.width() > symbianIconSize) + iconPixmap = iconPixmap.scaledToHeight(symbianIconSize, Qt::SmoothTransformation); + m_d->ui.symbianAppIconPreview->setPixmap(iconPixmap); + m_d->symbianSvgIcon = icon; + } +} + +QString MobileAppWizardOptionsPage::maemoPngIcon() const +{ + return m_d->maemoPngIcon; +} + +void MobileAppWizardOptionsPage::setMaemoPngIcon(const QString &icon) +{ + QString error; + QPixmap iconPixmap(icon); + if (iconPixmap.isNull()) + error = tr("The file is not a valid image."); + else if (iconPixmap.size() != QSize(64, 64)) + error = tr("The icon has an invalid size."); + if (!error.isEmpty()) { + QMessageBox::warning(this, tr("Icon unusable"), error); + } else { + m_d->ui.maemoPngIconButton->setIcon(iconPixmap); + m_d->maemoPngIcon = icon; + } +} + +QString MobileAppWizardOptionsPage::symbianUid() const +{ + return m_d->ui.symbianTargetUid3LineEdit->text(); +} + +void MobileAppWizardOptionsPage::setSymbianUid(const QString &uid) +{ + m_d->ui.symbianTargetUid3LineEdit->setText(uid); +} + +void MobileAppWizardOptionsPage::setNetworkEnabled(bool enableIt) +{ + m_d->ui.symbianEnableNetworkChackBox->setChecked(enableIt); +} + +bool MobileAppWizardOptionsPage::networkEnabled() const +{ + return m_d->ui.symbianEnableNetworkChackBox->isChecked(); +} + +void MobileAppWizardOptionsPage::openSymbianSvgIcon() +{ + const QString svgIcon = QFileDialog::getOpenFileName( + this, + m_d->ui.symbianAppIconLabel->text(), + QDesktopServices::storageLocation(QDesktopServices::PicturesLocation), + QLatin1String("*.svg")); + if (!svgIcon.isEmpty()) + setSymbianSvgIcon(svgIcon); +} + +void MobileAppWizardOptionsPage::openMaemoPngIcon() +{ + const QString iconPath = QFileDialog::getOpenFileName(this, + m_d->ui.maemoAppIconLabel->text(), m_d->maemoPngIcon, + QLatin1String("*.png")); + if (!iconPath.isEmpty()) + setMaemoPngIcon(iconPath); +} + +} // namespace Internal +} // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/wizards/mobileappwizardpages.h b/src/plugins/qt4projectmanager/wizards/mobileappwizardpages.h new file mode 100644 index 00000000000..cbea2f7b359 --- /dev/null +++ b/src/plugins/qt4projectmanager/wizards/mobileappwizardpages.h @@ -0,0 +1,71 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef QMLSTANDALONEAPPWIZARDPAGES_H +#define QMLSTANDALONEAPPWIZARDPAGES_H + +#include "mobileapp.h" + +#include <QtGui/QWizardPage> + +namespace Qt4ProjectManager { +namespace Internal { + +class MobileAppWizardOptionsPage : public QWizardPage +{ + Q_OBJECT + Q_DISABLE_COPY(MobileAppWizardOptionsPage) + +public: + explicit MobileAppWizardOptionsPage(QWidget *parent = 0); + virtual ~MobileAppWizardOptionsPage(); + + void setOrientation(MobileApp::Orientation orientation); + MobileApp::Orientation orientation() const; + QString symbianSvgIcon() const; + void setSymbianSvgIcon(const QString &icon); + QString maemoPngIcon() const; + void setMaemoPngIcon(const QString &icon); + QString symbianUid() const; + void setNetworkEnabled(bool enableIt); + bool networkEnabled() const; + void setSymbianUid(const QString &uid); + +private slots: + void openSymbianSvgIcon(); // Via file open dialog + void openMaemoPngIcon(); + +private: + class MobileAppWizardOptionsPagePrivate *m_d; +}; + +} // end of namespace Internal +} // end of namespace Qt4ProjectManager + +#endif // QMLSTANDALONEAPPWIZARDPAGES_H diff --git a/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.cpp b/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.cpp index 6a63538199a..12cfa12b1a2 100644 --- a/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.cpp +++ b/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.cpp @@ -95,7 +95,7 @@ QmlCppPlugin::QmlCppPlugin(const QString &name, const QFileInfo &path, , proFile(proFile) {} -GeneratedFileInfo::GeneratedFileInfo() +QmlAppGeneratedFileInfo::QmlAppGeneratedFileInfo() : file(MainQmlFile) , version(-1) , dataChecksum(0) @@ -103,17 +103,17 @@ GeneratedFileInfo::GeneratedFileInfo() { } -bool GeneratedFileInfo::isUpToDate() const +bool QmlAppGeneratedFileInfo::isUpToDate() const { return !isOutdated() && !wasModified(); } -bool GeneratedFileInfo::isOutdated() const +bool QmlAppGeneratedFileInfo::isOutdated() const { return version < QmlStandaloneApp::stubVersion(); } -bool GeneratedFileInfo::wasModified() const +bool QmlAppGeneratedFileInfo::wasModified() const { return dataChecksum != statedChecksum; } @@ -551,20 +551,20 @@ Core::GeneratedFiles QmlStandaloneApp::generateFiles(QString *errorMessage) cons Core::GeneratedFiles files; if (!useExistingMainQml()) { - files.append(file(generateFile(GeneratedFileInfo::MainQmlFile, errorMessage), path(MainQml))); + files.append(file(generateFile(QmlAppGeneratedFileInfo::MainQmlFile, errorMessage), path(MainQml))); files.last().setAttributes(Core::GeneratedFile::OpenEditorAttribute); } - files.append(file(generateFile(GeneratedFileInfo::AppProFile, errorMessage), path(AppPro))); + files.append(file(generateFile(QmlAppGeneratedFileInfo::AppProFile, errorMessage), path(AppPro))); files.last().setAttributes(Core::GeneratedFile::OpenProjectAttribute); - files.append(file(generateFile(GeneratedFileInfo::MainCppFile, errorMessage), path(MainCpp))); - files.append(file(generateFile(GeneratedFileInfo::SymbianSvgIconFile, errorMessage), path(SymbianSvgIcon))); - files.append(file(generateFile(GeneratedFileInfo::MaemoPngIconFile, errorMessage), path(MaemoPngIcon))); - files.append(file(generateFile(GeneratedFileInfo::DesktopFile, errorMessage), path(Desktop))); + files.append(file(generateFile(QmlAppGeneratedFileInfo::MainCppFile, errorMessage), path(MainCpp))); + files.append(file(generateFile(QmlAppGeneratedFileInfo::SymbianSvgIconFile, errorMessage), path(SymbianSvgIcon))); + files.append(file(generateFile(QmlAppGeneratedFileInfo::MaemoPngIconFile, errorMessage), path(MaemoPngIcon))); + files.append(file(generateFile(QmlAppGeneratedFileInfo::DesktopFile, errorMessage), path(Desktop))); - files.append(file(generateFile(GeneratedFileInfo::AppViewerPriFile, errorMessage), path(AppViewerPri))); - files.append(file(generateFile(GeneratedFileInfo::AppViewerCppFile, errorMessage), path(AppViewerCpp))); - files.append(file(generateFile(GeneratedFileInfo::AppViewerHFile, errorMessage), path(AppViewerH))); + files.append(file(generateFile(QmlAppGeneratedFileInfo::AppViewerPriFile, errorMessage), path(AppViewerPri))); + files.append(file(generateFile(QmlAppGeneratedFileInfo::AppViewerCppFile, errorMessage), path(AppViewerCpp))); + files.append(file(generateFile(QmlAppGeneratedFileInfo::AppViewerHFile, errorMessage), path(AppViewerH))); return files; } @@ -593,7 +593,7 @@ static QByteArray readBlob(const QString &source) return sourceFile.readAll(); } -QByteArray QmlStandaloneApp::generateFile(GeneratedFileInfo::File file, +QByteArray QmlStandaloneApp::generateFile(QmlAppGeneratedFileInfo::File file, const QString *errorMessage) const { QByteArray data; @@ -602,35 +602,35 @@ QByteArray QmlStandaloneApp::generateFile(GeneratedFileInfo::File file, QString comment = cFileComment; bool versionAndChecksum = false; switch (file) { - case GeneratedFileInfo::MainQmlFile: + case QmlAppGeneratedFileInfo::MainQmlFile: data = readBlob(path(MainQmlOrigin)); break; - case GeneratedFileInfo::MainCppFile: + case QmlAppGeneratedFileInfo::MainCppFile: data = generateMainCpp(errorMessage); break; - case GeneratedFileInfo::SymbianSvgIconFile: + case QmlAppGeneratedFileInfo::SymbianSvgIconFile: data = readBlob(path(SymbianSvgIconOrigin)); break; - case GeneratedFileInfo::MaemoPngIconFile: + case QmlAppGeneratedFileInfo::MaemoPngIconFile: data = readBlob(path(MaemoPngIconOrigin)); break; - case GeneratedFileInfo::DesktopFile: + case QmlAppGeneratedFileInfo::DesktopFile: data = generateDesktopFile(errorMessage); break; - case GeneratedFileInfo::AppProFile: + case QmlAppGeneratedFileInfo::AppProFile: data = generateProFile(errorMessage); comment = proFileComment; break; - case GeneratedFileInfo::AppViewerPriFile: + case QmlAppGeneratedFileInfo::AppViewerPriFile: data = readBlob(path(AppViewerPriOrigin)); comment = proFileComment; versionAndChecksum = true; break; - case GeneratedFileInfo::AppViewerCppFile: + case QmlAppGeneratedFileInfo::AppViewerCppFile: data = readBlob(path(AppViewerCppOrigin)); versionAndChecksum = true; break; - case GeneratedFileInfo::AppViewerHFile: + case QmlAppGeneratedFileInfo::AppViewerHFile: default: data = readBlob(path(AppViewerHOrigin)); versionAndChecksum = true; @@ -656,16 +656,16 @@ int QmlStandaloneApp::stubVersion() return 3; } -static QList<GeneratedFileInfo> updateableFiles(const QString &mainProFile) +static QList<QmlAppGeneratedFileInfo> updateableFiles(const QString &mainProFile) { - QList<GeneratedFileInfo> result; + QList<QmlAppGeneratedFileInfo> result; static const struct { - GeneratedFileInfo::File file; + QmlAppGeneratedFileInfo::File file; QString fileName; } files[] = { - {GeneratedFileInfo::AppViewerPriFile, appViewerPriFileName}, - {GeneratedFileInfo::AppViewerHFile, appViewerHFileName}, - {GeneratedFileInfo::AppViewerCppFile, appViewerCppFileName} + {QmlAppGeneratedFileInfo::AppViewerPriFile, appViewerPriFileName}, + {QmlAppGeneratedFileInfo::AppViewerHFile, appViewerHFileName}, + {QmlAppGeneratedFileInfo::AppViewerCppFile, appViewerCppFileName} }; const QFileInfo mainProFileInfo(mainProFile); const int size = sizeof(files) / sizeof(files[0]); @@ -674,7 +674,7 @@ static QList<GeneratedFileInfo> updateableFiles(const QString &mainProFile) + QLatin1Char('/') + appViewerOriginsSubDir + files[i].fileName; if (!QFile::exists(fileName)) continue; - GeneratedFileInfo file; + QmlAppGeneratedFileInfo file; file.file = files[i].file; file.fileInfo = QFileInfo(fileName); result.append(file); @@ -682,11 +682,11 @@ static QList<GeneratedFileInfo> updateableFiles(const QString &mainProFile) return result; } -QList<GeneratedFileInfo> QmlStandaloneApp::fileUpdates(const QString &mainProFile) +QList<QmlAppGeneratedFileInfo> QmlStandaloneApp::fileUpdates(const QString &mainProFile) { - QList<GeneratedFileInfo> result; - foreach (const GeneratedFileInfo &file, updateableFiles(mainProFile)) { - GeneratedFileInfo newFile = file; + QList<QmlAppGeneratedFileInfo> result; + foreach (const QmlAppGeneratedFileInfo &file, updateableFiles(mainProFile)) { + QmlAppGeneratedFileInfo newFile = file; QFile readFile(newFile.fileInfo.absoluteFilePath()); if (!readFile.open(QIODevice::ReadOnly)) continue; @@ -707,11 +707,11 @@ QList<GeneratedFileInfo> QmlStandaloneApp::fileUpdates(const QString &mainProFil return result; } -bool QmlStandaloneApp::updateFiles(const QList<GeneratedFileInfo> &list, QString &error) +bool QmlStandaloneApp::updateFiles(const QList<QmlAppGeneratedFileInfo> &list, QString &error) { error.clear(); const QmlStandaloneApp app; - foreach (const GeneratedFileInfo &info, list) { + foreach (const QmlAppGeneratedFileInfo &info, list) { const QByteArray data = app.generateFile(info.file, &error); if (!error.isEmpty()) return false; diff --git a/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.h b/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.h index c3501708d9c..03deb386c21 100644 --- a/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.h +++ b/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.h @@ -76,7 +76,7 @@ struct QmlCppPlugin const QFileInfo proFile; // .pro file for the plugin }; -struct GeneratedFileInfo +struct QmlAppGeneratedFileInfo { enum File { MainQmlFile, @@ -90,7 +90,7 @@ struct GeneratedFileInfo DesktopFile }; - GeneratedFileInfo(); + QmlAppGeneratedFileInfo(); bool isUpToDate() const; bool isOutdated() const; @@ -170,10 +170,10 @@ public: bool useExistingMainQml() const; QString error() const; const QList<QmlModule*> modules() const; - QByteArray generateFile(GeneratedFileInfo::File file, const QString *errorMessage) const; + QByteArray generateFile(QmlAppGeneratedFileInfo::File file, const QString *errorMessage) const; static int stubVersion(); - static QList<GeneratedFileInfo> fileUpdates(const QString &mainProFile); - static bool updateFiles(const QList<GeneratedFileInfo> &list, QString &error); + static QList<QmlAppGeneratedFileInfo> fileUpdates(const QString &mainProFile); + static bool updateFiles(const QList<QmlAppGeneratedFileInfo> &list, QString &error); private: QByteArray generateMainCpp(const QString *errorMessage) const; -- GitLab