File indexing completed on 2024-05-12 05:36:19

0001 /*
0002     SPDX-FileCopyrightText: 2020 Bhushan Shah <bshah@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #include <QDebug>
0008 #include <QDirIterator>
0009 #include <QPluginLoader>
0010 
0011 #include "gsettingsitem.h"
0012 #include "languagemodel.h"
0013 
0014 LanguageModel::LanguageModel(QObject *parent, GSettingsItem *settings)
0015     : QAbstractListModel(parent)
0016     , m_gsettings(settings)
0017 {
0018     beginResetModel();
0019     loadPlugins();
0020     endResetModel();
0021 }
0022 
0023 void LanguageModel::loadPlugins()
0024 {
0025     const QStringList enabledLangs = m_gsettings->value("enabled-languages").toStringList();
0026 
0027     QStringList langPaths;
0028     QDirIterator it(QStringLiteral(MALIIT_KEYBOARD_LANGUAGES_DIR), {"*plugin.so"}, QDir::NoFilter, QDirIterator::Subdirectories);
0029     while (it.hasNext()) {
0030         langPaths << it.next();
0031     }
0032     m_languages.clear();
0033     for (const auto &langPath : std::as_const(langPaths)) {
0034         QPluginLoader langPlugin(langPath);
0035         const auto &metadata = langPlugin.metaData().value("MetaData").toObject();
0036         Data lang;
0037         lang.langName = metadata.value("Language").toString();
0038         lang.langCode = metadata.value("LanguageId").toString();
0039         lang.enabled = enabledLangs.contains(lang.langCode);
0040         m_languages.append(lang);
0041     }
0042 }
0043 
0044 QVariant LanguageModel::data(const QModelIndex &index, int role) const
0045 {
0046     if (!index.isValid()) {
0047         return QVariant();
0048     }
0049 
0050     if (index.row() >= m_languages.size()) {
0051         return QVariant();
0052     }
0053 
0054     const Data data = m_languages.at(index.row());
0055     switch (role) {
0056     case EnabledRole:
0057         return data.enabled;
0058     case NameRole:
0059         return data.langName;
0060     case LanguageIdRole:
0061         return data.langCode;
0062     }
0063 
0064     return QVariant();
0065 }
0066 
0067 bool LanguageModel::setData(const QModelIndex &index, const QVariant &value, int role)
0068 {
0069     if (!index.isValid()) {
0070         return QAbstractListModel::setData(index, value, role);
0071     }
0072 
0073     if (role == EnabledRole) {
0074         Data &data = m_languages[index.row()];
0075         if (data.enabled != value.toBool()) {
0076             data.enabled = value.toBool();
0077         }
0078         Q_EMIT dataChanged(this->index(index.row(), 0), this->index(index.row(), 0));
0079     }
0080 
0081     QStringList enabledLangs;
0082     for (const auto &data : std::as_const(m_languages)) {
0083         if (data.enabled) {
0084             enabledLangs << data.langCode;
0085         }
0086     }
0087     m_gsettings->set("enabled-languages", enabledLangs);
0088     return QAbstractListModel::setData(index, value, role);
0089 }
0090 
0091 int LanguageModel::rowCount(const QModelIndex &parent) const
0092 {
0093     Q_UNUSED(parent)
0094     return m_languages.size();
0095 }
0096 
0097 QHash<int, QByteArray> LanguageModel::roleNames() const
0098 {
0099     return {
0100         {NameRole, "name"},
0101         {EnabledRole, "enabled"},
0102         {LanguageIdRole, "langId"},
0103     };
0104 }