forked from qt-creator/qt-creator
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:
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 *)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user