From 0923d8676eb6ce7e1af5fc54c83f399eb0ec6648 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Mon, 24 Jan 2022 13:41:13 +0100 Subject: [PATCH] CMakePM: Display CMake kit mismatch values in Settings page updateFromKit() is now called on parsingFinished and the configuration values that differ from the ones in the Kit's CMake configuration will be displayed in red. The "Initial Configuration" page will display the mismatches between kit's CMake configuration and initial parameters. The "Current Configuration" page will display the mismatches between the initial parameters and the current CMake parameters. The Tooltip is displayed with a bit of more space between values for more readability. Change-Id: I6ebfa71951cf979ab08f097befed2d43b74e4d6e Reviewed-by: Reviewed-by: Eike Ziller --- .../cmakebuildconfiguration.cpp | 3 + .../cmakeprojectmanager/configmodel.cpp | 88 +++++++++++++------ src/plugins/cmakeprojectmanager/configmodel.h | 5 +- 3 files changed, 66 insertions(+), 30 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 6facbb8cab7..d7ecacc0668 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -353,6 +353,8 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) m_showProgressTimer.start(); }); + m_configModel->setMacroExpander(m_buildConfiguration->macroExpander()); + if (bc->buildSystem()->isParsing()) m_showProgressTimer.start(); else { @@ -368,6 +370,7 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) m_configModel->setInitialParametersConfiguration( m_buildConfiguration->initialCMakeConfiguration()); m_buildConfiguration->filterConfigArgumentsFromAdditionalCMakeArguments(); + updateFromKit(); m_configView->expandAll(); m_configView->setEnabled(true); stretcher->stretch(); diff --git a/src/plugins/cmakeprojectmanager/configmodel.cpp b/src/plugins/cmakeprojectmanager/configmodel.cpp index 83e326e530d..aa74f3986b6 100644 --- a/src/plugins/cmakeprojectmanager/configmodel.cpp +++ b/src/plugins/cmakeprojectmanager/configmodel.cpp @@ -26,6 +26,7 @@ #include "configmodel.h" #include +#include #include #include @@ -315,34 +316,37 @@ void ConfigModel::setConfiguration(const QList &c generateTree(); } +Utils::MacroExpander *ConfigModel::macroExpander() const +{ + return m_macroExpander; +} + +void ConfigModel::setMacroExpander(Utils::MacroExpander *newExpander) +{ + m_macroExpander = newExpander; +} + void ConfigModel::generateTree() { + QHash initialHash; + for (const InternalDataItem &di : m_configuration) + if (di.isInitial) + initialHash.insert(di.key, di); + auto root = new Utils::TreeItem; - for (InternalDataItem &di : m_configuration) + for (InternalDataItem &di : m_configuration) { + auto it = initialHash.find(di.key); + if (it != initialHash.end()) + di.initialValue = macroExpander()->expand(it->value); + root->appendChild(new Internal::ConfigModelTreeItem(&di)); + } setRootItem(root); } ConfigModel::InternalDataItem::InternalDataItem(const ConfigModel::DataItem &item) : DataItem(item) { } -QString ConfigModel::InternalDataItem::toolTip() const -{ - QString desc = description; - if (isAdvanced) - desc += QCoreApplication::translate("CMakeProjectManager::ConfigModel", " (ADVANCED)"); - QStringList tooltip(desc); - if (inCMakeCache) { - if (value != newValue) - tooltip << QCoreApplication::translate("CMakeProjectManager", "Current CMake: %1").arg(value); - } else { - tooltip << QCoreApplication::translate("CMakeProjectManager", "Not in CMakeCache.txt").arg(value); - } - if (!kitValue.isEmpty()) - tooltip << QCoreApplication::translate("CMakeProjectManager::ConfigModel", "Current kit: %1").arg(kitValue); - return tooltip.join("
"); -} - QString ConfigModel::InternalDataItem::currentValue() const { if (isUnset) @@ -414,9 +418,15 @@ QVariant ConfigModelTreeItem::data(int column, int role) const font.setStrikeOut((!dataItem->inCMakeCache && !dataItem->isUserNew) || dataItem->isUnset); return font; } - case Qt::ForegroundRole: - return Utils::creatorTheme()->color((!dataItem->kitValue.isNull() && dataItem->kitValue != value) - ? Utils::Theme::TextColorHighlight : Utils::Theme::TextColorNormal); + case Qt::ForegroundRole: { + bool mismatch = false; + if (dataItem->isInitial) + mismatch = !dataItem->kitValue.isEmpty() && dataItem->kitValue != value; + else + mismatch = !dataItem->initialValue.isEmpty() && dataItem->initialValue != value; + return Utils::creatorTheme()->color(mismatch ? Utils::Theme::TextColorHighlight + : Utils::Theme::TextColorNormal); + } case Qt::ToolTipRole: { return toolTip(); } @@ -492,16 +502,36 @@ Qt::ItemFlags ConfigModelTreeItem::flags(int column) const QString ConfigModelTreeItem::toolTip() const { QTC_ASSERT(dataItem, return QString()); - QStringList tooltip(dataItem->description); - if (!dataItem->kitValue.isEmpty()) - tooltip << QCoreApplication::translate("CMakeProjectManager", "Value requested by kit: %1").arg(dataItem->kitValue); - if (dataItem->inCMakeCache) { + QStringList tooltip; + if (!dataItem->description.isEmpty()) + tooltip << dataItem->description; + + if (dataItem->isInitial) { + if (!dataItem->kitValue.isEmpty()) + tooltip << QCoreApplication::translate("CMakeProjectManager", "

Kit: %1

") + .arg(dataItem->kitValue); + if (dataItem->value != dataItem->newValue) - tooltip << QCoreApplication::translate("CMakeProjectManager", "Current CMake: %1").arg(dataItem->value); - } else { - tooltip << QCoreApplication::translate("CMakeProjectManager", "Not in CMakeCache.txt"); + tooltip << QCoreApplication::translate("CMakeProjectManager", + "

Initial Configuration: %1

") + .arg(dataItem->value); + } else { + if (!dataItem->initialValue.isEmpty()) + tooltip << QCoreApplication::translate("CMakeProjectManager", + "

Initial Configuration: %1

") + .arg(dataItem->initialValue); + + if (dataItem->inCMakeCache) { + if (dataItem->value != dataItem->newValue) + tooltip << QCoreApplication::translate("CMakeProjectManager", + "

Current Configuration: %1

") + .arg(dataItem->value); + } else { + tooltip << QCoreApplication::translate("CMakeProjectManager", + "

Not in CMakeCache.txt

"); + } } - return tooltip.join("
"); + return tooltip.join(""); } QString ConfigModelTreeItem::currentValue() const diff --git a/src/plugins/cmakeprojectmanager/configmodel.h b/src/plugins/cmakeprojectmanager/configmodel.h index 03192cad6ff..87f37fcaed6 100644 --- a/src/plugins/cmakeprojectmanager/configmodel.h +++ b/src/plugins/cmakeprojectmanager/configmodel.h @@ -162,6 +162,8 @@ public: QList configurationForCMake() const; + Utils::MacroExpander *macroExpander() const; + void setMacroExpander(Utils::MacroExpander *newExpander); private: class InternalDataItem : public DataItem @@ -170,13 +172,13 @@ private: InternalDataItem(const DataItem &item); InternalDataItem(const InternalDataItem &item) = default; - QString toolTip() const; QString currentValue() const; bool isUserChanged = false; bool isUserNew = false; QString newValue; QString kitValue; + QString initialValue; }; void generateTree(); @@ -184,6 +186,7 @@ private: void setConfiguration(const QList &config); QList m_configuration; KitConfiguration m_kitConfiguration; + Utils::MacroExpander *m_macroExpander = nullptr; friend class Internal::ConfigModelTreeItem; };