File indexing completed on 2024-05-19 05:32:25
0001 /* 0002 SPDX-FileCopyrightText: 2021 Vlad Zahorodnii <vlad.zahorodnii@kde.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #pragma once 0008 0009 #include "virtualdesktops.h" 0010 0011 #include <QAbstractListModel> 0012 #include <QPointer> 0013 #include <QSortFilterProxyModel> 0014 0015 #include <optional> 0016 0017 namespace KWin 0018 { 0019 class Window; 0020 class Output; 0021 0022 class WindowModel : public QAbstractListModel 0023 { 0024 Q_OBJECT 0025 0026 public: 0027 enum Roles { 0028 WindowRole = Qt::UserRole + 1, 0029 OutputRole, 0030 DesktopRole, 0031 ActivityRole 0032 }; 0033 0034 explicit WindowModel(QObject *parent = nullptr); 0035 0036 QHash<int, QByteArray> roleNames() const override; 0037 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; 0038 int rowCount(const QModelIndex &parent = QModelIndex()) const override; 0039 0040 private: 0041 void markRoleChanged(Window *window, int role); 0042 0043 void handleWindowAdded(Window *window); 0044 void handleWindowRemoved(Window *window); 0045 void setupWindowConnections(Window *window); 0046 0047 QList<Window *> m_windows; 0048 }; 0049 0050 class WindowFilterModel : public QSortFilterProxyModel 0051 { 0052 Q_OBJECT 0053 Q_PROPERTY(WindowModel *windowModel READ windowModel WRITE setWindowModel NOTIFY windowModelChanged) 0054 Q_PROPERTY(QString activity READ activity WRITE setActivity RESET resetActivity NOTIFY activityChanged) 0055 Q_PROPERTY(KWin::VirtualDesktop *desktop READ desktop WRITE setDesktop RESET resetDesktop NOTIFY desktopChanged) 0056 Q_PROPERTY(QString filter READ filter WRITE setFilter NOTIFY filterChanged) 0057 Q_PROPERTY(QString screenName READ screenName WRITE setScreenName RESET resetScreenName NOTIFY screenNameChanged) 0058 Q_PROPERTY(WindowTypes windowType READ windowType WRITE setWindowType RESET resetWindowType NOTIFY windowTypeChanged) 0059 Q_PROPERTY(bool minimizedWindows READ minimizedWindows WRITE setMinimizedWindows NOTIFY minimizedWindowsChanged) 0060 0061 public: 0062 enum WindowType { 0063 Normal = 0x1, 0064 Dialog = 0x2, 0065 Dock = 0x4, 0066 Desktop = 0x8, 0067 Notification = 0x10, 0068 CriticalNotification = 0x20, 0069 }; 0070 Q_DECLARE_FLAGS(WindowTypes, WindowType) 0071 Q_FLAG(WindowTypes) 0072 0073 explicit WindowFilterModel(QObject *parent = nullptr); 0074 0075 WindowModel *windowModel() const; 0076 void setWindowModel(WindowModel *windowModel); 0077 0078 QString activity() const; 0079 void setActivity(const QString &activity); 0080 void resetActivity(); 0081 0082 VirtualDesktop *desktop() const; 0083 void setDesktop(VirtualDesktop *desktop); 0084 void resetDesktop(); 0085 0086 QString filter() const; 0087 void setFilter(const QString &filter); 0088 0089 QString screenName() const; 0090 void setScreenName(const QString &screenName); 0091 void resetScreenName(); 0092 0093 WindowTypes windowType() const; 0094 void setWindowType(WindowTypes windowType); 0095 void resetWindowType(); 0096 0097 void setMinimizedWindows(bool show); 0098 bool minimizedWindows() const; 0099 0100 protected: 0101 bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override; 0102 0103 Q_SIGNALS: 0104 void activityChanged(); 0105 void desktopChanged(); 0106 void screenNameChanged(); 0107 void windowModelChanged(); 0108 void filterChanged(); 0109 void windowTypeChanged(); 0110 void minimizedWindowsChanged(); 0111 0112 private: 0113 WindowTypes windowTypeMask(Window *window) const; 0114 0115 WindowModel *m_windowModel = nullptr; 0116 std::optional<QString> m_activity; 0117 QPointer<Output> m_output; 0118 QPointer<VirtualDesktop> m_desktop; 0119 QString m_filter; 0120 std::optional<WindowTypes> m_windowType; 0121 bool m_showMinimizedWindows = true; 0122 }; 0123 0124 } // namespace KWin