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