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 }