From 5a5e6285361462a2fb85193d3eae75763049fd92 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 1 May 2014 10:51:58 -0700 Subject: [PATCH 1/2] Add Window.browse to scripting environment --- .../scripting/WindowScriptingInterface.cpp | 36 ++++++++++++++++++- .../src/scripting/WindowScriptingInterface.h | 2 ++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/interface/src/scripting/WindowScriptingInterface.cpp b/interface/src/scripting/WindowScriptingInterface.cpp index 3366e28f6e..144415d6ee 100644 --- a/interface/src/scripting/WindowScriptingInterface.cpp +++ b/interface/src/scripting/WindowScriptingInterface.cpp @@ -9,8 +9,10 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include +#include +#include #include +#include #include "Application.h" #include "Menu.h" @@ -43,6 +45,14 @@ QScriptValue WindowScriptingInterface::prompt(const QString& message, const QStr return retVal; } +QScriptValue WindowScriptingInterface::browse(const QString& title, const QString& directory, const QString& nameFilter) { + QScriptValue retVal; + QMetaObject::invokeMethod(this, "showBrowse", Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QScriptValue, retVal), + Q_ARG(const QString&, title), Q_ARG(const QString&, directory), Q_ARG(const QString&, nameFilter)); + return retVal; +} + /// Display an alert box /// \param const QString& message message to display /// \return QScriptValue::UndefinedValue @@ -76,6 +86,30 @@ QScriptValue WindowScriptingInterface::showPrompt(const QString& message, const return QScriptValue::NullValue; } +/// Display a file dialog. If `directory` is an invalid file or directory the browser will start at the current +/// working directory. +/// \param const QString& title title of the window +/// \param const QString& directory directory to start the file browser at +/// \param const QString& nameFilter filter to filter filenames by - see `QFileDialog` +/// \return QScriptValue file path as a string if one was selected, otherwise `QScriptValue::NullValue` +QScriptValue WindowScriptingInterface::showBrowse(const QString& title, const QString& directory, const QString& nameFilter) { + // On OS X `directory` does not work as expected unless a file is included in the path, so we append a bogus + // filename if the directory is valid. + QString path = ""; + QFileInfo fileInfo = QFileInfo(directory); + if (fileInfo.isDir()) { + fileInfo.setFile(directory, "__HIFI_INVALID_FILE__"); + path = fileInfo.filePath(); + } + + QFileDialog fileDialog(Application::getInstance()->getWindow(), title, path, nameFilter); + fileDialog.setFileMode(QFileDialog::ExistingFile); + if (fileDialog.exec()) { + return QScriptValue(fileDialog.selectedFiles().first()); + } + return QScriptValue::NullValue; +} + int WindowScriptingInterface::getInnerWidth() { return Application::getInstance()->getWindow()->geometry().width(); } diff --git a/interface/src/scripting/WindowScriptingInterface.h b/interface/src/scripting/WindowScriptingInterface.h index af9b15a96d..b97113af9c 100644 --- a/interface/src/scripting/WindowScriptingInterface.h +++ b/interface/src/scripting/WindowScriptingInterface.h @@ -30,11 +30,13 @@ public slots: QScriptValue alert(const QString& message = ""); QScriptValue confirm(const QString& message = ""); QScriptValue prompt(const QString& message = "", const QString& defaultText = ""); + QScriptValue browse(const QString& title = "", const QString& directory = "", const QString& nameFilter = ""); private slots: QScriptValue showAlert(const QString& message); QScriptValue showConfirm(const QString& message); QScriptValue showPrompt(const QString& message, const QString& defaultText); + QScriptValue showBrowse(const QString& title, const QString& directory, const QString& nameFilter); }; #endif // hifi_WindowScriptingInterface_h From eccedda2843e79306a2ab35d607e9580120b64b6 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 1 May 2014 10:56:23 -0700 Subject: [PATCH 2/2] Add fileBrowserExample.js --- examples/fileBrowserExample.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 examples/fileBrowserExample.js diff --git a/examples/fileBrowserExample.js b/examples/fileBrowserExample.js new file mode 100644 index 0000000000..e9b461ab22 --- /dev/null +++ b/examples/fileBrowserExample.js @@ -0,0 +1,13 @@ +var file = Window.browse("File Browser Example", "/"); +if (file === null) { + Window.alert("No file was selected"); +} else { + Window.alert("Selected file: " + file); +} + +file = Window.browse("Relative Directory Example", "./images", "PNG or JPG files(*.png *.jpg);;SVG files (*.svg)"); +if (file === null) { + Window.alert("No file was selected"); +} else { + Window.alert("Selected file: " + file); +}