File indexing completed on 2025-01-19 06:44:35
0001 /* 0002 * BluezQt - Asynchronous Bluez wrapper library 0003 * 0004 * SPDX-FileCopyrightText: 2014 David Rosca <nowrep@gmail.com> 0005 * 0006 * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0007 */ 0008 0009 #include "devicesmodel.h" 0010 #include "adapter.h" 0011 #include "device.h" 0012 #include "manager.h" 0013 0014 namespace BluezQt 0015 { 0016 class DevicesModelPrivate : public QObject 0017 { 0018 public: 0019 explicit DevicesModelPrivate(DevicesModel *qq); 0020 0021 void init(); 0022 0023 void deviceAdded(DevicePtr device); 0024 void deviceRemoved(DevicePtr device); 0025 void deviceChanged(DevicePtr device); 0026 void adapterChanged(AdapterPtr adapter); 0027 0028 DevicesModel *q; 0029 Manager *m_manager; 0030 QList<DevicePtr> m_devices; 0031 }; 0032 0033 DevicesModelPrivate::DevicesModelPrivate(DevicesModel *qq) 0034 : QObject(qq) 0035 , q(qq) 0036 , m_manager(nullptr) 0037 { 0038 } 0039 0040 void DevicesModelPrivate::init() 0041 { 0042 m_devices = m_manager->devices(); 0043 0044 connect(m_manager, &Manager::deviceAdded, this, &DevicesModelPrivate::deviceAdded); 0045 connect(m_manager, &Manager::deviceRemoved, this, &DevicesModelPrivate::deviceRemoved); 0046 connect(m_manager, &Manager::deviceChanged, this, &DevicesModelPrivate::deviceChanged); 0047 connect(m_manager, &Manager::adapterChanged, this, &DevicesModelPrivate::adapterChanged); 0048 } 0049 0050 void DevicesModelPrivate::deviceAdded(DevicePtr device) 0051 { 0052 q->beginInsertRows(QModelIndex(), m_devices.size(), m_devices.size()); 0053 m_devices.append(device); 0054 q->endInsertRows(); 0055 } 0056 0057 void DevicesModelPrivate::deviceRemoved(DevicePtr device) 0058 { 0059 int offset = m_devices.indexOf(device); 0060 Q_ASSERT(offset >= 0); 0061 0062 q->beginRemoveRows(QModelIndex(), offset, offset); 0063 m_devices.removeAt(offset); 0064 q->endRemoveRows(); 0065 } 0066 0067 void DevicesModelPrivate::deviceChanged(DevicePtr device) 0068 { 0069 int offset = m_devices.indexOf(device); 0070 Q_ASSERT(offset >= 0); 0071 0072 QModelIndex idx = q->createIndex(offset, 0); 0073 Q_EMIT q->dataChanged(idx, idx); 0074 } 0075 0076 void DevicesModelPrivate::adapterChanged(AdapterPtr adapter) 0077 { 0078 const auto devices = adapter->devices(); 0079 for (const DevicePtr &device : devices) { 0080 deviceChanged(device); 0081 } 0082 } 0083 0084 DevicesModel::DevicesModel(Manager *manager, QObject *parent) 0085 : QAbstractListModel(parent) 0086 , d(new DevicesModelPrivate(this)) 0087 { 0088 d->m_manager = manager; 0089 d->init(); 0090 } 0091 0092 DevicesModel::~DevicesModel() = default; 0093 0094 QHash<int, QByteArray> DevicesModel::roleNames() const 0095 { 0096 QHash<int, QByteArray> roles = QAbstractListModel::roleNames(); 0097 0098 roles[UbiRole] = QByteArrayLiteral("Ubi"); 0099 roles[AddressRole] = QByteArrayLiteral("Address"); 0100 roles[NameRole] = QByteArrayLiteral("Name"); 0101 roles[FriendlyNameRole] = QByteArrayLiteral("FriendlyName"); 0102 roles[RemoteNameRole] = QByteArrayLiteral("RemoteName"); 0103 roles[ClassRole] = QByteArrayLiteral("Class"); 0104 roles[TypeRole] = QByteArrayLiteral("Type"); 0105 roles[AppearanceRole] = QByteArrayLiteral("Appearance"); 0106 roles[IconRole] = QByteArrayLiteral("Icon"); 0107 roles[PairedRole] = QByteArrayLiteral("Paired"); 0108 roles[TrustedRole] = QByteArrayLiteral("Trusted"); 0109 roles[BlockedRole] = QByteArrayLiteral("Blocked"); 0110 roles[LegacyPairingRole] = QByteArrayLiteral("LegacyPairing"); 0111 roles[RssiRole] = QByteArrayLiteral("Rssi"); 0112 roles[ConnectedRole] = QByteArrayLiteral("Connected"); 0113 roles[UuidsRole] = QByteArrayLiteral("Uuids"); 0114 roles[ModaliasRole] = QByteArrayLiteral("Modalias"); 0115 roles[AdapterNameRole] = QByteArrayLiteral("AdapterName"); 0116 roles[AdapterAddressRole] = QByteArrayLiteral("AdapterAddress"); 0117 roles[AdapterPoweredRole] = QByteArrayLiteral("AdapterPowered"); 0118 roles[AdapterDiscoverableRole] = QByteArrayLiteral("AdapterDiscoverable"); 0119 roles[AdapterPairableRole] = QByteArrayLiteral("AdapterPairable"); 0120 roles[AdapterDiscoveringRole] = QByteArrayLiteral("AdapterDiscovering"); 0121 roles[AdapterUuidsRole] = QByteArrayLiteral("AdapterUuids"); 0122 0123 return roles; 0124 } 0125 0126 int DevicesModel::rowCount(const QModelIndex &parent) const 0127 { 0128 if (parent.isValid()) { 0129 return 0; 0130 } 0131 return d->m_devices.size(); 0132 } 0133 0134 QVariant DevicesModel::data(const QModelIndex &index, int role) const 0135 { 0136 DevicePtr dev = device(index); 0137 if (!dev) { 0138 return QVariant(); 0139 } 0140 0141 switch (role) { 0142 case Qt::DisplayRole: 0143 return dev->name(); 0144 case UbiRole: 0145 return dev->ubi(); 0146 case AddressRole: 0147 return dev->address(); 0148 case NameRole: 0149 return dev->name(); 0150 case FriendlyNameRole: 0151 return dev->friendlyName(); 0152 case RemoteNameRole: 0153 return dev->remoteName(); 0154 case ClassRole: 0155 return dev->deviceClass(); 0156 case TypeRole: 0157 return dev->type(); 0158 case AppearanceRole: 0159 return dev->appearance(); 0160 case IconRole: 0161 return dev->icon(); 0162 case PairedRole: 0163 return dev->isPaired(); 0164 case TrustedRole: 0165 return dev->isTrusted(); 0166 case BlockedRole: 0167 return dev->isBlocked(); 0168 case LegacyPairingRole: 0169 return dev->hasLegacyPairing(); 0170 case RssiRole: 0171 return dev->rssi(); 0172 case ConnectedRole: 0173 return dev->isConnected(); 0174 case UuidsRole: 0175 return dev->uuids(); 0176 case ModaliasRole: 0177 return dev->modalias(); 0178 case AdapterNameRole: 0179 return dev->adapter()->name(); 0180 case AdapterAddressRole: 0181 return dev->adapter()->address(); 0182 case AdapterPoweredRole: 0183 return dev->adapter()->isPowered(); 0184 case AdapterDiscoverableRole: 0185 return dev->adapter()->isDiscoverable(); 0186 case AdapterPairableRole: 0187 return dev->adapter()->isPairable(); 0188 case AdapterDiscoveringRole: 0189 return dev->adapter()->isDiscovering(); 0190 case AdapterUuidsRole: 0191 return dev->adapter()->uuids(); 0192 default: 0193 return QVariant(); 0194 } 0195 } 0196 0197 QModelIndex DevicesModel::index(int row, int column, const QModelIndex &parent) const 0198 { 0199 if (!hasIndex(row, column, parent)) { 0200 return QModelIndex(); 0201 } 0202 return createIndex(row, 0); 0203 } 0204 0205 DevicePtr DevicesModel::device(const QModelIndex &index) const 0206 { 0207 if (!index.isValid()) { 0208 return DevicePtr(); 0209 } 0210 return d->m_devices.at(index.row()); 0211 } 0212 0213 } // namespace BluezQt 0214 0215 #include "moc_devicesmodel.cpp"