3
0
mirror of https://github.com/Qortal/Brooklyn.git synced 2025-02-12 10:15:54 +00:00
Brooklyn/plasma/kcms/tablet/devicesmodel.cpp
Scare Crowe d2ebfd0519 QortalOS Titan 5.60.12
Screw the description like that inbred T3Q
2022-03-05 21:17:59 +05:00

185 lines
5.5 KiB
C++

/*
SPDX-FileCopyrightText: 2018 Roman Gilg <subdiff@gmail.com>
SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez <aleixpol@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "devicesmodel.h"
#include "inputdevice.h"
#include <QDBusInterface>
#include "logging.h"
DevicesModel *DevicesModel::self()
{
static DevicesModel s_self;
return &s_self;
}
DevicesModel::DevicesModel(QObject *parent)
: QAbstractListModel(parent)
{
m_deviceManager = new QDBusInterface(QStringLiteral("org.kde.KWin"),
QStringLiteral("/org/kde/KWin/InputDevice"),
QStringLiteral("org.kde.KWin.InputDeviceManager"),
QDBusConnection::sessionBus(),
this);
resetModel();
m_deviceManager->connection().connect(QStringLiteral("org.kde.KWin"),
QStringLiteral("/org/kde/KWin/InputDevice"),
QStringLiteral("org.kde.KWin.InputDeviceManager"),
QStringLiteral("deviceAdded"),
this,
SLOT(onDeviceAdded(QString)));
m_deviceManager->connection().connect(QStringLiteral("org.kde.KWin"),
QStringLiteral("/org/kde/KWin/InputDevice"),
QStringLiteral("org.kde.KWin.InputDeviceManager"),
QStringLiteral("deviceRemoved"),
this,
SLOT(onDeviceRemoved(QString)));
}
void DevicesModel::resetModel()
{
beginResetModel();
qDeleteAll(m_devices);
m_devices.clear();
QStringList devicesSysNames;
const QVariant reply = m_deviceManager->property("devicesSysNames");
if (reply.isValid()) {
qCDebug(KCM_TABLET) << "Devices list received successfully from KWin.";
devicesSysNames = reply.toStringList();
} else {
qCCritical(KCM_TABLET) << "Error on receiving device list from KWin.";
return;
}
for (const QString &sysname : devicesSysNames) {
addDevice(sysname, false);
}
endResetModel();
}
QVariant DevicesModel::data(const QModelIndex &index, int role) const
{
if (!checkIndex(index, CheckIndexOption::IndexIsValid) || index.column() != 0)
return {};
switch (role) {
case Qt::DisplayRole:
return m_devices.at(index.row())->name();
case Qt::UserRole:
return QVariant::fromValue<QObject *>(m_devices.at(index.row()));
}
return {};
}
int DevicesModel::rowCount(const QModelIndex &parent) const
{
return parent.isValid() ? 0 : m_devices.count();
}
void DevicesModel::onDeviceAdded(const QString &sysName)
{
if (std::any_of(m_devices.constBegin(), m_devices.constEnd(), [sysName](InputDevice *t) {
return t->sysName() == sysName;
})) {
return;
}
addDevice(sysName, true);
}
void DevicesModel::addDevice(const QString &sysName, bool tellModel)
{
QDBusInterface deviceIface(QStringLiteral("org.kde.KWin"),
QStringLiteral("/org/kde/KWin/InputDevice/") + sysName,
QStringLiteral("org.kde.KWin.InputDevice"),
QDBusConnection::sessionBus(),
this);
QVariant reply = deviceIface.property("tabletTool");
if (reply.isValid() && reply.toBool()) {
InputDevice *dev = new InputDevice(sysName);
connect(dev, &InputDevice::needsSaveChanged, this, &DevicesModel::needsSaveChanged);
if (tellModel) {
beginInsertRows({}, m_devices.count(), m_devices.count());
}
m_devices.append(dev);
qCDebug(KCM_TABLET).nospace() << "Device connected: " << dev->name() << " (" << dev->sysName() << ")";
if (tellModel) {
endInsertRows();
}
}
}
void DevicesModel::onDeviceRemoved(const QString &sysName)
{
QVector<InputDevice *>::const_iterator it = std::find_if(m_devices.constBegin(), m_devices.constEnd(), [sysName](InputDevice *t) {
return t->sysName() == sysName;
});
if (it == m_devices.cend()) {
return;
}
InputDevice *dev = static_cast<InputDevice *>(*it);
qCDebug(KCM_TABLET).nospace() << "Device disconnected: " << dev->name() << " (" << dev->sysName() << ")";
int index = m_devices.indexOf(*it);
beginRemoveRows({}, index, index);
m_devices.removeAt(index);
endInsertRows();
}
InputDevice *DevicesModel::deviceAt(int row) const
{
return m_devices.value(row, nullptr);
}
QHash<int, QByteArray> DevicesModel::roleNames() const
{
return {
{Qt::DisplayRole, "display"},
};
}
void DevicesModel::defaults()
{
for (auto device : qAsConst(m_devices)) {
device->defaults();
}
}
void DevicesModel::load()
{
for (auto device : qAsConst(m_devices)) {
device->load();
}
}
void DevicesModel::save()
{
for (auto device : qAsConst(m_devices)) {
device->save();
}
}
bool DevicesModel::isDefaults() const
{
return std::all_of(m_devices.constBegin(), m_devices.constEnd(), [](InputDevice *dev) {
return dev->isDefaults();
});
}
bool DevicesModel::isSaveNeeded() const
{
return std::any_of(m_devices.constBegin(), m_devices.constEnd(), [](InputDevice *dev) {
return dev->isSaveNeeded();
});
}