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 }