File indexing completed on 2024-05-12 05:12:43
0001 /* 0002 SPDX-FileCopyrightText: 2010 Volker Krause <vkrause@kde.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "agentconfigmodel.h" 0008 0009 #include "akonadiconsole_debug.h" 0010 #include <QDBusInterface> 0011 #include <QMetaMethod> 0012 0013 AgentConfigModel::AgentConfigModel(QObject *parent) 0014 : QAbstractTableModel(parent) 0015 { 0016 } 0017 0018 AgentConfigModel::~AgentConfigModel() 0019 { 0020 delete m_interface; 0021 } 0022 0023 void AgentConfigModel::setAgentInstance(const Akonadi::AgentInstance &instance) 0024 { 0025 beginResetModel(); 0026 m_settings.clear(); 0027 0028 m_interface = new QDBusInterface(QStringLiteral("org.freedesktop.Akonadi.Agent.%1").arg(instance.identifier()), QStringLiteral("/Settings")); 0029 if (!m_interface->isValid()) { 0030 qCritical() << "Unable to obtain KConfigXT D-Bus interface of agent" << instance.identifier(); 0031 delete m_interface; 0032 return; 0033 } 0034 endResetModel(); 0035 reload(); 0036 } 0037 0038 void AgentConfigModel::reload() 0039 { 0040 beginResetModel(); 0041 m_settings.clear(); 0042 for (int i = 0; i < m_interface->metaObject()->methodCount(); ++i) { 0043 const QMetaMethod method = m_interface->metaObject()->method(i); 0044 if (QByteArray(method.typeName()).isEmpty()) { // returns void 0045 continue; 0046 } 0047 const QByteArray signature(method.methodSignature()); 0048 if (signature.isEmpty()) { 0049 continue; 0050 } 0051 if (signature.startsWith("set") || !signature.contains("()")) { // setter or takes parameters // krazy:exclude=strings 0052 continue; 0053 } 0054 if (signature.startsWith("Introspect")) { // D-Bus stuff // krazy:exclude=strings 0055 continue; 0056 } 0057 const QString methodName = QString::fromLatin1(signature.left(signature.indexOf('('))); 0058 const QDBusMessage reply = m_interface->call(methodName); 0059 if (reply.arguments().count() != 1) { 0060 qCCritical(AKONADICONSOLE_LOG) << "call to method" << signature << "failed: " << reply.arguments() << reply.errorMessage(); 0061 continue; 0062 } 0063 const QString settingName = methodName.at(0).toUpper() + methodName.mid(1); 0064 m_settings.append(qMakePair(settingName, reply.arguments().at(0))); 0065 } 0066 endResetModel(); 0067 } 0068 0069 int AgentConfigModel::columnCount(const QModelIndex &parent) const 0070 { 0071 Q_UNUSED(parent) 0072 return 3; 0073 } 0074 0075 int AgentConfigModel::rowCount(const QModelIndex &parent) const 0076 { 0077 Q_UNUSED(parent) 0078 return m_settings.size(); 0079 } 0080 0081 QVariant AgentConfigModel::data(const QModelIndex &index, int role) const 0082 { 0083 if (index.row() < 0 || index.row() >= m_settings.size()) { 0084 return {}; 0085 } 0086 QPair<QString, QVariant> setting = m_settings.at(index.row()); 0087 if (role == Qt::DisplayRole || role == Qt::EditRole) { 0088 if (index.column() == 0) { 0089 return setting.first; 0090 } else if (index.column() == 1) { 0091 if (setting.second.metaType().id() == QMetaType::QStringList) { 0092 return setting.second.toStringList().join(QStringLiteral(", ")); 0093 } else { 0094 return setting.second; 0095 } 0096 } else if (index.column() == 2) { 0097 return QLatin1StringView(setting.second.typeName()); 0098 } 0099 } 0100 return {}; 0101 } 0102 0103 bool AgentConfigModel::setData(const QModelIndex &index, const QVariant &value, int role) 0104 { 0105 if (index.column() == 1 && role == Qt::EditRole && index.row() >= 0 && index.row() < m_settings.size()) { 0106 const QPair<QString, QVariant> setting = m_settings.at(index.row()); 0107 if (setting.second != value) { 0108 m_interface->call(QStringLiteral("set%1").arg(setting.first), value); 0109 reload(); 0110 } 0111 } 0112 return QAbstractItemModel::setData(index, value, role); 0113 } 0114 0115 QVariant AgentConfigModel::headerData(int section, Qt::Orientation orientation, int role) const 0116 { 0117 if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { 0118 if (section == 0) { 0119 return QStringLiteral("Setting"); 0120 } else if (section == 1) { 0121 return QStringLiteral("Value"); 0122 } else if (section == 2) { 0123 return QStringLiteral("Type"); 0124 } 0125 } 0126 return QAbstractItemModel::headerData(section, orientation, role); 0127 } 0128 0129 Qt::ItemFlags AgentConfigModel::flags(const QModelIndex &index) const 0130 { 0131 if (index.column() == 1) { 0132 return QAbstractItemModel::flags(index) | Qt::ItemIsEditable; 0133 } 0134 return QAbstractItemModel::flags(index); 0135 } 0136 0137 void AgentConfigModel::writeConfig() 0138 { 0139 m_interface->call(QStringLiteral("save")); 0140 } 0141 0142 #include "moc_agentconfigmodel.cpp"