aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp')
-rw-r--r--src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp174
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 &current, const QModelIndex &previous)