From e867f9ef11d30d4a5ecd5d14c954df485d26db8b Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 24 Jun 2024 11:40:42 +0200 Subject: [PATCH] Welcome: Fix the order of Qt versions for examples There are two sources for examples: Qt versions directly, and "example sets", which are just a tuple of display name, documentation path, examples path. The Qt installer registers an "example set" for Qt versions, so to avoid duplicate entries we match Qt versions to example sets, if found. This destroys any order the Qt versions might have been in before. Order the results by Qt version (and other sets last) by first creating all the items regardless of origin (noting their Qt version in the user data), and sorting them before adding to the model. Also use constants for the different user data fields. Fixes: QTCREATORBUG-31108 Change-Id: I827be892a3abe17fa6afcd3c6f39bf225f7af494 Reviewed-by: Christian Stenger --- src/plugins/qtsupport/exampleslistmodel.cpp | 93 +++++++++++++-------- 1 file changed, 59 insertions(+), 34 deletions(-) diff --git a/src/plugins/qtsupport/exampleslistmodel.cpp b/src/plugins/qtsupport/exampleslistmodel.cpp index bb424077855..01c808275d3 100644 --- a/src/plugins/qtsupport/exampleslistmodel.cpp +++ b/src/plugins/qtsupport/exampleslistmodel.cpp @@ -28,12 +28,14 @@ #include #include -#include -#include using namespace Core; using namespace Utils; +const int kQtVersionIdRole = Qt::UserRole; +const int kExtraSetIndexRole = Qt::UserRole + 1; +const int kVersionRole = Qt::UserRole + 2; + namespace QtSupport { namespace Internal { @@ -112,43 +114,66 @@ ExampleSetModel::ExampleSetModel() &ExampleSetModel::helpManagerInitialized); } -void ExampleSetModel::recreateModel(const QtVersions &qtVersions) +void ExampleSetModel::recreateModel(const QtVersions &qtVersionsIn) { beginResetModel(); clear(); QHash extraManifestDirs; - for (int i = 0; i < m_extraExampleSets.size(); ++i) { + for (int i = 0; i < m_extraExampleSets.size(); ++i) + extraManifestDirs.insert(FilePath::fromUserInput(m_extraExampleSets.at(i).manifestPath), i); + + // Sanitize away qt versions that have already been added through extra sets. + // This way we do not have entries for Qt/Android, Qt/Desktop, Qt/MinGW etc pp, + // but only the one "QtX X.Y.Z" entry that is registered as an example set by the installer. + const QtVersions qtVersions + = Utils::filtered(qtVersionsIn, [this, &extraManifestDirs](QtVersion *v) { + if (extraManifestDirs.contains(v->docsPath())) { + m_extraExampleSets[extraManifestDirs.value(v->docsPath())].qtVersion + = v->qtVersion(); + qCDebug(log) << "Not showing Qt version because manifest path is already added " + "through InstalledExamples settings:" + << v->displayName(); + return false; + } + return true; + }); + + QList items; + for (int i = 0; i < m_extraExampleSets.size(); ++i) { const ExtraExampleSet &set = m_extraExampleSets.at(i); auto newItem = new QStandardItem(); newItem->setData(set.displayName, Qt::DisplayRole); - newItem->setData(set.displayName, Qt::UserRole + 1); - newItem->setData(QVariant(), Qt::UserRole + 2); - newItem->setData(i, Qt::UserRole + 3); - appendRow(newItem); - - extraManifestDirs.insert(FilePath::fromUserInput(set.manifestPath), i); + newItem->setData(QVariant(), kQtVersionIdRole); + newItem->setData(i, kExtraSetIndexRole); + newItem->setData(QVariant::fromValue(set.qtVersion), kVersionRole); + items.append(newItem); } - - for (QtVersion *version : qtVersions) { - // Sanitize away qt versions that have already been added through extra sets. - // This way we do not have entries for Qt/Android, Qt/Desktop, Qt/MinGW etc pp, - // but only the one "QtX X.Y.Z" entry that is registered as an example set by the installer. - if (extraManifestDirs.contains(version->docsPath())) { - m_extraExampleSets[extraManifestDirs.value(version->docsPath())].qtVersion - = version->qtVersion(); - qCDebug(log) << "Not showing Qt version because manifest path is already added " - "through InstalledExamples settings:" - << version->displayName(); - continue; - } + items += Utils::transform(qtVersions, [](QtVersion *v) { auto newItem = new QStandardItem(); - newItem->setData(version->displayName(), Qt::DisplayRole); - newItem->setData(version->displayName(), Qt::UserRole + 1); - newItem->setData(version->uniqueId(), Qt::UserRole + 2); - newItem->setData(QVariant(), Qt::UserRole + 3); - appendRow(newItem); - } + newItem->setData(v->displayName(), Qt::DisplayRole); + newItem->setData(v->uniqueId(), kQtVersionIdRole); + newItem->setData(QVariant(), kExtraSetIndexRole); + newItem->setData(QVariant::fromValue(v->qtVersion()), kVersionRole); + return newItem; + }); + + // Sort by Qt version, example sets not associated to Qt last + Utils::sort(items, [](QStandardItem *a, QStandardItem *b) { + const QVersionNumber versionB = b->data(kVersionRole).value(); + if (versionB.isNull()) + return true; + const QVersionNumber versionA = a->data(kVersionRole).value(); + if (versionA.isNull()) + return false; + if (versionA == versionB) + return a->data(Qt::DisplayRole).toString() < b->data(Qt::DisplayRole).toString(); + return versionA < versionB; + }); + + for (QStandardItem *item : std::as_const(items)) + appendRow(item); + endResetModel(); } @@ -179,7 +204,7 @@ QVariant ExampleSetModel::getDisplayName(int i) const { if (i < 0 || i >= rowCount()) return QVariant(); - return data(index(i, 0), Qt::UserRole + 1); + return data(index(i, 0), Qt::DisplayRole); } // id is either the Qt version uniqueId, or the display name of the extra example set @@ -188,7 +213,7 @@ QVariant ExampleSetModel::getId(int i) const if (i < 0 || i >= rowCount()) return QVariant(); QModelIndex modelIndex = index(i, 0); - QVariant variant = data(modelIndex, Qt::UserRole + 2); + QVariant variant = data(modelIndex, kQtVersionIdRole); if (variant.isValid()) // set from qt version return variant; return getDisplayName(i); @@ -199,7 +224,7 @@ ExampleSetModel::ExampleSetType ExampleSetModel::getType(int i) const if (i < 0 || i >= rowCount()) return InvalidExampleSet; QModelIndex modelIndex = index(i, 0); - QVariant variant = data(modelIndex, Qt::UserRole + 2); /*Qt version uniqueId*/ + QVariant variant = data(modelIndex, kQtVersionIdRole); /*Qt version uniqueId*/ if (variant.isValid()) return QtExampleSet; return ExtraExampleSetType; @@ -209,7 +234,7 @@ int ExampleSetModel::getQtId(int i) const { QTC_ASSERT(i >= 0, return -1); QModelIndex modelIndex = index(i, 0); - QVariant variant = data(modelIndex, Qt::UserRole + 2); + QVariant variant = data(modelIndex, kQtVersionIdRole); QTC_ASSERT(variant.isValid(), return -1); QTC_ASSERT(variant.canConvert(), return -1); return variant.toInt(); @@ -224,7 +249,7 @@ int ExampleSetModel::getExtraExampleSetIndex(int i) const { QTC_ASSERT(i >= 0, return -1); QModelIndex modelIndex = index(i, 0); - QVariant variant = data(modelIndex, Qt::UserRole + 3); + QVariant variant = data(modelIndex, kExtraSetIndexRole); QTC_ASSERT(variant.isValid(), return -1); QTC_ASSERT(variant.canConvert(), return -1); return variant.toInt();