File indexing completed on 2024-05-05 05:38:34

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