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 }