diff options
author | Szabolcs David <davidsz@inf.u-szeged.hu> | 2022-12-20 16:12:22 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-01-16 01:19:13 +0000 |
commit | 2a7adf3dfdf90e9154a3ca5d4ad4d2592ebd8f60 (patch) | |
tree | f0e185770664c1eb43932bcc380f090de6e80e27 /src | |
parent | 0b27106fd2a61a01647a0559dd3a6fa51245f4a7 (diff) |
Quick: Fix file selection modes in the default UI delegate
Our implementation of QML file picker was outdated. Now directory picker
is a separate type of dialog and other file selection modes are set in
FileDialog.fileMode property.
Change-Id: Icc62369539c56666e596e5ee6f1b3068a43acd81
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
(cherry picked from commit 35d4b0b1d1c723e32d589b3dfddfe96eaa8e5568)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/webenginequick/ui/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/webenginequick/ui/DirectoryPicker.qml | 15 | ||||
-rw-r--r-- | src/webenginequick/ui_delegates_manager.cpp | 43 | ||||
-rw-r--r-- | src/webenginequick/ui_delegates_manager.h | 2 |
4 files changed, 57 insertions, 4 deletions
diff --git a/src/webenginequick/ui/CMakeLists.txt b/src/webenginequick/ui/CMakeLists.txt index dc9d14823..96dedf016 100644 --- a/src/webenginequick/ui/CMakeLists.txt +++ b/src/webenginequick/ui/CMakeLists.txt @@ -7,6 +7,7 @@ set(qml_files "AutofillPopup.qml" "ColorDialog.qml" "ConfirmDialog.qml" + "DirectoryPicker.qml" "FilePicker.qml" "Menu.qml" "MenuItem.qml" diff --git a/src/webenginequick/ui/DirectoryPicker.qml b/src/webenginequick/ui/DirectoryPicker.qml new file mode 100644 index 000000000..a8a6d47c9 --- /dev/null +++ b/src/webenginequick/ui/DirectoryPicker.qml @@ -0,0 +1,15 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Dialogs + +FolderDialog { + id: folderDialog + objectName: "folderDialog" + + signal folderSelected(var folder) + + onAccepted: { + folderSelected([selectedFolder]) + } +} diff --git a/src/webenginequick/ui_delegates_manager.cpp b/src/webenginequick/ui_delegates_manager.cpp index b63a822ca..b4036c5ee 100644 --- a/src/webenginequick/ui_delegates_manager.cpp +++ b/src/webenginequick/ui_delegates_manager.cpp @@ -350,6 +350,10 @@ void UIDelegatesManager::showDialog(QSharedPointer<AuthenticationDialogControlle void UIDelegatesManager::showFilePicker(QSharedPointer<FilePickerController> controller) { + if (controller->mode() == FilePickerController::UploadFolder) { + showDirectoryPicker(controller); + return; + } if (!ensureComponentLoaded(FilePicker)) return; @@ -361,19 +365,21 @@ void UIDelegatesManager::showFilePicker(QSharedPointer<FilePickerController> con filePicker->setParent(m_view); filePickerComponent->completeCreate(); + static int fileModeIndex = filePicker->metaObject()->indexOfEnumerator("FileMode"); + QMetaEnum fileModeEnum = filePicker->metaObject()->enumerator(fileModeIndex); + // Fine-tune some properties depending on the mode. switch (controller->mode()) { case FilePickerController::Open: + filePicker->setProperty("fileMode", fileModeEnum.keyToValue("OpenFile")); break; case FilePickerController::Save: - filePicker->setProperty("selectExisting", false); + filePicker->setProperty("fileMode", fileModeEnum.keyToValue("SaveFile")); break; case FilePickerController::OpenMultiple: - filePicker->setProperty("selectMultiple", true); + filePicker->setProperty("fileMode", fileModeEnum.keyToValue("OpenFiles")); break; case FilePickerController::UploadFolder: - filePicker->setProperty("selectFolder", true); - break; default: Q_UNREACHABLE(); } @@ -397,6 +403,35 @@ void UIDelegatesManager::showFilePicker(QSharedPointer<FilePickerController> con QMetaObject::invokeMethod(filePicker, "open"); } +void UIDelegatesManager::showDirectoryPicker(QSharedPointer<FilePickerController> controller) +{ + if (!ensureComponentLoaded(DirectoryPicker)) + return; + + QQmlContext *context = qmlContext(m_view); + QObject *directoryPicker = directoryPickerComponent->beginCreate(context); + if (QQuickItem *item = qobject_cast<QQuickItem*>(directoryPicker)) + item->setParentItem(m_view); + directoryPicker->setParent(m_view); + directoryPickerComponent->completeCreate(); + + QQmlProperty directoryPickedSignal(directoryPicker, QStringLiteral("onFolderSelected")); + CHECK_QML_SIGNAL_PROPERTY(directoryPickedSignal, directoryPickerComponent->url()); + QQmlProperty rejectSignal(directoryPicker, QStringLiteral("onRejected")); + CHECK_QML_SIGNAL_PROPERTY(rejectSignal, directoryPickerComponent->url()); + static int acceptedIndex = controller->metaObject()->indexOfSlot("accepted(QVariant)"); + QObject::connect(directoryPicker, directoryPickedSignal.method(), controller.data(), controller->metaObject()->method(acceptedIndex)); + static int rejectedIndex = controller->metaObject()->indexOfSlot("rejected()"); + QObject::connect(directoryPicker, rejectSignal.method(), controller.data(), controller->metaObject()->method(rejectedIndex)); + + // delete when done. + static int deleteLaterIndex = directoryPicker->metaObject()->indexOfSlot("deleteLater()"); + QObject::connect(directoryPicker, directoryPickedSignal.method(), directoryPicker, directoryPicker->metaObject()->method(deleteLaterIndex)); + QObject::connect(directoryPicker, rejectSignal.method(), directoryPicker, directoryPicker->metaObject()->method(deleteLaterIndex)); + + QMetaObject::invokeMethod(directoryPicker, "open"); +} + class TemporaryCursorMove { public: diff --git a/src/webenginequick/ui_delegates_manager.h b/src/webenginequick/ui_delegates_manager.h index 70e5ba00d..24dde656c 100644 --- a/src/webenginequick/ui_delegates_manager.h +++ b/src/webenginequick/ui_delegates_manager.h @@ -22,6 +22,7 @@ F(ConfirmDialog, confirmDialog) SEPARATOR \ F(PromptDialog, promptDialog) SEPARATOR \ F(FilePicker, filePicker) SEPARATOR \ + F(DirectoryPicker, directoryPicker) SEPARATOR \ F(AuthenticationDialog, authenticationDialog) SEPARATOR \ F(ToolTip, toolTip) SEPARATOR \ F(TouchHandle, touchHandle) SEPARATOR \ @@ -80,6 +81,7 @@ public: void showDialog(QSharedPointer<JavaScriptDialogController>); void showDialog(QSharedPointer<AuthenticationDialogController>); void showFilePicker(QSharedPointer<FilePickerController>); + void showDirectoryPicker(QSharedPointer<FilePickerController>); virtual void showMenu(QObject *menu); void showToolTip(const QString &text); QQuickItem *createTouchHandle(); |