From 6a80077e386e8a74940e81268055ff5ea0d97771 Mon Sep 17 00:00:00 2001 From: Matt Ranostay Date: Wed, 20 Mar 2019 14:22:57 -0700 Subject: libqtappfw: bluetooth: add BluetoothModel support Switch from using single threaded and incorrect QML processing of ListViews to using models provided from libqtappfw Bug-AGL: SPEC-2270 Change-Id: I83f02ab104a18ade95dfd172902e32a808c3d897 Signed-off-by: Matt Ranostay --- bluetooth/bluetoothmodel.cpp | 192 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 bluetooth/bluetoothmodel.cpp (limited to 'bluetooth/bluetoothmodel.cpp') diff --git a/bluetooth/bluetoothmodel.cpp b/bluetooth/bluetoothmodel.cpp new file mode 100644 index 0000000..f6c3d09 --- /dev/null +++ b/bluetooth/bluetoothmodel.cpp @@ -0,0 +1,192 @@ +#include "bluetoothmodel.h" +#include + +BluetoothDevice::BluetoothDevice(const QString &id, + const QString &address, + const QString &name, + const bool paired, + const bool connected) + : m_id(id), m_address(address), m_name(name), m_paired(paired), + m_connected(connected) +{ +} + +QString BluetoothDevice::id() const +{ + return m_id; +} + +QString BluetoothDevice::address() const +{ + return m_address; +} + +QString BluetoothDevice::name() const +{ + return m_name; +} + +bool BluetoothDevice::paired() const +{ + return m_paired; +} + +bool BluetoothDevice::connected() const +{ + return m_connected; +} + +void BluetoothDevice::setId(const QString id) +{ + m_id = id; +} + +void BluetoothDevice::setAddress(const QString address) +{ + m_address = address; +} + +void BluetoothDevice::setName(const QString name) +{ + m_name = name; +} + +void BluetoothDevice::setPaired(const bool paired) +{ + m_paired = paired; +} + +void BluetoothDevice::setConnected(const bool connected) +{ + m_connected = connected; +} + +BluetoothModel::BluetoothModel(QObject *parent) + : QAbstractListModel(parent) +{ +} + +void BluetoothModel::addDevice(BluetoothDevice *device) +{ + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + m_devices << device; + endInsertRows(); +} + +void BluetoothModel::removeDevice(BluetoothDevice *device) +{ + int row = m_devices.indexOf(device); + beginRemoveRows(QModelIndex(), row, row); + m_devices.removeAt(row); + endRemoveRows(); + delete device; +} + +void BluetoothModel::removeAllDevices() +{ + beginRemoveRows(QModelIndex(), 0, m_devices.count() - 1); + qDeleteAll(m_devices.begin(), m_devices.end()); + m_devices.clear(); + endRemoveRows(); +} + +int BluetoothModel::rowCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent); + return m_devices.count(); +} + +QVariant BluetoothModel::data(const QModelIndex &index, int role) const +{ + if (index.row() < 0 || index.row() >= m_devices.count()) + return QVariant(); + + const BluetoothDevice *device = m_devices[index.row()]; + + switch (role) { + case IdRole: + return device->id(); + case AddressRole: + return device->address(); + case NameRole: + return device->name(); + case PairedRole: + return device->paired(); + case ConnectedRole: + return device->connected(); + } + + return QVariant(); +} + +QHash BluetoothModel::roleNames() const { + QHash roles; + roles[IdRole] = "id"; + roles[AddressRole] = "address"; + roles[NameRole] = "name"; + roles[PairedRole] = "paired"; + roles[ConnectedRole] = "connected"; + + return roles; +} + +QModelIndex BluetoothModel::indexOf(BluetoothDevice *device) +{ + int row = m_devices.indexOf(device); + + return index(row); +} + +BluetoothDevice *BluetoothModel::getDevice(QString id) +{ + for (auto device : m_devices) { + if (device->id() == id) + return device; + } + + return nullptr; +} + +BluetoothDevice *BluetoothModel::updateDeviceProperties(BluetoothDevice *device, QJsonObject data) +{ + QJsonObject properties = data.value("properties").toObject(); + QString id = data.value("device").toString(); + QString address = properties.value("address").toString(); + QString name = properties.value("name").toString(); + bool paired = properties.value("paired").toBool(); + bool connected = properties.value("connected").toBool(); + + if (device == nullptr) + return new BluetoothDevice(id, address, name, paired, connected); + + device->setId(id); + + if (!address.isEmpty()) + device->setAddress(address); + + if (!name.isEmpty()) + device->setName(name); + + if (properties.contains("paired")) + device->setPaired(paired); + + if (properties.contains("connected")) + device->setConnected(connected); + + emit dataChanged(indexOf(device), indexOf(device)); + + return device; +} + +BluetoothModelFilter::BluetoothModelFilter(QObject *parent) : QSortFilterProxyModel(parent) +{ +} + +bool BluetoothModelFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const +{ + BluetoothModel *model = qobject_cast(sourceModel()); + QModelIndex index = model->index(sourceRow); + bool paired = model->data(index, BluetoothModel::BluetoothRoles::PairedRole).toBool(); + + return ((paired ? "true" : "false") == filterRegExp().pattern()); +} -- cgit 1.2.3-korg