| 1 | /* |
| 2 | SPDX-FileCopyrightText: 2021 Dan Leinir Turthra Jensen <admin@leinir.dk> |
| 3 | |
| 4 | SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL |
| 5 | */ |
| 6 | |
| 7 | #include "providersmodel.h" |
| 8 | |
| 9 | #include "enginebase.h" |
| 10 | |
| 11 | namespace KNSCore |
| 12 | { |
| 13 | class ProvidersModelPrivate |
| 14 | { |
| 15 | ProvidersModel *const q; |
| 16 | |
| 17 | public: |
| 18 | explicit ProvidersModelPrivate(ProvidersModel *qq) |
| 19 | : q(qq) |
| 20 | { |
| 21 | } |
| 22 | |
| 23 | EngineBase *getEngine() const; |
| 24 | void setEngine(EngineBase *engine); |
| 25 | |
| 26 | EngineBase *engine = nullptr; |
| 27 | QStringList knownProviders; |
| 28 | }; |
| 29 | |
| 30 | EngineBase *ProvidersModelPrivate::getEngine() const |
| 31 | { |
| 32 | return engine; |
| 33 | } |
| 34 | |
| 35 | void ProvidersModelPrivate::setEngine(EngineBase *engine) |
| 36 | { |
| 37 | q->setEngine(engine); |
| 38 | } |
| 39 | |
| 40 | ProvidersModel::ProvidersModel(QObject *parent) |
| 41 | : QAbstractListModel(parent) |
| 42 | , d(new ProvidersModelPrivate(this)) |
| 43 | { |
| 44 | } |
| 45 | |
| 46 | ProvidersModel::~ProvidersModel() = default; |
| 47 | |
| 48 | QHash<int, QByteArray> KNSCore::ProvidersModel::roleNames() const |
| 49 | { |
| 50 | static const QHash<int, QByteArray> roles{ |
| 51 | {IdRole, "id" }, |
| 52 | {NameRole, "name" }, |
| 53 | {VersionRole, "version" }, |
| 54 | {WebsiteRole, "website" }, |
| 55 | {HostRole, "host" }, |
| 56 | {ContactEmailRole, "contactEmail" }, |
| 57 | {SupportsSslRole, "supportsSsl" }, |
| 58 | {IconRole, "icon" }, |
| 59 | {ObjectRole, "object" }, |
| 60 | }; |
| 61 | return roles; |
| 62 | } |
| 63 | |
| 64 | int KNSCore::ProvidersModel::rowCount(const QModelIndex &parent) const |
| 65 | { |
| 66 | if (parent.isValid()) { |
| 67 | return 0; |
| 68 | } |
| 69 | return d->knownProviders.count(); |
| 70 | } |
| 71 | |
| 72 | QVariant KNSCore::ProvidersModel::data(const QModelIndex &index, int role) const |
| 73 | { |
| 74 | if (checkIndex(index) && d->engine) { |
| 75 | QSharedPointer<Provider> provider = d->engine->provider(providerId: d->knownProviders.value(i: index.row())); |
| 76 | if (provider) { |
| 77 | switch (role) { |
| 78 | case IdRole: |
| 79 | return provider->id(); |
| 80 | case NameRole: |
| 81 | return provider->name(); |
| 82 | case VersionRole: |
| 83 | return provider->version(); |
| 84 | case WebsiteRole: |
| 85 | return provider->website(); |
| 86 | case HostRole: |
| 87 | return provider->host(); |
| 88 | case ContactEmailRole: |
| 89 | return provider->contactEmail(); |
| 90 | case SupportsSslRole: |
| 91 | return provider->supportsSsl(); |
| 92 | case IconRole: |
| 93 | return provider->icon(); |
| 94 | case ObjectRole: |
| 95 | return QVariant::fromValue(value: provider.data()); |
| 96 | } |
| 97 | } |
| 98 | } |
| 99 | return QVariant(); |
| 100 | } |
| 101 | |
| 102 | QObject *KNSCore::ProvidersModel::engine() const |
| 103 | { |
| 104 | return d->engine; |
| 105 | } |
| 106 | |
| 107 | void KNSCore::ProvidersModel::setEngine(QObject *engine) |
| 108 | { |
| 109 | if (d->engine != engine) { |
| 110 | if (d->engine) { |
| 111 | d->engine->disconnect(receiver: this); |
| 112 | } |
| 113 | d->engine = qobject_cast<EngineBase *>(object: engine); |
| 114 | Q_EMIT engineChanged(); |
| 115 | if (d->engine) { |
| 116 | connect(sender: d->engine, signal: &EngineBase::providersChanged, context: this, slot: [this]() { |
| 117 | beginResetModel(); |
| 118 | d->knownProviders = d->engine->providerIDs(); |
| 119 | endResetModel(); |
| 120 | }); |
| 121 | beginResetModel(); |
| 122 | d->knownProviders = d->engine->providerIDs(); |
| 123 | endResetModel(); |
| 124 | } |
| 125 | } |
| 126 | } |
| 127 | |
| 128 | } |
| 129 | |
| 130 | #include "moc_providersmodel.cpp" |
| 131 | |