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