diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 3e64fcf3ea..6f101c062c 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3407,16 +3407,13 @@ ScriptEngine* Application::loadScript(const QString& scriptName, bool loadScript scriptEngine->registerGlobalObject("Overlays", &_overlays); - QScriptEngine &qScriptEngine = scriptEngine->getEngine(); - QScriptValue getLocationFunction = qScriptEngine.newFunction(LocationScriptingInterface::locationGetter); - QScriptValue setLocationFunction = qScriptEngine.newFunction(LocationScriptingInterface::locationSetter, 1); - qScriptEngine.globalObject().setProperty("location", getLocationFunction, QScriptValue::PropertyGetter); - qScriptEngine.globalObject().setProperty("location", setLocationFunction, QScriptValue::PropertySetter); + QScriptValue windowValue = scriptEngine->registerGlobalObject("Window", WindowScriptingInterface::getInstance()); + scriptEngine->registerGetterSetter("location", LocationScriptingInterface::locationGetter, + LocationScriptingInterface::locationSetter, windowValue); - QScriptValue windowValue = qScriptEngine.newQObject(WindowScriptingInterface::getInstance()); - qScriptEngine.globalObject().setProperty("Window", windowValue); - windowValue.setProperty("location", getLocationFunction, QScriptValue::PropertyGetter); - windowValue.setProperty("location", setLocationFunction, QScriptValue::PropertySetter); + // register `location` on the global object. + scriptEngine->registerGetterSetter("location", LocationScriptingInterface::locationGetter, + LocationScriptingInterface::locationSetter); scriptEngine->registerGlobalObject("Menu", MenuScriptingInterface::getInstance()); scriptEngine->registerGlobalObject("Settings", SettingsScriptingInterface::getInstance()); diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index a4629b6555..f2a3da14d0 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -248,10 +248,26 @@ void ScriptEngine::init() { _particlesScriptingInterface.getParticlePacketSender()->setProcessCallIntervalHint(SCRIPT_DATA_CALLBACK_USECS); } -void ScriptEngine::registerGlobalObject(const QString& name, QObject* object) { +QScriptValue ScriptEngine::registerGlobalObject(const QString& name, QObject* object) { if (object) { QScriptValue value = _engine.newQObject(object); _engine.globalObject().setProperty(name, value); + return value; + } + return QScriptValue::NullValue; +} + +void ScriptEngine::registerGetterSetter(const QString& name, QScriptEngine::FunctionSignature getter, + QScriptEngine::FunctionSignature setter, QScriptValue object) { + QScriptValue setterFunction = _engine.newFunction(setter, 1); + QScriptValue getterFunction = _engine.newFunction(getter); + + if (object.isNull()) { + object.setProperty(name, setterFunction, QScriptValue::PropertySetter); + object.setProperty(name, getterFunction, QScriptValue::PropertyGetter); + } else { + _engine.globalObject().setProperty(name, setterFunction, QScriptValue::PropertySetter); + _engine.globalObject().setProperty(name, getterFunction, QScriptValue::PropertyGetter); } } diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index fec885ac1d..61c3c559c5 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -58,7 +58,9 @@ public: const QString& getScriptName() const { return _scriptName; } void cleanupMenuItems(); - void registerGlobalObject(const QString& name, QObject* object); /// registers a global object by name + QScriptValue registerGlobalObject(const QString& name, QObject* object); /// registers a global object by name + void registerGetterSetter(const QString& name, QScriptEngine::FunctionSignature getter, + QScriptEngine::FunctionSignature setter, QScriptValue object = QScriptValue::NullValue); Q_INVOKABLE void setIsAvatar(bool isAvatar); bool isAvatar() const { return _isAvatar; } @@ -69,8 +71,6 @@ public: bool isListeningToAudioStream() const { return _isListeningToAudioStream; } void setIsListeningToAudioStream(bool isListeningToAudioStream) { _isListeningToAudioStream = isListeningToAudioStream; } - QScriptEngine& getEngine() { return _engine; } - void setAvatarSound(Sound* avatarSound) { _avatarSound = avatarSound; } bool isPlayingAvatarSound() const { return _avatarSound != NULL; }