From 67609e43e19338be9bd57217ca7e0a08be319fc1 Mon Sep 17 00:00:00 2001
From: Shawn Rutledge <shawn.rutledge@digia.com>
Date: Mon, 27 Oct 2014 14:32:19 +0100
Subject: [PATCH] FileDialog: several logic corrections in handling the enter
 key

A "save as" dialog does not need to validate existence of the file.
When the user presses enter in the text field at the top, and the
text field contains a path to a directory, it usually means enter
the directory; but if the dialog is for choosing a directory, then
pressing enter will mean enter the directory if the dialog is not already
viewing that one, or else accept the current directory as the choice if
the table view does not have focus on some other row.
When the user presses enter in table view, go down into a directory
only if a directory is selected; otherwise accept the current selection.
When the user clicks a row in the table, copy the path of that row
into the text field so that it is possible to edit the path before
pressing Enter or OK (behavior similar to a native dialog that has
an editable path, such as GTK).

Task-number: QTBUG-39435
Change-Id: Ibd5e988624c5b1072a12239d681cbdc812e0a697
Reviewed-by: Liang Qi <liang.qi@theqtcompany.com>
---
 src/dialogs/DefaultFileDialog.qml | 10 +++++++---
 src/dialogs/qquickfiledialog.cpp  | 17 +++++++++--------
 2 files changed, 16 insertions(+), 11 deletions(-)

diff --git a/src/dialogs/DefaultFileDialog.qml b/src/dialogs/DefaultFileDialog.qml
index 99623d626..7cd87bc99 100644
--- a/src/dialogs/DefaultFileDialog.qml
+++ b/src/dialogs/DefaultFileDialog.qml
@@ -316,13 +316,14 @@ AbstractFileDialog {
                     sortReversed: view.sortIndicatorOrder === Qt.DescendingOrder
                 }
 
-                onActivated: {
-                    if (view.model.isFolder(row)) {
+                onActivated: if (view.focus) {
+                    if (view.selection.count > 0 && view.model.isFolder(row)) {
                         dirDown(view.model.get(row, "filePath"))
                     } else {
                         root.acceptSelection()
                     }
                 }
+                onClicked: currentPathField.text = view.model.get(row, "filePath")
 
 
                 TableViewColumn {
@@ -398,13 +399,14 @@ AbstractFileDialog {
                 TextField {
                     id: currentPathField
                     Layout.fillWidth: true
-                    onAccepted: {
+                    function doAccept() {
                         root.clearSelection()
                         if (root.addSelection(root.pathToUrl(text)))
                             root.accept()
                         else
                             root.folder = root.pathFolder(text)
                     }
+                    onAccepted: doAccept()
                 }
             }
         }
@@ -454,6 +456,8 @@ AbstractFileDialog {
                     onClicked: {
                         if (view.model.isFolder(view.currentIndex) && !selectFolder)
                             dirDown(view.model.get(view.currentIndex, "filePath"))
+                        else if (!(root.selectExisting))
+                            currentPathField.doAccept()
                         else
                             root.acceptSelection()
                     }
diff --git a/src/dialogs/qquickfiledialog.cpp b/src/dialogs/qquickfiledialog.cpp
index 576778e10..8a7c3e5fb 100644
--- a/src/dialogs/qquickfiledialog.cpp
+++ b/src/dialogs/qquickfiledialog.cpp
@@ -176,14 +176,15 @@ void QQuickFileDialog::clearSelection()
 bool QQuickFileDialog::addSelection(const QUrl &path)
 {
     QFileInfo info(path.toLocalFile());
-    if (info.exists() && ((info.isDir() && m_selectFolder) || !info.isDir())) {
-        if (m_selectFolder)
-            m_selections.append(pathFolder(path.toLocalFile()));
-        else
-            m_selections.append(path);
-        return true;
-    }
-    return false;
+    if (selectExisting() && !info.exists())
+        return false;
+    if (selectFolder() != info.isDir())
+        return false;
+    if (selectFolder())
+        m_selections.append(pathFolder(path.toLocalFile()));
+    else
+        m_selections.append(path);
+    return true;
 }
 
 /*!
-- 
GitLab