File indexing completed on 2024-05-05 17:34:27

0001 /*
0002     SPDX-FileCopyrightText: 2019 Roman Gilg <subdiff@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 #ifndef COMMON_CONTROL_H
0007 #define COMMON_CONTROL_H
0008 
0009 #include <kscreen/output.h>
0010 #include <kscreen/types.h>
0011 
0012 #include <QObject>
0013 #include <QVariantMap>
0014 #include <QVector>
0015 
0016 class KDirWatch;
0017 
0018 class Control : public QObject
0019 {
0020     Q_OBJECT
0021 public:
0022     enum class OutputRetention {
0023         Undefined = -1,
0024         Global = 0,
0025         Individual = 1,
0026     };
0027     Q_ENUM(OutputRetention)
0028 
0029     explicit Control(QObject *parent = nullptr);
0030 
0031     ~Control() override = default;
0032 
0033     virtual bool writeFile();
0034     virtual void activateWatcher();
0035 
0036 Q_SIGNALS:
0037     void changed();
0038 
0039 protected:
0040     virtual QString dirPath() const;
0041     virtual QString filePath() const = 0;
0042     QString filePathFromHash(const QString &hash) const;
0043     void readFile();
0044     QVariantMap &info();
0045     const QVariantMap &constInfo() const;
0046     KDirWatch *watcher() const;
0047 
0048     static OutputRetention convertVariantToOutputRetention(QVariant variant);
0049 
0050 private:
0051     static QString s_dirName;
0052     QVariantMap m_info;
0053     KDirWatch *m_watcher = nullptr;
0054 };
0055 
0056 class ControlOutput;
0057 
0058 class ControlConfig : public Control
0059 {
0060     Q_OBJECT
0061 public:
0062     explicit ControlConfig(KScreen::ConfigPtr config, QObject *parent = nullptr);
0063 
0064     OutputRetention getOutputRetention(const KScreen::OutputPtr &output) const;
0065     OutputRetention getOutputRetention(const QString &outputId, const QString &outputName) const;
0066     void setOutputRetention(const KScreen::OutputPtr &output, OutputRetention value);
0067     void setOutputRetention(const QString &outputId, const QString &outputName, OutputRetention value);
0068 
0069     qreal getScale(const KScreen::OutputPtr &output) const;
0070     void setScale(const KScreen::OutputPtr &output, qreal value);
0071 
0072     bool getAutoRotate(const KScreen::OutputPtr &output) const;
0073     void setAutoRotate(const KScreen::OutputPtr &output, bool value);
0074 
0075     bool getAutoRotateOnlyInTabletMode(const KScreen::OutputPtr &output) const;
0076     void setAutoRotateOnlyInTabletMode(const KScreen::OutputPtr &output, bool value);
0077 
0078     KScreen::OutputPtr getReplicationSource(const KScreen::OutputPtr &output) const;
0079     void setReplicationSource(const KScreen::OutputPtr &output, const KScreen::OutputPtr &source);
0080 
0081     uint32_t getOverscan(const KScreen::OutputPtr &output) const;
0082     void setOverscan(const KScreen::OutputPtr &output, const uint32_t value);
0083 
0084     KScreen::Output::VrrPolicy getVrrPolicy(const KScreen::OutputPtr &output) const;
0085     void setVrrPolicy(const KScreen::OutputPtr &output, const KScreen::Output::VrrPolicy value);
0086 
0087     KScreen::Output::RgbRange getRgbRange(const KScreen::OutputPtr &output) const;
0088     void setRgbRange(const KScreen::OutputPtr &output, const KScreen::Output::RgbRange value);
0089 
0090     QString dirPath() const override;
0091     QString filePath() const override;
0092 
0093     bool writeFile() override;
0094     void activateWatcher() override;
0095 
0096 private:
0097     QVariantList getOutputs() const;
0098     void setOutputs(QVariantList outputsInfo);
0099     bool infoIsOutput(const QVariantMap &info, const QString &outputId, const QString &outputName) const;
0100     ControlOutput *getOutputControl(const QString &outputId, const QString &outputName) const;
0101 
0102     template<typename T, typename F>
0103     T get(const KScreen::OutputPtr &output, const QString &name, F globalRetentionFunc, T defaultValue) const;
0104     template<typename T, typename F, typename V>
0105     void set(const KScreen::OutputPtr &output, const QString &name, F globalRetentionFunc, V value);
0106 
0107     KScreen::ConfigPtr m_config;
0108     QStringList m_duplicateOutputIds;
0109     QVector<ControlOutput *> m_outputsControls;
0110 };
0111 
0112 class ControlOutput : public Control
0113 {
0114     Q_OBJECT
0115 public:
0116     explicit ControlOutput(KScreen::OutputPtr output, QObject *parent = nullptr);
0117 
0118     QString id() const;
0119     QString name() const;
0120 
0121     // TODO: scale auto value
0122 
0123     qreal getScale() const;
0124     void setScale(qreal value);
0125 
0126     bool getAutoRotate() const;
0127     void setAutoRotate(bool value);
0128 
0129     bool getAutoRotateOnlyInTabletMode() const;
0130     void setAutoRotateOnlyInTabletMode(bool value);
0131 
0132     uint32_t overscan() const;
0133     void setOverscan(uint32_t value);
0134 
0135     KScreen::Output::VrrPolicy vrrPolicy() const;
0136     void setVrrPolicy(KScreen::Output::VrrPolicy value);
0137 
0138     KScreen::Output::RgbRange rgbRange() const;
0139     void setRgbRange(KScreen::Output::RgbRange value);
0140 
0141     QString dirPath() const override;
0142     QString filePath() const override;
0143 
0144 private:
0145     KScreen::OutputPtr m_output;
0146 };
0147 
0148 #endif