From aeaae4ccc820a720efaf2f8c9706a58038419383 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Fri, 23 Sep 2016 14:27:47 -0700 Subject: [PATCH] reload qml with scripts --- libraries/gl/src/gl/OffscreenQmlSurface.cpp | 4 ++++ libraries/gl/src/gl/OffscreenQmlSurface.h | 2 ++ libraries/script-engine/CMakeLists.txt | 2 ++ libraries/script-engine/src/ScriptEngines.cpp | 20 ++++++++----------- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp index 6a16256198..bdfa359b8b 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp +++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp @@ -545,6 +545,10 @@ QObject* OffscreenQmlSurface::load(const QUrl& qmlSource, std::functionengine()->clearComponentCache(); +} + void OffscreenQmlSurface::requestUpdate() { _polish = true; _render = true; diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.h b/libraries/gl/src/gl/OffscreenQmlSurface.h index a4a5ecba7e..a9a77f2941 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.h +++ b/libraries/gl/src/gl/OffscreenQmlSurface.h @@ -40,10 +40,12 @@ public: virtual void create(QOpenGLContext* context); void resize(const QSize& size, bool forceResize = false); QSize size() const; + Q_INVOKABLE QObject* load(const QUrl& qmlSource, std::function f = [](QQmlContext*, QObject*) {}); Q_INVOKABLE QObject* load(const QString& qmlSourceFile, std::function f = [](QQmlContext*, QObject*) {}) { return load(QUrl(qmlSourceFile), f); } + void clearCache(); Q_INVOKABLE void executeOnUiThread(std::function function, bool blocking = false); Q_INVOKABLE QVariant returnFromUiThread(std::function function); diff --git a/libraries/script-engine/CMakeLists.txt b/libraries/script-engine/CMakeLists.txt index 8626a98161..b0dbbc111b 100644 --- a/libraries/script-engine/CMakeLists.txt +++ b/libraries/script-engine/CMakeLists.txt @@ -17,3 +17,5 @@ if (NOT ANDROID) endif () link_hifi_libraries(shared networking octree gpu ui procedural model model-networking recording avatars fbx entities controllers animation audio physics) +# ui includes gl, but link_hifi_libraries does not use transitive includes, so gl must be explicit +include_hifi_library_headers(gl) \ No newline at end of file diff --git a/libraries/script-engine/src/ScriptEngines.cpp b/libraries/script-engine/src/ScriptEngines.cpp index beddc21787..cb6291a8dc 100644 --- a/libraries/script-engine/src/ScriptEngines.cpp +++ b/libraries/script-engine/src/ScriptEngines.cpp @@ -16,6 +16,8 @@ #include #include +#include + #include "ScriptEngine.h" #include "ScriptEngineLogging.h" @@ -367,28 +369,21 @@ QStringList ScriptEngines::getRunningScripts() { void ScriptEngines::stopAllScripts(bool restart) { QReadLocker lock(&_scriptEnginesHashLock); - if (restart) { - // Delete all running scripts from cache so that they are re-downloaded when they are restarted - auto scriptCache = DependencyManager::get(); - for (QHash::const_iterator it = _scriptEnginesHash.constBegin(); - it != _scriptEnginesHash.constEnd(); it++) { - if (!it.value()->isFinished()) { - scriptCache->deleteScript(it.key()); - } - } - } - - // Stop and possibly restart all currently running scripts for (QHash::const_iterator it = _scriptEnginesHash.constBegin(); it != _scriptEnginesHash.constEnd(); it++) { + // skip already stopped scripts if (it.value()->isFinished() || it.value()->isStopping()) { continue; } + + // queue user scripts if restarting if (restart && it.value()->isUserLoaded()) { connect(it.value(), &ScriptEngine::finished, this, [this](QString scriptName, ScriptEngine* engine) { reloadScript(scriptName); }); } + + // stop all scripts it.value()->stop(true); qCDebug(scriptengine) << "stopping script..." << it.key(); } @@ -431,6 +426,7 @@ void ScriptEngines::setScriptsLocation(const QString& scriptsLocation) { void ScriptEngines::reloadAllScripts() { DependencyManager::get()->clearCache(); + DependencyManager::get()->clearCache(); emit scriptsReloading(); stopAllScripts(true); }