diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.cpp b/src/plugins/cmakeprojectmanager/builddirmanager.cpp index a8b5e0b56a1..3e082fec103 100644 --- a/src/plugins/cmakeprojectmanager/builddirmanager.cpp +++ b/src/plugins/cmakeprojectmanager/builddirmanager.cpp @@ -375,41 +375,40 @@ bool BuildDirManager::checkConfiguration() return false; // No cache file yet. CMakeConfig newConfig; - QSet changedKeys; - QSet removedKeys; - foreach (const CMakeConfigItem &iBc, m_parameters.configuration) { - const CMakeConfigItem &iCache - = Utils::findOrDefault(cache, [&iBc](const CMakeConfigItem &i) { return i.key == iBc.key; }); - if (iCache.isNull()) { - removedKeys << QString::fromUtf8(iBc.key); - } else if (QString::fromUtf8(iCache.value) != iBc.expandedValue(m_parameters.expander)) { - changedKeys << QString::fromUtf8(iBc.key); - newConfig.append(iCache); + QHash> changedKeys; + foreach (const CMakeConfigItem &projectItem, m_parameters.configuration) { + const QString projectKey = QString::fromUtf8(projectItem.key); + const QString projectValue = projectItem.expandedValue(m_parameters.expander); + const CMakeConfigItem &cmakeItem + = Utils::findOrDefault(cache, [&projectItem](const CMakeConfigItem &i) { return i.key == projectItem.key; }); + const QString iCacheValue = QString::fromUtf8(cmakeItem.value); + if (cmakeItem.isNull()) { + changedKeys.insert(projectKey, qMakePair(tr(""), projectValue)); + } else if (iCacheValue != projectValue) { + changedKeys.insert(projectKey, qMakePair(iCacheValue, projectValue)); + newConfig.append(cmakeItem); } else { - newConfig.append(iBc); + newConfig.append(projectItem); } } - if (!changedKeys.isEmpty() || !removedKeys.isEmpty()) { - QSet total = removedKeys + changedKeys; - QStringList keyList = total.toList(); + if (!changedKeys.isEmpty()) { + QStringList keyList = changedKeys.keys(); Utils::sort(keyList); - QString table = QLatin1String(""); + QString table = QString::fromLatin1("
") + .arg(tr("Key")).arg(tr("CMake")).arg(tr("Project")); foreach (const QString &k, keyList) { - QString change; - if (removedKeys.contains(k)) - change = tr(""); - else - change = QString::fromUtf8(CMakeConfigItem::valueOf(k.toUtf8(), cache)).trimmed(); - if (change.isEmpty()) - change = tr(""); - table += QString::fromLatin1("\n").arg(k).arg(change.toHtmlEscaped()); + const QPair data = changedKeys.value(k); + table += QString::fromLatin1("\n") + .arg(k) + .arg(data.first.toHtmlEscaped()) + .arg(data.second.toHtmlEscaped()); } table += QLatin1String("\n
%1%2%3
%1%2
%1%2%3
"); QPointer box = new QMessageBox(Core::ICore::mainWindow()); box->setText(tr("CMake configuration has changed on disk.")); - box->setInformativeText(tr("The CMakeCache.txt file has changed: %1").arg(table)); + box->setInformativeText(table); auto *defaultButton = box->addButton(tr("Overwrite Changes in CMake"), QMessageBox::RejectRole); auto *applyButton = box->addButton(tr("Apply Changes to Project"), QMessageBox::ApplyRole); box->setDefaultButton(defaultButton); diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp index 0abe72fd7d9..6813b234a45 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp @@ -286,7 +286,7 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) connect(m_resetButton, &QPushButton::clicked, m_configModel, &ConfigModel::resetAllChanges); connect(m_reconfigureButton, &QPushButton::clicked, this, [this]() { - m_buildConfiguration->setConfigurationForCMake(m_configModel->configurationChanges()); + m_buildConfiguration->setConfigurationForCMake(m_configModel->configurationForCMake()); }); connect(m_unsetButton, &QPushButton::clicked, this, [this]() { m_configModel->toggleUnsetFlag(mapToSource(m_configView, m_configView->currentIndex())); @@ -320,7 +320,12 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) connect(m_buildConfiguration->target(), &ProjectExplorer::Target::kitChanged, this, &CMakeBuildSettingsWidget::updateFromKit); connect(m_buildConfiguration, &CMakeBuildConfiguration::enabledChanged, - this, [this]() { setError(m_buildConfiguration->disabledReason()); }); + this, [this]() { + setError(m_buildConfiguration->disabledReason()); + setConfigurationForCMake(); + }); + connect(m_buildConfiguration, &CMakeBuildConfiguration::configurationForCMakeChanged, + this, [this]() { setConfigurationForCMake(); }); updateSelection(QModelIndex(), QModelIndex()); } @@ -381,7 +386,19 @@ void CMakeBuildSettingsWidget::updateFromKit() for (const CMakeConfigItem &i : config) configHash.insert(QString::fromUtf8(i.key), i.expandedValue(k)); - m_configModel->setKitConfiguration(configHash); + m_configModel->setConfigurationFromKit(configHash); +} + +void CMakeBuildSettingsWidget::setConfigurationForCMake() +{ + QHash 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)); + } + m_configModel->setConfigurationForCMake(config); } void CMakeBuildSettingsWidget::updateSelection(const QModelIndex ¤t, const QModelIndex &previous) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h index 6d422dfe1e7..b205d20f770 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h @@ -65,6 +65,7 @@ private: void updateAdvancedCheckBox(); void updateFromKit(); + void setConfigurationForCMake(); void updateSelection(const QModelIndex ¤t, const QModelIndex &previous); QAction *createForceAction(int type, const QModelIndex &idx); diff --git a/src/plugins/cmakeprojectmanager/configmodel.cpp b/src/plugins/cmakeprojectmanager/configmodel.cpp index 7abb52ee5d6..dbd654a1035 100644 --- a/src/plugins/cmakeprojectmanager/configmodel.cpp +++ b/src/plugins/cmakeprojectmanager/configmodel.cpp @@ -94,13 +94,30 @@ void ConfigModel::setConfiguration(const QList &config) setConfiguration(Utils::transform(config, [](const DataItem &di) { return InternalDataItem(di); })); } -void ConfigModel::setKitConfiguration(const QHash &kitConfig) +void ConfigModel::setConfigurationFromKit(const QHash &kitConfig) { m_kitConfiguration = kitConfig; for (InternalDataItem &i : m_configuration) { - if (m_kitConfiguration.contains(i.key)) { + if (m_kitConfiguration.contains(i.key)) i.kitValue = m_kitConfiguration.value(i.key); + } + setConfiguration(m_configuration); +} + +void ConfigModel::setConfigurationForCMake(const QHash &config) +{ + for (InternalDataItem &i : m_configuration) { + if (!config.contains(i.key)) + continue; + + const QString v = config.value(i.key); + if (i.value == v) { + i.newValue.clear(); + i.isUserChanged = false; + } else { + i.newValue = v; + i.isUserChanged = true; } } setConfiguration(m_configuration); @@ -202,7 +219,7 @@ ConfigModel::DataItem ConfigModel::dataItemFromIndex(const QModelIndex &idx) return DataItem(); } -QList ConfigModel::configurationChanges() const +QList ConfigModel::configurationForCMake() const { const QList tmp = Utils::filtered(m_configuration, [](const InternalDataItem &i) { diff --git a/src/plugins/cmakeprojectmanager/configmodel.h b/src/plugins/cmakeprojectmanager/configmodel.h index fbe9b1b0905..26f64d10a80 100644 --- a/src/plugins/cmakeprojectmanager/configmodel.h +++ b/src/plugins/cmakeprojectmanager/configmodel.h @@ -70,7 +70,8 @@ public: const QStringList &values = QStringList()); void setConfiguration(const CMakeConfig &config); void setConfiguration(const QList &config); - void setKitConfiguration(const QHash &kitConfig); + void setConfigurationFromKit(const QHash &kitConfig); + void setConfigurationForCMake(const QHash &config); void flush(); void resetAllChanges(); @@ -84,7 +85,7 @@ public: static DataItem dataItemFromIndex(const QModelIndex &idx); - QList configurationChanges() const; + QList configurationForCMake() const; private: