File indexing completed on 2024-05-05 17:44:50

0001 /*
0002     SPDX-FileCopyrightText: 2016 Eike Hein <hein@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #pragma once
0008 
0009 #include <QRect>
0010 #include <QSortFilterProxyModel>
0011 
0012 #include "abstracttasksproxymodeliface.h"
0013 
0014 #include "taskmanager_export.h"
0015 
0016 namespace TaskManager
0017 {
0018 /**
0019  * @short A proxy tasks model filtering its source model by various properties.
0020  *
0021  * This proxy model class filters its source tasks model by properties such as
0022  * virtual desktop or minimixed state. The values to filter for or by are set
0023  * as properties on the proxy model instance.
0024  *
0025  * @author Eike Hein <hein@kde.org>
0026  **/
0027 
0028 class TASKMANAGER_EXPORT TaskFilterProxyModel : public QSortFilterProxyModel, public AbstractTasksProxyModelIface
0029 {
0030     Q_OBJECT
0031 
0032     Q_PROPERTY(QVariant virtualDesktop READ virtualDesktop WRITE setVirtualDesktop NOTIFY virtualDesktopChanged)
0033     Q_PROPERTY(QRect screenGeometry READ screenGeometry WRITE setScreenGeometry NOTIFY screenGeometryChanged)
0034     Q_PROPERTY(QString activity READ activity WRITE setActivity NOTIFY activityChanged)
0035 
0036     Q_PROPERTY(bool filterByVirtualDesktop READ filterByVirtualDesktop WRITE setFilterByVirtualDesktop NOTIFY filterByVirtualDesktopChanged)
0037     Q_PROPERTY(bool filterByScreen READ filterByScreen WRITE setFilterByScreen NOTIFY filterByScreenChanged)
0038     Q_PROPERTY(bool filterByActivity READ filterByActivity WRITE setFilterByActivity NOTIFY filterByActivityChanged)
0039     Q_PROPERTY(bool filterMinimized READ filterMinimized WRITE setFilterMinimized NOTIFY filterMinimizedChanged)
0040     Q_PROPERTY(bool filterNotMinimized READ filterNotMinimized WRITE setFilterNotMinimized NOTIFY filterNotMinimizedChanged)
0041     Q_PROPERTY(bool filterNotMaximized READ filterNotMaximized WRITE setFilterNotMaximized NOTIFY filterNotMaximizedChanged)
0042     Q_PROPERTY(bool filterHidden READ filterHidden WRITE setFilterHidden NOTIFY filterHiddenChanged)
0043     Q_PROPERTY(bool filterSkipTaskbar READ filterSkipTaskbar WRITE setFilterSkipTaskbar NOTIFY filterSkipTaskbarChanged)
0044     Q_PROPERTY(bool filterSkipPager READ filterSkipPager WRITE setFilterSkipPager NOTIFY filterSkipPagerChanged)
0045 
0046     Q_PROPERTY(bool demandingAttentionSkipsFilters READ demandingAttentionSkipsFilters WRITE setDemandingAttentionSkipsFilters NOTIFY
0047                    demandingAttentionSkipsFiltersChanged)
0048 
0049 public:
0050     explicit TaskFilterProxyModel(QObject *parent = nullptr);
0051     ~TaskFilterProxyModel() override;
0052 
0053     void setSourceModel(QAbstractItemModel *sourceModel) override;
0054 
0055     /**
0056      * The id of the virtual desktop used in filtering by virtual
0057      * desktop. Usually set to the id of the current virtual desktop.
0058      * Defaults to empty.
0059      *
0060      * @see setVirtualDesktop
0061      * @returns the number of the virtual desktop used in filtering.
0062      **/
0063     QVariant virtualDesktop() const;
0064 
0065     /**
0066      * Set the id of the virtual desktop to use in filtering by virtual
0067      * desktop.
0068      *
0069      * If set to an empty id, filtering by virtual desktop is disabled.
0070      *
0071      * @see virtualDesktop
0072      * @param desktop A virtual desktop id (QString on Wayland; uint >0 on X11).
0073      **/
0074     void setVirtualDesktop(const QVariant &desktop = QVariant());
0075 
0076     /**
0077      * The geometry of the screen used in filtering by screen. Defaults
0078      * to a null QRect.
0079      *
0080      * @see setGeometryScreen
0081      * @returns the geometry of the screen used in filtering.
0082      **/
0083     QRect screenGeometry() const;
0084 
0085     /**
0086      * Set the geometry of the screen to use in filtering by screen.
0087      *
0088      * If set to an invalid QRect, filtering by screen is disabled.
0089      *
0090      * @see screenGeometry
0091      * @param geometry A screen geometry.
0092      **/
0093     void setScreenGeometry(const QRect &geometry);
0094 
0095     /**
0096      * The id of the activity used in filtering by activity. Usually
0097      * set to the id of the current activity. Defaults to an empty id.
0098      *
0099      * @see setActivity
0100      * @returns the id of the activity used in filtering.
0101      **/
0102     QString activity() const;
0103 
0104     /**
0105      * Set the id of the activity to use in filtering by activity.
0106      *
0107      * @see activity
0108      * @param activity An activity id.
0109      **/
0110     void setActivity(const QString &activity);
0111 
0112     /**
0113      * Whether tasks should be filtered by virtual desktop. Defaults to
0114      * @c false.
0115      *
0116      * Filtering by virtual desktop only happens if a virtual desktop
0117      * number greater than -1 is set, even if this returns @c true.
0118      *
0119      * @see setFilterByVirtualDesktop
0120      * @see setVirtualDesktop
0121      * @returns @c true if tasks should be filtered by virtual desktop.
0122      **/
0123     bool filterByVirtualDesktop() const;
0124 
0125     /**
0126      * Set whether tasks should be filtered by virtual desktop.
0127      *
0128      * Filtering by virtual desktop only happens if a virtual desktop
0129      * number is set, even if this is set to @c true.
0130      *
0131      * @see filterByVirtualDesktop
0132      * @see setVirtualDesktop
0133      * @param filter Whether tasks should be filtered by virtual desktop.
0134      **/
0135     void setFilterByVirtualDesktop(bool filter);
0136 
0137     /**
0138      * Whether tasks should be filtered by screen. Defaults to @c false.
0139      *
0140      * Filtering by screen only happens if a screen number is set, even
0141      * if this returns @c true.
0142      *
0143      * @see setFilterByScreen
0144      * @see setScreenGeometry
0145      * @returns @c true if tasks should be filtered by screen.
0146      **/
0147     bool filterByScreen() const;
0148 
0149     /**
0150      * Set whether tasks should be filtered by screen.
0151      *
0152      * Filtering by screen only happens if a screen number is set, even
0153      * if this is set to @c true.
0154      *
0155      * @see filterByScreen
0156      * @see setScreenGeometry
0157      * @param filter Whether tasks should be filtered by screen.
0158      **/
0159     void setFilterByScreen(bool filter);
0160 
0161     /**
0162      * Whether tasks should be filtered by activity. Defaults to @c false.
0163      *
0164      * Filtering by activity only happens if an activity id is set, even
0165      * if this returns @c true.
0166      *
0167      * @see setFilterByActivity
0168      * @see setActivity
0169      * @returns @ctrue if tasks should be filtered by activity.
0170      **/
0171     bool filterByActivity() const;
0172 
0173     /**
0174      * Set whether tasks should be filtered by activity. Defaults to
0175      * @c false.
0176      *
0177      * Filtering by activity only happens if an activity id is set,
0178      * even if this is set to @c true.
0179      *
0180      * @see filterByActivity
0181      * @see setActivity
0182      * @param filter Whether tasks should be filtered by activity.
0183      **/
0184     void setFilterByActivity(bool filter);
0185 
0186     /**
0187      * Whether minimized tasks should be filtered out. Defaults to
0188      * @c false.
0189      *
0190      * @returns @c true if minimized tasks should be filtered out.
0191      * @see setFilterMinimized
0192      * @since 5.27
0193      **/
0194     bool filterMinimized() const;
0195 
0196     /**
0197      * Sets whether non-minimized tasks should be filtered out.
0198      *
0199      * @param filter Whether minimized tasks should be filtered out.
0200      * @see filterMinimized
0201      * @since 5.27
0202      **/
0203     void setFilterMinimized(bool filter);
0204 
0205     /**
0206      * Whether non-minimized tasks should be filtered. Defaults to
0207      * @c false.
0208      *
0209      * @see setFilterNotMinimized
0210      * @returns @c true if non-minimized tasks should be filtered.
0211      **/
0212     bool filterNotMinimized() const;
0213 
0214     /**
0215      * Set whether non-minimized tasks should be filtered.
0216      *
0217      * @see filterNotMinimized
0218      * @param filter Whether non-minimized tasks should be filtered.
0219      **/
0220     void setFilterNotMinimized(bool filter);
0221 
0222     /**
0223      * Whether non-maximized tasks should be filtered. Defaults to
0224      * @c false.
0225      *
0226      * @see setFilterNotMaximized
0227      * @returns @c true if non-maximized tasks should be filtered.
0228      **/
0229     bool filterNotMaximized() const;
0230 
0231     /**
0232      * Set whether non-maximized tasks should be filtered.
0233      *
0234      * @see filterNotMaximized
0235      * @param filter Whether non-maximized tasks should be filtered.
0236      **/
0237     void setFilterNotMaximized(bool filter);
0238 
0239     /**
0240      * Whether hidden tasks should be filtered. Defaults to
0241      * @c false.
0242      *
0243      * @see setFilterHidden
0244      * @returns @c true if hidden tasks should be filtered.
0245      **/
0246     bool filterHidden() const;
0247 
0248     /**
0249      * Set whether hidden tasks should be filtered.
0250      *
0251      * @see filterHidden
0252      * @param filter Whether hidden tasks should be filtered.
0253      **/
0254     void setFilterHidden(bool filter);
0255 
0256     /**
0257      * Whether tasks which should be omitted from 'task bars' should be
0258      * filtered. Defaults to @c true.
0259      *
0260      * @see setFilterSkipTaskbar
0261      * @returns @c true if tasks which should not be on the 'task bar'
0262      * should be filtered.
0263      **/
0264     bool filterSkipTaskbar() const;
0265 
0266     /**
0267      * Set whether tasks which should be omitted from 'task bars' should be
0268      * filtered.
0269      *
0270      * @see filterSkipTaskbar
0271      * @param filter Whether tasks whichs should not be on the 'task bar'
0272      * should be filtered.
0273      **/
0274     void setFilterSkipTaskbar(bool filter);
0275 
0276     /**
0277      * Whether tasks which should be omitted from 'pagers' should be
0278      * filtered. Defaults to @c true.
0279      *
0280      * @see setFilterSkipPager
0281      * @returns @c true if tasks which should not be on the 'pager' should
0282      * be filtered.
0283      **/
0284     bool filterSkipPager() const;
0285 
0286     /**
0287      * Set whether tasks which should be omitted from 'pagers' should be
0288      * filtered.
0289      *
0290      * @see filterSkipPager
0291      * @param filter Whether tasks which should not be on the 'pager' should
0292      * be filtered.
0293      **/
0294     void setFilterSkipPager(bool filter);
0295 
0296     /**
0297      * Whether tasks which demand attention skip filters by virtual desktop
0298      * or activity. Defaults to @c true.
0299      *
0300      * @see setDemandingAttentionSkipsFilters
0301      * @returns @c true if tasks which demand attention skip filters.
0302      **/
0303     bool demandingAttentionSkipsFilters() const;
0304 
0305     /**
0306      * Sets whether tasks which demand attention should bypass filters by
0307      * virtual desktop or activity.
0308      *
0309      * @see demandingAttentionSkipsFilters
0310      * @param skip Whether tasks which demand attention should skip filters.
0311      **/
0312     void setDemandingAttentionSkipsFilters(bool skip);
0313 
0314     /**
0315      * Returns whether the filter model accepts this source row.
0316      *
0317      * @param int A row in the source model.
0318      */
0319     bool acceptsRow(int sourceRow) const;
0320 
0321 Q_SIGNALS:
0322     void virtualDesktopChanged() const;
0323     void screenGeometryChanged() const;
0324     void activityChanged() const;
0325     void filterByVirtualDesktopChanged() const;
0326     void filterByScreenChanged() const;
0327     void filterByActivityChanged() const;
0328     void filterMinimizedChanged();
0329     void filterNotMinimizedChanged() const;
0330     void filterNotMaximizedChanged() const;
0331     void filterHiddenChanged() const;
0332     void filterSkipTaskbarChanged() const;
0333     void filterSkipPagerChanged() const;
0334     void demandingAttentionSkipsFiltersChanged() const;
0335 
0336 protected:
0337     bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override;
0338     QModelIndex mapIfaceToSource(const QModelIndex &index) const override;
0339 
0340 private:
0341     class Private;
0342     QScopedPointer<Private> d;
0343 };
0344 
0345 }