diff --git a/src/assets/assetlist/model/assetfilter.cpp b/src/assets/assetlist/model/assetfilter.cpp index 2c0abcdfa..7db0b275d 100644 --- a/src/assets/assetlist/model/assetfilter.cpp +++ b/src/assets/assetlist/model/assetfilter.cpp @@ -1,188 +1,188 @@ /*************************************************************************** * Copyright (C) 2017 by Nicolas Carion * * This file is part of Kdenlive. See www.kdenlive.org. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) version 3 or any later version accepted by the * * membership of KDE e.V. (or its successor approved by the membership * * of KDE e.V.), which shall act as a proxy defined in Section 14 of * * version 3 of the license. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see . * ***************************************************************************/ #include "assetfilter.hpp" #include "abstractmodel/abstracttreemodel.hpp" #include "abstractmodel/treeitem.hpp" #include "assettreemodel.hpp" #include #include AssetFilter::AssetFilter(QObject *parent) : QSortFilterProxyModel(parent) { setFilterRole(Qt::DisplayRole); setSortRole(Qt::DisplayRole); setDynamicSortFilter(false); } void AssetFilter::setFilterName(bool enabled, const QString &pattern) { m_name_enabled = enabled; m_name_value = pattern; invalidateFilter(); if (rowCount() > 1) { sort(0); } } bool AssetFilter::lessThan(const QModelIndex &left, const QModelIndex &right) const { QString leftData = sourceModel()->data(left).toString(); QString rightData = sourceModel()->data(right).toString(); if (rightData == i18n("Favorites")) { return false; } return QString::localeAwareCompare(leftData, rightData) < 0; } bool AssetFilter::filterName(const std::shared_ptr &item) const { if (!m_name_enabled) { return true; } - QString itemText = item->dataColumn(AssetTreeModel::nameCol).toString(); + QString itemText = i18n(item->dataColumn(AssetTreeModel::nameCol).toString().toUtf8().constData()); itemText = itemText.normalized(QString::NormalizationForm_D).remove(QRegExp(QStringLiteral("[^a-zA-Z0-9\\s]"))); QString patt = m_name_value.normalized(QString::NormalizationForm_D).remove(QRegExp(QStringLiteral("[^a-zA-Z0-9\\s]"))); return itemText.contains(patt, Qt::CaseInsensitive); } bool AssetFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { QModelIndex row = sourceModel()->index(sourceRow, 0, sourceParent); auto *model = static_cast(sourceModel()); std::shared_ptr item = model->getItemById((int)row.internalId()); if (item->dataColumn(AssetTreeModel::idCol) == QStringLiteral("root")) { // In that case, we have a category. We hide it if it does not have children. QModelIndex category = sourceModel()->index(sourceRow, 0, sourceParent); if (!category.isValid()) { return false; } bool accepted = false; for (int i = 0; i < sourceModel()->rowCount(category) && !accepted; ++i) { accepted = filterAcceptsRow(i, category); } return accepted; } return applyAll(item); } bool AssetFilter::isVisible(const QModelIndex &sourceIndex) { auto parent = sourceModel()->parent(sourceIndex); return filterAcceptsRow(sourceIndex.row(), parent); } bool AssetFilter::applyAll(std::shared_ptr item) const { return filterName(item); } QModelIndex AssetFilter::getNextChild(const QModelIndex ¤t) { QModelIndex nextItem = current.sibling(current.row() + 1, current.column()); if (!nextItem.isValid()) { QModelIndex folder = index(current.parent().row() + 1, 0, QModelIndex()); if (!folder.isValid()) { return current; } while (folder.isValid() && rowCount(folder) == 0) { folder = folder.sibling(folder.row() + 1, folder.column()); } if (folder.isValid() && rowCount(folder) > 0) { return index(0, current.column(), folder); } nextItem = current; } return nextItem; } QModelIndex AssetFilter::getPreviousChild(const QModelIndex ¤t) { QModelIndex nextItem = current.sibling(current.row() - 1, current.column()); if (!nextItem.isValid()) { QModelIndex folder = index(current.parent().row() - 1, 0, QModelIndex()); if (!folder.isValid()) { return current; } while (folder.isValid() && rowCount(folder) == 0) { folder = folder.sibling(folder.row() - 1, folder.column()); } if (folder.isValid() && rowCount(folder) > 0) { return index(rowCount(folder) - 1, current.column(), folder); } nextItem = current; } return nextItem; } QModelIndex AssetFilter::firstVisibleItem(const QModelIndex ¤t) { if (current.isValid() && isVisible(mapToSource(current))) { return current; } QModelIndex folder = index(0, 0, QModelIndex()); if (!folder.isValid()) { return current; } while (folder.isValid() && rowCount(folder) == 0) { folder = index(folder.row() + 1, 0, QModelIndex()); } if (rowCount(folder) > 0) { return index(0, 0, folder); } return current; } QModelIndex AssetFilter::getCategory(int catRow) { QModelIndex cat = index(catRow, 0, QModelIndex()); return cat; } QVariantList AssetFilter::getCategories() { QVariantList list; for (int i = 0; i < sourceModel()->rowCount(); i++) { QModelIndex cat = getCategory(i); if (cat.isValid()) { list << cat; } } return list; } QModelIndex AssetFilter::getModelIndex(QModelIndex current) { QModelIndex sourceIndex = mapToSource(current); return sourceIndex; // this returns an integer } QModelIndex AssetFilter::getProxyIndex(QModelIndex current) { QModelIndex sourceIndex = mapFromSource(current); return sourceIndex; // this returns an integer }