diff --git a/src/plugins/ios/iosrunconfiguration.cpp b/src/plugins/ios/iosrunconfiguration.cpp index f607d311c98a0660ad589ddafe797e1816c3e1c5..b097c490df1811a45aa0707ba4db619a4c1e8ded 100644 --- a/src/plugins/ios/iosrunconfiguration.cpp +++ b/src/plugins/ios/iosrunconfiguration.cpp @@ -30,10 +30,12 @@ #include "iosrunconfiguration.h" #include "iosmanager.h" #include "iosdeploystep.h" +#include "ui_iosrunconfiguration.h" #include #include #include +#include #include #include #include @@ -41,7 +43,6 @@ #include #include #include -#include "ui_iosrunconfiguration.h" #include @@ -93,7 +94,43 @@ IosRunConfiguration::IosRunConfiguration(Target *parent, IosRunConfiguration *so void IosRunConfiguration::init() { + QmakeProject *project = static_cast(target()->project()); + m_parseSuccess = project->validParse(m_profilePath); + m_parseInProgress = project->parseInProgress(m_profilePath); + m_lastIsEnabled = isEnabled(); + m_lastDisabledReason = disabledReason(); + connect(DeviceManager::instance(), SIGNAL(updated()), + SLOT(deviceChanges())); + connect(KitManager::instance(), SIGNAL(kitsChanged()), + SLOT(deviceChanges())); + connect(target()->project(), SIGNAL(proFileUpdated(QmakeProjectManager::QmakeProFileNode*,bool,bool)), + this, SLOT(proFileUpdated(QmakeProjectManager::QmakeProFileNode*,bool,bool))); +} + +void IosRunConfiguration::enabledCheck() +{ + bool newIsEnabled = isEnabled(); + QString newDisabledReason = disabledReason(); + if (newDisabledReason != m_lastDisabledReason || newIsEnabled != m_lastIsEnabled) { + m_lastDisabledReason = newDisabledReason; + m_lastIsEnabled = newIsEnabled; + emit enabledChanged(); + } +} + +void IosRunConfiguration::deviceChanges() { setDefaultDisplayName(defaultDisplayName()); + enabledCheck(); +} + +void IosRunConfiguration::proFileUpdated(QmakeProjectManager::QmakeProFileNode *pro, bool success, + bool parseInProgress) +{ + if (m_profilePath != pro->path()) + return; + m_parseSuccess = success; + m_parseInProgress = parseInProgress; + enabledCheck(); } QWidget *IosRunConfiguration::createConfigurationWidget() @@ -210,6 +247,76 @@ QVariantMap IosRunConfiguration::toMap() const return res; } +bool IosRunConfiguration::isEnabled() const +{ + if (m_parseInProgress || !m_parseSuccess) + return false; + Core::Id devType = ProjectExplorer::DeviceTypeKitInformation::deviceTypeId(target()->kit()); + if (devType != Constants::IOS_DEVICE_TYPE && devType != Constants::IOS_SIMULATOR_TYPE) + return false; + IDevice::ConstPtr dev = ProjectExplorer::DeviceKitInformation::device(target()->kit()); + if (dev.isNull() || dev->deviceState() != IDevice::DeviceReadyToUse) + return false; + return RunConfiguration::isEnabled(); +} + +QString IosRunConfiguration::disabledReason() const +{ + if (m_parseInProgress) + return tr("The .pro file '%1' is currently being parsed.") + .arg(QFileInfo(m_profilePath).fileName()); + if (!m_parseSuccess) + return static_cast(target()->project()) + ->disabledReasonForRunConfiguration(m_profilePath); + Core::Id devType = ProjectExplorer::DeviceTypeKitInformation::deviceTypeId(target()->kit()); + if (devType != Constants::IOS_DEVICE_TYPE && devType != Constants::IOS_SIMULATOR_TYPE) + return tr("Kit has incorrect device type for running on iOS devices."); + IDevice::ConstPtr dev = ProjectExplorer::DeviceKitInformation::device(target()->kit()); + QString validDevName; + bool hasConncetedDev = false; + if (devType == Constants::IOS_DEVICE_TYPE) { + DeviceManager *dm = DeviceManager::instance(); + for (int idev = 0; idev < dm->deviceCount(); ++idev) { + IDevice::ConstPtr availDev = dm->deviceAt(idev); + if (!availDev.isNull() && availDev->type() == Constants::IOS_DEVICE_TYPE) { + if (availDev->deviceState() == IDevice::DeviceReadyToUse) { + validDevName += QLatin1String(" "); + validDevName += availDev->displayName(); + } else if (availDev->deviceState() == IDevice::DeviceConnected) { + hasConncetedDev = true; + } + } + } + } + + if (dev.isNull()) { + if (!validDevName.isEmpty()) + return tr("No device chosen. Select %1.").arg(validDevName); // should not happen + else if (hasConncetedDev) + return tr("No device chosen. Enable developer mode on a device."); // should not happen + else + return tr("No device available."); + } else { + switch (dev->deviceState()) { + case IDevice::DeviceReadyToUse: + break; + case IDevice::DeviceConnected: + return tr("To use this device you need to enable developer mode on it."); + case IDevice::DeviceDisconnected: + case IDevice::DeviceStateUnknown: + if (!validDevName.isEmpty()) + return tr("%1 is not connected. Select %2?") + .arg(dev->displayName(), validDevName); + else if (hasConncetedDev) + return tr("%1 is not connected. Enable developer mode on a device?") + .arg(dev->displayName()); + else + return tr("%1 is not connected.").arg(dev->displayName()); + } + } + return RunConfiguration::disabledReason(); +} + IosRunConfigurationWidget::IosRunConfigurationWidget(IosRunConfiguration *runConfiguration) : m_ui(new Ui::IosRunConfiguration), m_runConfiguration(runConfiguration) { diff --git a/src/plugins/ios/iosrunconfiguration.h b/src/plugins/ios/iosrunconfiguration.h index 0c394361fd154ff40667066ae3f0e6366c684d31..02789fe62b277ed3a0962046bf1c3f6bff40b17f 100644 --- a/src/plugins/ios/iosrunconfiguration.h +++ b/src/plugins/ios/iosrunconfiguration.h @@ -36,6 +36,10 @@ #include #include +namespace QmakeProjectManager { +class QmakeProFileNode; +} + namespace Ios { namespace Internal { @@ -60,6 +64,8 @@ public: QString appName() const; Utils::FileName bundleDir() const; Utils::FileName exePath() const; + bool isEnabled() const; + QString disabledReason() const; bool fromMap(const QVariantMap &map) QTC_OVERRIDE; QVariantMap toMap() const QTC_OVERRIDE; @@ -68,12 +74,20 @@ protected: IosRunConfiguration(ProjectExplorer::Target *parent, IosRunConfiguration *source); QString defaultDisplayName(); +private slots: + void proFileUpdated(QmakeProjectManager::QmakeProFileNode *pro, bool success, bool parseInProgress); + void deviceChanges(); private: void init(); + void enabledCheck(); friend class IosRunConfigurationWidget; QString m_profilePath; QStringList m_arguments; + QString m_lastDisabledReason; + bool m_lastIsEnabled; + bool m_parseInProgress; + bool m_parseSuccess; }; } // namespace Internal