diff --git a/src/plugins/ios/iosrunconfiguration.cpp b/src/plugins/ios/iosrunconfiguration.cpp index 334f27345d2..a7c8851d56b 100644 --- a/src/plugins/ios/iosrunconfiguration.cpp +++ b/src/plugins/ios/iosrunconfiguration.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -87,7 +88,7 @@ void IosDeviceTypeAspect::updateDeviceType() m_deviceType = IosDeviceType(IosDeviceType::SimulatedDevice); } -bool IosRunConfiguration::isEnabled() const +bool IosRunConfiguration::isEnabled(Id runMode) const { Utils::Id devType = DeviceTypeKitAspect::deviceTypeId(kit()); if (devType != Constants::IOS_DEVICE_TYPE && devType != Constants::IOS_SIMULATOR_TYPE) @@ -99,6 +100,12 @@ bool IosRunConfiguration::isEnabled() const if (dev.isNull() || dev->deviceState() != IDevice::DeviceReadyToUse) return false; + IosDevice::ConstPtr iosdevice = dev.dynamicCast(); + if (iosdevice && iosdevice->handler() == IosDevice::Handler::DeviceCtl + && runMode != ProjectExplorer::Constants::NORMAL_RUN_MODE) { + return false; + } + return true; } @@ -223,7 +230,7 @@ void IosDeviceTypeAspect::toMap(Store &map) const map.insert(deviceTypeKey, QVariant::fromValue(deviceType().toMap())); } -QString IosRunConfiguration::disabledReason() const +QString IosRunConfiguration::disabledReason(Id runMode) const { Utils::Id devType = DeviceTypeKitAspect::deviceTypeId(kit()); if (devType != Constants::IOS_DEVICE_TYPE && devType != Constants::IOS_SIMULATOR_TYPE) @@ -270,8 +277,14 @@ QString IosRunConfiguration::disabledReason() const else return Tr::tr("%1 is not connected.").arg(dev->displayName()); } + IosDevice::ConstPtr iosdevice = dev.dynamicCast(); + if (iosdevice && iosdevice->handler() == IosDevice::Handler::DeviceCtl + && runMode != ProjectExplorer::Constants::NORMAL_RUN_MODE) { + return Tr::tr("Debugging and profiling is currently not supported for devices with iOS " + "17 and later."); + } } - return RunConfiguration::disabledReason(); + return RunConfiguration::disabledReason(runMode); } IosDeviceType IosRunConfiguration::deviceType() const diff --git a/src/plugins/ios/iosrunconfiguration.h b/src/plugins/ios/iosrunconfiguration.h index da890ae3e5e..865d9c88089 100644 --- a/src/plugins/ios/iosrunconfiguration.h +++ b/src/plugins/ios/iosrunconfiguration.h @@ -70,11 +70,11 @@ public: QString applicationName() const; Utils::FilePath bundleDirectory() const; Utils::FilePath localExecutable() const; - QString disabledReason() const override; + QString disabledReason(Utils::Id runMode) const override; IosDeviceType deviceType() const; private: - bool isEnabled() const final; + bool isEnabled(Utils::Id runMode) const final; ProjectExplorer::ExecutableAspect executable{this}; ProjectExplorer::ArgumentsAspect arguments{this}; diff --git a/src/plugins/mcusupport/mcusupportrunconfiguration.cpp b/src/plugins/mcusupport/mcusupportrunconfiguration.cpp index b87b527f411..9e936c4faeb 100644 --- a/src/plugins/mcusupport/mcusupportrunconfiguration.cpp +++ b/src/plugins/mcusupport/mcusupportrunconfiguration.cpp @@ -59,12 +59,12 @@ public: connect(target->project(), &Project::displayNameChanged, this, &RunConfiguration::update); } - bool isEnabled() const override + bool isEnabled(Utils::Id runMode) const override { if (disabled) return false; - return RunConfiguration::isEnabled(); + return RunConfiguration::isEnabled(runMode); } static bool disabled; diff --git a/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp b/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp index 4341e14cf77..dc810bac326 100644 --- a/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp +++ b/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp @@ -46,7 +46,7 @@ CustomExecutableRunConfiguration::CustomExecutableRunConfiguration(Target *targe setDefaultDisplayName(defaultDisplayName()); } -bool CustomExecutableRunConfiguration::isEnabled() const +bool CustomExecutableRunConfiguration::isEnabled(Id) const { return true; } diff --git a/src/plugins/projectexplorer/customexecutablerunconfiguration.h b/src/plugins/projectexplorer/customexecutablerunconfiguration.h index 39199f4b4a1..ced9892c016 100644 --- a/src/plugins/projectexplorer/customexecutablerunconfiguration.h +++ b/src/plugins/projectexplorer/customexecutablerunconfiguration.h @@ -21,7 +21,7 @@ public: private: Utils::ProcessRunData runnable() const override; - bool isEnabled() const override; + bool isEnabled(Utils::Id) const override; Tasks checkForIssues() const override; void configurationDialogFinished(); diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 11318ef9cec..b2b2f5fc61d 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -2980,7 +2980,7 @@ void ProjectExplorerPlugin::runRunConfiguration(RunConfiguration *rc, Id runMode, const bool forceSkipDeploy) { - if (!rc->isEnabled()) + if (!rc->isEnabled(runMode)) return; const auto delay = [rc, runMode] { dd->m_runMode = runMode; @@ -3004,7 +3004,7 @@ void ProjectExplorerPlugin::runRunConfiguration(RunConfiguration *rc, delay(); break; case BuildForRunConfigStatus::NotBuilding: - if (rc->isEnabled()) + if (rc->isEnabled(runMode)) dd->executeRunConfiguration(rc, runMode); else delay(); @@ -3108,8 +3108,8 @@ expected_str ProjectExplorerPlugin::canRunStartupProject(Utils::Id runMode .arg(target->displayName(), project->displayName())); } - if (!activeRC->isEnabled()) - return make_unexpected(activeRC->disabledReason()); + if (!activeRC->isEnabled(runMode)) + return make_unexpected(activeRC->disabledReason(runMode)); if (dd->m_projectExplorerSettings.buildBeforeDeploy != BuildBeforeRunMode::Off && dd->m_projectExplorerSettings.deployBeforeRun diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index 30fda9b0442..be59ad0eaa6 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -186,13 +186,13 @@ RunConfiguration::RunConfiguration(Target *target, Utils::Id id) RunConfiguration::~RunConfiguration() = default; -QString RunConfiguration::disabledReason() const +QString RunConfiguration::disabledReason(Utils::Id) const { BuildSystem *bs = activeBuildSystem(); return bs ? bs->disabledReason(m_buildKey) : Tr::tr("No build system active"); } -bool RunConfiguration::isEnabled() const +bool RunConfiguration::isEnabled(Utils::Id) const { BuildSystem *bs = activeBuildSystem(); return bs && bs->hasParsingData(); diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index 629fcd2c614..2054a840c14 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -78,8 +78,8 @@ class PROJECTEXPLORER_EXPORT RunConfiguration : public ProjectConfiguration public: ~RunConfiguration() override; - virtual QString disabledReason() const; - virtual bool isEnabled() const; + virtual QString disabledReason(Utils::Id runMode) const; + virtual bool isEnabled(Utils::Id runMode) const; QWidget *createConfigurationWidget(); diff --git a/src/plugins/projectexplorer/runsettingspropertiespage.cpp b/src/plugins/projectexplorer/runsettingspropertiespage.cpp index 75980d8ccba..ec18f68c603 100644 --- a/src/plugins/projectexplorer/runsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/runsettingspropertiespage.cpp @@ -8,6 +8,7 @@ #include "buildstepspage.h" #include "deployconfiguration.h" #include "projectconfigurationmodel.h" +#include "projectexplorerconstants.h" #include "projectexplorertr.h" #include "runconfiguration.h" #include "target.h" @@ -523,8 +524,12 @@ void RunSettingsWidget::removeSubWidgets() void RunSettingsWidget::updateEnabledState() { - const bool enable = m_runConfiguration ? m_runConfiguration->isEnabled() : false; - const QString reason = m_runConfiguration ? m_runConfiguration->disabledReason() : QString(); + const bool enable = m_runConfiguration + ? m_runConfiguration->isEnabled(Constants::NORMAL_RUN_MODE) + : false; + const QString reason = m_runConfiguration + ? m_runConfiguration->disabledReason(Constants::NORMAL_RUN_MODE) + : QString(); m_runConfigurationWidget->setEnabled(enable); diff --git a/src/plugins/projectexplorer/target.cpp b/src/plugins/projectexplorer/target.cpp index 8231366dfce..7028ffc459f 100644 --- a/src/plugins/projectexplorer/target.cpp +++ b/src/plugins/projectexplorer/target.cpp @@ -18,6 +18,7 @@ #include "project.h" #include "projectconfigurationmodel.h" #include "projectexplorer.h" +#include "projectexplorerconstants.h" #include "projectexplorericons.h" #include "projectexplorersettings.h" #include "projectexplorertr.h" @@ -780,12 +781,12 @@ void Target::updateDefaultRunConfigurations() // Make sure a configured RC will be active after we delete the RCs: RunConfiguration *active = activeRunConfiguration(); - if (active && (removalList.contains(active) || !active->isEnabled())) { + if (active && (removalList.contains(active) || !active->isEnabled(Constants::NORMAL_RUN_MODE))) { RunConfiguration *newConfiguredDefault = newConfigured.isEmpty() ? nullptr : newConfigured.at(0); - RunConfiguration *rc - = Utils::findOrDefault(existingConfigured, - [](RunConfiguration *rc) { return rc->isEnabled(); }); + RunConfiguration *rc = Utils::findOrDefault(existingConfigured, [](RunConfiguration *rc) { + return rc->isEnabled(Constants::NORMAL_RUN_MODE); + }); if (!rc) { rc = Utils::findOr(newConfigured, newConfiguredDefault, Utils::equal(&RunConfiguration::displayName, project()->displayName())); diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp index 19c57f12206..77650c9dd81 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp @@ -57,8 +57,8 @@ public: QmlProjectRunConfiguration(Target *target, Id id); private: - QString disabledReason() const final; - bool isEnabled() const final; + QString disabledReason(Utils::Id runMode) const final; + bool isEnabled(Utils::Id) const final; FilePath mainScript() const; FilePath qmlRuntimeFilePath() const; @@ -180,7 +180,7 @@ QmlProjectRunConfiguration::QmlProjectRunConfiguration(Target *target, Id id) update(); } -QString QmlProjectRunConfiguration::disabledReason() const +QString QmlProjectRunConfiguration::disabledReason(Utils::Id runMode) const { if (mainScript().isEmpty()) return Tr::tr("No script file to execute."); @@ -193,7 +193,7 @@ QString QmlProjectRunConfiguration::disabledReason() const } if (viewer.isEmpty()) return Tr::tr("No QML utility specified for target device."); - return RunConfiguration::disabledReason(); + return RunConfiguration::disabledReason(runMode); } FilePath QmlProjectRunConfiguration::qmlRuntimeFilePath() const @@ -306,7 +306,7 @@ void QmlProjectRunConfiguration::setupQtVersionAspect() } } -bool QmlProjectRunConfiguration::isEnabled() const +bool QmlProjectRunConfiguration::isEnabled(Id) const { return const_cast(this)->qmlMainFile.isQmlFilePresent() && !commandLine().executable().isEmpty()