summaryrefslogtreecommitdiff
path: root/src/webenginequick
diff options
context:
space:
mode:
authorSzabolcs David <davidsz@inf.u-szeged.hu>2022-12-20 16:12:22 +0100
committerSzabolcs David <davidsz@inf.u-szeged.hu>2023-01-15 21:33:52 +0100
commit35d4b0b1d1c723e32d589b3dfddfe96eaa8e5568 (patch)
treecbcb4c9e17b4048a6f0da7c0e64d66e4028e588c /src/webenginequick
parent5734c78ba87b8a6e1070e6a65777b5def0da581d (diff)
downloadqtwebengine-35d4b0b1d1c723e32d589b3dfddfe96eaa8e5568.tar.gz
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. Pick-to: 6.4 6.5 Change-Id: Icc62369539c56666e596e5ee6f1b3068a43acd81 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'src/webenginequick')
-rw-r--r--src/webenginequick/ui/CMakeLists.txt1
-rw-r--r--src/webenginequick/ui/DirectoryPicker.qml15
-rw-r--r--src/webenginequick/ui_delegates_manager.cpp43
-rw-r--r--src/webenginequick/ui_delegates_manager.h2
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();