diff --git a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp index c5bf92f8cf5..c8d02c8e98e 100644 --- a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp @@ -29,32 +29,18 @@ #include "qbsprojectmanagerconstants.h" #include "qbsproject.h" -#include #include -#include -#include #include #include #include #include -#include #include -#include - -#include -#include -#include -#include -#include -#include #include -#include #include #include -#include using namespace ProjectExplorer; using namespace Utils; @@ -75,58 +61,28 @@ static QString usingLibraryPathsKey() { return QString("Qbs.RunConfiguration.Usi class QbsRunConfigurationWidget : public QWidget { public: - explicit QbsRunConfigurationWidget(QbsRunConfiguration *rc); + explicit QbsRunConfigurationWidget(QbsRunConfiguration *rc) + { + auto toplayout = new QFormLayout(this); + toplayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); + toplayout->setMargin(0); -private: - void targetInformationHasChanged(); + rc->extraAspect()->addToMainConfigurationWidget(this, toplayout); + rc->extraAspect()->addToMainConfigurationWidget(this, toplayout); + rc->extraAspect()->addToMainConfigurationWidget(this, toplayout); + rc->extraAspect()->addToMainConfigurationWidget(this, toplayout); - QbsRunConfiguration *m_runConfiguration = nullptr; - QLabel *m_executableLineLabel = nullptr; + auto usingLibPathsCheckBox = new QCheckBox; + usingLibPathsCheckBox->setText(QbsRunConfiguration::tr("Add library paths to run environment")); + usingLibPathsCheckBox->setChecked(rc->usingLibraryPaths()); + connect(usingLibPathsCheckBox, &QCheckBox::toggled, + rc, &QbsRunConfiguration::setUsingLibraryPaths); + toplayout->addRow(QString(), usingLibPathsCheckBox); + + Core::VariableChooser::addSupportForChildWidgets(this, rc->macroExpander()); + } }; -QbsRunConfigurationWidget::QbsRunConfigurationWidget(QbsRunConfiguration *rc) -{ - m_runConfiguration = rc; - - auto toplayout = new QFormLayout(this); - toplayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); - toplayout->setMargin(0); - - m_executableLineLabel = new QLabel(this); - m_executableLineLabel->setTextInteractionFlags(Qt::TextSelectableByMouse); - toplayout->addRow(QbsRunConfiguration::tr("Executable:"), m_executableLineLabel); - - m_runConfiguration->extraAspect()->addToMainConfigurationWidget(this, toplayout); - m_runConfiguration->extraAspect()->addToMainConfigurationWidget(this, toplayout); - m_runConfiguration->extraAspect()->addToMainConfigurationWidget(this, toplayout); - - auto usingLibPathsCheckBox = new QCheckBox; - usingLibPathsCheckBox->setText(QbsRunConfiguration::tr("Add library paths to run environment")); - usingLibPathsCheckBox->setChecked(m_runConfiguration->usingLibraryPaths()); - connect(usingLibPathsCheckBox, &QCheckBox::toggled, - m_runConfiguration, &QbsRunConfiguration::setUsingLibraryPaths); - toplayout->addRow(QString(), usingLibPathsCheckBox); - - connect(m_runConfiguration, &QbsRunConfiguration::targetInformationChanged, - this, &QbsRunConfigurationWidget::targetInformationHasChanged, Qt::QueuedConnection); - - connect(m_runConfiguration, &RunConfiguration::enabledChanged, - this, &QbsRunConfigurationWidget::targetInformationHasChanged); - - Core::VariableChooser::addSupportForChildWidgets(this, rc->macroExpander()); - - targetInformationHasChanged(); -} - -void QbsRunConfigurationWidget::targetInformationHasChanged() -{ - WorkingDirectoryAspect *aspect = m_runConfiguration->extraAspect(); - aspect->pathChooser()->setBaseFileName(m_runConfiguration->target()->project()->projectDirectory()); - - QString text = m_runConfiguration->executable(); - m_executableLineLabel->setText(text.isEmpty() ? QbsRunConfiguration::tr("") : text); -} - // -------------------------------------------------------------------- // QbsRunConfiguration: // -------------------------------------------------------------------- @@ -140,30 +96,13 @@ QbsRunConfiguration::QbsRunConfiguration(Target *target) }); addExtraAspect(envAspect); - connect(project(), &Project::parsingFinished, this, - [envAspect]() { envAspect->buildEnvironmentHasChanged(); }); + addExtraAspect(new ExecutableAspect(this)); addExtraAspect(new ArgumentsAspect(this, "Qbs.RunConfiguration.CommandLineArguments")); addExtraAspect(new WorkingDirectoryAspect(this, "Qbs.RunConfiguration.WorkingDirectory")); + addExtraAspect(new TerminalAspect(this, "Qbs.RunConfiguration.UseTerminal")); - addExtraAspect(new TerminalAspect(this, "Qbs.RunConfiguration.UseTerminal", isConsoleApplication())); - - connect(project(), &Project::parsingFinished, this, [this](bool success) { - auto terminalAspect = extraAspect(); - if (success && !terminalAspect->isUserSet()) - terminalAspect->setUseTerminal(isConsoleApplication()); - }); - connect(BuildManager::instance(), &BuildManager::buildStateChanged, this, - [this](Project *p) { - if (p == project() && !BuildManager::isBuilding(p)) { - const QString defaultWorkingDir = baseWorkingDirectory(); - if (!defaultWorkingDir.isEmpty()) { - extraAspect()->setDefaultWorkingDirectory( - Utils::FileName::fromString(defaultWorkingDir)); - } - emit enabledChanged(); - } - } - ); + connect(project(), &Project::parsingFinished, this, + [envAspect]() { envAspect->buildEnvironmentHasChanged(); }); connect(target, &Target::deploymentDataChanged, this, &QbsRunConfiguration::handleBuildSystemDataUpdated); @@ -172,10 +111,9 @@ QbsRunConfiguration::QbsRunConfiguration(Target *target) // Handles device changes, etc. connect(target, &Target::kitChanged, this, &QbsRunConfiguration::handleBuildSystemDataUpdated); -} -QbsRunConfiguration::~QbsRunConfiguration() -{ + connect(target->project(), &Project::parsingFinished, + this, &QbsRunConfiguration::handleBuildSystemDataUpdated); } QVariantMap QbsRunConfiguration::toMap() const @@ -217,7 +155,7 @@ QWidget *QbsRunConfiguration::createConfigurationWidget() Runnable QbsRunConfiguration::runnable() const { StandardRunnable r; - r.executable = executable(); + r.executable = extraAspect()->executable().toString(); r.workingDirectory = extraAspect()->workingDirectory().toString(); r.commandLineArguments = extraAspect()->arguments(); r.runMode = extraAspect()->runMode(); @@ -225,32 +163,12 @@ Runnable QbsRunConfiguration::runnable() const return r; } -QString QbsRunConfiguration::executable() const -{ - BuildTargetInfo bti = target()->applicationTargets().buildTargetInfo(m_buildKey); - return bti.targetFilePath.toString(); -} - -bool QbsRunConfiguration::isConsoleApplication() const -{ - BuildTargetInfo bti = target()->applicationTargets().buildTargetInfo(m_buildKey); - return bti.usesTerminal; -} - void QbsRunConfiguration::setUsingLibraryPaths(bool useLibPaths) { m_usingLibraryPaths = useLibPaths; extraAspect()->environmentChanged(); } -QString QbsRunConfiguration::baseWorkingDirectory() const -{ - const QString exe = executable(); - if (!exe.isEmpty()) - return QFileInfo(exe).absolutePath(); - return QString(); -} - void QbsRunConfiguration::addToBaseEnvironment(Utils::Environment &env) const { BuildTargetInfo bti = target()->applicationTargets().buildTargetInfo(m_buildKey); @@ -278,7 +196,23 @@ Utils::OutputFormatter *QbsRunConfiguration::createOutputFormatter() const void QbsRunConfiguration::handleBuildSystemDataUpdated() { - emit targetInformationChanged(); + BuildTargetInfo bti = target()->applicationTargets().buildTargetInfo(m_buildKey); + FileName executable = bti.targetFilePath; + + auto terminalAspect = extraAspect(); + if (!terminalAspect->isUserSet()) + terminalAspect->setUseTerminal(bti.usesTerminal); + + extraAspect()->setExecutable(executable); + + if (!executable.isEmpty()) { + QString defaultWorkingDir = QFileInfo(executable.toString()).absolutePath(); + if (!defaultWorkingDir.isEmpty()) { + auto wdAspect = extraAspect(); + wdAspect->setDefaultWorkingDirectory(FileName::fromString(defaultWorkingDir)); + } + } + emit enabledChanged(); } diff --git a/src/plugins/qbsprojectmanager/qbsrunconfiguration.h b/src/plugins/qbsprojectmanager/qbsrunconfiguration.h index 23e71df34e0..f1e62f028e6 100644 --- a/src/plugins/qbsprojectmanager/qbsrunconfiguration.h +++ b/src/plugins/qbsprojectmanager/qbsrunconfiguration.h @@ -44,26 +44,17 @@ class QbsRunConfiguration : public ProjectExplorer::RunConfiguration public: explicit QbsRunConfiguration(ProjectExplorer::Target *target); - ~QbsRunConfiguration(); QWidget *createConfigurationWidget() final; - ProjectExplorer::Runnable runnable() const final; - - QString executable() const; Utils::OutputFormatter *createOutputFormatter() const final; void addToBaseEnvironment(Utils::Environment &env) const; QString buildSystemTarget() const final; - bool isConsoleApplication() const; bool usingLibraryPaths() const { return m_usingLibraryPaths; } void setUsingLibraryPaths(bool useLibPaths); -signals: - void targetInformationChanged(); - void usingDyldImageSuffixChanged(bool); - private: QVariantMap toMap() const final; bool fromMap(const QVariantMap &map) final; @@ -71,12 +62,10 @@ private: void doAdditionalSetup(const ProjectExplorer::RunConfigurationCreationInfo &rci) final; bool canRunForNode(const ProjectExplorer::Node *node) const final; - QString baseWorkingDirectory() const; QString defaultDisplayName(); void handleBuildSystemDataUpdated(); bool m_usingLibraryPaths = true; - QString m_buildKey; };