1From af749499bc36d6c630b83fa6756515a90e797940 Mon Sep 17 00:00:00 2001 2From: Agata Cacko <tamtamy.tymona@gmail.com> 3Date: Mon, 10 Feb 2020 17:03:26 +0300 4Subject: [PATCH 22/22] Make jp(e)g default extensions context-aware 5 6This commit contains changes to Qt that enable two things: 7- non-native file dialogs give .jpg or .jpeg extension depending 8on the context: 91. If the current file is *.jp(e)g, suggest that extension. 102. Whether there are already files with this name 11and extension in the directory, take that extension. 123. Take .jpg. 13- "All" filter now suggests .kra extension instead of .exr. 14 15CCBUG:412651 16 17Change-Id: I6a61c3ab70942110ab1ead6eca8e1f1bd664ef3b 18--- 19 src/widgets/dialogs/qfiledialog.cpp | 84 +++++++++++++++++++++-------- 20 src/widgets/dialogs/qfiledialog_p.h | 2 + 21 2 files changed, 64 insertions(+), 22 deletions(-) 22 23diff --git a/src/widgets/dialogs/qfiledialog.cpp b/src/widgets/dialogs/qfiledialog.cpp 24index 9fccee8c81..8c868fceb6 100644 25--- a/src/widgets/dialogs/qfiledialog.cpp 26+++ b/src/widgets/dialogs/qfiledialog.cpp 27@@ -963,11 +963,7 @@ void QFileDialog::setDirectory(const QString &directory) 28 QDir QFileDialog::directory() const 29 { 30 Q_D(const QFileDialog); 31- if (d->nativeDialogInUse) { 32- QString dir = d->directory_sys().toLocalFile(); 33- return QDir(dir.isEmpty() ? d->options->initialDirectory().toLocalFile() : dir); 34- } 35- return d->rootPath(); 36+ return d->_q_directory(); 37 } 38 39 /*! 40@@ -1160,13 +1156,38 @@ Q_AUTOTEST_EXPORT QString qt_tildeExpansion(const QString &path) 41 } 42 #endif 43 44-static inline QString selectedNameFilterSuffix(const QFileDialog *dialog) 45+static inline QString selectedNameFilterSuffix(const QString nameFilter, const QStringList filesList, const QString directory, const QString currentExtension = "") 46 { 47- const QString nameFilter = dialog->selectedNameFilter(); 48+ QString directoryPath = directory + QDir::separator(); 49 if (nameFilter.isEmpty()) 50 return QString(); 51- foreach (const QString &filter, QPlatformFileDialogHelper::cleanFilterList(nameFilter)) { 52 53+ // special usecase to avoid jpg/jpeg issues 54+ const QString jpeg = "jpeg"; 55+ const QString jpg = "jpg"; 56+ 57+ if (nameFilter.contains(".kra")) { 58+ return "kra"; 59+ } 60+ 61+ if (nameFilter.contains(jpg, Qt::CaseInsensitive) || nameFilter.contains(jpeg, Qt::CaseInsensitive)) { 62+ 63+ foreach (const QString &file, filesList) { 64+ if (QFile::exists(directoryPath + file + QString(".") + jpg)) { 65+ return QString(jpg); 66+ } 67+ if (QFile::exists(directoryPath + file + QString(".") + jpeg)) { 68+ return QString(jpeg); 69+ } 70+ } 71+ 72+ if (currentExtension == jpg || currentExtension == jpeg) { 73+ return currentExtension; 74+ } 75+ 76+ } 77+ 78+ foreach (const QString &filter, QPlatformFileDialogHelper::cleanFilterList(nameFilter)) { 79 if (filter.startsWith(QLatin1String("*.")) && filter.indexOf(QLatin1Char('*'), 2) < 0) 80 return filter.right(filter.size() - 2); 81 } 82@@ -1214,7 +1235,7 @@ QStringList QFileDialogPrivate::typedFiles() const 83 84 QString suffix = q->defaultSuffix(); 85 if (suffix.isNull()) // Intended, setting an empty string should suppress the name filter. 86- suffix = selectedNameFilterSuffix(q); 87+ suffix = selectedNameFilterSuffix(q->selectedNameFilter(), files, q->directory().path()); 88 return addSuffixToFiles(files, suffix); 89 } 90 91@@ -1252,7 +1273,7 @@ QStringList QFileDialogPrivate::addSuffixToFiles(const QStringList &filesToFix, 92 // if the filename has no suffix, add the desired suffix 93 if (!suffix.isEmpty() && !info.isDir() && name.lastIndexOf(QLatin1Char('.')) == -1) { 94 name += QLatin1Char('.') + suffix; 95- } 96+ } 97 if (info.isAbsolute()) { 98 files.append(name); 99 } else { 100@@ -1276,12 +1297,12 @@ QList<QUrl> QFileDialogPrivate::addSuffixToUrls(const QList<QUrl> &urlsToFix, co 101 urls.reserve(numUrlsToFix); 102 for (int i = 0; i < numUrlsToFix; ++i) { 103 QUrl url = urlsToFix.at(i); 104- // if the filename has no suffix, add the desired suffix 105+ // if the filename has no suffix, add the desired suffix 106 if (!suffix.isEmpty() && !url.path().endsWith(QLatin1Char('/')) && url.path().lastIndexOf(QLatin1Char('.')) == -1) { 107 url.setPath(url.path() + QLatin1Char('.') + suffix); 108- } 109+ } 110 urls.append(url); 111- } 112+ } 113 return urls; 114 } 115 116@@ -3731,6 +3752,17 @@ void QFileDialogPrivate::_q_goToDirectory(const QString &path) 117 } 118 } 119 120+ 121+QDir QFileDialogPrivate::_q_directory() const 122+{ 123+ if (nativeDialogInUse) { 124+ QString dir = directory_sys().toLocalFile(); 125+ return QDir(dir.isEmpty() ? options->initialDirectory().toLocalFile() : dir); 126+ } 127+ return rootPath(); 128+} 129+ 130+ 131 /*! 132 \internal 133 134@@ -3748,19 +3780,27 @@ void QFileDialogPrivate::_q_useNameFilter(int index) 135 136 QString nameFilter = nameFilters.at(index); 137 QStringList newNameFilters = QPlatformFileDialogHelper::cleanFilterList(nameFilter); 138+ 139 if (q_func()->acceptMode() == QFileDialog::AcceptSave) { 140 QString newNameFilterExtension; 141- if (newNameFilters.count() > 0) 142- newNameFilterExtension = QFileInfo(newNameFilters.at(0)).suffix(); 143- 144 QString fileName = lineEdit()->text(); 145 const QString fileNameExtension = QFileInfo(fileName).suffix(); 146- if (!fileNameExtension.isEmpty() && !newNameFilterExtension.isEmpty()) { 147- const int fileNameExtensionLength = fileNameExtension.count(); 148- fileName.replace(fileName.count() - fileNameExtensionLength, 149- fileNameExtensionLength, newNameFilterExtension); 150- qFileDialogUi->listView->clearSelection(); 151- lineEdit()->setText(fileName); 152+ 153+ if (!fileNameExtension.isEmpty()) { 154+ 155+ QString fileNameWithoutExtension(fileName); 156+ int fileNameExtensionLength = fileNameExtension.count(); 157+ fileNameWithoutExtension.remove(fileName.count() - (fileNameExtensionLength + 1), fileNameExtensionLength + 1); // +1 to count the dot, too 158+ 159+ QStringList filesList = {fileNameWithoutExtension}; 160+ newNameFilterExtension = selectedNameFilterSuffix(nameFilter, filesList, _q_directory().path(), fileNameExtension); 161+ 162+ if (!newNameFilterExtension.isEmpty()) { 163+ fileName.replace(fileName.count() - fileNameExtensionLength, 164+ fileNameExtensionLength, newNameFilterExtension); 165+ qFileDialogUi->listView->clearSelection(); 166+ lineEdit()->setText(fileName); 167+ } 168 } 169 } 170 171diff --git a/src/widgets/dialogs/qfiledialog_p.h b/src/widgets/dialogs/qfiledialog_p.h 172index 0a029efaaa..3979c6eb29 100644 173--- a/src/widgets/dialogs/qfiledialog_p.h 174+++ b/src/widgets/dialogs/qfiledialog_p.h 175@@ -226,6 +226,8 @@ public: 176 void _q_rowsInserted(const QModelIndex & parent); 177 void _q_fileRenamed(const QString &path, const QString &oldName, const QString &newName); 178 179+ QDir _q_directory() const; 180+ 181 // layout 182 #if QT_CONFIG(proxymodel) 183 QAbstractProxyModel *proxyModel; 184-- 1852.20.1.windows.1 186 187