File indexing completed on 2024-05-12 17:07:30

0001 /*
0002     SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez <aleixpol@kde.org>
0003 
0004     Work sponsored by Technische Universität Dresden:
0005     SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB a KDAB Group company <info@kdab.com>
0006 
0007     SPDX-License-Identifier: LGPL-2.0-or-later
0008 */
0009 
0010 #include "kcmtouchscreen.h"
0011 #include "inputdevice.h"
0012 
0013 #include <KConfigGroup>
0014 #include <KLocalizedString>
0015 #include <KPluginFactory>
0016 #include <QGuiApplication>
0017 #include <QScreen>
0018 #include <QStandardItemModel>
0019 
0020 K_PLUGIN_CLASS_WITH_JSON(Touchscreen, "kcm_touchscreen.json")
0021 
0022 class OutputsModel : public QStandardItemModel
0023 {
0024     Q_OBJECT
0025 public:
0026     OutputsModel()
0027     {
0028         setItemRoleNames({
0029             {Qt::DisplayRole, "display"},
0030             {Qt::UserRole, "name"},
0031         });
0032 
0033         reset();
0034 
0035         connect(qGuiApp, &QGuiApplication::screenAdded, this, &OutputsModel::reset);
0036         connect(qGuiApp, &QGuiApplication::screenRemoved, this, &OutputsModel::reset);
0037     }
0038 
0039     void reset()
0040     {
0041         clear();
0042 
0043         auto screens = qGuiApp->screens();
0044         auto it = new QStandardItem(i18n("Automatic"));
0045         appendRow(it);
0046 
0047         for (auto screen : screens) {
0048             auto geo = screen->geometry();
0049             auto it = new QStandardItem(i18nc("model - (x,y widthxheight)",
0050                                               "%1 - (%2,%3 %4×%5)",
0051                                               screen->model(),
0052                                               QString::number(geo.x()),
0053                                               QString::number(geo.y()),
0054                                               QString::number(geo.width()),
0055                                               QString::number(geo.height())));
0056             it->setData(screen->name(), Qt::UserRole);
0057             appendRow(it);
0058         }
0059     }
0060 
0061     Q_SCRIPTABLE QString outputNameAt(int row) const
0062     {
0063         return item(row)->data(Qt::UserRole).toString();
0064     }
0065     Q_SCRIPTABLE int rowForOutputName(const QString &outputName)
0066     {
0067         for (int i = 0, c = rowCount(); i < c; ++i) {
0068             if (item(i)->data(Qt::UserRole) == outputName) {
0069                 return i;
0070             }
0071         }
0072 
0073         return 0;
0074     }
0075 };
0076 
0077 Touchscreen::Touchscreen(QObject *parent, const KPluginMetaData &metaData, const QVariantList &list)
0078     : ManagedConfigModule(parent, metaData, list)
0079     , m_touchscreensModel(new DevicesModel("touch", this))
0080 {
0081     qmlRegisterType<OutputsModel>("org.kde.plasma.touchscreen.kcm", 1, 0, "OutputsModel");
0082     qmlRegisterAnonymousType<InputDevice>("org.kde.plasma.touchscreen.kcm", 1);
0083 
0084     connect(m_touchscreensModel, &DevicesModel::needsSaveChanged, this, &Touchscreen::refreshNeedsSave);
0085 }
0086 
0087 Touchscreen::~Touchscreen() = default;
0088 
0089 void Touchscreen::refreshNeedsSave()
0090 {
0091     setNeedsSave(isSaveNeeded());
0092 }
0093 
0094 bool Touchscreen::isSaveNeeded() const
0095 {
0096     return m_touchscreensModel->isSaveNeeded();
0097 }
0098 
0099 bool Touchscreen::isDefaults() const
0100 {
0101     return m_touchscreensModel->isDefaults();
0102 }
0103 
0104 void Touchscreen::load()
0105 {
0106     m_touchscreensModel->load();
0107 }
0108 
0109 void Touchscreen::save()
0110 {
0111     m_touchscreensModel->save();
0112 }
0113 
0114 void Touchscreen::defaults()
0115 {
0116     m_touchscreensModel->defaults();
0117 }
0118 
0119 DevicesModel *Touchscreen::touchscreensModel() const
0120 {
0121     return m_touchscreensModel;
0122 }
0123 
0124 #include "kcmtouchscreen.moc"