From afeaf5ad8fc9e0d14f7f699b50d25e73cc64d7b7 Mon Sep 17 00:00:00 2001 From: Gong Heng Date: Tue, 7 May 2024 10:25:22 +0800 Subject: [PATCH] fix: [select-dialog] The suffix show error in gtk. 1. When save file by gtk, the suffix show error. 2. The suffix has RegExp, and not analyze it. Log: fix issue Bug: https://pms.uniontech.com/bug-view-253189.html --- .../views/filedialog.cpp | 60 ++++++++++++------- 1 file changed, 38 insertions(+), 22 deletions(-) diff --git a/src/plugins/filedialog/filedialogplugin-core/views/filedialog.cpp b/src/plugins/filedialog/filedialogplugin-core/views/filedialog.cpp index 8db3215719..986a23b577 100644 --- a/src/plugins/filedialog/filedialogplugin-core/views/filedialog.cpp +++ b/src/plugins/filedialog/filedialogplugin-core/views/filedialog.cpp @@ -157,33 +157,49 @@ void FileDialogPrivate::handleOpenNewWindow(const QUrl &url) bool FileDialogPrivate::checkFileSuffix(const QString &filename, QString &suffix) { - for (QString nameFilterList : nameFilters) { - for (QString nameFilter : QPlatformFileDialogHelper::cleanFilterList(nameFilterList)) { - QRegExp re(nameFilter, Qt::CaseInsensitive, QRegExp::Wildcard); - if (re.exactMatch(filename)) { + if (nameFilters.isEmpty()) + return false; + + for (const QString &nameFilterList : nameFilters) { + for (const QString &nameFilter : QPlatformFileDialogHelper::cleanFilterList(nameFilterList)) { + QString realFilter = nameFilter; + realFilter.replace(".", "\\."); + realFilter.replace("*", ".*"); + realFilter.append('$'); + QRegularExpression re(realFilter); + if (re.match(filename).hasMatch()) return false; - } } } - // query matched suffix - if (!nameFilters.isEmpty()) { - QMimeDatabase mdb; - // get current selected suffix - int index = q->selectedNameFilterIndex(); - QString filter = nameFilters[index]; - QStringList newNameFilters = QPlatformFileDialogHelper::cleanFilterList(filter); - if (!newNameFilters.isEmpty()) { - const QString firstFilter = newNameFilters.first(); - suffix = mdb.suffixForFileName(firstFilter); - if (suffix.isEmpty()) { - // check format is *. ? - if (!firstFilter.startsWith("*.")) - return false; - suffix = firstFilter.mid(2); - if (suffix.isEmpty()) - return false; + QMimeDatabase mdb; + // get current selected suffix + int index = q->selectedNameFilterIndex(); + QString filter = nameFilters[index]; + QStringList newNameFilters = QPlatformFileDialogHelper::cleanFilterList(filter); + if (newNameFilters.isEmpty()) + return false; + + for (const QString &newFilter : newNameFilters) { + suffix = mdb.suffixForFileName(newFilter); + if (suffix.isEmpty()) { + if (!newFilter.startsWith("*.")) + continue; + QString realFilter = newFilter.mid(2); + if (realFilter.isEmpty()) + continue; + realFilter.prepend('^'); + realFilter.append('$'); + QRegularExpression regExp(realFilter); + for (const QMimeType &m : mdb.allMimeTypes()) { + for (const QString &suffixe : m.suffixes()) { + if (regExp.match(suffixe).hasMatch()) { + suffix = suffixe; + return true; + } + } } + } else { return true; } }