File indexing completed on 2026-07-19 16:00:59

0001 /*
0002     SPDX-FileCopyrightText: 2020 Ismael Asensio <isma.af@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #pragma once
0008 
0009 #include "ruleitem.h"
0010 #include <rules.h>
0011 #include <rulesettings.h>
0012 #include <virtualdesktopsdbustypes.h>
0013 
0014 #include <QAbstractListModel>
0015 #include <QObject>
0016 #include <QSortFilterProxyModel>
0017 
0018 #if KWIN_BUILD_ACTIVITIES
0019 #include <KActivities/Consumer>
0020 #endif
0021 
0022 namespace KWin
0023 {
0024 
0025 class RulesModel : public QAbstractListModel
0026 {
0027     Q_OBJECT
0028 
0029     Q_PROPERTY(QString description READ description WRITE setDescription NOTIFY descriptionChanged)
0030     Q_PROPERTY(QStringList warningMessages READ warningMessages NOTIFY warningMessagesChanged)
0031 
0032 public:
0033     enum RulesRole {
0034         NameRole = Qt::DisplayRole,
0035         DescriptionRole = Qt::ToolTipRole,
0036         IconRole = Qt::DecorationRole,
0037         IconNameRole = Qt::UserRole + 1,
0038         KeyRole,
0039         SectionRole,
0040         EnabledRole,
0041         SelectableRole,
0042         ValueRole,
0043         TypeRole,
0044         PolicyRole,
0045         PolicyModelRole,
0046         OptionsModelRole,
0047         SuggestedValueRole
0048     };
0049     Q_ENUM(RulesRole)
0050 
0051 public:
0052     explicit RulesModel(QObject *parent = nullptr);
0053     ~RulesModel();
0054 
0055     int rowCount(const QModelIndex &parent = QModelIndex()) const override;
0056     QHash<int, QByteArray> roleNames() const override;
0057     QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
0058     bool setData(const QModelIndex &index, const QVariant &value, int role) override;
0059 
0060     QModelIndex indexOf(const QString &key) const;
0061     bool hasRule(const QString &key) const;
0062     RuleItem *ruleItem(const QString &key) const;
0063 
0064     RuleSettings *settings() const;
0065     void setSettings(RuleSettings *settings);
0066 
0067     void setSuggestedProperties(const QVariantMap &info);
0068 
0069     QString description() const;
0070     void setDescription(const QString &description);
0071     QStringList warningMessages() const;
0072 
0073     Q_INVOKABLE void detectWindowProperties(int miliseconds);
0074 
0075 Q_SIGNALS:
0076     void descriptionChanged();
0077     void warningMessagesChanged();
0078 
0079     void showSuggestions();
0080     void showErrorMessage(const QString &title, const QString &message);
0081 
0082     void virtualDesktopsUpdated();
0083 
0084 private:
0085     void populateRuleList();
0086     RuleItem *addRule(RuleItem *rule);
0087     void writeToSettings(RuleItem *rule);
0088 
0089     QString defaultDescription() const;
0090     void processSuggestion(const QString &key, const QVariant &value);
0091 
0092     bool wmclassWarning() const;
0093     bool geometryWarning() const;
0094 
0095     static const QHash<QString, QString> x11PropertyHash();
0096     void updateVirtualDesktops();
0097 
0098     QList<OptionsModel::Data> windowTypesModelData() const;
0099     QList<OptionsModel::Data> virtualDesktopsModelData() const;
0100     QList<OptionsModel::Data> activitiesModelData() const;
0101     QList<OptionsModel::Data> placementModelData() const;
0102     QList<OptionsModel::Data> focusModelData() const;
0103     QList<OptionsModel::Data> colorSchemesModelData() const;
0104 
0105 private Q_SLOTS:
0106     void selectX11Window();
0107 
0108 private:
0109     QList<RuleItem *> m_ruleList;
0110     QHash<QString, RuleItem *> m_rules;
0111     DBusDesktopDataVector m_virtualDesktops;
0112 #if KWIN_BUILD_ACTIVITIES
0113     KActivities::Consumer *m_activities;
0114 #endif
0115     RuleSettings *m_settings;
0116 };
0117 
0118 }