From a783f0302558c9af828991ab17591c7138d32efb Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Tue, 7 Apr 2015 16:48:11 +0200 Subject: [PATCH] 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);