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