diff options
Diffstat (limited to 'src/plugins')
24 files changed, 398 insertions, 116 deletions
diff --git a/src/plugins/bineditor/bineditor.cpp b/src/plugins/bineditor/bineditor.cpp index a8a04e24a6..e2dd621fc9 100644 --- a/src/plugins/bineditor/bineditor.cpp +++ b/src/plugins/bineditor/bineditor.cpp @@ -945,8 +945,8 @@ void BinEditor::setCursorPosition(int pos, MoveMode moveMode) hasSelection = m_anchorPosition != m_cursorPosition; updateLines(hasSelection ? oldCursorPosition : m_cursorPosition, m_cursorPosition); ensureCursorVisible(); - if (hasSelection != (m_anchorPosition != m_anchorPosition)) - emit copyAvailable(m_anchorPosition != m_cursorPosition); + if (hasSelection) + emit copyAvailable(hasSelection); emit cursorPositionChanged(m_cursorPosition); } diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp index 6ec45a45c8..e2e0886130 100644 --- a/src/plugins/debugger/qml/qmlengine.cpp +++ b/src/plugins/debugger/qml/qmlengine.cpp @@ -164,10 +164,9 @@ void QmlEngine::setupInferior() QTC_ASSERT(state() == InferiorSetupRequested, qDebug() << state()); if (startParameters().startMode == AttachToRemote) { + emit requestRemoteSetup(); if (startParameters().qmlServerPort != quint16(-1)) notifyInferiorSetupOk(); - else - emit requestRemoteSetup(); } else { d->m_applicationLauncher.setEnvironment(startParameters().environment); d->m_applicationLauncher.setWorkingDirectory(startParameters().workingDirectory); diff --git a/src/plugins/qmldesigner/customstyleplugin/plugindestdir.pri b/src/plugins/qmldesigner/customstyleplugin/plugindestdir.pri index 24f0c19b72..4975d9e153 100644 --- a/src/plugins/qmldesigner/customstyleplugin/plugindestdir.pri +++ b/src/plugins/qmldesigner/customstyleplugin/plugindestdir.pri @@ -1,5 +1,5 @@ macx { DESTDIR = $$IDE_LIBRARY_PATH/QmlDesigner } else { - DESTDIR = $$IDE_BUILD_TREE/lib/qmldesigner + DESTDIR = $$IDE_BUILD_TREE/$${IDE_LIBRARY_BASENAME}/qmldesigner } diff --git a/src/plugins/qmldesigner/designercore/model/modelnodecontextmenu.cpp b/src/plugins/qmldesigner/designercore/model/modelnodecontextmenu.cpp index 0333b5e4fc..3ae4815cc2 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnodecontextmenu.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnodecontextmenu.cpp @@ -71,7 +71,7 @@ static inline bool checkIfNodeIsAView(const ModelNode &node) static inline bool isItem(const ModelNode &node) { - return node.metaInfo().isValid() && node.metaInfo().isSubclassOf("QtQuick.Item", -1, -1); + return node.isValid() && node.metaInfo().isValid() && node.metaInfo().isSubclassOf("QtQuick.Item", -1, -1); } static inline QList<QmlItemNode> siblingsForNode(const QmlItemNode &itemNode) @@ -251,7 +251,7 @@ void ModelNodeContextMenu::execute(const QPoint &pos, bool selectionMenuBool) editMenu->addAction(action); action = createModelNodeAction(tr("Visibility"), editMenu, QList<ModelNode>() << currentSingleNode, ModelNodeAction::ModelNodeVisibility, singleSelected); editMenu->addAction(action); - if (!isItem(currentSingleNode)) + if (singleSelected && !isItem(currentSingleNode)) action->setDisabled(true); } else { diff --git a/src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp b/src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp index 01aadc0671..8a0f8ce8e7 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp @@ -216,6 +216,8 @@ RunControl *QmlProjectRunControlFactory::createDebugRunControl(QmlProjectRunConf params.displayName = runConfig->displayName(); params.projectSourceDirectory = runConfig->target()->project()->projectDirectory(); params.projectSourceFiles = runConfig->target()->project()->files(Project::ExcludeGeneratedFiles); + if (!runConfig->qtVersion()->qtAbis().isEmpty()) + params.toolChainAbi = runConfig->qtVersion()->qtAbis().first(); // Makes sure that all bindings go through the JavaScript engine, so that // breakpoints are actually hit! diff --git a/src/plugins/qt4projectmanager/qmakestep.cpp b/src/plugins/qt4projectmanager/qmakestep.cpp index 02dca1d90c..abecb0d5cb 100644 --- a/src/plugins/qt4projectmanager/qmakestep.cpp +++ b/src/plugins/qt4projectmanager/qmakestep.cpp @@ -180,7 +180,7 @@ QStringList QMakeStep::moreArguments() if (!bc->qtVersion()->needsQmlDebuggingLibrary()) { // This Qt version has the QML debugging services built in, however // they still need to be enabled at compile time - arguments << QLatin1String("CONFIG+=declarative_debug"); + arguments << QLatin1String(Constants::QMAKEVAR_DECLARATIVE_DEBUG); } else { QString qmlDebuggingHelperLibrary = bc->qtVersion()->qmlDebuggingHelperLibrary(true); if (!qmlDebuggingHelperLibrary.isEmpty()) { diff --git a/src/plugins/qt4projectmanager/qt-s60/codaruncontrol.cpp b/src/plugins/qt4projectmanager/qt-s60/codaruncontrol.cpp index 39f7ee0a85..11ac93ecde 100644 --- a/src/plugins/qt4projectmanager/qt-s60/codaruncontrol.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/codaruncontrol.cpp @@ -70,7 +70,6 @@ CodaRunControl::CodaRunControl(RunConfiguration *runConfiguration, const QString S60RunControlBase(runConfiguration, mode), m_port(0), m_state(StateUninit), - m_codaFlags(0), m_stopAfterConnect(false) { const S60DeviceRunConfiguration *s60runConfig = qobject_cast<S60DeviceRunConfiguration *>(runConfiguration); @@ -167,7 +166,7 @@ void CodaRunControl::doStop() case StateProcessRunning: QTC_ASSERT(!m_runningProcessId.isEmpty(), return); m_codaDevice->sendRunControlTerminateCommand(CodaCallback(), - m_runningProcessId.toAscii()); + m_runningProcessId.toAscii()); break; default: if (debug) @@ -226,10 +225,7 @@ void CodaRunControl::slotCodaEvent(const CodaEvent &event) void CodaRunControl::initCommunication() { - if (m_codaFlags & OptionsUseDebugSession) - m_codaDevice->sendDebugSessionControlSessionStartCommand(CodaCallback(this, &CodaRunControl::handleDebugSessionStarted)); - else - m_codaDevice->sendLoggingAddListenerCommand(CodaCallback(this, &CodaRunControl::handleAddListener)); + m_codaDevice->sendDebugSessionControlSessionStartCommand(CodaCallback(this, &CodaRunControl::handleDebugSessionStarted)); } void CodaRunControl::handleConnected(const CodaEvent &event) @@ -241,8 +237,6 @@ void CodaRunControl::handleConnected(const CodaEvent &event) setProgress(maxProgress()*0.80); m_codaServices = static_cast<const CodaLocatorHelloEvent &>(event).services(); - if (m_codaServices.contains(QLatin1String("DebugSessionControl"))) - m_codaFlags |= OptionsUseDebugSession; emit connected(); if (!m_stopAfterConnect) @@ -255,11 +249,7 @@ void CodaRunControl::handleContextRemoved(const CodaEvent &event) = static_cast<const CodaRunControlContextRemovedEvent &>(event).ids(); if (!m_runningProcessId.isEmpty() && removedItems.contains(m_runningProcessId.toAscii())) { - appendMessage(tr("Process has finished.\n"), Utils::NormalMessageFormat); - if (m_codaFlags & OptionsUseDebugSession) - m_codaDevice->sendDebugSessionControlSessionEndCommand(CodaCallback(this, &CodaRunControl::handleDebugSessionEnded)); - else - finishRunControl(); + m_codaDevice->sendDebugSessionControlSessionEndCommand(CodaCallback(this, &CodaRunControl::handleDebugSessionEnded)); } } @@ -331,6 +321,10 @@ void CodaRunControl::handleAddListener(const CodaCommandResult &result) void CodaRunControl::handleDebugSessionStarted(const CodaCommandResult &result) { Q_UNUSED(result) + if (m_codaDevice.isNull()) { + finishRunControl(); + return; + } m_state = StateDebugSessionStarted; m_codaDevice->sendLoggingAddListenerCommand(CodaCallback(this, &CodaRunControl::handleAddListener)); } @@ -355,7 +349,7 @@ void CodaRunControl::handleFindProcesses(const CodaCommandResult &result) executableUid(), commandLineArguments().split(' '), QString(), - !(m_codaFlags & OptionsUseDebugSession)); + true); appendMessage(tr("Launching: %1\n").arg(executableName()), Utils::NormalMessageFormat); } } @@ -365,17 +359,14 @@ void CodaRunControl::handleCreateProcess(const CodaCommandResult &result) const bool ok = result.type == CodaCommandResult::SuccessReply; bool processCreated = false; if (ok) { - if (m_codaFlags & OptionsUseDebugSession) { - if (result.values.size()) { - Json::JsonValue id = result.values.at(0).findChild("ID"); - if (id.isValid()) { - m_state = StateProcessRunning; - m_runningProcessId = id.data(); - processCreated = true; - } + if (result.values.size()) { + Json::JsonValue id = result.values.at(0).findChild("ID"); + if (id.isValid()) { + m_state = StateProcessRunning; + m_runningProcessId = id.data(); + processCreated = true; } - } else // If no DebugSession is present the process will already be created by now - processCreated = true; + } } if (processCreated) { setProgress(maxProgress()); diff --git a/src/plugins/qt4projectmanager/qt-s60/codaruncontrol.h b/src/plugins/qt4projectmanager/qt-s60/codaruncontrol.h index ccbb7701e2..584897c6e6 100644 --- a/src/plugins/qt4projectmanager/qt-s60/codaruncontrol.h +++ b/src/plugins/qt4projectmanager/qt-s60/codaruncontrol.h @@ -116,11 +116,6 @@ private: StateDebugSessionEnded }; - enum Options { - OptionsNone = 0, - OptionsUseDebugSession = 1 - }; - QSharedPointer<Coda::CodaDevice> m_codaDevice; QString m_address; @@ -130,7 +125,6 @@ private: QStringList m_codaServices; State m_state; - quint32 m_codaFlags; bool m_stopAfterConnect; }; diff --git a/src/plugins/qt4projectmanager/qt-s60/s60deployconfigurationwidget.cpp b/src/plugins/qt4projectmanager/qt-s60/s60deployconfigurationwidget.cpp index 25e94091b0..363357d6a7 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60deployconfigurationwidget.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60deployconfigurationwidget.cpp @@ -77,6 +77,7 @@ const char LAST_DRIVE_LETTER = 'Z'; static const quint32 CODA_UID = 0x20021F96; static const quint32 QTMOBILITY_UID = 0x2002AC89; static const quint32 QTCOMPONENTS_UID = 0x200346DE; +static const quint32 QMLVIEWER_UID = 0x20021317; QString formatDriveText(const S60DeployConfiguration::DeviceDrive &drive) { @@ -597,6 +598,7 @@ void S60DeployConfigurationWidget::getRomInfoResult(const Coda::CodaCommandResul packagesOfInterest.append(CODA_UID); packagesOfInterest.append(QTMOBILITY_UID); packagesOfInterest.append(QTCOMPONENTS_UID); + packagesOfInterest.append(QMLVIEWER_UID); if (m_codaInfoDevice) m_codaInfoDevice->sendSymbianInstallGetPackageInfoCommand(Coda::CodaCallback(this, &S60DeployConfigurationWidget::getInstalledPackagesResult), packagesOfInterest); } @@ -642,6 +644,10 @@ void S60DeployConfigurationWidget::getInstalledPackagesResult(const Coda::CodaCo addToTable(str, tr("Qt Quick components version: "), error ? tr("Not installed") : versionString); } break; + case QMLVIEWER_UID: { + addToTable(str, tr("QML Viewer version: "), error ? tr("Not installed") : versionString); + } + break; default: break; } } diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp index 39833e6ee4..96dc194795 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp @@ -535,8 +535,9 @@ bool Qt4BuildConfiguration::removeQMLInspectorFromArguments(QString *args) { bool removedArgument = false; for (Utils::QtcProcess::ArgIterator ait(args); ait.next(); ) { - if (ait.value().contains(QLatin1String(Constants::QMAKEVAR_QMLJSDEBUGGER_PATH))) { - ait.deleteArg(); + const QString arg = ait.value(); + if (arg.contains(QLatin1String(Constants::QMAKEVAR_QMLJSDEBUGGER_PATH)) + || arg.contains(Constants::QMAKEVAR_DECLARATIVE_DEBUG)) { removedArgument = true; } } diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.pro b/src/plugins/qt4projectmanager/qt4projectmanager.pro index 5452bf28be..81410e78fb 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.pro +++ b/src/plugins/qt4projectmanager/qt4projectmanager.pro @@ -137,6 +137,7 @@ FORMS += makestep.ui \ wizards/mobileappwizardgenericoptionspage.ui \ wizards/mobileappwizardsymbianoptionspage.ui \ wizards/mobileappwizardmaemooptionspage.ui \ + wizards/mobileappwizardharmattanoptionspage.ui \ wizards/qtquickcomponentsetoptionspage.ui RESOURCES += qt4projectmanager.qrc \ diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h b/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h index f3a21193b1..35c8ca0ced 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h +++ b/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h @@ -115,6 +115,7 @@ const char * const ICON_HTML5_APP = ":/wizards/images/html5app.png"; // Env variables const char * const QMAKEVAR_QMLJSDEBUGGER_PATH = "QMLJSDEBUGGER_PATH"; +const char * const QMAKEVAR_DECLARATIVE_DEBUG = "CONFIG+=declarative_debug"; } // namespace Constants } // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/wizards/abstractmobileapp.cpp b/src/plugins/qt4projectmanager/wizards/abstractmobileapp.cpp index d56a1275fa..8b24bae49d 100644 --- a/src/plugins/qt4projectmanager/wizards/abstractmobileapp.cpp +++ b/src/plugins/qt4projectmanager/wizards/abstractmobileapp.cpp @@ -42,6 +42,7 @@ #endif // CREATORLESSTEST #include <utils/fileutils.h> +#include <utils/qtcassert.h> namespace Qt4ProjectManager { @@ -62,8 +63,11 @@ const QString AbstractMobileApp::FileStubVersion(QLatin1String("version")); const int AbstractMobileApp::StubVersion = 6; AbstractMobileApp::AbstractMobileApp() - : m_orientation(ScreenOrientationAuto) + : QObject() + , m_canSupportMeegoBooster(false) + , m_orientation(ScreenOrientationAuto) , m_networkEnabled(true) + , m_supportsMeegoBooster(false) { } @@ -209,7 +213,10 @@ QByteArray AbstractMobileApp::generateDesktopFile(QString *errorMessage, int fil } else if (fileType == AbstractGeneratedFileInfo::DesktopFileHarmattan) { desktopFileContent.replace("Icon=thisApp", "Icon=/usr/share/icons/hicolor/80x80/apps/" + projectName().toUtf8() + "80.png"); - desktopFileContent.replace("Exec=", "Exec=/usr/bin/single-instance "); + if (m_supportsMeegoBooster) + desktopFileContent.replace("Exec=", "Exec=/usr/bin/invoker --type=d -s "); + else + desktopFileContent.replace("Exec=", "Exec=/usr/bin/single-instance "); } return desktopFileContent.replace("thisApp", projectName().toUtf8()); } @@ -416,6 +423,22 @@ QString AbstractMobileApp::error() const return m_error; } +bool AbstractMobileApp::canSupportMeegoBooster() const +{ + return m_canSupportMeegoBooster; +} + +bool AbstractMobileApp::supportsMeegoBooster() const +{ + return m_supportsMeegoBooster; +} + +void AbstractMobileApp::setSupportsMeegoBooster(bool supportMeegoBooster) +{ + QTC_ASSERT(canSupportMeegoBooster(), return); + m_supportsMeegoBooster = supportMeegoBooster; +} + QByteArray AbstractMobileApp::readBlob(const QString &filePath, QString *errorMsg) const { diff --git a/src/plugins/qt4projectmanager/wizards/abstractmobileapp.h b/src/plugins/qt4projectmanager/wizards/abstractmobileapp.h index c1d5ff80de..caabba1aab 100644 --- a/src/plugins/qt4projectmanager/wizards/abstractmobileapp.h +++ b/src/plugins/qt4projectmanager/wizards/abstractmobileapp.h @@ -133,6 +133,10 @@ public: QString path(int fileType) const; QString error() const; + bool canSupportMeegoBooster() const; + bool supportsMeegoBooster() const; + void setSupportsMeegoBooster(bool supportBooster); + #ifndef CREATORLESSTEST virtual Core::GeneratedFiles generateFiles(QString *errorMessage) const; #else @@ -168,6 +172,8 @@ protected: static const int StubVersion; QString m_error; + bool m_canSupportMeegoBooster; + private: QByteArray generateDesktopFile(QString *errorMessage, int fileType) const; QByteArray generateMainCpp(QString *errorMessage) const; @@ -194,6 +200,7 @@ private: QString m_symbianTargetUid; ScreenOrientation m_orientation; bool m_networkEnabled; + bool m_supportsMeegoBooster; }; } // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp index 650f6b92ba..b1c6f12187 100644 --- a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp @@ -70,8 +70,8 @@ AbstractMobileAppWizardDialog::AbstractMobileAppWizardDialog(QWidget *parent, co m_genericOptionsPage = new Internal::MobileAppWizardGenericOptionsPage; m_symbianOptionsPage = new Internal::MobileAppWizardSymbianOptionsPage; - m_maemoOptionsPage = new Internal::MobileAppWizardMaemoOptionsPage(64); - m_harmattanOptionsPage = new Internal::MobileAppWizardMaemoOptionsPage(80); + m_maemoOptionsPage = new Internal::MobileAppWizardMaemoOptionsPage; + m_harmattanOptionsPage = new Internal::MobileAppWizardHarmattanOptionsPage; } void AbstractMobileAppWizardDialog::addMobilePages() @@ -235,6 +235,7 @@ QWizard *AbstractMobileAppWizard::createWizardDialog(QWidget *parent, wdlg->m_symbianOptionsPage->setNetworkEnabled(app()->networkEnabled()); wdlg->m_maemoOptionsPage->setPngIcon(app()->pngIcon64()); wdlg->m_harmattanOptionsPage->setPngIcon(app()->pngIcon80()); + wdlg->m_harmattanOptionsPage->setBoosterOptionEnabled(app()->canSupportMeegoBooster()); connect(wdlg, SIGNAL(projectParametersChanged(QString, QString)), SLOT(useProjectPath(QString, QString))); foreach (QWizardPage *p, extensionPages) @@ -253,6 +254,9 @@ Core::GeneratedFiles AbstractMobileAppWizard::generateFiles(const QWizard *wizar app()->setNetworkEnabled(wdlg->m_symbianOptionsPage->networkEnabled()); app()->setPngIcon64(wdlg->m_maemoOptionsPage->pngIcon()); app()->setPngIcon80(wdlg->m_harmattanOptionsPage->pngIcon()); + if (wdlg->isHarmattanTargetSelected()) + app()->setSupportsMeegoBooster(wdlg->isHarmattanTargetSelected() + && wdlg->m_harmattanOptionsPage->supportsBooster()); prepareGenerateFiles(wizard, errorMessage); return app()->generateFiles(errorMessage); } diff --git a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.h b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.h index 3efbf1737f..f4aff8058d 100644 --- a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.h +++ b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.h @@ -48,6 +48,7 @@ namespace Internal { class MobileAppWizardGenericOptionsPage; class MobileAppWizardSymbianOptionsPage; class MobileAppWizardMaemoOptionsPage; +class MobileAppWizardHarmattanOptionsPage; } /// \internal @@ -81,7 +82,7 @@ private: Internal::MobileAppWizardGenericOptionsPage *m_genericOptionsPage; Internal::MobileAppWizardSymbianOptionsPage *m_symbianOptionsPage; Internal::MobileAppWizardMaemoOptionsPage *m_maemoOptionsPage; - Internal::MobileAppWizardMaemoOptionsPage *m_harmattanOptionsPage; + Internal::MobileAppWizardHarmattanOptionsPage *m_harmattanOptionsPage; TargetSetupPage *m_targetsPage; int m_genericOptionsPageId; diff --git a/src/plugins/qt4projectmanager/wizards/mobileappwizardharmattanoptionspage.ui b/src/plugins/qt4projectmanager/wizards/mobileappwizardharmattanoptionspage.ui new file mode 100644 index 0000000000..7354c26ecc --- /dev/null +++ b/src/plugins/qt4projectmanager/wizards/mobileappwizardharmattanoptionspage.ui @@ -0,0 +1,95 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>MobileAppWizardHarmattanOptionsPage</class> + <widget class="QWizardPage" name="MobileAppWizardHarmattanOptionsPage"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle"> + <string>WizardPage</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <widget class="QLabel" name="appIconLabel"> + <property name="text"> + <string>Application icon (80x80):</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QToolButton" name="pngIconButton"> + <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> + </item> + <item row="1" column="0" colspan="2"> + <widget class="QCheckBox" name="makeBoostableCheckBox"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="toolTip"> + <string>Generate code to speed up the launching on the device.</string> + </property> + <property name="text"> + <string>Make application boostable</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="0" column="2"> + <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> + <item row="2" column="1"> + <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/mobileappwizardmaemooptionspage.ui b/src/plugins/qt4projectmanager/wizards/mobileappwizardmaemooptionspage.ui index c21869d7cc..20f1f979d2 100644 --- a/src/plugins/qt4projectmanager/wizards/mobileappwizardmaemooptionspage.ui +++ b/src/plugins/qt4projectmanager/wizards/mobileappwizardmaemooptionspage.ui @@ -17,7 +17,7 @@ <item row="0" column="0"> <widget class="QLabel" name="appIconLabel"> <property name="text"> - <string>Application icon (%%w%%x%%h%%):</string> + <string>Application icon (64x64):</string> </property> </widget> </item> diff --git a/src/plugins/qt4projectmanager/wizards/mobileappwizardpages.cpp b/src/plugins/qt4projectmanager/wizards/mobileappwizardpages.cpp index 3e400c03d9..ec2721413d 100644 --- a/src/plugins/qt4projectmanager/wizards/mobileappwizardpages.cpp +++ b/src/plugins/qt4projectmanager/wizards/mobileappwizardpages.cpp @@ -33,6 +33,7 @@ #include "mobileappwizardpages.h" #include "ui_mobileappwizardgenericoptionspage.h" #include "ui_mobileappwizardmaemooptionspage.h" +#include "ui_mobileappwizardharmattanoptionspage.h" #include "ui_mobileappwizardsymbianoptionspage.h" #include <coreplugin/coreconstants.h> #include <utils/fileutils.h> @@ -67,6 +68,14 @@ class MobileAppWizardMaemoOptionsPagePrivate friend class MobileAppWizardMaemoOptionsPage; }; +class MobileAppWizardHarmattanOptionsPagePrivate +{ + Ui::MobileAppWizardHarmattanOptionsPage ui; + QSize iconSize; + QString pngIcon; + friend class MobileAppWizardHarmattanOptionsPage; +}; + MobileAppWizardGenericOptionsPage::MobileAppWizardGenericOptionsPage(QWidget *parent) : QWizardPage(parent) , m_d(new MobileAppWizardGenericOptionsPagePrivate) @@ -167,18 +176,12 @@ void MobileAppWizardSymbianOptionsPage::openSvgIcon() setSvgIcon(svgIcon); } - -MobileAppWizardMaemoOptionsPage::MobileAppWizardMaemoOptionsPage(int appIconSize, - QWidget *parent) +MobileAppWizardMaemoOptionsPage::MobileAppWizardMaemoOptionsPage(QWidget *parent) : QWizardPage(parent) , m_d(new MobileAppWizardMaemoOptionsPagePrivate) { m_d->ui.setupUi(this); - QString iconLabelText = m_d->ui.appIconLabel->text(); - iconLabelText.replace(QLatin1String("%%w%%"), QString::number(appIconSize)); - iconLabelText.replace(QLatin1String("%%h%%"), QString::number(appIconSize)); - m_d->ui.appIconLabel->setText(iconLabelText); - m_d->iconSize = QSize(appIconSize, appIconSize); + m_d->iconSize = QSize(64, 64); m_d->ui.pngIconButton->setIconSize(m_d->iconSize); connect(m_d->ui.pngIconButton, SIGNAL(clicked()), this, SLOT(openPngIcon())); } @@ -193,42 +196,66 @@ QString MobileAppWizardMaemoOptionsPage::pngIcon() const return m_d->pngIcon; } -void MobileAppWizardMaemoOptionsPage::setPngIcon(const QString &icon) + +class PngIconScaler : public QObject { - QString error; - QPixmap iconPixmap(icon); - if (iconPixmap.isNull()) { - QMessageBox::critical(this, tr("Invalid Icon"), - tr("The file is not a valid image.")); - return; + Q_OBJECT +public: + PngIconScaler(const QSize &expectedSize, const QString &iconPath) + : m_expectedSize(expectedSize) + , m_iconPath(iconPath) + , m_pixmap(iconPath) + { } - QString actualIconPath; - if (iconPixmap.size() == m_d->iconSize) { - actualIconPath = icon; - } else { - const QMessageBox::StandardButton button = QMessageBox::warning(this, - tr("Wrong Icon Size"), tr("The icon needs to be %1x%2 pixels big, " - "but is not. Do you want Creator to scale it?") - .arg(m_d->iconSize.width()).arg(m_d->iconSize.height()), - QMessageBox::Ok | QMessageBox::Cancel); + bool hasRightSize() const { return m_expectedSize == m_pixmap.size(); } + QPixmap pixmap() const { return m_pixmap; } + + bool scale(QString *newPath) { + const QMessageBox::StandardButton button + = QMessageBox::warning(QApplication::activeWindow(), + tr("Wrong Icon Size"), + tr("The icon needs to be %1x%2 pixels big, " + "but is not. Do you want Qt Creator to scale it?") + .arg(m_expectedSize.width()).arg(m_expectedSize.height()), + QMessageBox::Ok | QMessageBox::Cancel); if (button != QMessageBox::Ok) - return; - iconPixmap = iconPixmap.scaled(m_d->iconSize); + return false; + + m_pixmap = m_pixmap.scaled(m_expectedSize); Utils::TempFileSaver saver; saver.setAutoRemove(false); if (!saver.hasError()) - saver.setResult(iconPixmap.save( - saver.file(), QFileInfo(icon).suffix().toAscii().constData())); + saver.setResult(m_pixmap.save( + saver.file(), QFileInfo(m_iconPath).suffix().toAscii().constData())); if (!saver.finalize()) { - QMessageBox::critical(this, tr("File Error"), - tr("Could not copy icon file: %1").arg(saver.errorString())); - return; + QMessageBox::critical(QApplication::activeWindow(), + tr("File Error"), + tr("Could not copy icon file: %1").arg(saver.errorString())); + return false; } - actualIconPath = saver.fileName(); + *newPath = saver.fileName(); + return true; } +private: + QSize m_expectedSize; + QString m_iconPath; + QPixmap m_pixmap; +}; - m_d->ui.pngIconButton->setIcon(iconPixmap); + +void MobileAppWizardMaemoOptionsPage::setPngIcon(const QString &icon) +{ + QString actualIconPath; + PngIconScaler scaler(m_d->iconSize, icon); + if (scaler.hasRightSize()) { + actualIconPath = icon; + } else { + if (!scaler.scale(&actualIconPath)) + return; + } + + m_d->ui.pngIconButton->setIcon(scaler.pixmap()); m_d->pngIcon = actualIconPath; } @@ -241,5 +268,62 @@ void MobileAppWizardMaemoOptionsPage::openPngIcon() setPngIcon(iconPath); } +MobileAppWizardHarmattanOptionsPage::MobileAppWizardHarmattanOptionsPage(QWidget *parent) + : QWizardPage(parent) + , m_d(new MobileAppWizardHarmattanOptionsPagePrivate) +{ + m_d->ui.setupUi(this); + m_d->iconSize = QSize(80, 80); + m_d->ui.pngIconButton->setIconSize(m_d->iconSize); + connect(m_d->ui.pngIconButton, SIGNAL(clicked()), this, SLOT(openPngIcon())); +} + +MobileAppWizardHarmattanOptionsPage::~MobileAppWizardHarmattanOptionsPage() +{ + delete m_d; +} + +QString MobileAppWizardHarmattanOptionsPage::pngIcon() const +{ + return m_d->pngIcon; +} + +void MobileAppWizardHarmattanOptionsPage::setPngIcon(const QString &icon) +{ + QString actualIconPath; + PngIconScaler scaler(m_d->iconSize, icon); + if (scaler.hasRightSize()) { + actualIconPath = icon; + } else { + if (!scaler.scale(&actualIconPath)) + return; + } + + m_d->ui.pngIconButton->setIcon(scaler.pixmap()); + m_d->pngIcon = actualIconPath; +} + +void MobileAppWizardHarmattanOptionsPage::openPngIcon() +{ + const QString iconPath = QFileDialog::getOpenFileName(this, + m_d->ui.appIconLabel->text(), m_d->pngIcon, + QLatin1String("*.png")); + if (!iconPath.isEmpty()) + setPngIcon(iconPath); +} + +void MobileAppWizardHarmattanOptionsPage::setBoosterOptionEnabled(bool enable) +{ + m_d->ui.makeBoostableCheckBox->setEnabled(enable); + m_d->ui.makeBoostableCheckBox->setChecked(enable); +} + +bool MobileAppWizardHarmattanOptionsPage::supportsBooster() const +{ + return m_d->ui.makeBoostableCheckBox->isChecked(); +} + } // namespace Internal } // namespace Qt4ProjectManager + +#include "mobileappwizardpages.moc" diff --git a/src/plugins/qt4projectmanager/wizards/mobileappwizardpages.h b/src/plugins/qt4projectmanager/wizards/mobileappwizardpages.h index 87dc8e1fd2..029108c3fc 100644 --- a/src/plugins/qt4projectmanager/wizards/mobileappwizardpages.h +++ b/src/plugins/qt4projectmanager/wizards/mobileappwizardpages.h @@ -82,8 +82,7 @@ class MobileAppWizardMaemoOptionsPage : public QWizardPage Q_OBJECT public: - explicit MobileAppWizardMaemoOptionsPage(int appIconSize, - QWidget *parent = 0); + explicit MobileAppWizardMaemoOptionsPage(QWidget *parent = 0); virtual ~MobileAppWizardMaemoOptionsPage(); QString pngIcon() const; @@ -96,6 +95,27 @@ private: class MobileAppWizardMaemoOptionsPagePrivate *m_d; }; +class MobileAppWizardHarmattanOptionsPage : public QWizardPage +{ + Q_OBJECT + +public: + explicit MobileAppWizardHarmattanOptionsPage(QWidget *parent = 0); + virtual ~MobileAppWizardHarmattanOptionsPage(); + + QString pngIcon() const; + void setPngIcon(const QString &icon); + + void setBoosterOptionEnabled(bool enable); + bool supportsBooster() const; + +private slots: + void openPngIcon(); + +private: + class MobileAppWizardHarmattanOptionsPagePrivate *m_d; +}; + } // namespace Internal } // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/wizards/qtquickapp.cpp b/src/plugins/qt4projectmanager/wizards/qtquickapp.cpp index 859d2da090..7756233066 100644 --- a/src/plugins/qt4projectmanager/wizards/qtquickapp.cpp +++ b/src/plugins/qt4projectmanager/wizards/qtquickapp.cpp @@ -102,6 +102,7 @@ QtQuickApp::QtQuickApp() , m_mainQmlMode(ModeGenerate) , m_componentSet(QtQuick10Components) { + m_canSupportMeegoBooster = true; } QtQuickApp::~QtQuickApp() @@ -226,16 +227,16 @@ QString QtQuickApp::mainWindowClassName() const bool QtQuickApp::adaptCurrentMainCppTemplateLine(QString &line) const { const QLatin1Char quote('"'); - bool adaptLine = true; + if (line.contains(QLatin1String("// MAINQML"))) { insertParameter(line, quote + path(MainQmlDeployed) + quote); } else if (line.contains(QLatin1String("// ADDIMPORTPATH"))) { if (m_modules.isEmpty()) - adaptLine = false; + return false; else insertParameter(line, quote + path(ModulesDir) + quote); } - return adaptLine; + return true; } void QtQuickApp::handleCurrentProFileTemplateLine(const QString &line, @@ -263,6 +264,11 @@ void QtQuickApp::handleCurrentProFileTemplateLine(const QString &line, if (componentSet() == Symbian10Components) nextLine.remove(0, 2); // remove comment proFile << nextLine << endl; + } else if (line.contains(QLatin1String("# HARMATTAN_BOOSTABLE"))) { + QString nextLine = proFileTemplate.readLine(); // eats '# CONFIG += qdeclarative-boostable' + if (supportsMeegoBooster()) + nextLine.remove(0, 2); // remove comment + proFile << nextLine << endl; } } @@ -460,7 +466,7 @@ QString QtQuickApp::componentSetDir(ComponentSet componentSet) const } } -const int QtQuickApp::StubVersion = 15; +const int QtQuickApp::StubVersion = 16; } // namespace Internal } // namespace Qt4ProjectManager diff --git a/src/plugins/remotelinux/maemopackagecreationwidget.cpp b/src/plugins/remotelinux/maemopackagecreationwidget.cpp index bf37c99b3e..121a5514f9 100644 --- a/src/plugins/remotelinux/maemopackagecreationwidget.cpp +++ b/src/plugins/remotelinux/maemopackagecreationwidget.cpp @@ -72,7 +72,6 @@ void MaemoPackageCreationWidget::initGui() { m_ui->shortDescriptionLineEdit->setMaxLength(60); updateVersionInfo(); - versionInfoChanged(); const AbstractDebBasedQt4MaemoTarget * const debBasedMaemoTarget = m_step->debBasedMaemoTarget(); if (debBasedMaemoTarget) { @@ -142,9 +141,17 @@ void MaemoPackageCreationWidget::updateVersionInfo() } const QStringList list = versionString.split(QLatin1Char('.'), QString::SkipEmptyParts); + const bool blocked = m_ui->major->signalsBlocked(); + m_ui->major->blockSignals(true); + m_ui->minor->blockSignals(true); + m_ui->patch->blockSignals(true); m_ui->major->setValue(list.value(0, QLatin1String("0")).toInt()); m_ui->minor->setValue(list.value(1, QLatin1String("0")).toInt()); m_ui->patch->setValue(list.value(2, QLatin1String("0")).toInt()); + m_ui->major->blockSignals(blocked); + m_ui->minor->blockSignals(blocked); + m_ui->patch->blockSignals(blocked); + updateSummary(); } void MaemoPackageCreationWidget::handleControlFileUpdate() @@ -249,8 +256,10 @@ void MaemoPackageCreationWidget::versionInfoChanged() const bool success = m_step->setVersionString(m_ui->major->text() + QLatin1Char('.') + m_ui->minor->text() + QLatin1Char('.') + m_ui->patch->text(), &error); - if (!success) + if (!success) { QMessageBox::critical(this, tr("Could Not Set Version Number"), error); + updateVersionInfo(); + } } void MaemoPackageCreationWidget::editDebianFile() diff --git a/src/plugins/remotelinux/qt4maemotarget.cpp b/src/plugins/remotelinux/qt4maemotarget.cpp index b48bd71dc7..f43934473f 100644 --- a/src/plugins/remotelinux/qt4maemotarget.cpp +++ b/src/plugins/remotelinux/qt4maemotarget.cpp @@ -57,6 +57,8 @@ #include <QtGui/QApplication> #include <QtGui/QMainWindow> #include <QtCore/QBuffer> +#include <QtCore/QDateTime> +#include <QtCore/QLocale> #include <QtCore/QRegExp> #include <QtCore/QDir> #include <QtCore/QFile> @@ -276,6 +278,23 @@ void AbstractQt4MaemoTarget::handleTargetAdded(ProjectExplorer::Target *target) if (status == ActionSuccessful) // Don't do this when the packaging data already exists. initPackagingSettingsFromOtherTarget(); handleTargetAddedSpecial(); + if (status == ActionSuccessful) { + const QStringList &files = packagingFilePaths(); + if (!files.isEmpty()) { + const QString list = QLatin1String("<ul><li>") + files.join(QLatin1String("</li><li>")) + + QLatin1String("</li></ul>"); + QMessageBox::StandardButton button = QMessageBox::question(Core::ICore::instance()->mainWindow(), + tr("Add Packaging Files to Project"), + tr("<html>Qt Creator has set up the following files to enable " + "packaging:\n %1\nDo you want to add them to the project?</html>") + .arg(list), QMessageBox::Yes | QMessageBox::No); + if (button == QMessageBox::Yes) { + ProjectExplorer::ProjectExplorerPlugin::instance() + ->addExistingFiles(project()->rootProjectNode(), files); + } + } + } + m_isInitialized = true; } @@ -327,27 +346,7 @@ AbstractQt4MaemoTarget::ActionStatus AbstractQt4MaemoTarget::createTemplates() return ActionFailed; } - const ActionStatus actionStatus = createSpecialTemplates(); - if (actionStatus == ActionFailed) - return ActionFailed; - if (actionStatus == ActionSuccessful) { - const QStringList &files = packagingFilePaths(); - if (!files.isEmpty()) { - const QString list = QLatin1String("<ul><li>") - + files.join(QLatin1String("</li><li>")) + QLatin1String("</li></ul>"); - QMessageBox::StandardButton button - = QMessageBox::question(Core::ICore::instance()->mainWindow(), - tr("Add Packaging Files to Project"), - tr("<html>Qt Creator has set up the following files to enable " - "packaging:\n %1\nDo you want to add them to the project?</html>") - .arg(list), QMessageBox::Yes | QMessageBox::No); - if (button == QMessageBox::Yes) { - ProjectExplorer::ProjectExplorerPlugin::instance() - ->addExistingFiles(project()->rootProjectNode(), files); - } - } - } - return actionStatus; + return createSpecialTemplates(); } bool AbstractQt4MaemoTarget::initPackagingSettingsFromOtherTarget() @@ -416,8 +415,50 @@ bool AbstractDebBasedQt4MaemoTarget::setProjectVersionInternal(const QString &ve if (!reader.fetch(filePath, error)) return false; QString content = QString::fromUtf8(reader.data()); - content.replace(QRegExp(QLatin1String("\\([a-zA-Z0-9_\\.]+\\)")), - QLatin1Char('(') + version + QLatin1Char(')')); + if (content.contains(QLatin1Char('(') + version + QLatin1Char(')'))) { + if (error) { + *error = tr("Refusing to update changelog file: Already contains version '%1'.") + .arg(version); + } + return false; + } + + int maintainerOffset = content.indexOf(QLatin1String("\n -- ")); + const int eolOffset = content.indexOf(QLatin1Char('\n'), maintainerOffset+1); + if (maintainerOffset == -1 || eolOffset == -1) { + if (error) { + *error = tr("Cannot update changelog: Invalid format (no maintainer entry found)."); + } + return false; + } + + ++maintainerOffset; + const QDateTime currentDateTime = QDateTime::currentDateTime(); + QDateTime utcDateTime = QDateTime(currentDateTime); + utcDateTime.setTimeSpec(Qt::UTC); + int utcOffsetSeconds = currentDateTime.secsTo(utcDateTime); + QChar sign; + if (utcOffsetSeconds < 0) { + utcOffsetSeconds = -utcOffsetSeconds; + sign = QLatin1Char('-'); + } else { + sign = QLatin1Char('+'); + } + const int utcOffsetMinutes = (utcOffsetSeconds / 60) % 60; + const int utcOffsetHours = utcOffsetSeconds / 3600; + const QString dateString = QString::fromLatin1("%1 %2%3%4") + .arg(currentDateTime.toString(QLatin1String("ddd, dd MMM yyyy hh:mm:ss"))).arg(sign) + .arg(utcOffsetHours, 2, 10, QLatin1Char('0')) + .arg(utcOffsetMinutes, 2, 10, QLatin1Char('0')); + const QString maintainerLine = content.mid(maintainerOffset, eolOffset - maintainerOffset + 1) + .replace(QRegExp(QLatin1String("> [^\\n]*\n")), + QString::fromLocal8Bit("> %1").arg(dateString)); + QString versionLine = content.left(content.indexOf(QLatin1Char('\n'))) + .replace(QRegExp(QLatin1String("\\([a-zA-Z0-9_\\.]+\\)")), + QLatin1Char('(') + version + QLatin1Char(')')); + const QString newEntry = versionLine + QLatin1String("\n * <Add change description here>\n\n") + + maintainerLine + QLatin1String("\n\n"); + content.prepend(newEntry); Core::FileChangeBlocker update(filePath); Utils::FileSaver saver(filePath); saver.write(content.toUtf8()); @@ -664,10 +705,11 @@ void AbstractDebBasedQt4MaemoTarget::handleTargetAddedSpecial() // Such a file is created by the mobile wizards. const QString iconPath = project()->projectDirectory() + QLatin1Char('/') + project()->displayName() - + QLatin1String(".png"); + + QLatin1String("64.png"); if (QFileInfo(iconPath).exists()) setPackageManagerIcon(iconPath); } + m_filesWatcher->addDirectory(debianDirPath(), Utils::FileSystemWatcher::WatchAllChanges); m_controlFile = new WatchableFile(controlFilePath(), this); connect(m_controlFile, SIGNAL(modified()), SIGNAL(controlChanged())); @@ -875,7 +917,6 @@ bool AbstractDebBasedQt4MaemoTarget::setPackageManagerIcon(const QString &iconFi return success; } - AbstractRpmBasedQt4MaemoTarget::AbstractRpmBasedQt4MaemoTarget(Qt4Project *parent, const QString &id) : AbstractQt4MaemoTarget(parent, id) { diff --git a/src/plugins/remotelinux/remotelinuxruncontrol.cpp b/src/plugins/remotelinux/remotelinuxruncontrol.cpp index f0e441178c..29c5f43df2 100644 --- a/src/plugins/remotelinux/remotelinuxruncontrol.cpp +++ b/src/plugins/remotelinux/remotelinuxruncontrol.cpp @@ -37,10 +37,8 @@ #include <projectexplorer/projectexplorerconstants.h> #include <utils/qtcassert.h> -#include <QtGui/QIcon> -#include <QtGui/QMessageBox> - #include <QtCore/QString> +#include <QtGui/QIcon> using namespace ProjectExplorer; @@ -137,7 +135,6 @@ void AbstractRemoteLinuxRunControl::handleError(const QString &errString) { stop(); appendMessage(errString, Utils::ErrorMessageFormat); - QMessageBox::critical(0, tr("Remote Execution Failure"), errString); } void AbstractRemoteLinuxRunControl::setFinished() |