Warning, file /network/kdeconnect-kde/interfaces/pluginmodel.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /**
0002  * SPDX-FileCopyrightText: 2019 Nicolas Fella <nicolas.fella@gmx.de>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 
0007 #include "pluginmodel.h"
0008 
0009 #include <QDebug>
0010 
0011 #include <KConfigGroup>
0012 #include <KPluginLoader>
0013 
0014 PluginModel::PluginModel(QObject *parent)
0015     : QAbstractListModel(parent)
0016 {
0017     connect(this, &QAbstractItemModel::rowsInserted, this, &PluginModel::rowsChanged);
0018     connect(this, &QAbstractItemModel::rowsRemoved, this, &PluginModel::rowsChanged);
0019 
0020     beginResetModel();
0021     m_plugins = KPluginLoader::findPlugins(QStringLiteral("kdeconnect/"));
0022     endResetModel();
0023 }
0024 
0025 PluginModel::~PluginModel()
0026 {
0027 }
0028 
0029 void PluginModel::setDeviceId(const QString &deviceId)
0030 {
0031     if (deviceId == m_deviceId)
0032         return;
0033 
0034     m_deviceId = deviceId;
0035     DeviceDbusInterface *device = new DeviceDbusInterface(m_deviceId);
0036     m_config = KSharedConfig::openConfig(device->pluginsConfigFile());
0037 }
0038 
0039 QVariant PluginModel::data(const QModelIndex &index, int role) const
0040 {
0041     if (!index.isValid()) {
0042         return QVariant();
0043     }
0044 
0045     const KPluginMetaData &pluginEntry = m_plugins[index.row()];
0046 
0047     switch (role) {
0048     case Qt::CheckStateRole: {
0049         const QString def = pluginEntry.isEnabledByDefault() ? QStringLiteral("true") : QStringLiteral("false");
0050         return m_config->group("Plugins").readEntry(QStringLiteral("%1Enabled").arg(pluginEntry.pluginId()), def) == QStringLiteral("true");
0051     }
0052     case Qt::DisplayRole:
0053         return pluginEntry.name();
0054     case IconRole:
0055         return pluginEntry.iconName();
0056     case IdRole:
0057         return pluginEntry.pluginId();
0058     case ConfigSourceRole: {
0059         const QString configFile =
0060             QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("kdeconnect/%1_config.qml").arg(pluginEntry.pluginId()));
0061         if (configFile.isEmpty())
0062             return QUrl();
0063 
0064         return QUrl::fromLocalFile(configFile);
0065     }
0066     case DescriptionRole:
0067         return pluginEntry.description();
0068     default:
0069         return QVariant();
0070     }
0071 }
0072 
0073 QHash<int, QByteArray> PluginModel::roleNames() const
0074 {
0075     QHash<int, QByteArray> roles = QAbstractItemModel::roleNames();
0076     roles[Qt::DisplayRole] = "name";
0077     roles[Qt::CheckStateRole] = "isChecked";
0078     roles[IconRole] = "iconName";
0079     roles[IdRole] = "pluginId";
0080     roles[ConfigSourceRole] = "configSource";
0081     roles[DescriptionRole] = "description";
0082     return roles;
0083 }
0084 
0085 bool PluginModel::setData(const QModelIndex &index, const QVariant &value, int role)
0086 {
0087     if (!index.isValid()) {
0088         return false;
0089     }
0090 
0091     bool ret = false;
0092 
0093     if (role == Qt::CheckStateRole) {
0094         const KPluginMetaData &pluginEntry = m_plugins[index.row()];
0095         m_config->group("Plugins").writeEntry(QStringLiteral("%1Enabled").arg(pluginEntry.pluginId()), value);
0096         ret = true;
0097     }
0098 
0099     m_config->sync();
0100 
0101     if (ret) {
0102         Q_EMIT dataChanged(index, index);
0103     }
0104 
0105     return ret;
0106 }
0107 
0108 int PluginModel::rowCount(const QModelIndex &parent) const
0109 {
0110     if (parent.isValid()) {
0111         return 0;
0112     }
0113 
0114     return m_plugins.size();
0115 }
0116 
0117 QString PluginModel::deviceId()
0118 {
0119     return m_deviceId;
0120 }