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 }