From e79f6031da960ccb9f7f39f927a252694291e7d3 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 11 Jan 2011 16:08:51 +0100 Subject: [PATCH] Maemo: Prepare for possibility of our deploy step disappearing. Could happen e.g. when RDA is used. --- .../qt-maemo/maemodeployables.cpp | 23 +++++---------- .../qt-maemo/maemodeployables.h | 9 ++---- .../qt-maemo/maemodeploystep.cpp | 5 +++- .../qt4projectmanager/qt-maemo/maemoglobal.h | 2 ++ .../qt-maemo/maemorunconfiguration.cpp | 16 +++++------ .../qt-maemo/maemorunconfigurationwidget.cpp | 28 ++++++++++++++++--- .../qt-maemo/maemorunconfigurationwidget.h | 2 ++ .../qt-maemo/maemorunfactories.cpp | 3 +- 8 files changed, 52 insertions(+), 36 deletions(-) diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.cpp index 84a20d16bb9..414a0d47069 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.cpp @@ -55,8 +55,8 @@ namespace Qt4ProjectManager { namespace Internal { -MaemoDeployables::MaemoDeployables(const ProjectExplorer::BuildStep *buildStep) - : m_buildStep(buildStep), m_updateTimer(new QTimer(this)) +MaemoDeployables::MaemoDeployables(const Qt4Target *target) + : m_target(target), m_updateTimer(new QTimer(this)) { QTimer::singleShot(0, this, SLOT(init())); m_updateTimer->setInterval(1500); @@ -67,7 +67,7 @@ MaemoDeployables::~MaemoDeployables() {} void MaemoDeployables::init() { - Qt4Project *pro = qt4BuildConfiguration()->qt4Target()->qt4Project(); + Qt4Project * const pro = m_target->qt4Project(); connect(pro, SIGNAL(proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode*,bool)), m_updateTimer, SLOT(start())); @@ -78,16 +78,14 @@ void MaemoDeployables::init() void MaemoDeployables::createModels() { - if (!qt4BuildConfiguration() || !qt4BuildConfiguration()->qt4Target() - || qt4BuildConfiguration()->qt4Target()->project()->activeTarget()->id() - != QLatin1String(Qt4ProjectManager::Constants::MAEMO_DEVICE_TARGET_ID)) + if (m_target->project()->activeTarget() != m_target) return; const Qt4ProFileNode *const rootNode - = qt4BuildConfiguration()->qt4Target()->qt4Project()->rootProjectNode(); + = m_target->qt4Project()->rootProjectNode(); if (!rootNode) // Happens on project creation by wizard. return; m_updateTimer->stop(); - disconnect(qt4BuildConfiguration()->qt4Target()->qt4Project(), + disconnect(m_target->qt4Project(), SIGNAL(proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode*,bool)), m_updateTimer, SLOT(start())); beginResetModel(); @@ -119,7 +117,7 @@ void MaemoDeployables::createModels() } endResetModel(); - connect(qt4BuildConfiguration()->qt4Target()->qt4Project(), + connect(m_target->qt4Project(), SIGNAL(proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode*,bool)), m_updateTimer, SLOT(start())); } @@ -201,13 +199,6 @@ QString MaemoDeployables::remoteExecutableFilePath(const QString &localExecutabl return QString(); } -const Qt4BuildConfiguration *MaemoDeployables::qt4BuildConfiguration() const -{ - const Qt4BuildConfiguration * const bc - = qobject_cast(m_buildStep->target()->activeBuildConfiguration()); - return bc; -} - int MaemoDeployables::rowCount(const QModelIndex &parent) const { return parent.isValid() ? 0 : modelCount(); diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.h b/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.h index 9d3f797bef4..9c7ef449047 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.h +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.h @@ -51,10 +51,9 @@ QT_FORWARD_DECLARE_CLASS(QTimer) -namespace ProjectExplorer { class BuildStep; } - namespace Qt4ProjectManager { class Qt4BuildConfiguration; +class Qt4Target; namespace Internal { class Qt4ProFileNode; @@ -63,7 +62,7 @@ class MaemoDeployables : public QAbstractListModel { Q_OBJECT public: - MaemoDeployables(const ProjectExplorer::BuildStep *buildStep); + MaemoDeployables(const Qt4Target *target); ~MaemoDeployables(); void setUnmodified(); bool isModified() const; @@ -72,7 +71,6 @@ public: QString remoteExecutableFilePath(const QString &localExecutableFilePath) const; int modelCount() const { return m_listModels.count(); } MaemoDeployableListModel *modelAt(int i) const { return m_listModels.at(i); } - const ProjectExplorer::BuildStep *buildStep() const { return m_buildStep; } private: typedef QHash UpdateSettingsMap; @@ -83,11 +81,10 @@ private: Q_SLOT void createModels(); Q_SLOT void init(); void createModels(const Qt4ProFileNode *proFileNode); - const Qt4BuildConfiguration *qt4BuildConfiguration() const; QList m_listModels; UpdateSettingsMap m_updateSettings; - const ProjectExplorer::BuildStep * const m_buildStep; + const Qt4Target * const m_target; QTimer *const m_updateTimer; }; diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.cpp index 2069f2eeae7..de94eb0801c 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.cpp @@ -52,6 +52,7 @@ #include #include +#include #include #include @@ -96,7 +97,9 @@ void MaemoDeployStep::ctor() const QList &deployConfigs = target()->deployConfigurations(); if (deployConfigs.isEmpty()) { - m_deployables = QSharedPointer(new MaemoDeployables(this)); + const Qt4Target * const qt4Target = qobject_cast(target()); + Q_ASSERT(qt4Target); + m_deployables = QSharedPointer(new MaemoDeployables(qt4Target)); } else { const MaemoDeployStep *const other = MaemoGlobal::buildStep(deployConfigs.first()); diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemoglobal.h b/src/plugins/qt4projectmanager/qt-maemo/maemoglobal.h index 7dc658c3201..91aeb21ad9c 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemoglobal.h +++ b/src/plugins/qt4projectmanager/qt-maemo/maemoglobal.h @@ -97,6 +97,8 @@ public: template static T *buildStep(const ProjectExplorer::DeployConfiguration *dc) { + if (!dc) + return 0; ProjectExplorer::BuildStepList *bsl = dc->stepList(); if (!bsl) return 0; diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp index 9c3c58ef14e..c95f14ea74b 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp @@ -213,7 +213,8 @@ QString MaemoRunConfiguration::defaultDisplayName() MaemoDeviceConfig MaemoRunConfiguration::deviceConfig() const { - return deployStep()->deviceConfigModel()->current(); + const MaemoDeployStep * const step = deployStep(); + return step ? step->deviceConfigModel()->current() : MaemoDeviceConfig(); } const MaemoToolChain *MaemoRunConfiguration::toolchain() const @@ -232,11 +233,7 @@ const QString MaemoRunConfiguration::gdbCmd() const MaemoDeployStep *MaemoRunConfiguration::deployStep() const { - MaemoDeployStep * const step - = MaemoGlobal::buildStep(target()->activeDeployConfiguration()); - Q_ASSERT_X(step, Q_FUNC_INFO, - "Impossible: Maemo build configuration without deploy step."); - return step; + return MaemoGlobal::buildStep(target()->activeDeployConfiguration()); } const QString MaemoRunConfiguration::sysRoot() const @@ -302,8 +299,10 @@ QString MaemoRunConfiguration::localExecutableFilePath() const QString MaemoRunConfiguration::remoteExecutableFilePath() const { - return deployStep()->deployables() - ->remoteExecutableFilePath(localExecutableFilePath()); + const MaemoDeployStep * const step = deployStep(); + return step + ? step->deployables()->remoteExecutableFilePath(localExecutableFilePath()) + : QString(); } MaemoPortList MaemoRunConfiguration::freePorts() const @@ -381,6 +380,7 @@ void MaemoRunConfiguration::handleDeployConfigChanged() } } updateDeviceConfigurations(); + updateFactoryState(); } QString MaemoRunConfiguration::baseEnvironmentText() const diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfigurationwidget.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfigurationwidget.cpp index 641ac6a652f..2873de4c21b 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfigurationwidget.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfigurationwidget.cpp @@ -79,7 +79,8 @@ MaemoRunConfigurationWidget::MaemoRunConfigurationWidget( : QWidget(parent), m_runConfiguration(runConfiguration), m_ignoreChange(false), - m_deviceEnvReader(new MaemoDeviceEnvReader(this, runConfiguration)) + m_deviceEnvReader(new MaemoDeviceEnvReader(this, runConfiguration)), + m_deployablesConnected(false) { m_lastActiveBuildConfig = m_runConfiguration->activeQt4BuildConfiguration(); QVBoxLayout *mainLayout = new QVBoxLayout; @@ -172,9 +173,10 @@ void MaemoRunConfigurationWidget::addGenericWidgets(QVBoxLayout *mainLayout) SLOT(handleDebuggingTypeChanged())); connect(m_runConfiguration, SIGNAL(targetInformationChanged()), this, SLOT(updateTargetInformation())); - connect(m_runConfiguration->deployStep()->deployables().data(), - SIGNAL(modelReset()), this, SLOT(handleDeploySpecsChanged())); - handleDeploySpecsChanged(); + connect(m_runConfiguration->target(), + SIGNAL(activeDeployConfigurationChanged(ProjectExplorer::DeployConfiguration*)), + SLOT(handleActiveDeployConfigurationChanged())); + handleActiveDeployConfigurationChanged(); } void MaemoRunConfigurationWidget::addDebuggingWidgets(QVBoxLayout *mainLayout) @@ -302,6 +304,24 @@ void MaemoRunConfigurationWidget::updateTargetInformation() ->setText(QDir::toNativeSeparators(m_runConfiguration->localExecutableFilePath())); } +void MaemoRunConfigurationWidget::handleActiveDeployConfigurationChanged() +{ + if (m_deployablesConnected) + return; + MaemoDeployStep * const deployStep = m_runConfiguration->deployStep(); + if (!deployStep) + return; + connect(deployStep->deployables().data(), SIGNAL(modelReset()), + SLOT(handleDeploySpecsChanged())); + handleDeploySpecsChanged(); + m_deployablesConnected = true; + disconnect(m_runConfiguration->target(), + SIGNAL(activeDeployConfigurationChanged(ProjectExplorer::DeployConfiguration*)), + this, + SLOT(handleActiveDeployConfigurationChanged())); + +} + void MaemoRunConfigurationWidget::handleDeploySpecsChanged() { m_remoteExecutableLabel->setText(m_runConfiguration->remoteExecutableFilePath()); diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfigurationwidget.h b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfigurationwidget.h index 1066a82328f..f88daf48649 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfigurationwidget.h +++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfigurationwidget.h @@ -98,6 +98,7 @@ private slots: void handleDeploySpecsChanged(); void handleBuildConfigChanged(); void handleToolchainChanged(); + void handleActiveDeployConfigurationChanged(); private: void addGenericWidgets(QVBoxLayout *mainLayout); @@ -127,6 +128,7 @@ private: MaemoDeviceEnvReader *m_deviceEnvReader; ProjectExplorer::EnvironmentWidget *m_environmentWidget; Qt4BuildConfiguration *m_lastActiveBuildConfig; + bool m_deployablesConnected; }; } // namespace Internal diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunfactories.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemorunfactories.cpp index c61dc72a4d6..14912320e37 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemorunfactories.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunfactories.cpp @@ -163,7 +163,8 @@ bool MaemoRunControlFactory::canRun(RunConfiguration *runConfiguration, { const MaemoRunConfiguration * const maemoRunConfig = qobject_cast(runConfiguration); - if (!maemoRunConfig || !maemoRunConfig->deviceConfig().isValid() + if (!maemoRunConfig + || !maemoRunConfig->deviceConfig().isValid() || !maemoRunConfig->toolchain() || maemoRunConfig->remoteExecutableFilePath().isEmpty()) return false;