Dynamic languages in selector

Similar to categories, Languages in the selector are now shown based on the library.
This commit is contained in:
Nikhil Tanwar 2023-07-11 15:30:17 +05:30
parent 574d1e2a29
commit 71f8c2f8f4
4 changed files with 34 additions and 29 deletions

View File

@ -71,6 +71,7 @@ ContentManager::ContentManager(Library* library, kiwix::Downloader* downloader,
connect(&m_remoteLibraryManager, &OpdsRequestManager::languagesReceived, this, &ContentManager::updateLanguages); connect(&m_remoteLibraryManager, &OpdsRequestManager::languagesReceived, this, &ContentManager::updateLanguages);
connect(&m_remoteLibraryManager, &OpdsRequestManager::categoriesReceived, this, &ContentManager::updateCategories); connect(&m_remoteLibraryManager, &OpdsRequestManager::categoriesReceived, this, &ContentManager::updateCategories);
setCategories(); setCategories();
setLanguages();
} }
QList<QMap<QString, QVariant>> ContentManager::getBooksList() QList<QMap<QString, QVariant>> ContentManager::getBooksList()
@ -147,6 +148,7 @@ void ContentManager::setLocal(bool local) {
m_local = local; m_local = local;
emit(filterParamsChanged()); emit(filterParamsChanged());
setCategories(); setCategories();
setLanguages();
} }
QStringList ContentManager::getTranslations(const QStringList &keys) QStringList ContentManager::getTranslations(const QStringList &keys)
@ -187,6 +189,7 @@ void ContentManager::setLanguages()
languages.push_back({langCode, selfName}); languages.push_back({langCode, selfName});
} }
m_languages = languages; m_languages = languages;
emit(languagesLoaded(m_languages));
return; return;
} }
m_remoteLibraryManager.getLanguagesFromOpds(); m_remoteLibraryManager.getLanguagesFromOpds();
@ -631,6 +634,7 @@ void ContentManager::updateLanguages(const QString& content) {
tempLanguages.push_back({code, title}); tempLanguages.push_back({code, title});
} }
m_languages = tempLanguages; m_languages = tempLanguages;
emit(languagesLoaded(m_languages));
} }
void ContentManager::updateCategories(const QString& content) {; void ContentManager::updateCategories(const QString& content) {;

View File

@ -16,9 +16,9 @@ class ContentManager : public QObject
Q_PROPERTY(QStringList bookIds READ getBookIds NOTIFY booksChanged) Q_PROPERTY(QStringList bookIds READ getBookIds NOTIFY booksChanged)
Q_PROPERTY(QStringList downloadIds READ getDownloadIds NOTIFY downloadsChanged) Q_PROPERTY(QStringList downloadIds READ getDownloadIds NOTIFY downloadsChanged)
Q_PROPERTY(QString currentLanguage MEMBER m_currentLanguage WRITE setCurrentLanguage NOTIFY currentLangChanged) Q_PROPERTY(QString currentLanguage MEMBER m_currentLanguage WRITE setCurrentLanguage NOTIFY currentLangChanged)
typedef QList<QPair<QString, QString>> LanguageList;
public: public:
typedef QList<QPair<QString, QString>> LanguageList;
explicit ContentManager(Library* library, kiwix::Downloader *downloader, QObject *parent = nullptr); explicit ContentManager(Library* library, kiwix::Downloader *downloader, QObject *parent = nullptr);
virtual ~ContentManager() {} virtual ~ContentManager() {}
@ -65,6 +65,7 @@ signals:
void currentLangChanged(); void currentLangChanged();
void pendingRequest(const bool); void pendingRequest(const bool);
void categoriesLoaded(QStringList); void categoriesLoaded(QStringList);
void languagesLoaded(LanguageList);
public slots: public slots:
QStringList getTranslations(const QStringList &keys); QStringList getTranslations(const QStringList &keys);

View File

@ -93,30 +93,9 @@ ContentManagerSide::ContentManagerSide(QWidget *parent) :
} }
setCategories(KiwixApp::instance()->getContentManager()->getCategories()); setCategories(KiwixApp::instance()->getContentManager()->getCategories());
setLanguages(KiwixApp::instance()->getContentManager()->getLanguages());
connect(KiwixApp::instance()->getContentManager(), &ContentManager::categoriesLoaded, this, &ContentManagerSide::setCategories); connect(KiwixApp::instance()->getContentManager(), &ContentManager::categoriesLoaded, this, &ContentManagerSide::setCategories);
connect(KiwixApp::instance()->getContentManager(), &ContentManager::languagesLoaded, this, &ContentManagerSide::setLanguages);
for(auto lang: S_LANGUAGES)
{
auto currentLang = QLocale().language();
auto locale = QLocale(lang);
if (locale.language() != lang) {
// Qt may not find the locale for the lang :/
// In this case, Qt return the current locale
// So we must be sure that the locale found correspond to the lang we want to add,
// else we may add several time the current language.
continue;
}
auto item = new KListWidgetItem(QLocale::languageToString(locale.language()));
item->setData(Qt::UserRole, lang);
mp_languageSelector->addItem(item);
if (lang == currentLang) {
item->setSelected(true);
}
}
mp_languageSelector->sortItems();
auto item = new KListWidgetItem("All");
item->setData(Qt::UserRole, QLocale::AnyLanguage);
mp_languageSelector->insertItem(0, item);
} }
ContentManagerSide::~ContentManagerSide() ContentManagerSide::~ContentManagerSide()
@ -131,14 +110,12 @@ void ContentManagerSide::setContentManager(ContentManager *contentManager)
this, [=]() { this, [=]() {
auto item = mp_languageSelector->selectedItems().at(0); auto item = mp_languageSelector->selectedItems().at(0);
if (!item) return; if (!item) return;
auto langId = item->data(Qt::UserRole).toInt(); auto lang = item->data(Qt::UserRole).toString();
auto lang = QLocale::Language(langId); if (lang == "all") {
if (lang == QLocale::AnyLanguage) {
mp_contentManager->setCurrentLanguage("*"); mp_contentManager->setCurrentLanguage("*");
return; return;
} }
auto locale = QLocale(lang); mp_contentManager->setCurrentLanguage(lang);
mp_contentManager->setCurrentLanguage(locale.name().split("_").at(0));
}); });
connect(mp_categorySelector, &QListWidget::itemSelectionChanged, connect(mp_categorySelector, &QListWidget::itemSelectionChanged,
this, [=]() { this, [=]() {
@ -173,3 +150,25 @@ void ContentManagerSide::setCategories(QStringList categories)
} }
} }
} }
void ContentManagerSide::setLanguages(ContentManager::LanguageList langList)
{
mp_languageSelector->blockSignals(true);
mp_languageSelector->setHidden(true);
mp_languageSelector->clear();
mp_languageSelector->blockSignals(false);
for(auto lang: langList)
{
auto currentLang = QLocale().language();
auto item = new KListWidgetItem(lang.second);
item->setData(Qt::UserRole, lang.first);
mp_languageSelector->addItem(item);
if (lang.second == QLocale::languageToString(currentLang)) {
item->setSelected(true);
}
}
mp_languageSelector->sortItems();
auto item = new KListWidgetItem("All");
item->setData(Qt::UserRole, "all");
mp_languageSelector->insertItem(0, item);
}

View File

@ -33,6 +33,7 @@ private:
public slots: public slots:
void setCategories(QStringList); void setCategories(QStringList);
void setLanguages(ContentManager::LanguageList);
}; };
#endif // CONTENTMANAGERSIDE_H #endif // CONTENTMANAGERSIDE_H