diff --git a/src/attica/atticaprovider.cpp b/src/attica/atticaprovider.cpp --- a/src/attica/atticaprovider.cpp +++ b/src/attica/atticaprovider.cpp @@ -121,10 +121,17 @@ Attica::ListJob *job = static_cast*>(listJob); Category::List categoryList = job->itemList(); + QList categoryMetadataList; foreach (const Category &category, categoryList) { if (mCategoryMap.contains(category.name())) { - qCDebug(KNEWSTUFFCORE) << "Adding category: " << category.name(); + qCDebug(KNEWSTUFFCORE) << "Adding category: " << category.name() << category.displayName(); mCategoryMap[category.name()] = category; + + CategoryMetadata categoryMetadata; + categoryMetadata.id = category.id(); + categoryMetadata.name = category.name(); + categoryMetadata.displayName = category.displayName(); + categoryMetadataList << categoryMetadata; } } @@ -140,6 +147,7 @@ if (correct) { mInitialized = true; emit providerInitialized(this); + emit categoriesMetadataLoded(categoryMetadataList); } else { emit signalError(i18n("All categories are missing")); } diff --git a/src/core/engine.h b/src/core/engine.h --- a/src/core/engine.h +++ b/src/core/engine.h @@ -131,6 +131,8 @@ QStringList categories() const; QStringList categoriesFilter() const; + QList categoriesMetadata(); + Q_SIGNALS: /** * Indicates a message to be added to the ui's log, or sent to a messagebox @@ -159,6 +161,8 @@ void signalBusy(const QString &); void signalIdle(const QString &); + void signalCategoriesMetadataLoded(const QList &categories); + private Q_SLOTS: // the .knsrc file was loaded void slotProviderFileLoaded(const QDomDocument &doc); @@ -200,6 +204,7 @@ void doRequest(); + //FIXME KF6: move all of this in EnginePrivate // handle installation of entries Installation *m_installation; // read/write cache of entries @@ -231,7 +236,6 @@ // If the provider is ready to be used bool m_initialized; - Q_DISABLE_COPY(Engine) }; diff --git a/src/core/engine.cpp b/src/core/engine.cpp --- a/src/core/engine.cpp +++ b/src/core/engine.cpp @@ -53,6 +53,30 @@ using namespace KNSCore; +class EnginePrivate { +public: + QList categoriesMetadata; +}; + +// BCI: Add a real d-pointer +typedef QHash EnginePrivateHash; +Q_GLOBAL_STATIC(EnginePrivateHash, d_func) +static EnginePrivate *d(const Engine* engine) +{ + EnginePrivate* ret = d_func()->value(engine); + if (!ret) { + ret = new EnginePrivate; + d_func()->insert(engine, ret); + } + return ret; +} +static void delete_d(const Engine* engine) +{ + EnginePrivate* ret = d_func()->value(engine); + delete ret; + d_func()->remove(engine); +} + Engine::Engine(QObject *parent) : QObject(parent) , m_installation(new Installation) @@ -84,6 +108,7 @@ delete m_atticaProviderManager; delete m_searchTimer; delete m_installation; + delete_d(this); } bool Engine::init(const QString &configfile) @@ -147,6 +172,11 @@ return m_currentRequest.categories; } +QList Engine::categoriesMetadata() +{ + return d(this)->categoriesMetadata; +} + void Engine::loadProviders() { if (m_providerFileUrl.isEmpty()) { @@ -192,6 +222,11 @@ QSharedPointer provider; if (isAtticaProviderFile || n.attribute(QStringLiteral("type")).toLower() == QLatin1String("rest")) { provider = QSharedPointer (new AtticaProvider(m_categories)); + connect(provider.data(), &Provider::categoriesMetadataLoded, + this, [this](const QList &categories){ + d(this)->categoriesMetadata = categories; + emit signalCategoriesMetadataLoded(categories); + }); } else { provider = QSharedPointer (new StaticXmlProvider); } @@ -215,6 +250,11 @@ } QSharedPointer provider = QSharedPointer (new AtticaProvider(atticaProvider, m_categories)); + connect(provider.data(), &Provider::categoriesMetadataLoded, + this, [this](const QList &categories){ + d(this)->categoriesMetadata = categories; + emit signalCategoriesMetadataLoded(categories); + }); addProvider(provider); } diff --git a/src/core/provider.h b/src/core/provider.h --- a/src/core/provider.h +++ b/src/core/provider.h @@ -85,6 +85,15 @@ }; /** + * Describes a category: id/name/disaplayName + */ + struct CategoryMetadata { + QString id; + QString name; + QString displayName; + }; + + /** * Constructor. */ Provider(); @@ -165,6 +174,8 @@ void signalInformation(const QString &) const; void signalError(const QString &) const; + void categoriesMetadataLoded(const QList &categories); + protected: QString mName; QUrl mIcon; diff --git a/src/downloadwidget.cpp b/src/downloadwidget.cpp --- a/src/downloadwidget.cpp +++ b/src/downloadwidget.cpp @@ -177,7 +177,8 @@ engine->setCategoriesFilter(QStringList()); } else { - QString category = ui.m_categoryCombo->currentText(); + QString category = ui.m_categoryCombo->currentData().toString(); + if (!category.isEmpty()) { QStringList filter(category); engine->setCategoriesFilter(filter); @@ -285,11 +286,19 @@ ui.m_categoryCombo->setVisible(false); } else { ui.m_categoryCombo->addItem(i18n("All Categories")); - foreach (const QString &category, categories) { - ui.m_categoryCombo->addItem(category); - } + //NOTE: categories will be populated when we will get metadata from the server } + connect(engine, &KNSCore::Engine::signalCategoriesMetadataLoded, + this, [this](const QList &categories) { + for (auto data : categories) { + if (!data.displayName.isEmpty()) { + ui.m_categoryCombo->addItem(data.displayName, data.name); + } else { + ui.m_categoryCombo->addItem(data.name, data.name); + } + } + }); ui.detailsStack->widget(0)->layout()->setMargin(0); ui.detailsStack->widget(1)->layout()->setMargin(0);