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 #include "taskfilterproxymodel.h"
0008 #include "abstracttasksmodel.h"
0009 
0010 #include "launchertasksmodel_p.h"
0011 
0012 namespace TaskManager
0013 {
0014 class Q_DECL_HIDDEN TaskFilterProxyModel::Private
0015 {
0016 public:
0017     Private(TaskFilterProxyModel *q);
0018 
0019     AbstractTasksModelIface *sourceTasksModel = nullptr;
0020 
0021     QVariant virtualDesktop;
0022     QRect screenGeometry;
0023     QString activity;
0024 
0025     bool filterByVirtualDesktop = false;
0026     bool filterByScreen = false;
0027     bool filterByActivity = false;
0028     bool filterMinimized = false;
0029     bool filterNotMinimized = false;
0030     bool filterNotMaximized = false;
0031     bool filterHidden = false;
0032     bool filterSkipTaskbar = true;
0033     bool filterSkipPager = false;
0034 
0035     bool demandingAttentionSkipsFilters = true;
0036 };
0037 
0038 TaskFilterProxyModel::Private::Private(TaskFilterProxyModel *)
0039 {
0040 }
0041 
0042 TaskFilterProxyModel::TaskFilterProxyModel(QObject *parent)
0043     : QSortFilterProxyModel(parent)
0044     , d(new Private(this))
0045 {
0046 }
0047 
0048 TaskFilterProxyModel::~TaskFilterProxyModel()
0049 {
0050 }
0051 
0052 void TaskFilterProxyModel::setSourceModel(QAbstractItemModel *sourceModel)
0053 {
0054     d->sourceTasksModel = dynamic_cast<AbstractTasksModelIface *>(sourceModel);
0055 
0056     QSortFilterProxyModel::setSourceModel(sourceModel);
0057 }
0058 
0059 QVariant TaskFilterProxyModel::virtualDesktop() const
0060 {
0061     return d->virtualDesktop;
0062 }
0063 
0064 void TaskFilterProxyModel::setVirtualDesktop(const QVariant &desktop)
0065 {
0066     if (d->virtualDesktop != desktop) {
0067         d->virtualDesktop = desktop;
0068 
0069         if (d->filterByVirtualDesktop) {
0070             invalidateFilter();
0071         }
0072 
0073         Q_EMIT virtualDesktopChanged();
0074     }
0075 }
0076 
0077 QRect TaskFilterProxyModel::screenGeometry() const
0078 {
0079     return d->screenGeometry;
0080 }
0081 
0082 void TaskFilterProxyModel::setScreenGeometry(const QRect &geometry)
0083 {
0084     if (d->screenGeometry != geometry) {
0085         d->screenGeometry = geometry;
0086 
0087         if (d->filterByScreen) {
0088             invalidateFilter();
0089         }
0090 
0091         Q_EMIT screenGeometryChanged();
0092     }
0093 }
0094 
0095 QString TaskFilterProxyModel::activity() const
0096 {
0097     return d->activity;
0098 }
0099 
0100 void TaskFilterProxyModel::setActivity(const QString &activity)
0101 {
0102     if (d->activity != activity) {
0103         d->activity = activity;
0104 
0105         if (d->filterByActivity) {
0106             invalidateFilter();
0107         }
0108 
0109         Q_EMIT activityChanged();
0110     }
0111 }
0112 
0113 bool TaskFilterProxyModel::filterByVirtualDesktop() const
0114 {
0115     return d->filterByVirtualDesktop;
0116 }
0117 
0118 void TaskFilterProxyModel::setFilterByVirtualDesktop(bool filter)
0119 {
0120     if (d->filterByVirtualDesktop != filter) {
0121         d->filterByVirtualDesktop = filter;
0122 
0123         invalidateFilter();
0124 
0125         Q_EMIT filterByVirtualDesktopChanged();
0126     }
0127 }
0128 
0129 bool TaskFilterProxyModel::filterByScreen() const
0130 {
0131     return d->filterByScreen;
0132 }
0133 
0134 void TaskFilterProxyModel::setFilterByScreen(bool filter)
0135 {
0136     if (d->filterByScreen != filter) {
0137         d->filterByScreen = filter;
0138 
0139         invalidateFilter();
0140 
0141         Q_EMIT filterByScreenChanged();
0142     }
0143 }
0144 
0145 bool TaskFilterProxyModel::filterByActivity() const
0146 {
0147     return d->filterByActivity;
0148 }
0149 
0150 void TaskFilterProxyModel::setFilterByActivity(bool filter)
0151 {
0152     if (d->filterByActivity != filter) {
0153         d->filterByActivity = filter;
0154 
0155         invalidateFilter();
0156 
0157         Q_EMIT filterByActivityChanged();
0158     }
0159 }
0160 
0161 bool TaskFilterProxyModel::filterMinimized() const
0162 {
0163     return d->filterMinimized;
0164 }
0165 
0166 void TaskFilterProxyModel::setFilterMinimized(bool filter)
0167 {
0168     if (d->filterMinimized == filter) {
0169         return;
0170     }
0171 
0172     d->filterMinimized = filter;
0173     invalidateFilter();
0174 
0175     Q_EMIT filterMinimizedChanged();
0176 }
0177 
0178 bool TaskFilterProxyModel::filterNotMinimized() const
0179 {
0180     return d->filterNotMinimized;
0181 }
0182 
0183 void TaskFilterProxyModel::setFilterNotMinimized(bool filter)
0184 {
0185     if (d->filterNotMinimized != filter) {
0186         d->filterNotMinimized = filter;
0187 
0188         invalidateFilter();
0189 
0190         Q_EMIT filterNotMinimizedChanged();
0191     }
0192 }
0193 
0194 bool TaskFilterProxyModel::filterNotMaximized() const
0195 {
0196     return d->filterNotMaximized;
0197 }
0198 
0199 void TaskFilterProxyModel::setFilterNotMaximized(bool filter)
0200 {
0201     if (d->filterNotMaximized != filter) {
0202         d->filterNotMaximized = filter;
0203 
0204         invalidateFilter();
0205 
0206         Q_EMIT filterNotMaximizedChanged();
0207     }
0208 }
0209 
0210 bool TaskFilterProxyModel::filterHidden() const
0211 {
0212     return d->filterHidden;
0213 }
0214 
0215 void TaskFilterProxyModel::setFilterHidden(bool filter)
0216 {
0217     if (d->filterHidden != filter) {
0218         d->filterHidden = filter;
0219 
0220         invalidateFilter();
0221 
0222         Q_EMIT filterHiddenChanged();
0223     }
0224 }
0225 
0226 bool TaskFilterProxyModel::filterSkipTaskbar() const
0227 {
0228     return d->filterSkipTaskbar;
0229 }
0230 
0231 void TaskFilterProxyModel::setFilterSkipTaskbar(bool filter)
0232 {
0233     if (d->filterSkipTaskbar != filter) {
0234         d->filterSkipTaskbar = filter;
0235 
0236         invalidateFilter();
0237 
0238         Q_EMIT filterSkipTaskbarChanged();
0239     }
0240 }
0241 
0242 bool TaskFilterProxyModel::filterSkipPager() const
0243 {
0244     return d->filterSkipPager;
0245 }
0246 
0247 void TaskFilterProxyModel::setFilterSkipPager(bool filter)
0248 {
0249     if (d->filterSkipPager != filter) {
0250         d->filterSkipPager = filter;
0251 
0252         invalidateFilter();
0253 
0254         Q_EMIT filterSkipPagerChanged();
0255     }
0256 }
0257 
0258 bool TaskFilterProxyModel::demandingAttentionSkipsFilters() const
0259 {
0260     return d->demandingAttentionSkipsFilters;
0261 }
0262 
0263 void TaskFilterProxyModel::setDemandingAttentionSkipsFilters(bool skip)
0264 {
0265     if (d->demandingAttentionSkipsFilters != skip) {
0266         d->demandingAttentionSkipsFilters = skip;
0267 
0268         invalidateFilter();
0269 
0270         Q_EMIT demandingAttentionSkipsFiltersChanged();
0271     }
0272 }
0273 
0274 QModelIndex TaskFilterProxyModel::mapIfaceToSource(const QModelIndex &index) const
0275 {
0276     return mapToSource(index);
0277 }
0278 
0279 bool TaskFilterProxyModel::acceptsRow(int sourceRow) const
0280 {
0281     const QModelIndex &sourceIdx = sourceModel()->index(sourceRow, 0);
0282 
0283     if (!sourceIdx.isValid()) {
0284         return false;
0285     }
0286 
0287     // Filter tasks that are not to be shown on the task bar.
0288     if (d->filterSkipTaskbar && sourceIdx.data(AbstractTasksModel::SkipTaskbar).toBool()) {
0289         return false;
0290     }
0291 
0292     // Filter tasks that are not to be shown on the pager.
0293     if (d->filterSkipPager && sourceIdx.data(AbstractTasksModel::SkipPager).toBool()) {
0294         return false;
0295     }
0296 
0297     // Filter by virtual desktop.
0298     if (d->filterByVirtualDesktop && !d->virtualDesktop.isNull()) {
0299         if (!sourceIdx.data(AbstractTasksModel::IsOnAllVirtualDesktops).toBool()
0300             && (!d->demandingAttentionSkipsFilters || !sourceIdx.data(AbstractTasksModel::IsDemandingAttention).toBool())) {
0301             const QVariantList &virtualDesktops = sourceIdx.data(AbstractTasksModel::VirtualDesktops).toList();
0302 
0303             if (!virtualDesktops.isEmpty() && !virtualDesktops.contains(d->virtualDesktop)) {
0304                 return false;
0305             }
0306         }
0307     }
0308 
0309     // Filter by screen.
0310     if (d->filterByScreen && d->screenGeometry.isValid()) {
0311         const QRect &screenGeometry = sourceIdx.data(AbstractTasksModel::ScreenGeometry).toRect();
0312 
0313         if (screenGeometry.isValid() && screenGeometry != d->screenGeometry) {
0314             return false;
0315         }
0316     }
0317 
0318     // Filter by activity.
0319     if (d->filterByActivity && !d->activity.isEmpty()) {
0320         if (!d->demandingAttentionSkipsFilters || !sourceIdx.data(AbstractTasksModel::IsDemandingAttention).toBool()) {
0321             const QVariant &activities = sourceIdx.data(AbstractTasksModel::Activities);
0322 
0323             if (!activities.isNull()) {
0324                 const QStringList l = activities.toStringList();
0325 
0326                 if (!l.isEmpty() && !l.contains(NULL_UUID) && !l.contains(d->activity)) {
0327                     return false;
0328                 }
0329             }
0330         }
0331     }
0332 
0333     // Filter not minimized.
0334     if (d->filterNotMinimized) {
0335         bool isMinimized = sourceIdx.data(AbstractTasksModel::IsMinimized).toBool();
0336 
0337         if (!isMinimized) {
0338             return false;
0339         }
0340     }
0341 
0342     // Filter out minimized windows
0343     if (d->filterMinimized) {
0344         const bool isMinimized = sourceIdx.data(AbstractTasksModel::IsMinimized).toBool();
0345 
0346         if (isMinimized) {
0347             return false;
0348         }
0349     }
0350 
0351     // Filter not maximized.
0352     if (d->filterNotMaximized) {
0353         bool isMaximized = sourceIdx.data(AbstractTasksModel::IsMaximized).toBool();
0354 
0355         if (!isMaximized) {
0356             return false;
0357         }
0358     }
0359 
0360     // Filter hidden.
0361     if (d->filterHidden) {
0362         bool isHidden = sourceIdx.data(AbstractTasksModel::IsHidden).toBool();
0363 
0364         if (isHidden) {
0365             return false;
0366         }
0367     }
0368 
0369     return true;
0370 }
0371 
0372 bool TaskFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
0373 {
0374     Q_UNUSED(sourceParent)
0375 
0376     return acceptsRow(sourceRow);
0377 }
0378 
0379 }