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 00000000000..707d5c4e85d Binary files /dev/null and b/share/qtcreator/templates/mobileapp/maemoicon.png differ 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 + +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 + +#if defined(Q_OS_SYMBIAN) && defined(ORIENTATIONLOCK) +#include +#include +#include +#include +#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 (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 + +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 @@ + + MainWindow + + + + 0 + 0 + 200 + 320 + + + + MainWindow + + + + + + + + + + + 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 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + 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 updates = + const QList 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("
    ")); - 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 + +#include +#include +#include +#include + +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 + +#include +#include +#include + +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 +#include +#include +#include + +#include + +#include +#include +#include +#include + +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(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 + +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 @@ + + + MobileAppWizardOptionPage + + + + 0 + 0 + 404 + 548 + + + + WizardPage + + + + + + General + + + + 12 + + + + + + 0 + 0 + + + + Orientation Behavior: + + + orientationBehaviorComboBox + + + + + + + + + + + + + 0 + + + + Symbian specific + + + + + + + 0 + 0 + + + + Application Icon (.svg): + + + symbianAppIconLoadToolButton + + + + + + + + + + 45 + 45 + + + + + 45 + 45 + + + + QFrame::Panel + + + QFrame::Sunken + + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + 0 + 0 + + + + Target UID3: + + + symbianTargetUid3LineEdit + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Enable network access + + + + + + + + Maemo specific + + + + + 9 + 9 + 155 + 16 + + + + Application Icon (64x64): + + + + + + 171 + 10 + 71 + 70 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + + + + + 64 + 64 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 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 + +#include +#include +#include +#include + +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(orientation)) { + comboBox->setCurrentIndex(i); + break; + } +} + +MobileApp::Orientation MobileAppWizardOptionsPage::orientation() const +{ + const int index = m_d->ui.orientationBehaviorComboBox->currentIndex(); + return static_cast(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 + +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 updateableFiles(const QString &mainProFile) +static QList updateableFiles(const QString &mainProFile) { - QList result; + QList 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 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 updateableFiles(const QString &mainProFile) return result; } -QList QmlStandaloneApp::fileUpdates(const QString &mainProFile) +QList QmlStandaloneApp::fileUpdates(const QString &mainProFile) { - QList result; - foreach (const GeneratedFileInfo &file, updateableFiles(mainProFile)) { - GeneratedFileInfo newFile = file; + QList 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 QmlStandaloneApp::fileUpdates(const QString &mainProFil return result; } -bool QmlStandaloneApp::updateFiles(const QList &list, QString &error) +bool QmlStandaloneApp::updateFiles(const QList &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 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 fileUpdates(const QString &mainProFile); - static bool updateFiles(const QList &list, QString &error); + static QList fileUpdates(const QString &mainProFile); + static bool updateFiles(const QList &list, QString &error); private: QByteArray generateMainCpp(const QString *errorMessage) const;