From 1e8d45aecb1c7d9056461ed93054eb611d127f3a Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Wed, 27 Apr 2016 18:27:41 -0700 Subject: [PATCH] Put ScriptableResource state enum in prototype --- libraries/networking/src/ResourceCache.cpp | 12 +--------- libraries/networking/src/ResourceCache.h | 3 +++ libraries/script-engine/src/ScriptEngine.cpp | 22 ++++++++++++++++++- .../developer/tests/scriptableResource/lib.js | 12 +++++----- 4 files changed, 31 insertions(+), 18 deletions(-) diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index aa42f94e8b..32b1c03766 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -121,17 +121,7 @@ QSharedPointer ResourceCacheSharedItems::getHighestPendingRequest() { ScriptableResource::ScriptableResource(const QUrl& url) : QObject(nullptr), - _url(url) { - - // Expose enum State to JS/QML via properties - QObject* state = new QObject(this); - state->setObjectName("ResourceState"); - setProperty("State", QVariant::fromValue(state)); - auto metaEnum = QMetaEnum::fromType(); - for (int i = 0; i < metaEnum.keyCount(); ++i) { - state->setProperty(metaEnum.key(i), metaEnum.value(i)); - } -} + _url(url) { } void ScriptableResource::release() { disconnectHelper(); diff --git a/libraries/networking/src/ResourceCache.h b/libraries/networking/src/ResourceCache.h index 904da4f097..98473a58c3 100644 --- a/libraries/networking/src/ResourceCache.h +++ b/libraries/networking/src/ResourceCache.h @@ -24,9 +24,12 @@ #include #include #include + #include #include +#include + #include #include "ResourceManager.h" diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 29d592eec2..1cbd2a6127 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -285,6 +285,23 @@ static void scriptableResourceFromScriptValue(const QScriptValue& value, Scripta resource = static_cast(value.toQObject()); } +static QScriptValue createScriptableResourcePrototype(QScriptEngine* engine) { + auto prototype = engine->newObject(); + + // Expose enum State to JS/QML via properties + QObject* state = new QObject(engine); + state->setObjectName("ResourceState"); + auto metaEnum = QMetaEnum::fromType(); + for (int i = 0; i < metaEnum.keyCount(); ++i) { + state->setProperty(metaEnum.key(i), metaEnum.value(i)); + } + + auto prototypeState = engine->newQObject(state, QScriptEngine::QtOwnership, QScriptEngine::ExcludeSlots | QScriptEngine::ExcludeSuperClassMethods); + prototype.setProperty("State", prototypeState); + + return prototype; +} + void ScriptEngine::init() { if (_isInitialized) { return; // only initialize once @@ -342,11 +359,14 @@ void ScriptEngine::init() { registerGlobalObject("Vec3", &_vec3Library); registerGlobalObject("Mat4", &_mat4Library); registerGlobalObject("Uuid", &_uuidLibrary); - registerGlobalObject("AnimationCache", DependencyManager::get().data()); registerGlobalObject("Messages", DependencyManager::get().data()); qScriptRegisterMetaType(this, animVarMapToScriptValue, animVarMapFromScriptValue); qScriptRegisterMetaType(this, resultHandlerToScriptValue, resultHandlerFromScriptValue); + // Scriptable cache access + auto resourcePrototype = createScriptableResourcePrototype(this); + globalObject().setProperty("Resource", resourcePrototype); + setDefaultPrototype(qMetaTypeId(), resourcePrototype); qScriptRegisterMetaType(this, scriptableResourceToScriptValue, scriptableResourceFromScriptValue); // constants diff --git a/scripts/developer/tests/scriptableResource/lib.js b/scripts/developer/tests/scriptableResource/lib.js index 21e2e64cae..053cd0bf44 100644 --- a/scripts/developer/tests/scriptableResource/lib.js +++ b/scripts/developer/tests/scriptableResource/lib.js @@ -19,15 +19,15 @@ function getFrame(callback) { var FRAME_URL = "http://hifi-production.s3.amazonaws.com/tutorials/pictureFrame/finalFrame.fbx"; var model = ModelCache.prefetch(FRAME_URL); - if (model.loaded) { - makeFrame(true); + if (model.state = Resource.State.FINISHED) { + makeFrame(Resource.State.FINISHED); } else { model.stateChanged.connect(makeFrame); } function makeFrame(state) { - if (state == 4) { throw "Failed to load frame"; } - if (state != 3) { return; } + if (state == Resource.State.FAILED) { throw "Failed to load frame"; } + if (state != Resource.State.FINISHED) { return; } var pictureFrameProperties = { name: 'scriptableResourceTest Picture Frame', @@ -67,10 +67,10 @@ function prefetch(callback) { var filepath = MOVIE_URL + padded + '.jpg'; var texture = TextureCache.prefetch(filepath); frames.push(texture); - if (!texture.loaded) { + if (!texture.state == Resource.State.FINISHED) { numLoading++; texture.stateChanged.connect(function(state) { - if (state == 3 || state == 4) { + if (state == Resource.State.FAILED || state == Resource.State.FINISHED) { --numLoading; if (!numLoading) { callback(frames); } }