diff options
Diffstat (limited to 'src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp')
-rw-r--r-- | src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp | 174 |
1 files changed, 93 insertions, 81 deletions
diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp index 3464fd7291..1baebfc8b4 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp @@ -25,39 +25,32 @@ #include "cmakebuildsettingswidget.h" +#include "cmakebuildconfiguration.h" +#include "cmakebuildsystem.h" +#include "cmakeconfigitem.h" +#include "cmakekitinformation.h" #include "configmodel.h" #include "configmodelitemdelegate.h" -#include "cmakekitinformation.h" -#include "cmakeproject.h" -#include "cmakebuildconfiguration.h" -#include <coreplugin/icore.h> #include <coreplugin/find/itemviewfind.h> -#include <projectexplorer/kitmanager.h> +#include <projectexplorer/buildaspects.h> #include <projectexplorer/project.h> -#include <projectexplorer/projectexplorer.h> #include <projectexplorer/target.h> #include <qtsupport/qtbuildaspects.h> +#include <utils/algorithm.h> #include <utils/categorysortfiltermodel.h> #include <utils/detailswidget.h> -#include <utils/fancylineedit.h> #include <utils/headerviewstretcher.h> #include <utils/infolabel.h> #include <utils/itemviews.h> -#include <utils/pathchooser.h> #include <utils/progressindicator.h> +#include <utils/qtcassert.h> #include <QBoxLayout> #include <QCheckBox> -#include <QComboBox> -#include <QFrame> #include <QGridLayout> -#include <QLabel> #include <QPushButton> -#include <QSortFilterProxyModel> -#include <QSpacerItem> -#include <QStyledItemDelegate> #include <QMenu> using namespace ProjectExplorer; @@ -105,20 +98,18 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) mainLayout->setContentsMargins(0, 0, 0, 0); mainLayout->setColumnStretch(1, 10); - auto project = bc->project(); - - auto buildDirChooser = new Utils::PathChooser; - buildDirChooser->setBaseDirectory(project->projectDirectory()); - buildDirChooser->setFileName(bc->buildDirectory()); - connect(buildDirChooser, &Utils::PathChooser::rawPathChanged, this, - [this](const QString &path) { - m_configModel->flush(); // clear out config cache... - m_buildConfiguration->setBuildDirectory(Utils::FilePath::fromString(path)); - }); - int row = 0; - mainLayout->addWidget(new QLabel(tr("Build directory:")), row, 0); - mainLayout->addWidget(buildDirChooser, row, 1, 1, 2); + auto buildDirAspect = bc->buildDirectoryAspect(); + connect(buildDirAspect, &ProjectConfigurationAspect::changed, this, [this]() { + m_configModel->flush(); // clear out config cache...; + }); + auto initialCMakeAspect = bc->aspect<InitialCMakeArgumentsAspect>(); + auto aspectWidget = new QWidget; + LayoutBuilder aspectWidgetBuilder(aspectWidget); + buildDirAspect->addToLayout(aspectWidgetBuilder); + aspectWidgetBuilder.startNewRow(); + initialCMakeAspect->addToLayout(aspectWidgetBuilder); + mainLayout->addWidget(aspectWidget, row, 0, 1, 2); ++row; auto qmlDebugAspect = bc->aspect<QtSupport::QmlDebuggingAspect>(); @@ -133,11 +124,6 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) mainLayout->addItem(new QSpacerItem(20, 10), row, 0); ++row; - m_errorMessageLabel = new Utils::InfoLabel({}, Utils::InfoLabel::Error); - m_errorMessageLabel->setVisible(false); - mainLayout->addWidget(m_errorMessageLabel, row, 0, 1, -1, Qt::AlignHCenter); - - ++row; m_warningMessageLabel = new Utils::InfoLabel({}, Utils::InfoLabel::Warning); m_warningMessageLabel->setVisible(false); mainLayout->addWidget(m_warningMessageLabel, row, 0, 1, -1, Qt::AlignHCenter); @@ -167,7 +153,6 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) m_configTextFilterModel->setSourceModel(m_configFilterModel); m_configTextFilterModel->setSortRole(Qt::DisplayRole); m_configTextFilterModel->setFilterKeyColumn(-1); - m_configTextFilterModel->setFilterCaseSensitivity(Qt::CaseInsensitive); connect(m_configTextFilterModel, &QAbstractItemModel::layoutChanged, this, [this]() { QModelIndex selectedIdx = m_configView->currentIndex(); @@ -257,18 +242,17 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) m_configView->expandAll(); } - connect(bc->target(), &Target::parsingFinished, this, [this, buildDirChooser, stretcher] { + connect(bc->target(), &Target::parsingFinished, this, [this, stretcher] { m_configModel->setConfiguration(m_buildConfiguration->configurationFromCMake()); m_configView->expandAll(); m_configView->setEnabled(true); stretcher->stretch(); updateButtonState(); - buildDirChooser->triggerChanged(); // refresh valid state... handleQmlDebugCxxFlags(); m_showProgressTimer.stop(); m_progressIndicator->hide(); }); - connect(m_buildConfiguration, &CMakeBuildConfiguration::errorOccured, + connect(m_buildConfiguration, &CMakeBuildConfiguration::errorOccurred, this, [this]() { m_showProgressTimer.stop(); m_progressIndicator->hide(); @@ -286,13 +270,20 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) connect(m_showAdvancedCheckBox, &QCheckBox::stateChanged, this, &CMakeBuildSettingsWidget::updateAdvancedCheckBox); - connect(m_filterEdit, &QLineEdit::textChanged, - m_configTextFilterModel, &QSortFilterProxyModel::setFilterFixedString); + connect(m_filterEdit, + &QLineEdit::textChanged, + m_configTextFilterModel, + [this](const QString &txt) { + m_configTextFilterModel->setFilterRegularExpression( + QRegularExpression(QRegularExpression::escape(txt), + QRegularExpression::CaseInsensitiveOption)); + }); connect(m_resetButton, &QPushButton::clicked, m_configModel, &ConfigModel::resetAllChanges); - connect(m_reconfigureButton, &QPushButton::clicked, this, [this]() { - m_buildConfiguration->setConfigurationForCMake(m_configModel->configurationForCMake()); - }); + connect(m_reconfigureButton, + &QPushButton::clicked, + m_buildConfiguration, + &CMakeBuildConfiguration::runCMakeWithExtraArguments); connect(m_unsetButton, &QPushButton::clicked, this, [this]() { m_configModel->toggleUnsetFlag(mapToSource(m_configView, m_configView->currentIndex())); }); @@ -323,8 +314,8 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) m_configView->edit(idx); }); - connect(bc, &CMakeBuildConfiguration::errorOccured, this, &CMakeBuildSettingsWidget::setError); - connect(bc, &CMakeBuildConfiguration::warningOccured, this, &CMakeBuildSettingsWidget::setWarning); + connect(bc, &CMakeBuildConfiguration::errorOccurred, this, &CMakeBuildSettingsWidget::setError); + connect(bc, &CMakeBuildConfiguration::warningOccurred, this, &CMakeBuildSettingsWidget::setWarning); updateFromKit(); connect(m_buildConfiguration->target(), &ProjectExplorer::Target::kitChanged, @@ -332,19 +323,14 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) connect(m_buildConfiguration, &CMakeBuildConfiguration::enabledChanged, this, [this]() { setError(m_buildConfiguration->disabledReason()); - setConfigurationForCMake(); }); - connect(m_buildConfiguration, &CMakeBuildConfiguration::configurationForCMakeChanged, - this, [this]() { setConfigurationForCMake(); }); updateSelection(QModelIndex(), QModelIndex()); } void CMakeBuildSettingsWidget::setError(const QString &message) { - bool showError = !message.isEmpty(); - m_errorMessageLabel->setVisible(showError); - m_errorMessageLabel->setText(message); + m_buildConfiguration->buildDirectoryAspect()->setProblem(message); } void CMakeBuildSettingsWidget::setWarning(const QString &message) @@ -360,6 +346,42 @@ void CMakeBuildSettingsWidget::updateButtonState() const bool hasChanges = m_configModel->hasChanges(); m_resetButton->setEnabled(hasChanges && !isParsing); m_reconfigureButton->setEnabled((hasChanges || m_configModel->hasCMakeChanges()) && !isParsing); + + // Update extra data in buildconfiguration + const QList<ConfigModel::DataItem> changes = m_configModel->configurationForCMake(); + + const CMakeConfig configChanges = Utils::transform(changes, [](const ConfigModel::DataItem &i) { + CMakeConfigItem ni; + ni.key = i.key.toUtf8(); + ni.value = i.value.toUtf8(); + ni.documentation = i.description.toUtf8(); + ni.isAdvanced = i.isAdvanced; + ni.isUnset = i.isUnset; + ni.inCMakeCache = i.inCMakeCache; + ni.values = i.values; + switch (i.type) { + case CMakeProjectManager::ConfigModel::DataItem::BOOLEAN: + ni.type = CMakeConfigItem::BOOL; + break; + case CMakeProjectManager::ConfigModel::DataItem::FILE: + ni.type = CMakeConfigItem::FILEPATH; + break; + case CMakeProjectManager::ConfigModel::DataItem::DIRECTORY: + ni.type = CMakeConfigItem::PATH; + break; + case CMakeProjectManager::ConfigModel::DataItem::STRING: + ni.type = CMakeConfigItem::STRING; + break; + case CMakeProjectManager::ConfigModel::DataItem::UNKNOWN: + default: + ni.type = CMakeConfigItem::INTERNAL; + break; + } + return ni; + }); + + m_buildConfiguration->setExtraCMakeArguments( + Utils::transform(configChanges, [](const CMakeConfigItem &i) { return i.toArgument(); })); } void CMakeBuildSettingsWidget::updateAdvancedCheckBox() @@ -393,49 +415,39 @@ void CMakeBuildSettingsWidget::handleQmlDebugCxxFlags() const auto aspect = m_buildConfiguration->aspect<QtSupport::QmlDebuggingAspect>(); const bool enable = aspect->setting() == TriState::Enabled; - CMakeConfig changedConfig = m_buildConfiguration->configurationForCMake(); const CMakeConfig configList = m_buildConfiguration->configurationFromCMake(); const QByteArrayList cxxFlags{"CMAKE_CXX_FLAGS", "CMAKE_CXX_FLAGS_DEBUG", "CMAKE_CXX_FLAGS_RELWITHDEBINFO"}; const QByteArray qmlDebug("-DQT_QML_DEBUG"); - for (CMakeConfigItem item : configList) { - CMakeConfigItem it(item); + CMakeConfig changedConfig; + + for (const CMakeConfigItem &item : configList) { + if (!cxxFlags.contains(item.key)) + continue; - if (cxxFlags.contains(it.key)) { - if (enable) { - if (!it.value.contains(qmlDebug)) { - it.value = it.value.append(' ').append(qmlDebug); - changed = true; - } - } else { - int index = it.value.indexOf(qmlDebug); - if (index != -1) { - it.value.remove(index, qmlDebug.length()); - changed = true; - } + CMakeConfigItem it(item); + if (enable) { + if (!it.value.contains(qmlDebug)) { + it.value = it.value.append(' ').append(qmlDebug); + changed = true; + } + } else { + int index = it.value.indexOf(qmlDebug); + if (index != -1) { + it.value.remove(index, qmlDebug.length()); + changed = true; } - it.value = it.value.trimmed(); - changedConfig.append(it); } + it.value = it.value.trimmed(); + changedConfig.append(it); } - if (!changed) - return; - - m_buildConfiguration->setConfigurationForCMake(changedConfig); -} - -void CMakeBuildSettingsWidget::setConfigurationForCMake() -{ - QHash<QString, QString> config; - const CMakeConfig configList = m_buildConfiguration->configurationForCMake(); - for (const CMakeConfigItem &i : configList) { - config.insert(QString::fromUtf8(i.key), - CMakeConfigItem::expandedValueOf(m_buildConfiguration->target()->kit(), - i.key, configList)); + if (changed) { + m_buildConfiguration->setExtraCMakeArguments( + Utils::transform(changedConfig, + [](const CMakeConfigItem &i) { return i.toArgument(); })); } - m_configModel->setConfigurationForCMake(config); } void CMakeBuildSettingsWidget::updateSelection(const QModelIndex ¤t, const QModelIndex &previous) |