From b604b1bbac75f8833dbf8d82d12143839cbf6f55 Mon Sep 17 00:00:00 2001 From: vladest Date: Sun, 13 Aug 2017 11:02:29 +0200 Subject: [PATCH] Async file dialogs #1 --- libraries/ui/src/OffscreenUi.cpp | 47 ++++++++++++++++++++++++++++++++ libraries/ui/src/OffscreenUi.h | 5 +++- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/libraries/ui/src/OffscreenUi.cpp b/libraries/ui/src/OffscreenUi.cpp index fd557d74c6..4027c4c5b6 100644 --- a/libraries/ui/src/OffscreenUi.cpp +++ b/libraries/ui/src/OffscreenUi.cpp @@ -680,6 +680,31 @@ QString OffscreenUi::fileDialog(const QVariantMap& properties) { return result.toUrl().toLocalFile(); } +QQuickItem *OffscreenUi::fileDialogAsync(const QVariantMap& properties) { + QVariant buildDialogResult; + bool invokeResult; + auto tabletScriptingInterface = DependencyManager::get(); + TabletProxy* tablet = dynamic_cast(tabletScriptingInterface->getTablet("com.highfidelity.interface.tablet.system")); + if (tablet->getToolbarMode()) { + invokeResult = QMetaObject::invokeMethod(_desktop, "fileDialog", + Q_RETURN_ARG(QVariant, buildDialogResult), + Q_ARG(QVariant, QVariant::fromValue(properties))); + } else { + QQuickItem* tabletRoot = tablet->getTabletRoot(); + invokeResult = QMetaObject::invokeMethod(tabletRoot, "fileDialog", + Q_RETURN_ARG(QVariant, buildDialogResult), + Q_ARG(QVariant, QVariant::fromValue(properties))); + emit tabletScriptingInterface->tabletNotification(); + } + + if (!invokeResult) { + qWarning() << "Failed to create file open dialog"; + return nullptr; + } + + return qvariant_cast(buildDialogResult); +} + QString OffscreenUi::fileOpenDialog(const QString& caption, const QString& dir, const QString& filter, QString* selectedFilter, QFileDialog::Options options) { if (QThread::currentThread() != thread()) { QString result; @@ -702,6 +727,28 @@ QString OffscreenUi::fileOpenDialog(const QString& caption, const QString& dir, return fileDialog(map); } +QString OffscreenUi::fileOpenDialogAsync(const QString& caption, const QString& dir, const QString& filter, QString* selectedFilter, QFileDialog::Options options) { + if (QThread::currentThread() != thread()) { + QString result; + BLOCKING_INVOKE_METHOD(this, "fileOpenDialogAsync", + Q_RETURN_ARG(QString, result), + Q_ARG(QString, caption), + Q_ARG(QString, dir), + Q_ARG(QString, filter), + Q_ARG(QString*, selectedFilter), + Q_ARG(QFileDialog::Options, options)); + return result; + } + + // FIXME support returning the selected filter... somehow? + QVariantMap map; + map.insert("caption", caption); + map.insert("dir", QUrl::fromLocalFile(dir)); + map.insert("filter", filter); + map.insert("options", static_cast(options)); + return fileDialog(map); +} + QString OffscreenUi::fileSaveDialog(const QString& caption, const QString& dir, const QString& filter, QString* selectedFilter, QFileDialog::Options options) { if (QThread::currentThread() != thread()) { QString result; diff --git a/libraries/ui/src/OffscreenUi.h b/libraries/ui/src/OffscreenUi.h index 09f5d0b863..90902dc417 100644 --- a/libraries/ui/src/OffscreenUi.h +++ b/libraries/ui/src/OffscreenUi.h @@ -149,6 +149,7 @@ public: QMessageBox::StandardButton defaultButton = QMessageBox::NoButton); Q_INVOKABLE QString fileOpenDialog(const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = 0); + Q_INVOKABLE QString fileOpenDialogAsync(const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = 0); Q_INVOKABLE QString fileSaveDialog(const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = 0); Q_INVOKABLE QString existingDirectoryDialog(const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = 0); @@ -190,11 +191,13 @@ public: signals: void showDesktop(); void response(QMessageBox::StandardButton response); - public slots: + void fileDialogResponse(QString response); +public slots: void removeModalDialog(QObject* modal); private: QString fileDialog(const QVariantMap& properties); + QQuickItem* fileDialogAsync(const QVariantMap &properties); QString assetDialog(const QVariantMap& properties); QQuickItem* _desktop { nullptr };