diff --git a/libdiscover/Category/Category.h b/libdiscover/Category/Category.h --- a/libdiscover/Category/Category.h +++ b/libdiscover/Category/Category.h @@ -68,6 +68,12 @@ static void sortCategories(QVector& cats); static void addSubcategory(QVector& cats, Category* cat); + /** + * Add a subcategory to this category. This function should only + * be used during the initialisation stage, before adding the local + * root category to the global root category model. + */ + void addSubcategory(Category* cat); void parseData(const QString& path, const QDomNode& data); bool blacklistPlugins(const QSet& pluginName); bool isAddons() const { return m_isAddons; } diff --git a/libdiscover/Category/Category.cpp b/libdiscover/Category/Category.cpp --- a/libdiscover/Category/Category.cpp +++ b/libdiscover/Category/Category.cpp @@ -222,6 +222,19 @@ Q_ASSERT(isSorted(list)); } +void Category::addSubcategory(Category* cat) +{ + int i = 0; + for(Category* subCat : m_subCategories) { + if(!categoryLessThan(subCat, cat)) { + break; + } + ++i; + } + m_subCategories.insert(i, cat); + Q_ASSERT(isSorted(m_subCategories)); +} + bool Category::blacklistPluginsInVector(const QSet& pluginNames, QVector& subCategories) { bool ret = false; diff --git a/libdiscover/backends/KNSBackend/KNSBackend.cpp b/libdiscover/backends/KNSBackend/KNSBackend.cpp --- a/libdiscover/backends/KNSBackend/KNSBackend.cpp +++ b/libdiscover/backends/KNSBackend/KNSBackend.cpp @@ -143,6 +143,17 @@ categories << new Category(cat, {}, { {CategoryFilter, cat } }, backendName, {}, {}, true); } + QVector topCategories{categories}; + for (const auto &cat: categories) { + const QString catName = cat->name().append(QLatin1Char('/')); + for (const auto& potentialSubCat: categories) { + if(potentialSubCat->name().startsWith(catName)) { + cat->addSubcategory(potentialSubCat); + topCategories.removeOne(potentialSubCat); + } + } + } + m_engine = new KNSCore::Engine(this); connect(m_engine, &KNSCore::Engine::signalErrorCode, this, &KNSBackend::signalErrorCode); connect(m_engine, &KNSCore::Engine::signalEntriesLoaded, this, &KNSBackend::receivedEntries, Qt::QueuedConnection);