File indexing completed on 2026-08-09 14:49:16

0001 /*
0002     SPDX-FileCopyrightText: 2014 Martin Gräßlin <mgraesslin@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 #pragma once
0007 
0008 #include <KDecoration2/DecorationSettings>
0009 #include <KDecoration2/Private/DecorationSettingsPrivate>
0010 #include <QAbstractListModel>
0011 #include <QObject>
0012 
0013 namespace KDecoration2
0014 {
0015 
0016 namespace Preview
0017 {
0018 class ButtonsModel;
0019 class PreviewBridge;
0020 
0021 class BorderSizesModel : public QAbstractListModel
0022 {
0023     Q_OBJECT
0024 public:
0025     explicit BorderSizesModel(QObject *parent = nullptr);
0026     ~BorderSizesModel() override;
0027     QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
0028     int rowCount(const QModelIndex &parent = QModelIndex()) const override;
0029     QHash<int, QByteArray> roleNames() const override;
0030 
0031 private:
0032     QList<BorderSize> m_borders = QList<BorderSize>({BorderSize::None,
0033                                                      BorderSize::NoSides,
0034                                                      BorderSize::Tiny,
0035                                                      BorderSize::Normal,
0036                                                      BorderSize::Large,
0037                                                      BorderSize::VeryLarge,
0038                                                      BorderSize::Huge,
0039                                                      BorderSize::VeryHuge,
0040                                                      BorderSize::Oversized});
0041 };
0042 
0043 class PreviewSettings : public QObject, public DecorationSettingsPrivate
0044 {
0045     Q_OBJECT
0046     Q_PROPERTY(bool onAllDesktopsAvailable READ isOnAllDesktopsAvailable WRITE setOnAllDesktopsAvailable NOTIFY onAllDesktopsAvailableChanged)
0047     Q_PROPERTY(bool alphaChannelSupported READ isAlphaChannelSupported WRITE setAlphaChannelSupported NOTIFY alphaChannelSupportedChanged)
0048     Q_PROPERTY(bool closeOnDoubleClickOnMenu READ isCloseOnDoubleClickOnMenu WRITE setCloseOnDoubleClickOnMenu NOTIFY closeOnDoubleClickOnMenuChanged)
0049     Q_PROPERTY(QAbstractItemModel *leftButtonsModel READ leftButtonsModel CONSTANT)
0050     Q_PROPERTY(QAbstractItemModel *rightButtonsModel READ rightButtonsModel CONSTANT)
0051     Q_PROPERTY(QAbstractItemModel *availableButtonsModel READ availableButtonsModel CONSTANT)
0052     Q_PROPERTY(QAbstractItemModel *borderSizesModel READ borderSizesModel CONSTANT)
0053     Q_PROPERTY(int borderSizesIndex READ borderSizesIndex WRITE setBorderSizesIndex NOTIFY borderSizesIndexChanged)
0054     Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged)
0055 public:
0056     explicit PreviewSettings(DecorationSettings *parent);
0057     ~PreviewSettings() override;
0058     bool isAlphaChannelSupported() const override;
0059     bool isOnAllDesktopsAvailable() const override;
0060     bool isCloseOnDoubleClickOnMenu() const override
0061     {
0062         return m_closeOnDoubleClick;
0063     }
0064     BorderSize borderSize() const override;
0065 
0066     void setOnAllDesktopsAvailable(bool available);
0067     void setAlphaChannelSupported(bool supported);
0068     void setCloseOnDoubleClickOnMenu(bool enabled);
0069 
0070     QAbstractItemModel *leftButtonsModel() const;
0071     QAbstractItemModel *rightButtonsModel() const;
0072     QAbstractItemModel *availableButtonsModel() const;
0073     QAbstractItemModel *borderSizesModel() const
0074     {
0075         return m_borderSizes;
0076     }
0077 
0078     QVector<DecorationButtonType> decorationButtonsLeft() const override;
0079     QVector<DecorationButtonType> decorationButtonsRight() const override;
0080 
0081     Q_INVOKABLE void addButtonToLeft(int row);
0082     Q_INVOKABLE void addButtonToRight(int row);
0083 
0084     int borderSizesIndex() const
0085     {
0086         return m_borderSize;
0087     }
0088     void setBorderSizesIndex(int index);
0089 
0090     QFont font() const override
0091     {
0092         return m_font;
0093     }
0094     void setFont(const QFont &font);
0095 
0096 Q_SIGNALS:
0097     void onAllDesktopsAvailableChanged(bool);
0098     void alphaChannelSupportedChanged(bool);
0099     void closeOnDoubleClickOnMenuChanged(bool);
0100     void borderSizesIndexChanged(int);
0101     void fontChanged(const QFont &);
0102 
0103 private:
0104     bool m_alphaChannelSupported;
0105     bool m_onAllDesktopsAvailable;
0106     bool m_closeOnDoubleClick;
0107     ButtonsModel *m_leftButtons;
0108     ButtonsModel *m_rightButtons;
0109     ButtonsModel *m_availableButtons;
0110     BorderSizesModel *m_borderSizes;
0111     int m_borderSize;
0112     QFont m_font;
0113 };
0114 
0115 class Settings : public QObject
0116 {
0117     Q_OBJECT
0118     Q_PROPERTY(KDecoration2::Preview::PreviewBridge *bridge READ bridge WRITE setBridge NOTIFY bridgeChanged)
0119     Q_PROPERTY(KDecoration2::DecorationSettings *settings READ settingsPointer NOTIFY settingsChanged)
0120     Q_PROPERTY(int borderSizesIndex READ borderSizesIndex WRITE setBorderSizesIndex NOTIFY borderSizesIndexChanged)
0121 public:
0122     explicit Settings(QObject *parent = nullptr);
0123     ~Settings() override;
0124 
0125     PreviewBridge *bridge() const;
0126     void setBridge(PreviewBridge *bridge);
0127 
0128     QSharedPointer<DecorationSettings> settings() const;
0129     DecorationSettings *settingsPointer() const;
0130     int borderSizesIndex() const
0131     {
0132         return m_borderSize;
0133     }
0134     void setBorderSizesIndex(int index);
0135 
0136 Q_SIGNALS:
0137     void bridgeChanged();
0138     void settingsChanged();
0139     void borderSizesIndexChanged(int);
0140 
0141 private:
0142     void createSettings();
0143     QPointer<PreviewBridge> m_bridge;
0144     QSharedPointer<KDecoration2::DecorationSettings> m_settings;
0145     PreviewSettings *m_previewSettings = nullptr;
0146     int m_borderSize = 3;
0147 };
0148 
0149 }
0150 }