From 2b23108e616260989c27afdec1be5a109c474b06 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Tue, 7 Apr 2015 01:06:39 +0200 Subject: [PATCH 1/7] ScriptsScripting Interface --- interface/src/Application.cpp | 4 +++ .../scripting/ScriptsScriptingInterface.cpp | 27 +++++++++++++++++++ .../src/scripting/ScriptsScriptingInterface.h | 27 +++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 interface/src/scripting/ScriptsScriptingInterface.cpp create mode 100644 interface/src/scripting/ScriptsScriptingInterface.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a8f9efd672..943f2bd491 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -121,6 +121,7 @@ #include "scripting/GlobalServicesScriptingInterface.h" #include "scripting/LocationScriptingInterface.h" #include "scripting/MenuScriptingInterface.h" +#include "scripting/ScriptsScriptingInterface.h" #include "scripting/SettingsScriptingInterface.h" #include "scripting/WindowScriptingInterface.h" #include "scripting/WebWindowClass.h" @@ -3595,6 +3596,9 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri scriptEngine->registerGlobalObject("Scene", DependencyManager::get().data()); + QScriptValue scriptsScriptingInterface = scriptEngine->registerGlobalObject("Scripts", ScriptsScriptingInterface::getInstance()); + scriptEngine->registerFunction(scriptsScriptingInterface, "getPublic", ScriptsScriptingInterface::getPublic, 0); + #ifdef HAVE_RTMIDI scriptEngine->registerGlobalObject("MIDI", &MIDIManager::getInstance()); #endif diff --git a/interface/src/scripting/ScriptsScriptingInterface.cpp b/interface/src/scripting/ScriptsScriptingInterface.cpp new file mode 100644 index 0000000000..93bfe967ad --- /dev/null +++ b/interface/src/scripting/ScriptsScriptingInterface.cpp @@ -0,0 +1,27 @@ +// +// ScriptsScriptingInterface.cpp +// interface/src/scripting +// +// Created by Thijs Wenker on 3/31/15. +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "Application.h" + +#include "ScriptsScriptingInterface.h" + +ScriptsScriptingInterface* ScriptsScriptingInterface::getInstance() { + static ScriptsScriptingInterface sharedInstance; + return &sharedInstance; +} + +QStringList ScriptsScriptingInterface::getRunning() { + return Application::getInstance()->getRunningScripts(); +} + +QScriptValue ScriptsScriptingInterface::getPublic(QScriptContext* context, QScriptEngine* engine) { + return QScriptValue::NullValue; +} diff --git a/interface/src/scripting/ScriptsScriptingInterface.h b/interface/src/scripting/ScriptsScriptingInterface.h new file mode 100644 index 0000000000..ad7f4d2cea --- /dev/null +++ b/interface/src/scripting/ScriptsScriptingInterface.h @@ -0,0 +1,27 @@ +// +// ScriptsScriptingInterface.h +// interface/src/scripting +// +// Created by Thijs Wenker on 3/31/15. +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_ScriptsScriptingInterface_h +#define hifi_ScriptsScriptingInterface_h + +#include + +class ScriptsScriptingInterface : public QObject { + Q_OBJECT +public: + ScriptsScriptingInterface() {}; + static ScriptsScriptingInterface* getInstance(); + static QScriptValue getPublic(QScriptContext* context, QScriptEngine* engine); +public slots: + QStringList getRunning(); +}; + +#endif // hifi_ScriptsScriptingInterface_h From a783f0302558c9af828991ab17591c7138d32efb Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Tue, 7 Apr 2015 16:48:11 +0200 Subject: [PATCH 2/7] New scripting functions Scripts.getPublic(), Scripts.getLocal() and Scripts.getRunning() functional. --- interface/src/Application.cpp | 3 +- .../scripting/ScriptsScriptingInterface.cpp | 71 +++++++++++++++++-- .../src/scripting/ScriptsScriptingInterface.h | 9 ++- interface/src/ui/RunningScriptsWidget.h | 2 + 4 files changed, 77 insertions(+), 8 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index af6c600bf8..9bbc10a7d5 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3609,8 +3609,7 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri scriptEngine->registerGlobalObject("Scene", DependencyManager::get().data()); - QScriptValue scriptsScriptingInterface = scriptEngine->registerGlobalObject("Scripts", ScriptsScriptingInterface::getInstance()); - scriptEngine->registerFunction(scriptsScriptingInterface, "getPublic", ScriptsScriptingInterface::getPublic, 0); + scriptEngine->registerGlobalObject("Scripts", ScriptsScriptingInterface::getInstance()); #ifdef HAVE_RTMIDI scriptEngine->registerGlobalObject("MIDI", &MIDIManager::getInstance()); diff --git a/interface/src/scripting/ScriptsScriptingInterface.cpp b/interface/src/scripting/ScriptsScriptingInterface.cpp index 93bfe967ad..72a0807bce 100644 --- a/interface/src/scripting/ScriptsScriptingInterface.cpp +++ b/interface/src/scripting/ScriptsScriptingInterface.cpp @@ -18,10 +18,73 @@ ScriptsScriptingInterface* ScriptsScriptingInterface::getInstance() { return &sharedInstance; } -QStringList ScriptsScriptingInterface::getRunning() { - return Application::getInstance()->getRunningScripts(); +QVariantList ScriptsScriptingInterface::getRunning() { + const int WINDOWS_DRIVE_LETTER_SIZE = 1; + QVariantList result; + QStringList runningScripts = Application::getInstance()->getRunningScripts(); + for (int i = 0; i < runningScripts.size(); i++) { + QUrl runningScriptURL = QUrl(runningScripts.at(i)); + if (runningScriptURL.scheme().size() <= WINDOWS_DRIVE_LETTER_SIZE) { + runningScriptURL = QUrl::fromLocalFile(runningScriptURL.toDisplayString(QUrl::FormattingOptions(QUrl::FullyEncoded))); + } + QVariantMap resultNode; + resultNode.insert("name", runningScriptURL.fileName()); + resultNode.insert("path", runningScriptURL.toDisplayString(QUrl::FormattingOptions(QUrl::FullyEncoded))); + resultNode.insert("local", runningScriptURL.isLocalFile()); + result.append(resultNode); + } + return result; } -QScriptValue ScriptsScriptingInterface::getPublic(QScriptContext* context, QScriptEngine* engine) { - return QScriptValue::NullValue; +QVariantList ScriptsScriptingInterface::getPublic() { + return getPublicChildNodes(NULL); +} + +QVariantList ScriptsScriptingInterface::getPublicChildNodes(TreeNodeFolder* parent) { + QVariantList result; + QList treeNodes = Application::getInstance()->getRunningScriptsWidget()->getScriptsModel() + ->getFolderNodes(parent); + for (int i = 0; i < treeNodes.size(); i++) { + TreeNodeBase* node = treeNodes.at(i); + if (node->getType() == TREE_NODE_TYPE_FOLDER) { + TreeNodeFolder* folder = static_cast(node); + QVariantMap resultNode; + resultNode.insert("name", node->getName()); + resultNode.insert("type", "folder"); + resultNode.insert("children", getPublicChildNodes(folder)); + result.append(resultNode); + continue; + } + TreeNodeScript* script = static_cast(node); + if (script->getOrigin() == ScriptOrigin::SCRIPT_ORIGIN_LOCAL) { + continue; + } + QVariantMap resultNode; + resultNode.insert("name", node->getName()); + resultNode.insert("type", "script"); + resultNode.insert("path", script->getFullPath()); + result.append(resultNode); + } + return result; +} + +QVariantList ScriptsScriptingInterface::getLocal() { + QVariantList result; + QList treeNodes = Application::getInstance()->getRunningScriptsWidget()->getScriptsModel() + ->getFolderNodes(NULL); + for (int i = 0; i < treeNodes.size(); i++) { + TreeNodeBase* node = treeNodes.at(i); + if (node->getType() != TREE_NODE_TYPE_SCRIPT) { + continue; + } + TreeNodeScript* script = static_cast(node); + if (script->getOrigin() != ScriptOrigin::SCRIPT_ORIGIN_LOCAL) { + continue; + } + QVariantMap resultNode; + resultNode.insert("name", node->getName()); + resultNode.insert("path", script->getFullPath()); + result.append(resultNode); + } + return result; } diff --git a/interface/src/scripting/ScriptsScriptingInterface.h b/interface/src/scripting/ScriptsScriptingInterface.h index ad7f4d2cea..6833c4d064 100644 --- a/interface/src/scripting/ScriptsScriptingInterface.h +++ b/interface/src/scripting/ScriptsScriptingInterface.h @@ -19,9 +19,14 @@ class ScriptsScriptingInterface : public QObject { public: ScriptsScriptingInterface() {}; static ScriptsScriptingInterface* getInstance(); - static QScriptValue getPublic(QScriptContext* context, QScriptEngine* engine); + public slots: - QStringList getRunning(); + QVariantList getRunning(); + QVariantList getPublic(); + QVariantList getLocal(); + +private: + QVariantList getPublicChildNodes(TreeNodeFolder* parent); }; #endif // hifi_ScriptsScriptingInterface_h diff --git a/interface/src/ui/RunningScriptsWidget.h b/interface/src/ui/RunningScriptsWidget.h index 3ec5590dee..38ca3d46cf 100644 --- a/interface/src/ui/RunningScriptsWidget.h +++ b/interface/src/ui/RunningScriptsWidget.h @@ -33,6 +33,8 @@ public: void setRunningScripts(const QStringList& list); + const ScriptsModel* getScriptsModel() { return &_scriptsModel; } + signals: void stopScriptName(const QString& name); From af34add63c5322bffd53f5990a9823a664b21e3b Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Tue, 7 Apr 2015 17:39:50 +0200 Subject: [PATCH 3/7] added example for the new Scripts functions: example\misc\scriptsExample.js --- examples/example/misc/scriptsExample.js | 41 +++++++++++++++++++ .../scripting/ScriptsScriptingInterface.cpp | 4 +- 2 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 examples/example/misc/scriptsExample.js diff --git a/examples/example/misc/scriptsExample.js b/examples/example/misc/scriptsExample.js new file mode 100644 index 0000000000..1ffeaa30c4 --- /dev/null +++ b/examples/example/misc/scriptsExample.js @@ -0,0 +1,41 @@ +// +// scriptsExample.js +// examples/example/misc +// +// Created by Thijs Wenker on 7 Apr 2015 +// Copyright 2015 High Fidelity, Inc. +// +// Outputs the running, public and local scripts to the console. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +var runningScripts = Scripts.getRunning(); +print("Running Scripts:"); +for (var i = 0; i < runningScripts.length; i++) { + print(" - " + runningScripts[i].name + (runningScripts[i].local ? "[Local]" : "") + " {" + runningScripts[i].url + "}"); +} + +var localScripts = Scripts.getLocal(); +print("Local Scripts:"); +for (var i = 0; i < localScripts.length; i++) { + print(" - " + localScripts[i].name + " {" + localScripts[i].path + "}"); +} + +// recursive function to walk through all folders in public scripts +// adding 2 spaces to the prefix per depth level +function displayPublicScriptFolder(nodes, prefix) { + for (var i = 0; i < nodes.length; i++) { + if (nodes[i].type == "folder") { + print(prefix + "<" + nodes[i].name + ">"); + displayPublicScriptFolder(nodes[i].children, " " + prefix); + continue; + } + print(prefix + nodes[i].name + " {" + nodes[i].url + "}"); + } +} + +var publicScripts = Scripts.getPublic(); +print("Public Scripts:"); +displayPublicScriptFolder(publicScripts, " - "); \ No newline at end of file diff --git a/interface/src/scripting/ScriptsScriptingInterface.cpp b/interface/src/scripting/ScriptsScriptingInterface.cpp index 72a0807bce..7cf02fd27b 100644 --- a/interface/src/scripting/ScriptsScriptingInterface.cpp +++ b/interface/src/scripting/ScriptsScriptingInterface.cpp @@ -29,7 +29,7 @@ QVariantList ScriptsScriptingInterface::getRunning() { } QVariantMap resultNode; resultNode.insert("name", runningScriptURL.fileName()); - resultNode.insert("path", runningScriptURL.toDisplayString(QUrl::FormattingOptions(QUrl::FullyEncoded))); + resultNode.insert("url", runningScriptURL.toDisplayString(QUrl::FormattingOptions(QUrl::FullyEncoded))); resultNode.insert("local", runningScriptURL.isLocalFile()); result.append(resultNode); } @@ -62,7 +62,7 @@ QVariantList ScriptsScriptingInterface::getPublicChildNodes(TreeNodeFolder* pare QVariantMap resultNode; resultNode.insert("name", node->getName()); resultNode.insert("type", "script"); - resultNode.insert("path", script->getFullPath()); + resultNode.insert("url", script->getFullPath()); result.append(resultNode); } return result; From 0cb5ee5bd18889cd808c96b0001e6cd8628cd403 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Thu, 9 Apr 2015 23:46:49 +0200 Subject: [PATCH 4/7] - Scripts JS object renamed to ScriptDiscoveryService. - Renamed Example script file for the ScriptDiscoveryService. - Moved ScriptDiscoveryService functions to the RunningScriptWidget --- .../{scriptsExample.js => listAllScripts.js} | 8 +- interface/src/Application.cpp | 3 +- .../scripting/ScriptsScriptingInterface.cpp | 90 ------------------- .../src/scripting/ScriptsScriptingInterface.h | 32 ------- interface/src/ui/RunningScriptsWidget.cpp | 71 +++++++++++++++ interface/src/ui/RunningScriptsWidget.h | 7 +- 6 files changed, 82 insertions(+), 129 deletions(-) rename examples/example/misc/{scriptsExample.js => listAllScripts.js} (86%) delete mode 100644 interface/src/scripting/ScriptsScriptingInterface.cpp delete mode 100644 interface/src/scripting/ScriptsScriptingInterface.h diff --git a/examples/example/misc/scriptsExample.js b/examples/example/misc/listAllScripts.js similarity index 86% rename from examples/example/misc/scriptsExample.js rename to examples/example/misc/listAllScripts.js index 1ffeaa30c4..1baa40751e 100644 --- a/examples/example/misc/scriptsExample.js +++ b/examples/example/misc/listAllScripts.js @@ -1,5 +1,5 @@ // -// scriptsExample.js +// listAllScripts.js // examples/example/misc // // Created by Thijs Wenker on 7 Apr 2015 @@ -11,13 +11,13 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -var runningScripts = Scripts.getRunning(); +var runningScripts = ScriptDiscoveryService.getRunning(); print("Running Scripts:"); for (var i = 0; i < runningScripts.length; i++) { print(" - " + runningScripts[i].name + (runningScripts[i].local ? "[Local]" : "") + " {" + runningScripts[i].url + "}"); } -var localScripts = Scripts.getLocal(); +var localScripts = ScriptDiscoveryService.getLocal(); print("Local Scripts:"); for (var i = 0; i < localScripts.length; i++) { print(" - " + localScripts[i].name + " {" + localScripts[i].path + "}"); @@ -36,6 +36,6 @@ function displayPublicScriptFolder(nodes, prefix) { } } -var publicScripts = Scripts.getPublic(); +var publicScripts = ScriptDiscoveryService.getPublic(); print("Public Scripts:"); displayPublicScriptFolder(publicScripts, " - "); \ No newline at end of file diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 9bbc10a7d5..fe5a73b056 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -121,7 +121,6 @@ #include "scripting/GlobalServicesScriptingInterface.h" #include "scripting/LocationScriptingInterface.h" #include "scripting/MenuScriptingInterface.h" -#include "scripting/ScriptsScriptingInterface.h" #include "scripting/SettingsScriptingInterface.h" #include "scripting/WindowScriptingInterface.h" #include "scripting/WebWindowClass.h" @@ -3609,7 +3608,7 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri scriptEngine->registerGlobalObject("Scene", DependencyManager::get().data()); - scriptEngine->registerGlobalObject("Scripts", ScriptsScriptingInterface::getInstance()); + scriptEngine->registerGlobalObject("ScriptDiscoveryService", this->getRunningScriptsWidget()); #ifdef HAVE_RTMIDI scriptEngine->registerGlobalObject("MIDI", &MIDIManager::getInstance()); diff --git a/interface/src/scripting/ScriptsScriptingInterface.cpp b/interface/src/scripting/ScriptsScriptingInterface.cpp deleted file mode 100644 index 7cf02fd27b..0000000000 --- a/interface/src/scripting/ScriptsScriptingInterface.cpp +++ /dev/null @@ -1,90 +0,0 @@ -// -// ScriptsScriptingInterface.cpp -// interface/src/scripting -// -// Created by Thijs Wenker on 3/31/15. -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#include "Application.h" - -#include "ScriptsScriptingInterface.h" - -ScriptsScriptingInterface* ScriptsScriptingInterface::getInstance() { - static ScriptsScriptingInterface sharedInstance; - return &sharedInstance; -} - -QVariantList ScriptsScriptingInterface::getRunning() { - const int WINDOWS_DRIVE_LETTER_SIZE = 1; - QVariantList result; - QStringList runningScripts = Application::getInstance()->getRunningScripts(); - for (int i = 0; i < runningScripts.size(); i++) { - QUrl runningScriptURL = QUrl(runningScripts.at(i)); - if (runningScriptURL.scheme().size() <= WINDOWS_DRIVE_LETTER_SIZE) { - runningScriptURL = QUrl::fromLocalFile(runningScriptURL.toDisplayString(QUrl::FormattingOptions(QUrl::FullyEncoded))); - } - QVariantMap resultNode; - resultNode.insert("name", runningScriptURL.fileName()); - resultNode.insert("url", runningScriptURL.toDisplayString(QUrl::FormattingOptions(QUrl::FullyEncoded))); - resultNode.insert("local", runningScriptURL.isLocalFile()); - result.append(resultNode); - } - return result; -} - -QVariantList ScriptsScriptingInterface::getPublic() { - return getPublicChildNodes(NULL); -} - -QVariantList ScriptsScriptingInterface::getPublicChildNodes(TreeNodeFolder* parent) { - QVariantList result; - QList treeNodes = Application::getInstance()->getRunningScriptsWidget()->getScriptsModel() - ->getFolderNodes(parent); - for (int i = 0; i < treeNodes.size(); i++) { - TreeNodeBase* node = treeNodes.at(i); - if (node->getType() == TREE_NODE_TYPE_FOLDER) { - TreeNodeFolder* folder = static_cast(node); - QVariantMap resultNode; - resultNode.insert("name", node->getName()); - resultNode.insert("type", "folder"); - resultNode.insert("children", getPublicChildNodes(folder)); - result.append(resultNode); - continue; - } - TreeNodeScript* script = static_cast(node); - if (script->getOrigin() == ScriptOrigin::SCRIPT_ORIGIN_LOCAL) { - continue; - } - QVariantMap resultNode; - resultNode.insert("name", node->getName()); - resultNode.insert("type", "script"); - resultNode.insert("url", script->getFullPath()); - result.append(resultNode); - } - return result; -} - -QVariantList ScriptsScriptingInterface::getLocal() { - QVariantList result; - QList treeNodes = Application::getInstance()->getRunningScriptsWidget()->getScriptsModel() - ->getFolderNodes(NULL); - for (int i = 0; i < treeNodes.size(); i++) { - TreeNodeBase* node = treeNodes.at(i); - if (node->getType() != TREE_NODE_TYPE_SCRIPT) { - continue; - } - TreeNodeScript* script = static_cast(node); - if (script->getOrigin() != ScriptOrigin::SCRIPT_ORIGIN_LOCAL) { - continue; - } - QVariantMap resultNode; - resultNode.insert("name", node->getName()); - resultNode.insert("path", script->getFullPath()); - result.append(resultNode); - } - return result; -} diff --git a/interface/src/scripting/ScriptsScriptingInterface.h b/interface/src/scripting/ScriptsScriptingInterface.h deleted file mode 100644 index 6833c4d064..0000000000 --- a/interface/src/scripting/ScriptsScriptingInterface.h +++ /dev/null @@ -1,32 +0,0 @@ -// -// ScriptsScriptingInterface.h -// interface/src/scripting -// -// Created by Thijs Wenker on 3/31/15. -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#ifndef hifi_ScriptsScriptingInterface_h -#define hifi_ScriptsScriptingInterface_h - -#include - -class ScriptsScriptingInterface : public QObject { - Q_OBJECT -public: - ScriptsScriptingInterface() {}; - static ScriptsScriptingInterface* getInstance(); - -public slots: - QVariantList getRunning(); - QVariantList getPublic(); - QVariantList getLocal(); - -private: - QVariantList getPublicChildNodes(TreeNodeFolder* parent); -}; - -#endif // hifi_ScriptsScriptingInterface_h diff --git a/interface/src/ui/RunningScriptsWidget.cpp b/interface/src/ui/RunningScriptsWidget.cpp index 9ff600675f..f892deabb6 100644 --- a/interface/src/ui/RunningScriptsWidget.cpp +++ b/interface/src/ui/RunningScriptsWidget.cpp @@ -210,3 +210,74 @@ void RunningScriptsWidget::scriptStopped(const QString& scriptName) { void RunningScriptsWidget::allScriptsStopped() { Application::getInstance()->stopAllScripts(); } + +QVariantList RunningScriptsWidget::getRunning() { + const int WINDOWS_DRIVE_LETTER_SIZE = 1; + QVariantList result; + QStringList runningScripts = Application::getInstance()->getRunningScripts(); + for (int i = 0; i < runningScripts.size(); i++) { + QUrl runningScriptURL = QUrl(runningScripts.at(i)); + if (runningScriptURL.scheme().size() <= WINDOWS_DRIVE_LETTER_SIZE) { + runningScriptURL = QUrl::fromLocalFile(runningScriptURL.toDisplayString(QUrl::FormattingOptions(QUrl::FullyEncoded))); + } + QVariantMap resultNode; + resultNode.insert("name", runningScriptURL.fileName()); + resultNode.insert("url", runningScriptURL.toDisplayString(QUrl::FormattingOptions(QUrl::FullyEncoded))); + resultNode.insert("local", runningScriptURL.isLocalFile()); + result.append(resultNode); + } + return result; +} + +QVariantList RunningScriptsWidget::getPublic() { + return getPublicChildNodes(NULL); +} + +QVariantList RunningScriptsWidget::getPublicChildNodes(TreeNodeFolder* parent) { + QVariantList result; + QList treeNodes = Application::getInstance()->getRunningScriptsWidget()->getScriptsModel() + ->getFolderNodes(parent); + for (int i = 0; i < treeNodes.size(); i++) { + TreeNodeBase* node = treeNodes.at(i); + if (node->getType() == TREE_NODE_TYPE_FOLDER) { + TreeNodeFolder* folder = static_cast(node); + QVariantMap resultNode; + resultNode.insert("name", node->getName()); + resultNode.insert("type", "folder"); + resultNode.insert("children", getPublicChildNodes(folder)); + result.append(resultNode); + continue; + } + TreeNodeScript* script = static_cast(node); + if (script->getOrigin() == ScriptOrigin::SCRIPT_ORIGIN_LOCAL) { + continue; + } + QVariantMap resultNode; + resultNode.insert("name", node->getName()); + resultNode.insert("type", "script"); + resultNode.insert("url", script->getFullPath()); + result.append(resultNode); + } + return result; +} + +QVariantList RunningScriptsWidget::getLocal() { + QVariantList result; + QList treeNodes = Application::getInstance()->getRunningScriptsWidget()->getScriptsModel() + ->getFolderNodes(NULL); + for (int i = 0; i < treeNodes.size(); i++) { + TreeNodeBase* node = treeNodes.at(i); + if (node->getType() != TREE_NODE_TYPE_SCRIPT) { + continue; + } + TreeNodeScript* script = static_cast(node); + if (script->getOrigin() != ScriptOrigin::SCRIPT_ORIGIN_LOCAL) { + continue; + } + QVariantMap resultNode; + resultNode.insert("name", node->getName()); + resultNode.insert("path", script->getFullPath()); + result.append(resultNode); + } + return result; +} diff --git a/interface/src/ui/RunningScriptsWidget.h b/interface/src/ui/RunningScriptsWidget.h index 38ca3d46cf..5d3f6843af 100644 --- a/interface/src/ui/RunningScriptsWidget.h +++ b/interface/src/ui/RunningScriptsWidget.h @@ -46,7 +46,10 @@ protected: public slots: void scriptStopped(const QString& scriptName); - + QVariantList getRunning(); + QVariantList getPublic(); + QVariantList getLocal(); + private slots: void allScriptsStopped(); void updateFileFilter(const QString& filter); @@ -62,6 +65,8 @@ private: ScriptsTableWidget* _recentlyLoadedScriptsTable; QStringList _recentlyLoadedScripts; QString _lastStoppedScript; + + QVariantList getPublicChildNodes(TreeNodeFolder* parent); }; #endif // hifi_RunningScriptsWidget_h From caaf090b875a22e76f1ef6b1bf340736385be7db Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sun, 12 Apr 2015 13:02:27 -0700 Subject: [PATCH 5/7] Fix typo --- interface/ui/preferencesDialog.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/ui/preferencesDialog.ui b/interface/ui/preferencesDialog.ui index d295d094c2..247e033f99 100644 --- a/interface/ui/preferencesDialog.ui +++ b/interface/ui/preferencesDialog.ui @@ -1388,7 +1388,7 @@ - Faceshift eye detection + Faceshift eye deflection 0 From 809c7919aa705994a21744888f26c5113c4121ea Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 13 Apr 2015 15:57:36 +0200 Subject: [PATCH 6/7] Fix ghost avatars --- interface/src/avatar/AvatarManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 5ee09ba1cf..38144dfe5f 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -149,7 +149,7 @@ void AvatarManager::simulateAvatarFades(float deltaTime) { while (fadingIterator != _avatarFades.end()) { Avatar* avatar = static_cast(fadingIterator->data()); - avatar->setTargetScale(avatar->getScale() * SHRINK_RATE); + avatar->setTargetScale(avatar->getScale() * SHRINK_RATE, true); if (avatar->getTargetScale() < MIN_FADE_SCALE) { fadingIterator = _avatarFades.erase(fadingIterator); } else { From 8479f0d4c130944925a61cafb5653b8bd60ed1c2 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 13 Apr 2015 09:34:38 -0700 Subject: [PATCH 7/7] don't compute shape info until both render and collision geometries are fully loaded --- .../src/RenderableModelEntityItem.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 73968607f7..1d601d1294 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -297,10 +297,17 @@ bool RenderableModelEntityItem::isReadyToComputeShape() { // no collision-model url, so we're ready to compute a shape (of type None). return true; } + if (_model->getURL().isEmpty()) { + // we need a render geometry with a scale to proceed, so give up. + return true; + } const QSharedPointer collisionNetworkGeometry = _model->getCollisionGeometry(); - if (! collisionNetworkGeometry.isNull() && collisionNetworkGeometry->isLoadedWithTextures()) { - // we have a _collisionModelURL AND a collisionNetworkGeometry AND it's fully loaded. + const QSharedPointer renderNetworkGeometry = _model->getGeometry(); + + if ((! collisionNetworkGeometry.isNull() && collisionNetworkGeometry->isLoadedWithTextures()) && + (! renderNetworkGeometry.isNull() && renderNetworkGeometry->isLoadedWithTextures())) { + // we have both URLs AND both geometries AND they are both fully loaded. return true; } @@ -309,7 +316,7 @@ bool RenderableModelEntityItem::isReadyToComputeShape() { } void RenderableModelEntityItem::computeShapeInfo(ShapeInfo& info) { - if (_model->getCollisionURL().isEmpty()) { + if (_model->getCollisionURL().isEmpty() || _model->getURL().isEmpty()) { info.setParams(getShapeType(), 0.5f * getDimensions()); } else { const QSharedPointer collisionNetworkGeometry = _model->getCollisionGeometry();