From 7ab8b5a8436d825bbc3490d39ed8436bd0d23d05 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 17 Jul 2014 17:12:54 -0700 Subject: [PATCH] Added S3 browser --- examples/editModels.js | 4 +-- .../scripting/WindowScriptingInterface.cpp | 25 +++++++++++++++- .../src/scripting/WindowScriptingInterface.h | 2 ++ interface/src/ui/ModelsBrowser.cpp | 29 ++++++++++++------- interface/src/ui/ModelsBrowser.h | 6 ++++ 5 files changed, 53 insertions(+), 13 deletions(-) diff --git a/examples/editModels.js b/examples/editModels.js index 411c11de38..c13f97fcf9 100644 --- a/examples/editModels.js +++ b/examples/editModels.js @@ -780,8 +780,8 @@ function mousePressEvent(event) { var clickedOverlay = Overlays.getOverlayAtPoint({x: event.x, y: event.y}); if (newModel == toolBar.clicked(clickedOverlay)) { - var url = Window.prompt("Model url", modelURLs[Math.floor(Math.random() * modelURLs.length)]); - if (url == null) { + var url = Window.s3Browse(); + if (url == null || url == "") { return; } diff --git a/interface/src/scripting/WindowScriptingInterface.cpp b/interface/src/scripting/WindowScriptingInterface.cpp index cdf039a183..76b11ccc6d 100644 --- a/interface/src/scripting/WindowScriptingInterface.cpp +++ b/interface/src/scripting/WindowScriptingInterface.cpp @@ -18,6 +18,7 @@ #include "Application.h" #include "Menu.h" +#include "ui/ModelsBrowser.h" #include "WindowScriptingInterface.h" @@ -66,6 +67,14 @@ QScriptValue WindowScriptingInterface::browse(const QString& title, const QStrin return retVal; } +QScriptValue WindowScriptingInterface::s3Browse(const QString& nameFilter) { + QScriptValue retVal; + QMetaObject::invokeMethod(this, "showS3Browse", Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QScriptValue, retVal), + Q_ARG(const QString&, nameFilter)); + return retVal; +} + /// Display an alert box /// \param const QString& message message to display /// \return QScriptValue::UndefinedValue @@ -182,7 +191,7 @@ QScriptValue WindowScriptingInterface::showBrowse(const QString& title, const QS fileInfo.setFile(directory, "__HIFI_INVALID_FILE__"); path = fileInfo.filePath(); } - + QFileDialog fileDialog(Application::getInstance()->getWindow(), title, path, nameFilter); fileDialog.setFileMode(QFileDialog::ExistingFile); if (fileDialog.exec()) { @@ -191,6 +200,20 @@ QScriptValue WindowScriptingInterface::showBrowse(const QString& title, const QS return QScriptValue::NullValue; } +/// Display a browse window for S3 models +/// \param const QString& nameFilter filter to filter filenames +/// \return QScriptValue file path as a string if one was selected, otherwise `QScriptValue::NullValue` +QScriptValue WindowScriptingInterface::showS3Browse(const QString& nameFilter) { + ModelsBrowser browser(ENTITY_MODEL); + browser.setNameFilter(nameFilter); + QEventLoop loop; + connect(&browser, &ModelsBrowser::selected, &loop, &QEventLoop::quit); + QMetaObject::invokeMethod(&browser, "browse", Qt::QueuedConnection); + loop.exec(); + + return browser.getSelectedFile(); +} + int WindowScriptingInterface::getInnerWidth() { return Application::getInstance()->getWindow()->geometry().width(); } diff --git a/interface/src/scripting/WindowScriptingInterface.h b/interface/src/scripting/WindowScriptingInterface.h index 7f84282543..230a901613 100644 --- a/interface/src/scripting/WindowScriptingInterface.h +++ b/interface/src/scripting/WindowScriptingInterface.h @@ -31,6 +31,7 @@ public slots: QScriptValue form(const QString& title, QScriptValue array); QScriptValue prompt(const QString& message = "", const QString& defaultText = ""); QScriptValue browse(const QString& title = "", const QString& directory = "", const QString& nameFilter = ""); + QScriptValue s3Browse(const QString& nameFilter = "..*"); private slots: QScriptValue showAlert(const QString& message); @@ -38,6 +39,7 @@ private slots: QScriptValue showForm(const QString& title, QScriptValue form); QScriptValue showPrompt(const QString& message, const QString& defaultText); QScriptValue showBrowse(const QString& title, const QString& directory, const QString& nameFilter); + QScriptValue showS3Browse(const QString& nameFilter); private: WindowScriptingInterface(); diff --git a/interface/src/ui/ModelsBrowser.cpp b/interface/src/ui/ModelsBrowser.cpp index a803625206..8f1bff14c2 100644 --- a/interface/src/ui/ModelsBrowser.cpp +++ b/interface/src/ui/ModelsBrowser.cpp @@ -23,7 +23,7 @@ #include "ModelsBrowser.h" -const char* MODEL_TYPE_NAMES[] = { "heads", "skeletons", "attachments" }; +const char* MODEL_TYPE_NAMES[] = { "entities", "heads", "skeletons", "attachments" }; static const QString S3_URL = "http://highfidelity-public.s3-us-west-1.amazonaws.com"; static const QString PUBLIC_URL = "http://public.highfidelity.io"; @@ -122,11 +122,7 @@ void ModelsBrowser::applyFilter(const QString &filter) { } // Hid the row if it doesn't match (Make sure it's not it it does) - if (match) { - _view.setRowHidden(i, QModelIndex(), false); - } else { - _view.setRowHidden(i, QModelIndex(), true); - } + _view.setRowHidden(i, QModelIndex(), !match); } _handler->unlockModel(); } @@ -142,7 +138,13 @@ void ModelsBrowser::enableSearchBar() { _searchBar->setEnabled(true); } +void ModelsBrowser::setNameFilter(QString nameFilter) { + _handler->setNameFilter(nameFilter); +} + void ModelsBrowser::browse() { + _selectedFile = ""; + QDialog dialog; dialog.setWindowTitle("Browse models"); dialog.setMinimumSize(570, 500); @@ -160,14 +162,16 @@ void ModelsBrowser::browse() { dialog.connect(buttons, SIGNAL(accepted()), SLOT(accept())); dialog.connect(buttons, SIGNAL(rejected()), SLOT(reject())); + QVariant selectedFile; if (dialog.exec() == QDialog::Accepted) { _handler->lockModel(); - QVariant selectedFile = _handler->getModel()->data(_view.currentIndex(), Qt::UserRole); + selectedFile = _handler->getModel()->data(_view.currentIndex(), Qt::UserRole); _handler->unlockModel(); if (selectedFile.isValid()) { - emit selected(selectedFile.toString()); + _selectedFile = selectedFile.toString(); } } + emit selected(_selectedFile); // So that we don't have to reconstruct the view _view.setParent(NULL); @@ -177,7 +181,8 @@ void ModelsBrowser::browse() { ModelHandler::ModelHandler(ModelType modelsType, QWidget* parent) : QObject(parent), _initiateExit(false), - _type(modelsType) + _type(modelsType), + _nameFilter(".*fst") { // set headers data QStringList headerData; @@ -187,6 +192,10 @@ ModelHandler::ModelHandler(ModelType modelsType, QWidget* parent) : _model.setHorizontalHeaderLabels(headerData); } +void ModelHandler::setNameFilter(QString nameFilter) { + _nameFilter = nameFilter; +} + void ModelHandler::download() { _lock.lockForWrite(); if (_initiateExit) { @@ -278,7 +287,7 @@ bool ModelHandler::parseXML(QByteArray xmlFile) { } QXmlStreamReader xml(xmlFile); - QRegExp rx(".*fst"); + QRegExp rx(_nameFilter); bool truncated = false; QString lastKey; diff --git a/interface/src/ui/ModelsBrowser.h b/interface/src/ui/ModelsBrowser.h index 8063fd8eeb..fa09a67826 100644 --- a/interface/src/ui/ModelsBrowser.h +++ b/interface/src/ui/ModelsBrowser.h @@ -17,6 +17,7 @@ #include enum ModelType { + ENTITY_MODEL, HEAD_MODEL, SKELETON_MODEL, ATTACHMENT_MODEL @@ -38,6 +39,7 @@ signals: void updated(); public slots: + void setNameFilter(QString nameFilter); void download(); void update(); void exit(); @@ -50,6 +52,7 @@ private: ModelType _type; QReadWriteLock _lock; QStandardItemModel _model; + QString _nameFilter; void queryNewFiles(QString marker = QString()); bool parseXML(QByteArray xmlFile); @@ -62,6 +65,7 @@ class ModelsBrowser : public QWidget { public: ModelsBrowser(ModelType modelsType, QWidget* parent = NULL); + QString getSelectedFile() { return _selectedFile; } signals: void startDownloading(); @@ -69,6 +73,7 @@ signals: void selected(QString filename); public slots: + void setNameFilter(QString nameFilter); void browse(); private slots: @@ -80,6 +85,7 @@ private: ModelHandler* _handler; QLineEdit* _searchBar; QTreeView _view; + QString _selectedFile; }; #endif // hifi_ModelsBrowser_h