File indexing completed on 2024-05-12 15:59:52
0001 /* 0002 * SPDX-FileCopyrightText: 2018 Boudewijn Rempt <boud@valdyas.org> 0003 * 0004 * SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 #include "KisStorageFilterProxyModel.h" 0007 0008 #include <QDebug> 0009 #include <KisResourceModel.h> 0010 #include <kis_debug.h> 0011 #include <KisResourceSearchBoxFilter.h> 0012 #include <KisResourceLocator.h> 0013 0014 struct KisStorageFilterProxyModel::Private 0015 { 0016 FilterType filterType {KisStorageFilterProxyModel::ByStorageType}; 0017 QVariant filter; 0018 0019 }; 0020 0021 KisStorageFilterProxyModel::KisStorageFilterProxyModel(QObject *parent) 0022 : QSortFilterProxyModel(parent) 0023 , d(new Private) 0024 { 0025 } 0026 0027 KisStorageFilterProxyModel::~KisStorageFilterProxyModel() 0028 { 0029 delete d; 0030 } 0031 0032 KisResourceStorageSP KisStorageFilterProxyModel::storageForIndex(QModelIndex index) const 0033 { 0034 KisStorageModel *source = dynamic_cast<KisStorageModel*>(sourceModel()); 0035 if (source) { 0036 return source->storageForIndex(mapToSource(index)); 0037 } 0038 return 0; 0039 } 0040 0041 void KisStorageFilterProxyModel::setFilter(KisStorageFilterProxyModel::FilterType filterType, QVariant filter) 0042 { 0043 d->filter = filter; 0044 d->filterType = filterType; 0045 } 0046 0047 0048 bool KisStorageFilterProxyModel::filterAcceptsColumn(int /*source_column*/, const QModelIndex &/*source_parent*/) const 0049 { 0050 return true; 0051 } 0052 0053 bool KisStorageFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const 0054 { 0055 if (d->filter.isNull()) return true; 0056 0057 QModelIndex idx = sourceModel()->index(source_row, KisAbstractResourceModel::Name, source_parent); 0058 0059 switch (d->filterType) { 0060 case ByFileName: 0061 { 0062 QString filename = d->filter.toString(); 0063 return (sourceModel()->data(idx, Qt::UserRole + KisStorageModel::Location).toString().contains(filename)); 0064 } 0065 case ByStorageType: 0066 { 0067 QString storageType = sourceModel()->data(idx, Qt::UserRole + KisStorageModel::StorageType).toString(); 0068 return (d->filter.toStringList().contains(storageType)); 0069 } 0070 case ByActive: 0071 { 0072 bool active = d->filter.toBool(); 0073 bool isActive = sourceModel()->data(idx, Qt::UserRole + KisStorageModel::Active).toBool(); 0074 return (active == isActive); 0075 } 0076 default: 0077 ; 0078 } 0079 0080 return false; 0081 } 0082 0083 bool KisStorageFilterProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const 0084 { 0085 QString nameLeft = sourceModel()->data(source_left, Qt::UserRole + KisAbstractResourceModel::Name).toString(); 0086 QString nameRight = sourceModel()->data(source_right, Qt::UserRole + KisAbstractResourceModel::Name).toString(); 0087 return nameLeft < nameRight; 0088 } 0089 0090 void KisStorageFilterProxyModel::slotModelReset() 0091 { 0092 invalidateFilter(); 0093 }