From 7ab8b5a8436d825bbc3490d39ed8436bd0d23d05 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 17 Jul 2014 17:12:54 -0700 Subject: [PATCH 1/2] 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 From c07ba9fec59219779953c36a4711379519a9e639 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 17 Jul 2014 17:50:56 -0700 Subject: [PATCH 2/2] Added browser as a tool --- examples/editModels.js | 26 ++++++++++++++++++- examples/toolBars.js | 7 +++++ .../scripting/WindowScriptingInterface.cpp | 4 ++- .../src/scripting/WindowScriptingInterface.h | 2 +- interface/src/ui/ModelsBrowser.cpp | 2 +- 5 files changed, 37 insertions(+), 4 deletions(-) diff --git a/examples/editModels.js b/examples/editModels.js index c13f97fcf9..458ddf7b4a 100644 --- a/examples/editModels.js +++ b/examples/editModels.js @@ -665,7 +665,8 @@ function checkController(deltaTime) { moveOverlays(); } - +var newModel; +var browser; function initToolBar() { toolBar = new ToolBar(0, 0, ToolBar.VERTICAL); // New Model @@ -676,6 +677,12 @@ function initToolBar() { visible: true, alpha: 0.9 }); + browser = toolBar.addTool({ + imageURL: toolIconUrl + "list-icon.png", + width: toolWidth, height: toolHeight, + visible: true, + alpha: 0.7 + }); } function moveOverlays() { @@ -780,6 +787,23 @@ 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 || url == "") { + return; + } + + var position = Vec3.sum(MyAvatar.position, Vec3.multiply(Quat.getFront(MyAvatar.orientation), SPAWN_DISTANCE)); + + if (position.x > 0 && position.y > 0 && position.z > 0) { + Models.addModel({ position: position, + radius: radiusDefault, + modelURL: url + }); + } else { + print("Can't create model: Model would be out of bounds."); + } + + } else if (browser == toolBar.clicked(clickedOverlay)) { var url = Window.s3Browse(); if (url == null || url == "") { return; diff --git a/examples/toolBars.js b/examples/toolBars.js index 88b07276f0..1a464b4e4f 100644 --- a/examples/toolBars.js +++ b/examples/toolBars.js @@ -90,11 +90,18 @@ Tool = function(properties, selectable, selected) { // selectable and selected a return selected; } this.select = function(doSelect) { + if (!selectable) { + return; + } + selected = doSelect; properties.subImage.y = (selected ? 2 : 1) * properties.subImage.height; Overlays.editOverlay(this.overlay(), { subImage: properties.subImage }); } this.toggle = function() { + if (!selectable) { + return; + } selected = !selected; properties.subImage.y = (selected ? 2 : 1) * properties.subImage.height; Overlays.editOverlay(this.overlay(), { subImage: properties.subImage }); diff --git a/interface/src/scripting/WindowScriptingInterface.cpp b/interface/src/scripting/WindowScriptingInterface.cpp index 76b11ccc6d..827f66c8d5 100644 --- a/interface/src/scripting/WindowScriptingInterface.cpp +++ b/interface/src/scripting/WindowScriptingInterface.cpp @@ -205,7 +205,9 @@ QScriptValue WindowScriptingInterface::showBrowse(const QString& title, const QS /// \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); + if (nameFilter != "") { + browser.setNameFilter(nameFilter); + } QEventLoop loop; connect(&browser, &ModelsBrowser::selected, &loop, &QEventLoop::quit); QMetaObject::invokeMethod(&browser, "browse", Qt::QueuedConnection); diff --git a/interface/src/scripting/WindowScriptingInterface.h b/interface/src/scripting/WindowScriptingInterface.h index 230a901613..654b048b24 100644 --- a/interface/src/scripting/WindowScriptingInterface.h +++ b/interface/src/scripting/WindowScriptingInterface.h @@ -31,7 +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 = "..*"); + QScriptValue s3Browse(const QString& nameFilter = ""); private slots: QScriptValue showAlert(const QString& message); diff --git a/interface/src/ui/ModelsBrowser.cpp b/interface/src/ui/ModelsBrowser.cpp index 8f1bff14c2..41dea69581 100644 --- a/interface/src/ui/ModelsBrowser.cpp +++ b/interface/src/ui/ModelsBrowser.cpp @@ -182,7 +182,7 @@ ModelHandler::ModelHandler(ModelType modelsType, QWidget* parent) : QObject(parent), _initiateExit(false), _type(modelsType), - _nameFilter(".*fst") + _nameFilter(".*(fst|fbx|FST|FBX)") { // set headers data QStringList headerData;