From b9f296ddb3892404153d77e2224ccd441eed9a7f Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 30 Apr 2014 09:38:30 -0700 Subject: [PATCH 01/12] Add WindowScriptingInterface and LocationScriptingInterface --- .../scripting/LocationScriptingInterface.cpp | 49 +++++++++++ .../scripting/LocationScriptingInterface.h | 46 ++++++++++ .../scripting/WindowScriptingInterface.cpp | 85 +++++++++++++++++++ .../src/scripting/WindowScriptingInterface.h | 43 ++++++++++ 4 files changed, 223 insertions(+) create mode 100644 interface/src/scripting/LocationScriptingInterface.cpp create mode 100644 interface/src/scripting/LocationScriptingInterface.h create mode 100644 interface/src/scripting/WindowScriptingInterface.cpp create mode 100644 interface/src/scripting/WindowScriptingInterface.h diff --git a/interface/src/scripting/LocationScriptingInterface.cpp b/interface/src/scripting/LocationScriptingInterface.cpp new file mode 100644 index 0000000000..44ff94aa1f --- /dev/null +++ b/interface/src/scripting/LocationScriptingInterface.cpp @@ -0,0 +1,49 @@ +// +// LocationScriptingInterface.cpp +// interface/src/scripting +// +// Created by Ryan Huffman on 4/29/14. +// Copyright 2014 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 + +#include "NodeList.h" + +#include "LocationScriptingInterface.h" + +LocationScriptingInterface* LocationScriptingInterface::getInstance() { + static LocationScriptingInterface sharedInstance; + return &sharedInstance; +} + +QString LocationScriptingInterface::getHref() { + return getProtocol() + "//" + getHostname() + getPathname(); +} + +QString LocationScriptingInterface::getPathname() { + const glm::vec3& position = Application::getInstance()->getAvatar()->getPosition(); + QString path; + path.sprintf("/%.4f,%.4f,%.4f", position.x, position.y, position.z); + return path; +} + +QString LocationScriptingInterface::getHostname() { + return NodeList::getInstance()->getDomainHandler().getHostname(); +} + +void LocationScriptingInterface::assign(const QString& url) { + QMetaObject::invokeMethod(Menu::getInstance(), "goToURL", Q_ARG(const QString&, url)); +} + +QScriptValue LocationScriptingInterface::locationGetter(QScriptContext* context, QScriptEngine* engine) { + return engine->newQObject(getInstance()); +} + +QScriptValue LocationScriptingInterface::locationSetter(QScriptContext* context, QScriptEngine* engine) { + LocationScriptingInterface::getInstance()->assign(context->argument(0).toString()); + return QScriptValue::UndefinedValue; +} diff --git a/interface/src/scripting/LocationScriptingInterface.h b/interface/src/scripting/LocationScriptingInterface.h new file mode 100644 index 0000000000..36b6d97561 --- /dev/null +++ b/interface/src/scripting/LocationScriptingInterface.h @@ -0,0 +1,46 @@ +// +// LocationScriptingInterface.h +// interface/src/scripting +// +// Created by Ryan Huffman on 4/29/14. +// Copyright 2014 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_LocationScriptingInterface_h +#define hifi_LocationScriptingInterface_h + +#include +#include +#include +#include +#include + +#include "Application.h" + +class LocationScriptingInterface : public QObject { + Q_OBJECT + Q_PROPERTY(QString href READ getHref) + Q_PROPERTY(QString protocol READ getProtocol) + Q_PROPERTY(QString hostname READ getHostname) + Q_PROPERTY(QString pathname READ getPathname) + LocationScriptingInterface() { }; +public: + static LocationScriptingInterface* getInstance(); + + QString getHref(); + QString getProtocol() { return CUSTOM_URL_SCHEME; }; + QString getPathname(); + QString getHostname(); + + static QScriptValue locationGetter(QScriptContext* context, QScriptEngine* engine); + static QScriptValue locationSetter(QScriptContext* context, QScriptEngine* engine); + +public slots: + void assign(const QString& url); + +}; + +#endif // hifi_LocationScriptingInterface_h diff --git a/interface/src/scripting/WindowScriptingInterface.cpp b/interface/src/scripting/WindowScriptingInterface.cpp new file mode 100644 index 0000000000..6272b689d9 --- /dev/null +++ b/interface/src/scripting/WindowScriptingInterface.cpp @@ -0,0 +1,85 @@ +// +// WindowScriptingInterface.cpp +// interface/src/scripting +// +// Created by Ryan Huffman on 4/29/14. +// Copyright 2014 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 +#include + +#include "Application.h" +#include "Menu.h" + +#include "WindowScriptingInterface.h" + +WindowScriptingInterface* WindowScriptingInterface::getInstance() { + static WindowScriptingInterface sharedInstance; + return &sharedInstance; +} + +QScriptValue WindowScriptingInterface::alert(const QString& message) { + QScriptValue retVal; + QMetaObject::invokeMethod(this, "showAlert", Qt::BlockingQueuedConnection, Q_RETURN_ARG(QScriptValue, retVal), Q_ARG(const QString&, message)); + return retVal; +} + +QScriptValue WindowScriptingInterface::confirm(const QString& message) { + bool retVal; + QMetaObject::invokeMethod(this, "showConfirm", Qt::BlockingQueuedConnection, + Q_RETURN_ARG(bool, retVal), Q_ARG(const QString&, message)); + return QScriptValue(retVal); +} + +QScriptValue WindowScriptingInterface::prompt(const QString& message, const QString& defaultText) { + QScriptValue retVal; + QMetaObject::invokeMethod(this, "showPrompt", Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QScriptValue, retVal), + Q_ARG(const QString&, message), Q_ARG(const QString&, defaultText)); + return retVal; +} + +/// Display an alert box +/// \param const QString& message message to display +/// \return QScriptValue::UndefinedValue +QScriptValue WindowScriptingInterface::showAlert(const QString& message) { + QMessageBox::warning(Application::getInstance()->getWindow(), "", message); + return QScriptValue::UndefinedValue; +} + +/// Display a confirmation box with the options 'Yes' and 'No' +/// \param const QString& message message to display +/// \return QScriptValue `true` if 'Yes' was clicked, `false` otherwise +QScriptValue WindowScriptingInterface::showConfirm(const QString& message) { + QMessageBox::StandardButton response = QMessageBox::question(Application::getInstance()->getWindow(), "", message); + return QScriptValue(response == QMessageBox::Yes); +} + +/// Display a prompt with a text box +/// \param const QString& message message to display +/// \param const QString& defaultText default text in the text box +/// \return QScriptValue string text value in text box if the dialog was accepted, `null` otherwise. +QScriptValue WindowScriptingInterface::showPrompt(const QString& message, const QString& defaultText) { + QInputDialog promptDialog(Application::getInstance()->getWindow()); + promptDialog.setWindowTitle(""); + promptDialog.setLabelText(message); + promptDialog.setTextValue(defaultText); + + if (promptDialog.exec() == QDialog::Accepted) { + return QScriptValue(promptDialog.textValue()); + } + + return QScriptValue::NullValue; +} + +int WindowScriptingInterface::getInnerWidth() { + return Application::getInstance()->getWindow()->geometry().width(); +} + +int WindowScriptingInterface::getInnerHeight() { + return Application::getInstance()->getWindow()->geometry().height(); +} diff --git a/interface/src/scripting/WindowScriptingInterface.h b/interface/src/scripting/WindowScriptingInterface.h new file mode 100644 index 0000000000..a97733eaf4 --- /dev/null +++ b/interface/src/scripting/WindowScriptingInterface.h @@ -0,0 +1,43 @@ +// +// WindowScriptingInterface.cpp +// interface/src/scripting +// +// Created by Ryan Huffman on 4/29/14. +// Copyright 2014 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_WindowScriptingInterface_h +#define hifi_WindowScriptingInterface_h + +#include +#include +#include +#include + +#include "LocationScriptingInterface.h" + +class WindowScriptingInterface : public QObject { + Q_OBJECT + Q_PROPERTY(int innerWidth READ getInnerWidth) + Q_PROPERTY(int innerHeight READ getInnerHeight) + WindowScriptingInterface() { }; +public: + static WindowScriptingInterface* getInstance(); + int getInnerWidth(); + int getInnerHeight(); + +public slots: + QScriptValue alert(const QString& message); + QScriptValue confirm(const QString& message); + QScriptValue prompt(const QString& message, const QString& defaultText=""); + +private slots: + QScriptValue showAlert(const QString& message); + QScriptValue showConfirm(const QString& message); + QScriptValue showPrompt(const QString& message, const QString& defaultText); +}; + +#endif // hifi_WindowScriptingInterface_h From 0570849df5909e0aaf592a2bff21f0a6fd66c559 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 30 Apr 2014 09:38:57 -0700 Subject: [PATCH 02/12] Add Window and location to global script object --- interface/src/Application.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 97b5c05f25..d630f2eb83 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -77,6 +77,8 @@ #include "scripting/ClipboardScriptingInterface.h" #include "scripting/MenuScriptingInterface.h" #include "scripting/SettingsScriptingInterface.h" +#include "scripting/WindowScriptingInterface.h" +#include "scripting/LocationScriptingInterface.h" #include "ui/InfoView.h" #include "ui/Snapshot.h" @@ -3406,6 +3408,18 @@ ScriptEngine* Application::loadScript(const QString& scriptName, bool loadScript connect(scriptEngine, SIGNAL(finished(const QString&)), clipboardScriptable, SLOT(deleteLater())); 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 = qScriptEngine.newQObject(WindowScriptingInterface::getInstance()); + qScriptEngine.globalObject().setProperty("Window", windowValue); + windowValue.setProperty("location", getLocationFunction, QScriptValue::PropertyGetter); + windowValue.setProperty("location", setLocationFunction, QScriptValue::PropertySetter); + scriptEngine->registerGlobalObject("Menu", MenuScriptingInterface::getInstance()); scriptEngine->registerGlobalObject("Settings", SettingsScriptingInterface::getInstance()); scriptEngine->registerGlobalObject("AudioDevice", AudioDeviceScriptingInterface::getInstance()); From ff51b22bfeb2a95da2a3f76e464ed128f00c8136 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 30 Apr 2014 09:39:48 -0700 Subject: [PATCH 03/12] Add Menu::goToUrl --- interface/src/Menu.cpp | 70 ++++++++++++++++++++++-------------------- interface/src/Menu.h | 1 + 2 files changed, 38 insertions(+), 33 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 44117df55c..ca969832b3 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -927,44 +927,48 @@ void Menu::goTo() { int dialogReturn = gotoDialog.exec(); if (dialogReturn == QDialog::Accepted && !gotoDialog.textValue().isEmpty()) { QString desiredDestination = gotoDialog.textValue(); - - if (desiredDestination.startsWith(CUSTOM_URL_SCHEME + "//")) { - QStringList urlParts = desiredDestination.remove(0, CUSTOM_URL_SCHEME.length() + 2).split('/', QString::SkipEmptyParts); - - if (urlParts.count() > 1) { - // if url has 2 or more parts, the first one is domain name - QString domain = urlParts[0]; - - // second part is either a destination coordinate or - // a place name - QString destination = urlParts[1]; - - // any third part is an avatar orientation. - QString orientation = urlParts.count() > 2 ? urlParts[2] : QString(); - - goToDomain(domain); - - // goto either @user, #place, or x-xx,y-yy,z-zz - // style co-ordinate. - goTo(destination); - - if (!orientation.isEmpty()) { - // location orientation - goToOrientation(orientation); - } - } else if (urlParts.count() == 1) { - // location coordinates or place name - QString destination = urlParts[0]; - goTo(destination); - } - - } else { - goToUser(gotoDialog.textValue()); + if (!goToURL(desiredDestination)) {; + goTo(desiredDestination); } } sendFakeEnterEvent(); } +bool Menu::goToURL(QString location) { + if (location.startsWith(CUSTOM_URL_SCHEME + "//")) { + QStringList urlParts = location.remove(0, CUSTOM_URL_SCHEME.length() + 2).split('/', QString::SkipEmptyParts); + + if (urlParts.count() > 1) { + // if url has 2 or more parts, the first one is domain name + QString domain = urlParts[0]; + + // second part is either a destination coordinate or + // a place name + QString destination = urlParts[1]; + + // any third part is an avatar orientation. + QString orientation = urlParts.count() > 2 ? urlParts[2] : QString(); + + goToDomain(domain); + + // goto either @user, #place, or x-xx,y-yy,z-zz + // style co-ordinate. + goTo(destination); + + if (!orientation.isEmpty()) { + // location orientation + goToOrientation(orientation); + } + } else if (urlParts.count() == 1) { + // location coordinates or place name + QString destination = urlParts[0]; + goTo(destination); + } + return true; + } + return false; +} + void Menu::goToUser(const QString& user) { LocationManager* manager = &LocationManager::getInstance(); manager->goTo(user); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index bc70f8f83f..c2f4937dc2 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -152,6 +152,7 @@ public slots: void importSettings(); void exportSettings(); void goTo(); + bool goToURL(QString location); void goToUser(const QString& user); void pasteToVoxel(); void openUrl(const QUrl& url); From 0477706cb91582354d317058ded8f5dea193002f Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 30 Apr 2014 09:40:32 -0700 Subject: [PATCH 04/12] Add ScriptEngine::getEngine() to get internal QScriptEngine --- libraries/script-engine/src/ScriptEngine.cpp | 1 + libraries/script-engine/src/ScriptEngine.h | 3 +++ 2 files changed, 4 insertions(+) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index ed05658538..aae9e85294 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index 9ea99276d3..fec885ac1d 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -69,6 +69,8 @@ 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; } @@ -136,6 +138,7 @@ private: Vec3 _vec3Library; ScriptUUID _uuidLibrary; AnimationCache _animationCache; + }; #endif // hifi_ScriptEngine_h From 9a44b2b2fbb0f156b497ceb052334652413557ce Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 30 Apr 2014 09:40:50 -0700 Subject: [PATCH 05/12] Remove unneeded include in WindowScriptingInterface --- interface/src/scripting/WindowScriptingInterface.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/interface/src/scripting/WindowScriptingInterface.h b/interface/src/scripting/WindowScriptingInterface.h index a97733eaf4..f6a91cd597 100644 --- a/interface/src/scripting/WindowScriptingInterface.h +++ b/interface/src/scripting/WindowScriptingInterface.h @@ -17,8 +17,6 @@ #include #include -#include "LocationScriptingInterface.h" - class WindowScriptingInterface : public QObject { Q_OBJECT Q_PROPERTY(int innerWidth READ getInnerWidth) From 45beeaa8d5a854a3b2efde293f8d2ede5da2610f Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 30 Apr 2014 09:45:53 -0700 Subject: [PATCH 06/12] Add dialog + location + window JS examples --- examples/dialogExample.js | 7 +++++++ examples/locationExample.js | 11 +++++++++++ examples/windowExample.js | 12 ++++++++++++ 3 files changed, 30 insertions(+) create mode 100644 examples/dialogExample.js create mode 100644 examples/locationExample.js create mode 100644 examples/windowExample.js diff --git a/examples/dialogExample.js b/examples/dialogExample.js new file mode 100644 index 0000000000..144b681950 --- /dev/null +++ b/examples/dialogExample.js @@ -0,0 +1,7 @@ +Window.alert("This is an alert box"); + +var confirmed = Window.confirm("This is a confirmation dialog") +Window.alert("Your response was: " + confirmed); + +var prompt = Window.prompt("This is a prompt dialog", "This is the default text"); +Window.alert("Your response was: " + prompt); diff --git a/examples/locationExample.js b/examples/locationExample.js new file mode 100644 index 0000000000..7530a3e3b6 --- /dev/null +++ b/examples/locationExample.js @@ -0,0 +1,11 @@ +var goto = Window.prompt("Where would you like to go? (ex. @username, #location, 1.0,500.3,100.2)"); +var url = "hifi://" + goto; +print("Going to: " + url); +location = url; + +// If the destination location is a user or named location the new location may not be set by the time execution reaches here +// because it requires an asynchronous lookup. Coordinate changes should be be reflected immediately, though. (ex: hifi://0,0,0) +print("URL: " + location.href); +print("Protocol: " + location.protocol); +print("Hostname: " + location.hostname); +print("Pathname: " + location.pathname); diff --git a/examples/windowExample.js b/examples/windowExample.js new file mode 100644 index 0000000000..afde83591d --- /dev/null +++ b/examples/windowExample.js @@ -0,0 +1,12 @@ +var width = 0, + height = 0; + +function onUpdate(dt) { + if (width != Window.innerWidth || height != Window.innerHeight) { + width = Window.innerWidth; + height = Window.innerHeight; + print("New window dimensions: " + width + ", " + height); + } +} + +Script.update.connect(onUpdate); From 9e684a0bc88a8998e5632e18ca84f33ff3b2d638 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 30 Apr 2014 11:17:36 -0700 Subject: [PATCH 07/12] Add registerGetterSetter to remove need for getEngine() --- interface/src/Application.cpp | 15 ++++++--------- libraries/script-engine/src/ScriptEngine.cpp | 18 +++++++++++++++++- libraries/script-engine/src/ScriptEngine.h | 6 +++--- 3 files changed, 26 insertions(+), 13 deletions(-) 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; } From 701fcd3542bec46bffa2511a75d48c00ba4d0b3b Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 30 Apr 2014 11:29:01 -0700 Subject: [PATCH 08/12] Fix invalid check for null object in registerGetterSetter --- libraries/script-engine/src/ScriptEngine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index f2a3da14d0..82209b1f5b 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -262,7 +262,7 @@ void ScriptEngine::registerGetterSetter(const QString& name, QScriptEngine::Func QScriptValue setterFunction = _engine.newFunction(setter, 1); QScriptValue getterFunction = _engine.newFunction(getter); - if (object.isNull()) { + if (!object.isNull()) { object.setProperty(name, setterFunction, QScriptValue::PropertySetter); object.setProperty(name, getterFunction, QScriptValue::PropertyGetter); } else { From 3a64ce733a540e4dd98824c68b19be414be380cc Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 30 Apr 2014 16:55:51 -0700 Subject: [PATCH 09/12] Fixed warning --- interface/src/avatar/Avatar.h | 2 +- interface/src/avatar/MyAvatar.cpp | 2 +- interface/src/avatar/MyAvatar.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index df1340b79a..4263e606a5 100755 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -185,7 +185,7 @@ protected: float getPelvisToHeadLength() const; void renderDisplayName(); - virtual void renderBody(RenderMode renderMode, float glowLevel); + virtual void renderBody(RenderMode renderMode, float glowLevel = 0.0f); virtual bool shouldRenderHead(const glm::vec3& cameraPosition, RenderMode renderMode) const; virtual void updateJointMappings(); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 40e350dcb7..8e0eb6f78f 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -618,7 +618,7 @@ void MyAvatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { _billboardValid = false; } -void MyAvatar::renderBody(RenderMode renderMode) { +void MyAvatar::renderBody(RenderMode renderMode, float glowLevel) { if (!(_skeletonModel.isRenderable() && getHead()->getFaceModel().isRenderable())) { return; // wait until both models are loaded } diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index a5312b0016..28ac2141bb 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -42,7 +42,7 @@ public: void moveWithLean(); void render(const glm::vec3& cameraPosition, RenderMode renderMode = NORMAL_RENDER_MODE); - void renderBody(RenderMode renderMode); + void renderBody(RenderMode renderMode, float glowLevel = 0.0f); bool shouldRenderHead(const glm::vec3& cameraPosition, RenderMode renderMode) const; void renderDebugBodyPoints(); void renderHeadMouse() const; From 8e63352d54ed534fb87ba8b9d931836a3e3f7486 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 30 Apr 2014 19:00:06 -0700 Subject: [PATCH 10/12] Fix Window.confirm() not working --- interface/src/scripting/WindowScriptingInterface.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/src/scripting/WindowScriptingInterface.cpp b/interface/src/scripting/WindowScriptingInterface.cpp index 6272b689d9..3366e28f6e 100644 --- a/interface/src/scripting/WindowScriptingInterface.cpp +++ b/interface/src/scripting/WindowScriptingInterface.cpp @@ -29,10 +29,10 @@ QScriptValue WindowScriptingInterface::alert(const QString& message) { } QScriptValue WindowScriptingInterface::confirm(const QString& message) { - bool retVal; + QScriptValue retVal; QMetaObject::invokeMethod(this, "showConfirm", Qt::BlockingQueuedConnection, - Q_RETURN_ARG(bool, retVal), Q_ARG(const QString&, message)); - return QScriptValue(retVal); + Q_RETURN_ARG(QScriptValue, retVal), Q_ARG(const QString&, message)); + return retVal; } QScriptValue WindowScriptingInterface::prompt(const QString& message, const QString& defaultText) { From a7dd19183e0d612516fd031b2dc798ffd998c09f Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 30 Apr 2014 19:02:28 -0700 Subject: [PATCH 11/12] Add default values for alert, confirm, and prompt --- interface/src/scripting/WindowScriptingInterface.h | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/interface/src/scripting/WindowScriptingInterface.h b/interface/src/scripting/WindowScriptingInterface.h index f6a91cd597..af9b15a96d 100644 --- a/interface/src/scripting/WindowScriptingInterface.h +++ b/interface/src/scripting/WindowScriptingInterface.h @@ -12,9 +12,8 @@ #ifndef hifi_WindowScriptingInterface_h #define hifi_WindowScriptingInterface_h -#include -#include #include +#include #include class WindowScriptingInterface : public QObject { @@ -28,9 +27,9 @@ public: int getInnerHeight(); public slots: - QScriptValue alert(const QString& message); - QScriptValue confirm(const QString& message); - QScriptValue prompt(const QString& message, const QString& defaultText=""); + QScriptValue alert(const QString& message = ""); + QScriptValue confirm(const QString& message = ""); + QScriptValue prompt(const QString& message = "", const QString& defaultText = ""); private slots: QScriptValue showAlert(const QString& message); From 33ca387c8678e44874b4665594300b73fa7cc21c Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 30 Apr 2014 21:12:04 -0700 Subject: [PATCH 12/12] Update goToURL to work with domains and user/location If the path starts with # or @ it's a location or user, respectively, otherwise it is a domain. --- interface/src/Menu.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 5c396f169c..7ab2639065 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -931,9 +931,14 @@ bool Menu::goToURL(QString location) { goToOrientation(orientation); } } else if (urlParts.count() == 1) { - // location coordinates or place name QString destination = urlParts[0]; - goTo(destination); + + // If this starts with # or @, treat it as a user/location, otherwise treat it as a domain + if (destination[0] == '#' || destination[0] == '@') { + goTo(destination); + } else { + goToDomain(destination); + } } return true; }