Examples: Move categorization to examplesparser

For easier testing.

Change-Id: I11f9de3f4fbcc2c85c196f1b59b2147e73ea8209
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
Eike Ziller
2023-05-24 12:38:31 +02:00
parent 0d3d4892c6
commit 8ca4f909e8
4 changed files with 69 additions and 52 deletions

View File

@@ -4,7 +4,6 @@
#include "exampleslistmodel.h" #include "exampleslistmodel.h"
#include "examplesparser.h" #include "examplesparser.h"
#include "qtsupporttr.h"
#include <QBuffer> #include <QBuffer>
#include <QApplication> #include <QApplication>
@@ -326,57 +325,6 @@ static bool isValidExampleOrDemo(ExampleItem *item)
return ok || debugExamples(); return ok || debugExamples();
} }
static bool sortByHighlightedAndName(ExampleItem *first, ExampleItem *second)
{
if (first->isHighlighted && !second->isHighlighted)
return true;
if (!first->isHighlighted && second->isHighlighted)
return false;
return first->name.compare(second->name, Qt::CaseInsensitive) < 0;
}
static QList<std::pair<QString, QList<ExampleItem *>>> getCategories(
const QList<ExampleItem *> &items, bool sortIntoCategories)
{
static const QString otherDisplayName = Tr::tr("Other", "Category for all other examples");
const bool useCategories = sortIntoCategories
|| qtcEnvironmentVariableIsSet("QTC_USE_EXAMPLE_CATEGORIES");
QList<ExampleItem *> other;
QMap<QString, QList<ExampleItem *>> categoryMap;
if (useCategories) {
for (ExampleItem *item : items) {
const QStringList itemCategories = item->metaData.value("category");
for (const QString &category : itemCategories)
categoryMap[category].append(item);
if (itemCategories.isEmpty())
other.append(item);
}
}
QList<std::pair<QString, QList<ExampleItem *>>> categories;
if (categoryMap.isEmpty()) {
// The example set doesn't define categories. Consider the "highlighted" ones as "featured"
QList<ExampleItem *> featured;
QList<ExampleItem *> allOther;
std::tie(featured, allOther) = Utils::partition(items, [](ExampleItem *i) {
return i->isHighlighted;
});
if (!featured.isEmpty())
categories.append({Tr::tr("Featured", "Category for highlighted examples"), featured});
if (!allOther.isEmpty())
categories.append({otherDisplayName, allOther});
} else {
const auto end = categoryMap.constKeyValueEnd();
for (auto it = categoryMap.constKeyValueBegin(); it != end; ++it)
categories.append(*it);
if (!other.isEmpty())
categories.append({otherDisplayName, other});
}
const auto end = categories.end();
for (auto it = categories.begin(); it != end; ++it)
sort(it->second, sortByHighlightedAndName);
return categories;
}
void ExamplesViewController::updateExamples() void ExamplesViewController::updateExamples()
{ {
QString examplesInstallPath; QString examplesInstallPath;

View File

@@ -3,7 +3,10 @@
#include "examplesparser.h" #include "examplesparser.h"
#include "qtsupporttr.h"
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/environment.h>
#include <utils/filepath.h> #include <utils/filepath.h>
#include <utils/stylehelper.h> #include <utils/stylehelper.h>
@@ -298,4 +301,55 @@ expected_str<QList<ExampleItem *>> parseExamples(const QByteArray &manifestData,
return items; return items;
} }
static bool sortByHighlightedAndName(ExampleItem *first, ExampleItem *second)
{
if (first->isHighlighted && !second->isHighlighted)
return true;
if (!first->isHighlighted && second->isHighlighted)
return false;
return first->name.compare(second->name, Qt::CaseInsensitive) < 0;
}
QList<std::pair<QString, QList<ExampleItem *>>> getCategories(const QList<ExampleItem *> &items,
bool sortIntoCategories)
{
static const QString otherDisplayName = Tr::tr("Other", "Category for all other examples");
const bool useCategories = sortIntoCategories
|| qtcEnvironmentVariableIsSet("QTC_USE_EXAMPLE_CATEGORIES");
QList<ExampleItem *> other;
QMap<QString, QList<ExampleItem *>> categoryMap;
if (useCategories) {
for (ExampleItem *item : items) {
const QStringList itemCategories = item->metaData.value("category");
for (const QString &category : itemCategories)
categoryMap[category].append(item);
if (itemCategories.isEmpty())
other.append(item);
}
}
QList<std::pair<QString, QList<ExampleItem *>>> categories;
if (categoryMap.isEmpty()) {
// The example set doesn't define categories. Consider the "highlighted" ones as "featured"
QList<ExampleItem *> featured;
QList<ExampleItem *> allOther;
std::tie(featured, allOther) = Utils::partition(items, [](ExampleItem *i) {
return i->isHighlighted;
});
if (!featured.isEmpty())
categories.append({Tr::tr("Featured", "Category for highlighted examples"), featured});
if (!allOther.isEmpty())
categories.append({otherDisplayName, allOther});
} else {
const auto end = categoryMap.constKeyValueEnd();
for (auto it = categoryMap.constKeyValueBegin(); it != end; ++it)
categories.append(*it);
if (!other.isEmpty())
categories.append({otherDisplayName, other});
}
const auto end = categories.end();
for (auto it = categories.begin(); it != end; ++it)
sort(it->second, sortByHighlightedAndName);
return categories;
}
} // namespace QtSupport::Internal } // namespace QtSupport::Internal

View File

@@ -44,6 +44,9 @@ QTSUPPORT_EXPORT Utils::expected_str<QList<ExampleItem *>> parseExamples(
const Utils::FilePath &demosInstallPath, const Utils::FilePath &demosInstallPath,
bool examples); bool examples);
QTSUPPORT_TEST_EXPORT QList<std::pair<QString, QList<ExampleItem *>>> getCategories(
const QList<ExampleItem *> &items, bool sortIntoCategories);
} // namespace QtSupport::Internal } // namespace QtSupport::Internal
Q_DECLARE_METATYPE(QtSupport::Internal::ExampleItem *) Q_DECLARE_METATYPE(QtSupport::Internal::ExampleItem *)

View File

@@ -12,3 +12,15 @@
#else #else
# define QTSUPPORT_EXPORT Q_DECL_IMPORT # define QTSUPPORT_EXPORT Q_DECL_IMPORT
#endif #endif
#if defined(WITH_TESTS)
# if defined(QTSUPPORT_LIBRARY)
# define QTSUPPORT_TEST_EXPORT Q_DECL_EXPORT
# elif defined(QTSUPPORT_STATIC_LIBRARY)
# define QTSUPPORT_TEST_EXPORT
# else
# define QTSUPPORT_TEST_EXPORT Q_DECL_IMPORT
# endif
#else
# define QTSUPPORT_TEST_EXPORT
#endif