diff --git a/src/quickdialogs/quickdialogsquickimpl/qml/+Fusion/FileDialog.qml b/src/quickdialogs/quickdialogsquickimpl/qml/+Fusion/FileDialog.qml index 20631dc5c6..965f56bdc7 100644 --- a/src/quickdialogs/quickdialogsquickimpl/qml/+Fusion/FileDialog.qml +++ b/src/quickdialogs/quickdialogsquickimpl/qml/+Fusion/FileDialog.qml @@ -167,7 +167,6 @@ FileDialogImpl { TextField { id: fileNameTextField objectName: "fileNameTextField" - text: control.fileName visible: false Layout.fillWidth: true diff --git a/src/quickdialogs/quickdialogsquickimpl/qml/+Imagine/FileDialog.qml b/src/quickdialogs/quickdialogsquickimpl/qml/+Imagine/FileDialog.qml index 3ab5574114..8568be710a 100644 --- a/src/quickdialogs/quickdialogsquickimpl/qml/+Imagine/FileDialog.qml +++ b/src/quickdialogs/quickdialogsquickimpl/qml/+Imagine/FileDialog.qml @@ -158,7 +158,6 @@ FileDialogImpl { TextField { id: fileNameTextField objectName: "fileNameTextField" - text: control.fileName visible: false Layout.fillWidth: true diff --git a/src/quickdialogs/quickdialogsquickimpl/qml/+Material/FileDialog.qml b/src/quickdialogs/quickdialogsquickimpl/qml/+Material/FileDialog.qml index 61301295af..9700aeba79 100644 --- a/src/quickdialogs/quickdialogsquickimpl/qml/+Material/FileDialog.qml +++ b/src/quickdialogs/quickdialogsquickimpl/qml/+Material/FileDialog.qml @@ -139,7 +139,6 @@ FileDialogImpl { TextField { id: fileNameTextField objectName: "fileNameTextField" - text: control.fileName visible: false Layout.topMargin: 12 diff --git a/src/quickdialogs/quickdialogsquickimpl/qml/+Universal/FileDialog.qml b/src/quickdialogs/quickdialogsquickimpl/qml/+Universal/FileDialog.qml index 5bea5d2194..0d2db8b426 100644 --- a/src/quickdialogs/quickdialogsquickimpl/qml/+Universal/FileDialog.qml +++ b/src/quickdialogs/quickdialogsquickimpl/qml/+Universal/FileDialog.qml @@ -143,7 +143,6 @@ FileDialogImpl { TextField { id: fileNameTextField objectName: "fileNameTextField" - text: control.fileName visible: false Layout.fillWidth: true diff --git a/src/quickdialogs/quickdialogsquickimpl/qml/FileDialog.qml b/src/quickdialogs/quickdialogsquickimpl/qml/FileDialog.qml index 7478786fd9..defb7dd4e2 100644 --- a/src/quickdialogs/quickdialogsquickimpl/qml/FileDialog.qml +++ b/src/quickdialogs/quickdialogsquickimpl/qml/FileDialog.qml @@ -155,7 +155,6 @@ FileDialogImpl { TextField { id: fileNameTextField objectName: "fileNameTextField" - text: control.fileName visible: false Layout.fillWidth: true diff --git a/src/quickdialogs/quickdialogsquickimpl/qquickfiledialogimpl.cpp b/src/quickdialogs/quickdialogsquickimpl/qquickfiledialogimpl.cpp index c2f5531b9a..d16afe8ad2 100644 --- a/src/quickdialogs/quickdialogsquickimpl/qquickfiledialogimpl.cpp +++ b/src/quickdialogs/quickdialogsquickimpl/qquickfiledialogimpl.cpp @@ -137,12 +137,24 @@ void QQuickFileDialogImplPrivate::updateSelectedFile(const QString &oldFolderPat qCDebug(lcUpdateSelectedFile).nospace() << "updateSelectedFile is setting selectedFile to " << newSelectedFileUrl << ", newSelectedFileIndex is " << newSelectedFileIndex; q->setSelectedFile(newSelectedFileUrl); + updateFileNameTextEdit(); // If the index is -1, there are no files in the directory, and so fileDialogListView's // currentIndex will already be -1. if (newSelectedFileIndex != -1) tryUpdateFileDialogListViewCurrentIndex(newSelectedFileIndex); } +void QQuickFileDialogImplPrivate::updateFileNameTextEdit() +{ + QQuickFileDialogImplAttached *attached = attachedOrWarn(); + if (Q_UNLIKELY(!attached)) + return; + + const QFileInfo fileInfo(selectedFile.toLocalFile()); + if (fileInfo.isFile()) + attached->fileNameTextField()->setText(fileInfo.fileName()); +} + QDir::SortFlags QQuickFileDialogImplPrivate::fileListSortFlags() { QDir::SortFlags sortFlags = QDir::IgnoreCase; @@ -353,6 +365,7 @@ void QQuickFileDialogImpl::setInitialCurrentFolderAndSelectedFile(const QUrl &fi qCDebug(lcSelectedFile) << "setting initial currentFolder to" << fileDirUrl << "and selectedFile to" << file; setCurrentFolder(fileDirUrl, QQuickFileDialogImpl::SetReason::Internal); setSelectedFile(file); + d->updateFileNameTextEdit(); d->setCurrentIndexToInitiallySelectedFile = true; // If the currentFolder didn't change, the FolderListModel won't change and @@ -590,6 +603,7 @@ void QQuickFileDialogImplAttachedPrivate::fileDialogListViewCurrentIndexChanged( auto fileDialogImplPrivate = QQuickFileDialogImplPrivate::get(fileDialogImpl); if (moveReason != QQuickItemViewPrivate::Other) { fileDialogImpl->setSelectedFile(fileDialogDelegate->file()); + fileDialogImplPrivate->updateFileNameTextEdit(); } else if (fileDialogImplPrivate->setCurrentIndexToInitiallySelectedFile) { // When setting selectedFile before opening the FileDialog, // we need to ensure that the currentIndex is correct, because the initial change diff --git a/src/quickdialogs/quickdialogsquickimpl/qquickfiledialogimpl_p_p.h b/src/quickdialogs/quickdialogsquickimpl/qquickfiledialogimpl_p_p.h index ee8dbcadac..d7767a08db 100644 --- a/src/quickdialogs/quickdialogsquickimpl/qquickfiledialogimpl_p_p.h +++ b/src/quickdialogs/quickdialogsquickimpl/qquickfiledialogimpl_p_p.h @@ -47,6 +47,7 @@ public: void updateEnabled(); void updateSelectedFile(const QString &oldFolderPath); + void updateFileNameTextEdit(); static QDir::SortFlags fileListSortFlags(); static QFileInfoList fileList(const QDir &dir); void setFileDialogListViewCurrentIndex(int newCurrentIndex); diff --git a/tests/auto/quickdialogs/qquickfiledialogimpl/tst_qquickfiledialogimpl.cpp b/tests/auto/quickdialogs/qquickfiledialogimpl/tst_qquickfiledialogimpl.cpp index 480830bf48..7ba2976740 100644 --- a/tests/auto/quickdialogs/qquickfiledialogimpl/tst_qquickfiledialogimpl.cpp +++ b/tests/auto/quickdialogs/qquickfiledialogimpl/tst_qquickfiledialogimpl.cpp @@ -90,6 +90,7 @@ private slots: void selectNewFileViaTextField_data(); void selectNewFileViaTextField(); void selectExistingFileShouldWarnUserWhenFileModeEqualsSaveFile(); + void fileNameTextFieldOnlyChangesWhenSelectingFiles(); private: enum DelegateOrderPolicy @@ -1565,6 +1566,54 @@ void tst_QQuickFileDialogImpl::selectExistingFileShouldWarnUserWhenFileModeEqual QCOMPARE(acceptedSpy.count(), 3); } +void tst_QQuickFileDialogImpl::fileNameTextFieldOnlyChangesWhenSelectingFiles() +{ + const auto tempSubFile1Url = QUrl::fromLocalFile(tempSubFile1->fileName()); + const auto tempSubDirUrl = QUrl::fromLocalFile(tempSubDir.path()); + const auto tempFile11Url = QUrl::fromLocalFile(tempFile1->fileName()); + + const QVariantMap initialProperties = { + { "tempFile1Url", QVariant::fromValue(tempSubFile1Url) }, + { "fileMode", QVariant::fromValue(QQuickFileDialog::SaveFile) } + }; + FileDialogTestHelper dialogHelper(this, "setSelectedFile.qml", {}, initialProperties); + + OPEN_QUICK_DIALOG(); + QQuickTest::qWaitForPolish(dialogHelper.window()); + + QQuickTextField *fileNameTextField = + dialogHelper.quickDialog->findChild("fileNameTextField"); + QVERIFY(fileNameTextField); + + auto getSelectedFileInfo = [&dialogHelper]() { + return QFileInfo(dialogHelper.dialog->selectedFile().toLocalFile()); + }; + + QVERIFY(getSelectedFileInfo().isFile()); + QCOMPARE(fileNameTextField->text(), tempSubFile1Url.fileName()); + QCOMPARE(dialogHelper.dialog->selectedFile(), tempSubFile1Url); + + auto *breadcrumbBar = dialogHelper.quickDialog->findChild(); + QVERIFY(breadcrumbBar); + + // Pressing the up button causes tempSubDir to be selected + QVERIFY(clickButton(breadcrumbBar->upButton())); + + QVERIFY(getSelectedFileInfo().isDir()); + QCOMPARE(fileNameTextField->text(), tempSubFile1Url.fileName()); + QCOMPARE(dialogHelper.dialog->selectedFile(), tempSubDirUrl); + + // Change the selected file from the outside + dialogHelper.dialog->close(); + dialogHelper.dialog->setSelectedFile(tempFile11Url); + dialogHelper.openDialog(); + QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); + + QVERIFY(getSelectedFileInfo().isFile()); + QCOMPARE(fileNameTextField->text(), tempFile11Url.fileName()); + QCOMPARE(dialogHelper.dialog->selectedFile(), tempFile11Url); +} + QTEST_MAIN(tst_QQuickFileDialogImpl) #include "tst_qquickfiledialogimpl.moc"