You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
libcutefish/bluez/applet/devicesproxymodel.cpp

104 lines
3.4 KiB
C++

4 years ago
/*
SPDX-FileCopyrightText: 2014-2015 David Rosca <nowrep@gmail.com>
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#include "devicesproxymodel.h"
#include <BluezQt/Adapter>
#include <BluezQt/Device>
DevicesProxyModel::DevicesProxyModel(QObject *parent)
: QSortFilterProxyModel(parent)
{
setDynamicSortFilter(true);
sort(0, Qt::DescendingOrder);
}
QHash<int, QByteArray> DevicesProxyModel::roleNames() const
{
QHash<int, QByteArray> roles = QSortFilterProxyModel::roleNames();
roles[SectionRole] = QByteArrayLiteral("Section");
roles[DeviceFullNameRole] = QByteArrayLiteral("DeviceFullName");
return roles;
}
QVariant DevicesProxyModel::data(const QModelIndex &index, int role) const
{
switch (role) {
case SectionRole:
if (index.data(BluezQt::DevicesModel::ConnectedRole).toBool()) {
return QStringLiteral("Connected");
}
return QStringLiteral("Available");
case DeviceFullNameRole:
if (duplicateIndexAddress(index)) {
const QString &name = QSortFilterProxyModel::data(index, BluezQt::DevicesModel::NameRole).toString();
const QString &ubi = QSortFilterProxyModel::data(index, BluezQt::DevicesModel::UbiRole).toString();
const QString &hci = adapterHciString(ubi);
if (!hci.isEmpty()) {
return QStringLiteral("%1 - %2").arg(name, hci);
}
}
return QSortFilterProxyModel::data(index, BluezQt::DevicesModel::NameRole);
default:
return QSortFilterProxyModel::data(index, role);
}
}
bool DevicesProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
{
bool leftConnected = left.data(BluezQt::DevicesModel::ConnectedRole).toBool();
bool rightConnected = right.data(BluezQt::DevicesModel::ConnectedRole).toBool();
if (leftConnected < rightConnected) {
return true;
} else if (leftConnected > rightConnected) {
return false;
}
const QString &leftName = left.data(BluezQt::DevicesModel::NameRole).toString();
const QString &rightName = right.data(BluezQt::DevicesModel::NameRole).toString();
return QString::localeAwareCompare(leftName, rightName) > 0;
}
// Returns "hciX" part from UBI "/org/bluez/hciX/dev_xx_xx_xx_xx_xx_xx"
QString DevicesProxyModel::adapterHciString(const QString &ubi) const
{
int startIndex = ubi.indexOf(QLatin1String("/hci")) + 1;
if (startIndex < 1) {
return QString();
}
int endIndex = ubi.indexOf(QLatin1Char('/'), startIndex);
if (endIndex == -1) {
return ubi.mid(startIndex);
}
return ubi.mid(startIndex, endIndex - startIndex);
}
bool DevicesProxyModel::duplicateIndexAddress(const QModelIndex &idx) const
{
const QModelIndexList &list = match(index(0, 0), //
BluezQt::DevicesModel::AddressRole,
idx.data(BluezQt::DevicesModel::AddressRole).toString(),
2,
Qt::MatchExactly);
return list.size() > 1;
}
bool DevicesProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
const QModelIndex index = sourceModel()->index(source_row, 0, source_parent);
return index.data(BluezQt::DevicesModel::AdapterPoweredRole).toBool() &&
index.data(BluezQt::DevicesModel::AdapterPairableRole).toBool();
4 years ago
}