CMake: Fix the config model merging data

Old user-settings used to get lost.

Change-Id: I5197c3b57b12d94e7464a86261a1364dd9aca266
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Tobias Hunger
2016-12-01 15:24:36 +01:00
parent ea220ccec1
commit 5a88e4c9ad
2 changed files with 23 additions and 9 deletions

View File

@@ -28,6 +28,7 @@
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <QCoreApplication>
#include <QFont> #include <QFont>
namespace CMakeProjectManager { namespace CMakeProjectManager {
@@ -100,7 +101,7 @@ QVariant ConfigModel::data(const QModelIndex &index, int role) const
case Qt::EditRole: case Qt::EditRole:
return item.key; return item.key;
case Qt::ToolTipRole: case Qt::ToolTipRole:
return item.description; return item.toolTip();
case Qt::FontRole: { case Qt::FontRole: {
QFont font; QFont font;
font.setItalic(item.isCMakeChanged); font.setItalic(item.isCMakeChanged);
@@ -127,7 +128,7 @@ QVariant ConfigModel::data(const QModelIndex &index, int role) const
return font; return font;
} }
case Qt::ToolTipRole: case Qt::ToolTipRole:
return item.description; return item.toolTip();
default: default:
return QVariant(); return QVariant();
} }
@@ -135,7 +136,7 @@ QVariant ConfigModel::data(const QModelIndex &index, int role) const
case 2: case 2:
switch (role) { switch (role) {
case Qt::EditRole: case Qt::EditRole:
return QString::fromLatin1("0"); return "0";
case Qt::DisplayRole: case Qt::DisplayRole:
return QString::fromLatin1(item.isAdvanced ? "1" : "0"); return QString::fromLatin1(item.isAdvanced ? "1" : "0");
case Qt::CheckStateRole: case Qt::CheckStateRole:
@@ -246,12 +247,16 @@ void ConfigModel::setConfiguration(const QList<ConfigModel::DataItem> &config)
result << InternalDataItem(*newIt); result << InternalDataItem(*newIt);
++newIt; ++newIt;
} else if (newIt->key > oldIt->key) { } else if (newIt->key > oldIt->key) {
// skip old entry: // Keep old user settings, but skip other entries:
if (oldIt->isUserChanged || oldIt->isUserNew)
result << InternalDataItem(*oldIt);
++oldIt; ++oldIt;
} else { } else {
// merge old/new entry: // merge old/new entry:
InternalDataItem item(*newIt); InternalDataItem item(*newIt);
item.newValue = (newIt->value != oldIt->newValue) ? oldIt->newValue : QString();
item.isCMakeChanged = (oldIt->value != newIt->value); item.isCMakeChanged = (oldIt->value != newIt->value);
item.isUserChanged = !item.newValue.isEmpty() && (item.newValue != item.value);
result << item; result << item;
++newIt; ++newIt;
++oldIt; ++oldIt;
@@ -326,9 +331,16 @@ const ConfigModel::InternalDataItem &ConfigModel::itemAtRow(int row) const
return m_configuration[row]; return m_configuration[row];
} }
ConfigModel::InternalDataItem::InternalDataItem(const ConfigModel::DataItem &item) : DataItem(item), ConfigModel::InternalDataItem::InternalDataItem(const ConfigModel::DataItem &item) : DataItem(item)
isUserChanged(false), isUserNew(false), isCMakeChanged(false)
{ } { }
QString ConfigModel::InternalDataItem::toolTip() const
{
QStringList tooltip(description);
if (!value.isEmpty() && !newValue.isEmpty() && value != newValue)
tooltip << QCoreApplication::translate("CMakeProjectManager", "Current CMake: %1").arg(value);
return tooltip.join("<br>");
}
} // namespace CMakeProjectManager } // namespace CMakeProjectManager

View File

@@ -82,9 +82,11 @@ private:
InternalDataItem(const DataItem &item); InternalDataItem(const DataItem &item);
InternalDataItem(const InternalDataItem &item) = default; InternalDataItem(const InternalDataItem &item) = default;
bool isUserChanged; QString toolTip() const;
bool isUserNew;
bool isCMakeChanged; bool isUserChanged = false;
bool isUserNew = false;
bool isCMakeChanged = false;
QString newValue; QString newValue;
}; };