diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index cb340863f7..33db4fb0d6 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -134,6 +134,7 @@ #include "devices/Faceshift.h" #include "devices/Leapmotion.h" #include "DiscoverabilityManager.h" +#include "EntityScriptServerLogClient.h" #include "GLCanvas.h" #include "InterfaceActionFactory.h" #include "InterfaceLogging.h" @@ -520,6 +521,7 @@ bool setupEssentials(int& argc, char** argv) { DependencyManager::set(); DependencyManager::set(); DependencyManager::set(); + DependencyManager::set(); return previousSessionCrashed; } @@ -5524,6 +5526,9 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri auto recordingInterface = DependencyManager::get(); scriptEngine->registerGlobalObject("Recording", recordingInterface.data()); + auto entityScriptServerLog = DependencyManager::get(); + scriptEngine->registerGlobalObject("EntityScriptServerLog", entityScriptServerLog.data()); + // connect this script engines printedMessage signal to the global ScriptEngines these various messages connect(scriptEngine, &ScriptEngine::printedMessage, DependencyManager::get().data(), &ScriptEngines::onPrintedMessage); connect(scriptEngine, &ScriptEngine::errorMessage, DependencyManager::get().data(), &ScriptEngines::onErrorMessage); diff --git a/interface/src/EntityScriptServerLogClient.cpp b/interface/src/EntityScriptServerLogClient.cpp new file mode 100644 index 0000000000..3a8e248499 --- /dev/null +++ b/interface/src/EntityScriptServerLogClient.cpp @@ -0,0 +1,83 @@ +// +// EntityScriptServerLogClient.cpp +// interface/src +// +// Created by Clement Brisset on 2/1/17. +// Copyright 2017 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 "EntityScriptServerLogClient.h" + +EntityScriptServerLogClient::EntityScriptServerLogClient() { + auto nodeList = DependencyManager::get(); + auto& packetReceiver = nodeList->getPacketReceiver(); + packetReceiver.registerListener(PacketType::EntityServerScriptLog, this, "handleEntityServerScriptLogPacket"); + + QObject::connect(nodeList.data(), &NodeList::nodeActivated, this, &EntityScriptServerLogClient::nodeActivated); + QObject::connect(nodeList.data(), &NodeList::nodeKilled, this, &EntityScriptServerLogClient::nodeKilled); + + QObject::connect(nodeList.data(), &NodeList::canRezChanged, this, &EntityScriptServerLogClient::canRezChanged); +} + + +void EntityScriptServerLogClient::connectNotify(const QMetaMethod& signal) { + auto numReceivers = receivers(SIGNAL(receivedNewLogLines(QString))); + if (!_subscribed && numReceivers > 0) { + enableToEntityServerScriptLog(DependencyManager::get()->getThisNodeCanRez()); + } +} + +void EntityScriptServerLogClient::disconnectNotify(const QMetaMethod& signal) { + auto numReceivers = receivers(SIGNAL(receivedNewLogLines(QString))); + if (_subscribed && numReceivers == 0) { + enableToEntityServerScriptLog(false); + } +} + +void EntityScriptServerLogClient::enableToEntityServerScriptLog(bool enable) { + auto nodeList = DependencyManager::get(); + + if (auto node = nodeList->soloNodeOfType(NodeType::EntityScriptServer)) { + auto packet = NLPacket::create(PacketType::EntityServerScriptLog, sizeof(bool), true); + packet->writePrimitive(enable); + nodeList->sendPacket(std::move(packet), *node); + + if (_subscribed != enable) { + if (enable) { + emit receivedNewLogLines("====================== Subscribded to the Entity Script Server's log ======================"); + } else { + emit receivedNewLogLines("==================== Unsubscribded from the Entity Script Server's log ===================="); + } + } + _subscribed = enable; + } else { + qWarning() << "Entity Script Server not found"; + } +} + +void EntityScriptServerLogClient::handleEntityServerScriptLogPacket(QSharedPointer message, SharedNodePointer senderNode) { + emit receivedNewLogLines(QString::fromUtf8(message->readAll())); +} + +void EntityScriptServerLogClient::nodeActivated(SharedNodePointer activatedNode) { + if (_subscribed && activatedNode->getType() == NodeType::EntityScriptServer) { + _subscribed = false; + enableToEntityServerScriptLog(DependencyManager::get()->getThisNodeCanRez()); + } +} + +void EntityScriptServerLogClient::nodeKilled(SharedNodePointer killedNode) { + if (killedNode->getType() == NodeType::EntityScriptServer) { + emit receivedNewLogLines("====================== Connection to the Entity Script Server lost ======================"); + } +} + +void EntityScriptServerLogClient::canRezChanged(bool canRez) { + auto numReceivers = receivers(SIGNAL(receivedNewLogLines(QString))); + if (numReceivers > 0) { + enableToEntityServerScriptLog(canRez); + } +} diff --git a/interface/src/EntityScriptServerLogClient.h b/interface/src/EntityScriptServerLogClient.h new file mode 100644 index 0000000000..6fb0c9a3ce --- /dev/null +++ b/interface/src/EntityScriptServerLogClient.h @@ -0,0 +1,44 @@ +// +// EntityScriptServerLogClient.h +// interface/src +// +// Created by Clement Brisset on 2/1/17. +// Copyright 2017 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_EntityScriptServerLogClient_h +#define hifi_EntityScriptServerLogClient_h + +#include + +#include + +class EntityScriptServerLogClient : public QObject, public Dependency { + Q_OBJECT + +public: + EntityScriptServerLogClient(); + +signals: + void receivedNewLogLines(QString logLines); + +protected: + void connectNotify(const QMetaMethod& signal) override; + void disconnectNotify(const QMetaMethod& signal) override; + +private slots: + void enableToEntityServerScriptLog(bool enable); + void handleEntityServerScriptLogPacket(QSharedPointer message, SharedNodePointer senderNode); + + void nodeActivated(SharedNodePointer activatedNode); + void nodeKilled(SharedNodePointer killedNode); + void canRezChanged(bool canRez); + +private: + bool _subscribed { false }; +}; + +#endif // hifi_EntityScriptServerLogClient_h diff --git a/interface/src/ui/EntityScriptServerLogDialog.cpp b/interface/src/ui/EntityScriptServerLogDialog.cpp index fd06388bf9..e8ee3ee522 100644 --- a/interface/src/ui/EntityScriptServerLogDialog.cpp +++ b/interface/src/ui/EntityScriptServerLogDialog.cpp @@ -11,58 +11,13 @@ #include "EntityScriptServerLogDialog.h" +#include + EntityScriptServerLogDialog::EntityScriptServerLogDialog(QWidget* parent) : BaseLogDialog(parent) { setWindowTitle("Entity Script Server Log"); - auto nodeList = DependencyManager::get(); - auto& packetReceiver = nodeList->getPacketReceiver(); - packetReceiver.registerListener(PacketType::EntityServerScriptLog, this, "handleEntityServerScriptLogPacket"); - QObject::connect(nodeList.data(), &NodeList::nodeActivated, this, &EntityScriptServerLogDialog::nodeActivated); - QObject::connect(nodeList.data(), &NodeList::nodeKilled, this, &EntityScriptServerLogDialog::nodeKilled); - - QObject::connect(nodeList.data(), &NodeList::canRezChanged, this, &EntityScriptServerLogDialog::enableToEntityServerScriptLog); - enableToEntityServerScriptLog(nodeList->getThisNodeCanRez()); -} - -EntityScriptServerLogDialog::~EntityScriptServerLogDialog() { - enableToEntityServerScriptLog(false); -} -void EntityScriptServerLogDialog::enableToEntityServerScriptLog(bool enable) { - auto nodeList = DependencyManager::get(); - - if (auto node = nodeList->soloNodeOfType(NodeType::EntityScriptServer)) { - auto packet = NLPacket::create(PacketType::EntityServerScriptLog, sizeof(bool), true); - packet->writePrimitive(enable); - nodeList->sendPacket(std::move(packet), *node); - - if (_subscribed != enable) { - if (enable) { - appendLogLine("====================== Subscribded to the Entity Script Server's log ======================"); - } else { - appendLogLine("==================== Unsubscribded from the Entity Script Server's log ===================="); - } - } - _subscribed = enable; - } else { - qWarning() << "Entity Script Server not found"; - } -} - -void EntityScriptServerLogDialog::handleEntityServerScriptLogPacket(QSharedPointer message, SharedNodePointer senderNode) { - auto lines = QString::fromUtf8(message->readAll()); - QMetaObject::invokeMethod(this, "appendLogLine", Q_ARG(QString, lines)); -} - -void EntityScriptServerLogDialog::nodeActivated(SharedNodePointer activatedNode) { - if (_subscribed && activatedNode->getType() == NodeType::EntityScriptServer) { - _subscribed = false; - enableToEntityServerScriptLog(DependencyManager::get()->getThisNodeCanRez()); - } -} - -void EntityScriptServerLogDialog::nodeKilled(SharedNodePointer killedNode) { - if (killedNode->getType() == NodeType::EntityScriptServer) { - appendLogLine("====================== Connection to the Entity Script Server lost ======================"); - } + auto client = DependencyManager::get(); + QObject::connect(client.data(), &EntityScriptServerLogClient::receivedNewLogLines, + this, &EntityScriptServerLogDialog::appendLogLine); } diff --git a/interface/src/ui/EntityScriptServerLogDialog.h b/interface/src/ui/EntityScriptServerLogDialog.h index f183e9df33..a5451b6159 100644 --- a/interface/src/ui/EntityScriptServerLogDialog.h +++ b/interface/src/ui/EntityScriptServerLogDialog.h @@ -14,27 +14,14 @@ #include "BaseLogDialog.h" -#include - class EntityScriptServerLogDialog : public BaseLogDialog { Q_OBJECT public: EntityScriptServerLogDialog(QWidget* parent = nullptr); - ~EntityScriptServerLogDialog(); protected: QString getCurrentLog() override { return QString(); }; - -private slots: - void enableToEntityServerScriptLog(bool enable); - void handleEntityServerScriptLogPacket(QSharedPointer message, SharedNodePointer senderNode); - - void nodeActivated(SharedNodePointer activatedNode); - void nodeKilled(SharedNodePointer killedNode); - -private: - bool _subscribed { false }; }; #endif // hifi_EntityScriptServerLogDialog_h diff --git a/scripts/developer/debugging/essDebugWindow.js b/scripts/developer/debugging/essDebugWindow.js new file mode 100644 index 0000000000..7622655d13 --- /dev/null +++ b/scripts/developer/debugging/essDebugWindow.js @@ -0,0 +1,28 @@ +// +// essDebugWindow.js +// +// Created by Clement Brisset on 2/2/17. +// Copyright 2017 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 +// + +(function() { // BEGIN LOCAL_SCOPE + +// Set up the qml ui +var qml = Script.resolvePath('debugWindow.qml'); +var window = new OverlayWindow({ + title: 'Debug Window', + source: qml, + width: 400, height: 900, +}); +window.setPosition(25, 50); +window.closed.connect(function() { Script.stop(); }); + +EntityScriptServerLog.receivedNewLogLines.connect(function(message) { + window.sendToQml(message); +}); + + +}()); // END LOCAL_SCOPE