File indexing completed on 2024-04-28 05:31:32

0001 /*
0002     SPDX-FileCopyrightText: 2020 Marco Martin <mart@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #pragma once
0008 
0009 #include <KConfigGroup>
0010 #include <KConfigLoader>
0011 #include <KConfigPropertyMap>
0012 #include <KLocalizedContext>
0013 #include <KPackage/PackageLoader>
0014 #include <QJsonArray>
0015 #include <QQuickItem>
0016 #include <QStandardItemModel>
0017 
0018 #include <functional>
0019 
0020 #include "sensorfaces_export.h"
0021 
0022 class QQmlEngine;
0023 
0024 namespace KSysGuard
0025 {
0026 class SensorFaceController;
0027 class SensorFace;
0028 class SensorQuery;
0029 
0030 class FacesModel : public QStandardItemModel
0031 {
0032     Q_OBJECT
0033 public:
0034     enum AdditionalRoles {
0035         PluginIdRole = Qt::UserRole + 1,
0036     };
0037     Q_ENUM(AdditionalRoles)
0038 
0039     FacesModel(QObject *parent = nullptr);
0040     ~FacesModel() override = default;
0041 
0042     Q_INVOKABLE void reload();
0043     Q_INVOKABLE QString pluginId(int row);
0044 
0045     QHash<int, QByteArray> roleNames() const override;
0046 };
0047 
0048 class PresetsModel : public QStandardItemModel
0049 {
0050     Q_OBJECT
0051 public:
0052     enum AdditionalRoles { PluginIdRole = Qt::UserRole + 1, ConfigRole, WritableRole };
0053     Q_ENUM(AdditionalRoles)
0054 
0055     PresetsModel(QObject *parent = nullptr);
0056     ~PresetsModel() override = default;
0057 
0058     Q_INVOKABLE void reload();
0059 
0060     QHash<int, QByteArray> roleNames() const override;
0061 };
0062 
0063 struct SensorResolver {
0064     SensorResolver(SensorFaceController *_controller, const QJsonArray &_expected);
0065     void execute();
0066 
0067     SensorFaceController *controller = nullptr;
0068 
0069     QJsonArray expected;
0070     QJsonArray found;
0071     QJsonArray missing;
0072 
0073     QList<SensorQuery *> queries;
0074 
0075     std::function<void(SensorResolver *)> callback;
0076 };
0077 
0078 // This is exported so we can use it in autotests
0079 class SENSORFACES_EXPORT SensorFaceControllerPrivate
0080 {
0081 public:
0082     SensorFaceControllerPrivate();
0083 
0084     QJsonArray readSensors(const KConfigGroup &config, const QString &entryName);
0085     QJsonArray readAndUpdateSensors(KConfigGroup &config, const QString &entryName);
0086     QString replaceDiskId(const QString &entryname) const;
0087     QString replacePartitionId(const QString &entryname) const;
0088     void resolveSensors(const QJsonArray &partialEntries, std::function<void(SensorResolver *)>);
0089     SensorFace *createGui(const QString &qmlPath);
0090     QQuickItem *createConfigUi(const QString &file, const QVariantMap &initialProperties);
0091 
0092     SensorFaceController *q;
0093     QString title;
0094     QQmlEngine *engine;
0095 
0096     KConfigGroup faceProperties;
0097     KConfigPropertyMap *faceConfiguration = nullptr;
0098     KConfigLoader *faceConfigLoader = nullptr;
0099 
0100     bool configNeedsSave = false;
0101     KPackage::Package facePackage;
0102     QString faceId;
0103     KLocalizedContext *contextObj = nullptr;
0104     KConfigGroup configGroup;
0105     KConfigGroup appearanceGroup;
0106     KConfigGroup sensorsGroup;
0107     KConfigGroup colorsGroup;
0108     KConfigGroup labelsGroup;
0109     QPointer<SensorFace> fullRepresentation;
0110     QPointer<SensorFace> compactRepresentation;
0111     QPointer<QQuickItem> faceConfigUi;
0112     QPointer<QQuickItem> appearanceConfigUi;
0113     QPointer<QQuickItem> sensorsConfigUi;
0114 
0115     QJsonArray totalSensors;
0116     QJsonArray highPrioritySensorIds;
0117     QJsonArray lowPrioritySensorIds;
0118     QJsonArray missingSensors;
0119 
0120     QTimer *syncTimer;
0121     bool shouldSync = true;
0122     FacesModel *availableFacesModel = nullptr;
0123     PresetsModel *availablePresetsModel = nullptr;
0124 
0125     static QList<QPair<QRegularExpression, QString>> sensorIdReplacements;
0126     static QRegularExpression oldDiskSensor;
0127     static QRegularExpression oldPartitionSensor;
0128 };
0129 
0130 }