diff --git a/src/filewidgets/kfilewidget.cpp b/src/filewidgets/kfilewidget.cpp --- a/src/filewidgets/kfilewidget.cpp +++ b/src/filewidgets/kfilewidget.cpp @@ -129,6 +129,7 @@ void setLocationText(const QList &); void appendExtension(QUrl &url); void updateLocationEditExtension(const QString &); + bool matchFilter(const QString &filename, const QString &filter, const bool bUpdate); void updateFilter(); void updateFilterText(); QList &parseSelectedUrls(); @@ -2452,6 +2453,22 @@ } } +bool KFileWidgetPrivate::matchFilter(const QString &filename, const QString &filter, const bool bUpdate) +{ + const QStringList patterns = filter.left(filter.indexOf(QLatin1Char('|'))).split(QLatin1Char(' '), QString::SkipEmptyParts); // '*.foo *.bar|Foo type' -> '*.foo', '*.bar' + for (const QString &p, patterns) { + QRegExp rx(p); + rx.setPatternSyntax(QRegExp::Wildcard); + if (rx.exactMatch(filename)) { + if (bUpdate && p != QLatin1String("*")) { // never match the catch-all filter + filterWidget->setCurrentFilter(filter); + } + return true; // do not repeat, could match a later filter + } + } + return false; +} + // Updates the filter if the extension of the filename specified in d->locationEdit is changed // (this prevents you from accidently saving "file.kwd" as RTF, for example) void KFileWidgetPrivate::updateFilter() @@ -2475,18 +2492,11 @@ } } else { QString filename = urlStr.mid(urlStr.lastIndexOf(QLatin1Char('/')) + 1); // only filename + if (matchFilter(filename, filterWidget->currentFilter() + QLatin1Char('|'), false)) + return; foreach (const QString &filter, filterWidget->filters()) { - const QStringList patterns = filter.left(filter.indexOf(QLatin1Char('|'))).split(QLatin1Char(' '), QString::SkipEmptyParts); // '*.foo *.bar|Foo type' -> '*.foo', '*.bar' - for (const QString &p : patterns) { - QRegExp rx(p); - rx.setPatternSyntax(QRegExp::Wildcard); - if (rx.exactMatch(filename)) { - if (p != QLatin1String("*")) { // never match the catch-all filter - filterWidget->setCurrentFilter(filter); - } - return; // do not repeat, could match a later filter - } - } + if (matchFilter(filename, filter, true)) + return; // do not repeat, could match a later filter } } }