CollectionFilter: Match individual words
This commit is contained in:
@@ -61,33 +61,32 @@ bool CollectionFilter::filterAcceptsRow(const int source_row, const QModelIndex
|
|||||||
if (!item) return false;
|
if (!item) return false;
|
||||||
|
|
||||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
|
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
|
||||||
QString filter_text = filterRegularExpression().pattern().remove(QLatin1Char('\\'));
|
QString filter_string = filterRegularExpression().pattern().remove(QLatin1Char('\\'));
|
||||||
#else
|
#else
|
||||||
QString filter_text = filterRegExp().pattern();
|
QString filter_string = filterRegExp().pattern();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (filter_text.isEmpty()) return true;
|
if (filter_string.isEmpty()) return true;
|
||||||
|
|
||||||
if (item->type != CollectionItem::Type::Song) {
|
if (item->type != CollectionItem::Type::Song) {
|
||||||
return item->type == CollectionItem::Type::LoadingIndicator;
|
return item->type == CollectionItem::Type::LoadingIndicator;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const QString &foperator : Operators) {
|
for (const QString &foperator : Operators) {
|
||||||
if (filter_text.contains(foperator + QLatin1Char(' '))) {
|
if (filter_string.contains(foperator + QLatin1Char(' '))) {
|
||||||
filter_text = filter_text.replace(foperator + QLatin1Char(' '), foperator);
|
filter_string = filter_string.replace(foperator + QLatin1Char(' '), foperator);
|
||||||
}
|
}
|
||||||
if (filter_text.contains(QLatin1Char(' ') + foperator)) {
|
if (filter_string.contains(QLatin1Char(' ') + foperator)) {
|
||||||
filter_text = filter_text.replace(QLatin1Char(' ') + foperator, foperator);
|
filter_string = filter_string.replace(QLatin1Char(' ') + foperator, foperator);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
|
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
|
||||||
const QStringList tokens = filter_text.split(QLatin1Char(' '), Qt::SkipEmptyParts);
|
const QStringList tokens = filter_string.split(QLatin1Char(' '), Qt::SkipEmptyParts);
|
||||||
#else
|
#else
|
||||||
const QStringList tokens = filter_text.split(QLatin1Char(' '), QString::SkipEmptyParts);
|
const QStringList tokens = filter_string.split(QLatin1Char(' '), QString::SkipEmptyParts);
|
||||||
#endif
|
#endif
|
||||||
|
QStringList filter_strings;
|
||||||
filter_text.clear();
|
|
||||||
|
|
||||||
FilterList filters;
|
FilterList filters;
|
||||||
static QRegularExpression operator_regex(QStringLiteral("(=|<[>=]?|>=?|!=)"));
|
static QRegularExpression operator_regex(QStringLiteral("(=|<[>=]?|>=?|!=)"));
|
||||||
@@ -160,17 +159,16 @@ bool CollectionFilter::filterAcceptsRow(const int source_row, const QModelIndex
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!filter_text.isEmpty()) filter_text.append(QLatin1Char(' '));
|
filter_strings << token;
|
||||||
filter_text += token;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (filter_text.isEmpty() && filters.isEmpty()) return true;
|
if (filters.isEmpty() && filter_strings.isEmpty()) return true;
|
||||||
|
|
||||||
return item->metadata.is_valid() && ItemMetadataMatchesFilters(item->metadata, filters, filter_text);
|
return item->metadata.is_valid() && ItemMetadataMatchesFilters(item->metadata, filters, filter_strings);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CollectionFilter::ItemMetadataMatchesFilters(const Song &metadata, const FilterList &filters, const QString &filter_text) {
|
bool CollectionFilter::ItemMetadataMatchesFilters(const Song &metadata, const FilterList &filters, const QStringList &filter_strings) {
|
||||||
|
|
||||||
for (FilterList::const_iterator it = filters.begin() ; it != filters.end() ; ++it) {
|
for (FilterList::const_iterator it = filters.begin() ; it != filters.end() ; ++it) {
|
||||||
const QString &field = it.key();
|
const QString &field = it.key();
|
||||||
@@ -192,21 +190,27 @@ bool CollectionFilter::ItemMetadataMatchesFilters(const Song &metadata, const Fi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return filter_text.isEmpty() || ItemMetadataMatchesFilterText(metadata, filter_text);
|
return filter_strings.isEmpty() || ItemMetadataMatchesFilterText(metadata, filter_strings);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CollectionFilter::ItemMetadataMatchesFilterText(const Song &metadata, const QString &filter_text) {
|
bool CollectionFilter::ItemMetadataMatchesFilterText(const Song &metadata, const QStringList &filter_strings) {
|
||||||
|
|
||||||
return metadata.effective_albumartist().contains(filter_text, Qt::CaseInsensitive) ||
|
for (const QString &filter_string : filter_strings) {
|
||||||
metadata.artist().contains(filter_text, Qt::CaseInsensitive) ||
|
if (!metadata.effective_albumartist().contains(filter_string, Qt::CaseInsensitive) &&
|
||||||
metadata.album().contains(filter_text, Qt::CaseInsensitive) ||
|
!metadata.artist().contains(filter_string, Qt::CaseInsensitive) &&
|
||||||
metadata.title().contains(filter_text, Qt::CaseInsensitive) ||
|
!metadata.album().contains(filter_string, Qt::CaseInsensitive) &&
|
||||||
metadata.composer().contains(filter_text, Qt::CaseInsensitive) ||
|
!metadata.title().contains(filter_string, Qt::CaseInsensitive) &&
|
||||||
metadata.performer().contains(filter_text, Qt::CaseInsensitive) ||
|
!metadata.composer().contains(filter_string, Qt::CaseInsensitive) &&
|
||||||
metadata.grouping().contains(filter_text, Qt::CaseInsensitive) ||
|
!metadata.performer().contains(filter_string, Qt::CaseInsensitive) &&
|
||||||
metadata.genre().contains(filter_text, Qt::CaseInsensitive) ||
|
!metadata.grouping().contains(filter_string, Qt::CaseInsensitive) &&
|
||||||
metadata.comment().contains(filter_text, Qt::CaseInsensitive);
|
!metadata.genre().contains(filter_string, Qt::CaseInsensitive) &&
|
||||||
|
!metadata.comment().contains(filter_string, Qt::CaseInsensitive)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,8 +52,8 @@ class CollectionFilter : public QSortFilterProxyModel {
|
|||||||
QString foperator;
|
QString foperator;
|
||||||
};
|
};
|
||||||
using FilterList = QMap<QString, Filter>;
|
using FilterList = QMap<QString, Filter>;
|
||||||
static bool ItemMetadataMatchesFilters(const Song &metadata, const FilterList &filters, const QString &filter_text);
|
static bool ItemMetadataMatchesFilters(const Song &metadata, const FilterList &filters, const QStringList &filter_strings);
|
||||||
static bool ItemMetadataMatchesFilterText(const Song &metadata, const QString &filter_text);
|
static bool ItemMetadataMatchesFilterText(const Song &metadata, const QStringList &filter_strings);
|
||||||
static QVariant DataFromField(const QString &field, const Song &metadata);
|
static QVariant DataFromField(const QString &field, const Song &metadata);
|
||||||
static bool FieldValueMatchesData(const QVariant &value, const QVariant &data, const QString &foperator);
|
static bool FieldValueMatchesData(const QVariant &value, const QVariant &data, const QString &foperator);
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
|||||||
Reference in New Issue
Block a user