From 9449ad71920007d9cc4f9588e37a89680456c9f6 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sun, 29 Jun 2014 19:40:53 -0700 Subject: [PATCH 1/7] Add missing script engine hash key code changes The script engine hash key changed starting at commit [62f85d] on 11 Jun. --- interface/src/Application.cpp | 3 ++- interface/src/ui/ScriptEditorWidget.cpp | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 3a5db6666d..5de4dc32f5 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3628,7 +3628,8 @@ ScriptEngine* Application::loadScript(const QString& scriptName, bool loadScript } void Application::scriptFinished(const QString& scriptName) { - QHash::iterator it = _scriptEnginesHash.find(scriptName); + const QString& scriptURLString = QUrl(scriptName).toString(); + QHash::iterator it = _scriptEnginesHash.find(scriptURLString); if (it != _scriptEnginesHash.end()) { _scriptEnginesHash.erase(it); _runningScriptsWidget->scriptStopped(scriptName); diff --git a/interface/src/ui/ScriptEditorWidget.cpp b/interface/src/ui/ScriptEditorWidget.cpp index be5577e0e8..ae5d69b1aa 100644 --- a/interface/src/ui/ScriptEditorWidget.cpp +++ b/interface/src/ui/ScriptEditorWidget.cpp @@ -84,7 +84,8 @@ bool ScriptEditorWidget::setRunning(bool run) { } if (run) { - _scriptEngine = Application::getInstance()->loadScript(_currentScript, true); + const QString& scriptURLString = QUrl(_currentScript).toString(); + _scriptEngine = Application::getInstance()->loadScript(scriptURLString, true); connect(_scriptEngine, &ScriptEngine::runningStateChanged, this, &ScriptEditorWidget::runningStateChanged); // Make new connections. @@ -148,7 +149,8 @@ void ScriptEditorWidget::loadFile(const QString& scriptPath) { } } - _scriptEngine = Application::getInstance()->getScriptEngine(_currentScript); + const QString& scriptURLString = QUrl(_currentScript).toString(); + _scriptEngine = Application::getInstance()->getScriptEngine(scriptURLString); if (_scriptEngine != NULL) { connect(_scriptEngine, &ScriptEngine::runningStateChanged, this, &ScriptEditorWidget::runningStateChanged); connect(_scriptEngine, &ScriptEngine::errorMessage, this, &ScriptEditorWidget::onScriptError); From 48fb156e28f363a3d61bf1be58c119d6f42c760e Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sun, 29 Jun 2014 19:47:00 -0700 Subject: [PATCH 2/7] Fix Script Editor run-on-the-fly crashing Wait for script engine to stop before restarting. --- interface/src/ui/ScriptEditorWidget.cpp | 14 ++++++++++++-- interface/src/ui/ScriptEditorWidget.h | 2 ++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/ScriptEditorWidget.cpp b/interface/src/ui/ScriptEditorWidget.cpp index ae5d69b1aa..f519a6f4fd 100644 --- a/interface/src/ui/ScriptEditorWidget.cpp +++ b/interface/src/ui/ScriptEditorWidget.cpp @@ -28,7 +28,8 @@ ScriptEditorWidget::ScriptEditorWidget() : _scriptEditorWidgetUI(new Ui::ScriptEditorWidget), - _scriptEngine(NULL) + _scriptEngine(NULL), + _isRestarting(false) { _scriptEditorWidgetUI->setupUi(this); @@ -52,8 +53,9 @@ ScriptEditorWidget::~ScriptEditorWidget() { void ScriptEditorWidget::onScriptModified() { if(_scriptEditorWidgetUI->onTheFlyCheckBox->isChecked() && isRunning()) { + _isRestarting = true; setRunning(false); - setRunning(true); + // Script is restarted once current script instance finishes. } } @@ -62,6 +64,13 @@ void ScriptEditorWidget::onScriptEnding() { _scriptEngine = NULL; } +void ScriptEditorWidget::onScriptFinished(const QString& scriptPath) { + if (_isRestarting) { + _isRestarting = false; + setRunning(true); + } +} + bool ScriptEditorWidget::isModified() { return _scriptEditorWidgetUI->scriptEdit->document()->isModified(); } @@ -93,6 +102,7 @@ bool ScriptEditorWidget::setRunning(bool run) { connect(_scriptEngine, &ScriptEngine::printedMessage, this, &ScriptEditorWidget::onScriptPrint); connect(_scriptEngine, &ScriptEngine::scriptEnding, this, &ScriptEditorWidget::onScriptEnding); } else { + connect(_scriptEngine, &ScriptEngine::finished, this, &ScriptEditorWidget::onScriptFinished); Application::getInstance()->stopScript(_currentScript); _scriptEngine = NULL; } diff --git a/interface/src/ui/ScriptEditorWidget.h b/interface/src/ui/ScriptEditorWidget.h index 3e95ea322b..f3e09971dc 100644 --- a/interface/src/ui/ScriptEditorWidget.h +++ b/interface/src/ui/ScriptEditorWidget.h @@ -47,11 +47,13 @@ private slots: void onScriptPrint(const QString& message); void onScriptModified(); void onScriptEnding(); + void onScriptFinished(const QString& scriptName); private: Ui::ScriptEditorWidget* _scriptEditorWidgetUI; ScriptEngine* _scriptEngine; QString _currentScript; + bool _isRestarting; }; #endif // hifi_ScriptEditorWidget_h From 742007892f4cd3968cfbb84e4a543cef83dcf2b3 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sun, 29 Jun 2014 19:57:26 -0700 Subject: [PATCH 3/7] Rework old fix for Script Editor Script.stop() crash --- interface/src/ui/ScriptEditorWidget.cpp | 17 +++++------------ interface/src/ui/ScriptEditorWidget.h | 1 - libraries/script-engine/src/ScriptEngine.cpp | 1 + 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/interface/src/ui/ScriptEditorWidget.cpp b/interface/src/ui/ScriptEditorWidget.cpp index f519a6f4fd..170ea5bab3 100644 --- a/interface/src/ui/ScriptEditorWidget.cpp +++ b/interface/src/ui/ScriptEditorWidget.cpp @@ -59,12 +59,8 @@ void ScriptEditorWidget::onScriptModified() { } } -void ScriptEditorWidget::onScriptEnding() { - // signals will automatically be disonnected when the _scriptEngine is deleted later - _scriptEngine = NULL; -} - void ScriptEditorWidget::onScriptFinished(const QString& scriptPath) { + _scriptEngine = NULL; if (_isRestarting) { _isRestarting = false; setRunning(true); @@ -84,23 +80,20 @@ bool ScriptEditorWidget::setRunning(bool run) { return false; } - // Clean-up old connections. if (_scriptEngine != NULL) { disconnect(_scriptEngine, &ScriptEngine::runningStateChanged, this, &ScriptEditorWidget::runningStateChanged); disconnect(_scriptEngine, &ScriptEngine::errorMessage, this, &ScriptEditorWidget::onScriptError); disconnect(_scriptEngine, &ScriptEngine::printedMessage, this, &ScriptEditorWidget::onScriptPrint); - disconnect(_scriptEngine, &ScriptEngine::scriptEnding, this, &ScriptEditorWidget::onScriptEnding); + disconnect(_scriptEngine, &ScriptEngine::finished, this, &ScriptEditorWidget::onScriptFinished); } if (run) { const QString& scriptURLString = QUrl(_currentScript).toString(); _scriptEngine = Application::getInstance()->loadScript(scriptURLString, true); connect(_scriptEngine, &ScriptEngine::runningStateChanged, this, &ScriptEditorWidget::runningStateChanged); - - // Make new connections. connect(_scriptEngine, &ScriptEngine::errorMessage, this, &ScriptEditorWidget::onScriptError); connect(_scriptEngine, &ScriptEngine::printedMessage, this, &ScriptEditorWidget::onScriptPrint); - connect(_scriptEngine, &ScriptEngine::scriptEnding, this, &ScriptEditorWidget::onScriptEnding); + connect(_scriptEngine, &ScriptEngine::finished, this, &ScriptEditorWidget::onScriptFinished); } else { connect(_scriptEngine, &ScriptEngine::finished, this, &ScriptEditorWidget::onScriptFinished); Application::getInstance()->stopScript(_currentScript); @@ -144,7 +137,7 @@ void ScriptEditorWidget::loadFile(const QString& scriptPath) { disconnect(_scriptEngine, &ScriptEngine::runningStateChanged, this, &ScriptEditorWidget::runningStateChanged); disconnect(_scriptEngine, &ScriptEngine::errorMessage, this, &ScriptEditorWidget::onScriptError); disconnect(_scriptEngine, &ScriptEngine::printedMessage, this, &ScriptEditorWidget::onScriptPrint); - disconnect(_scriptEngine, &ScriptEngine::scriptEnding, this, &ScriptEditorWidget::onScriptEnding); + disconnect(_scriptEngine, &ScriptEngine::finished, this, &ScriptEditorWidget::onScriptFinished); } } else { QNetworkAccessManager* networkManager = new QNetworkAccessManager(this); @@ -165,7 +158,7 @@ void ScriptEditorWidget::loadFile(const QString& scriptPath) { connect(_scriptEngine, &ScriptEngine::runningStateChanged, this, &ScriptEditorWidget::runningStateChanged); connect(_scriptEngine, &ScriptEngine::errorMessage, this, &ScriptEditorWidget::onScriptError); connect(_scriptEngine, &ScriptEngine::printedMessage, this, &ScriptEditorWidget::onScriptPrint); - connect(_scriptEngine, &ScriptEngine::scriptEnding, this, &ScriptEditorWidget::onScriptEnding); + connect(_scriptEngine, &ScriptEngine::finished, this, &ScriptEditorWidget::onScriptFinished); } } diff --git a/interface/src/ui/ScriptEditorWidget.h b/interface/src/ui/ScriptEditorWidget.h index f3e09971dc..d7fa615024 100644 --- a/interface/src/ui/ScriptEditorWidget.h +++ b/interface/src/ui/ScriptEditorWidget.h @@ -46,7 +46,6 @@ private slots: void onScriptError(const QString& message); void onScriptPrint(const QString& message); void onScriptModified(); - void onScriptEnding(); void onScriptFinished(const QString& scriptName); private: diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 350473cc87..c5fb0a263d 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -349,6 +349,7 @@ void ScriptEngine::run() { init(); } _isRunning = true; + _isFinished = false; emit runningStateChanged(); QScriptValue result = _engine.evaluate(_scriptContents); From 3df43dc6534e70e977606a202f2380bba4d6cd19 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sun, 29 Jun 2014 20:13:27 -0700 Subject: [PATCH 4/7] Catch any on-the-fly modifications made while script is restarting --- interface/src/ui/ScriptEditorWidget.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/interface/src/ui/ScriptEditorWidget.cpp b/interface/src/ui/ScriptEditorWidget.cpp index 170ea5bab3..4d73ab26bd 100644 --- a/interface/src/ui/ScriptEditorWidget.cpp +++ b/interface/src/ui/ScriptEditorWidget.cpp @@ -52,7 +52,7 @@ ScriptEditorWidget::~ScriptEditorWidget() { } void ScriptEditorWidget::onScriptModified() { - if(_scriptEditorWidgetUI->onTheFlyCheckBox->isChecked() && isRunning()) { + if(_scriptEditorWidgetUI->onTheFlyCheckBox->isChecked() && isModified() && isRunning()) { _isRestarting = true; setRunning(false); // Script is restarted once current script instance finishes. @@ -84,6 +84,7 @@ bool ScriptEditorWidget::setRunning(bool run) { disconnect(_scriptEngine, &ScriptEngine::runningStateChanged, this, &ScriptEditorWidget::runningStateChanged); disconnect(_scriptEngine, &ScriptEngine::errorMessage, this, &ScriptEditorWidget::onScriptError); disconnect(_scriptEngine, &ScriptEngine::printedMessage, this, &ScriptEditorWidget::onScriptPrint); + disconnect(_scriptEngine, &ScriptEngine::update, this, &ScriptEditorWidget::onScriptModified); disconnect(_scriptEngine, &ScriptEngine::finished, this, &ScriptEditorWidget::onScriptFinished); } @@ -93,6 +94,7 @@ bool ScriptEditorWidget::setRunning(bool run) { connect(_scriptEngine, &ScriptEngine::runningStateChanged, this, &ScriptEditorWidget::runningStateChanged); connect(_scriptEngine, &ScriptEngine::errorMessage, this, &ScriptEditorWidget::onScriptError); connect(_scriptEngine, &ScriptEngine::printedMessage, this, &ScriptEditorWidget::onScriptPrint); + connect(_scriptEngine, &ScriptEngine::update, this, &ScriptEditorWidget::onScriptModified); connect(_scriptEngine, &ScriptEngine::finished, this, &ScriptEditorWidget::onScriptFinished); } else { connect(_scriptEngine, &ScriptEngine::finished, this, &ScriptEditorWidget::onScriptFinished); @@ -137,6 +139,7 @@ void ScriptEditorWidget::loadFile(const QString& scriptPath) { disconnect(_scriptEngine, &ScriptEngine::runningStateChanged, this, &ScriptEditorWidget::runningStateChanged); disconnect(_scriptEngine, &ScriptEngine::errorMessage, this, &ScriptEditorWidget::onScriptError); disconnect(_scriptEngine, &ScriptEngine::printedMessage, this, &ScriptEditorWidget::onScriptPrint); + disconnect(_scriptEngine, &ScriptEngine::update, this, &ScriptEditorWidget::onScriptModified); disconnect(_scriptEngine, &ScriptEngine::finished, this, &ScriptEditorWidget::onScriptFinished); } } else { @@ -158,6 +161,7 @@ void ScriptEditorWidget::loadFile(const QString& scriptPath) { connect(_scriptEngine, &ScriptEngine::runningStateChanged, this, &ScriptEditorWidget::runningStateChanged); connect(_scriptEngine, &ScriptEngine::errorMessage, this, &ScriptEditorWidget::onScriptError); connect(_scriptEngine, &ScriptEngine::printedMessage, this, &ScriptEditorWidget::onScriptPrint); + connect(_scriptEngine, &ScriptEngine::update, this, &ScriptEditorWidget::onScriptModified); connect(_scriptEngine, &ScriptEngine::finished, this, &ScriptEditorWidget::onScriptFinished); } } From c454c790fa87bf86553e545b9e183f84f1e3d995 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sun, 29 Jun 2014 21:31:28 -0700 Subject: [PATCH 5/7] Check script file for external changes when editor regains focus Prompt user whether to reload. --- interface/src/ui/ScriptEditorWidget.cpp | 39 ++++++++++++++++++++++--- interface/src/ui/ScriptEditorWidget.h | 6 ++++ interface/src/ui/ScriptEditorWindow.cpp | 11 +++++++ interface/src/ui/ScriptEditorWindow.h | 4 +++ 4 files changed, 56 insertions(+), 4 deletions(-) diff --git a/interface/src/ui/ScriptEditorWidget.cpp b/interface/src/ui/ScriptEditorWidget.cpp index 4d73ab26bd..3829cb6a2e 100644 --- a/interface/src/ui/ScriptEditorWidget.cpp +++ b/interface/src/ui/ScriptEditorWidget.cpp @@ -29,8 +29,11 @@ ScriptEditorWidget::ScriptEditorWidget() : _scriptEditorWidgetUI(new Ui::ScriptEditorWidget), _scriptEngine(NULL), - _isRestarting(false) + _isRestarting(false), + _isReloading(false) { + setAttribute(Qt::WA_DeleteOnClose); + _scriptEditorWidgetUI->setupUi(this); connect(_scriptEditorWidgetUI->scriptEdit->document(), &QTextDocument::modificationChanged, this, @@ -52,7 +55,7 @@ ScriptEditorWidget::~ScriptEditorWidget() { } void ScriptEditorWidget::onScriptModified() { - if(_scriptEditorWidgetUI->onTheFlyCheckBox->isChecked() && isModified() && isRunning()) { + if(_scriptEditorWidgetUI->onTheFlyCheckBox->isChecked() && isModified() && isRunning() && !_isReloading) { _isRestarting = true; setRunning(false); // Script is restarted once current script instance finishes. @@ -76,7 +79,7 @@ bool ScriptEditorWidget::isRunning() { } bool ScriptEditorWidget::setRunning(bool run) { - if (run && !save()) { + if (run && isModified() && !save()) { return false; } @@ -114,13 +117,14 @@ bool ScriptEditorWidget::saveFile(const QString &scriptPath) { QTextStream out(&file); out << _scriptEditorWidgetUI->scriptEdit->toPlainText(); + file.close(); setScriptFile(scriptPath); return true; } void ScriptEditorWidget::loadFile(const QString& scriptPath) { - QUrl url(scriptPath); + QUrl url(scriptPath); // if the scheme length is one or lower, maybe they typed in a file, let's try const int WINDOWS_DRIVE_LETTER_SIZE = 1; @@ -133,6 +137,7 @@ void ScriptEditorWidget::loadFile(const QString& scriptPath) { } QTextStream in(&file); _scriptEditorWidgetUI->scriptEdit->setPlainText(in.readAll()); + file.close(); setScriptFile(scriptPath); if (_scriptEngine != NULL) { @@ -184,6 +189,7 @@ bool ScriptEditorWidget::saveAs() { void ScriptEditorWidget::setScriptFile(const QString& scriptPath) { _currentScript = scriptPath; + _currentScriptModified = QFileInfo(_currentScript).lastModified(); _scriptEditorWidgetUI->scriptEdit->document()->setModified(false); setWindowModified(false); @@ -207,3 +213,28 @@ void ScriptEditorWidget::onScriptError(const QString& message) { void ScriptEditorWidget::onScriptPrint(const QString& message) { _scriptEditorWidgetUI->debugText->appendPlainText("> " + message); } + +void ScriptEditorWidget::onWindowActivated() { + if (!_isReloading) { + _isReloading = true; + + if (QFileInfo(_currentScript).lastModified() > _currentScriptModified) { + if (QMessageBox::warning(this, _currentScript, + tr("This file has been modified outside of the Interface editor.") + "\n\n" + +(isModified() + ? tr("Do you want to reload it and lose the changes you've made in the Interface editor?") + : tr("Do you want to reload it?")), + QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { + loadFile(_currentScript); + if (_scriptEditorWidgetUI->onTheFlyCheckBox->isChecked() && isRunning()) { + _isRestarting = true; + setRunning(false); + // Script is restarted once current script instance finishes. + } + + } + } + + _isReloading = false; + } +} diff --git a/interface/src/ui/ScriptEditorWidget.h b/interface/src/ui/ScriptEditorWidget.h index d7fa615024..8dd847ee6d 100644 --- a/interface/src/ui/ScriptEditorWidget.h +++ b/interface/src/ui/ScriptEditorWidget.h @@ -13,6 +13,7 @@ #define hifi_ScriptEditorWidget_h #include + #include "ScriptEngine.h" namespace Ui { @@ -42,6 +43,9 @@ signals: void scriptnameChanged(); void scriptModified(); +public slots: + void onWindowActivated(); + private slots: void onScriptError(const QString& message); void onScriptPrint(const QString& message); @@ -52,7 +56,9 @@ private: Ui::ScriptEditorWidget* _scriptEditorWidgetUI; ScriptEngine* _scriptEngine; QString _currentScript; + QDateTime _currentScriptModified; bool _isRestarting; + bool _isReloading; }; #endif // hifi_ScriptEditorWidget_h diff --git a/interface/src/ui/ScriptEditorWindow.cpp b/interface/src/ui/ScriptEditorWindow.cpp index 3f63f0741b..7c8f5c79cb 100644 --- a/interface/src/ui/ScriptEditorWindow.cpp +++ b/interface/src/ui/ScriptEditorWindow.cpp @@ -36,6 +36,8 @@ ScriptEditorWindow::ScriptEditorWindow() : _loadMenu(new QMenu), _saveMenu(new QMenu) { + setAttribute(Qt::WA_DeleteOnClose); + _ScriptEditorWindowUI->setupUi(this); this->setWindowFlags(Qt::Tool); show(); @@ -140,6 +142,7 @@ ScriptEditorWidget* ScriptEditorWindow::addScriptEditorWidget(QString title) { connect(newScriptEditorWidget, &ScriptEditorWidget::scriptnameChanged, this, &ScriptEditorWindow::updateScriptNameOrStatus); connect(newScriptEditorWidget, &ScriptEditorWidget::scriptModified, this, &ScriptEditorWindow::updateScriptNameOrStatus); connect(newScriptEditorWidget, &ScriptEditorWidget::runningStateChanged, this, &ScriptEditorWindow::updateButtons); + connect(this, &ScriptEditorWindow::windowActivated, newScriptEditorWidget, &ScriptEditorWidget::onWindowActivated); _ScriptEditorWindowUI->tabWidget->addTab(newScriptEditorWidget, title); _ScriptEditorWindowUI->tabWidget->setCurrentWidget(newScriptEditorWidget); newScriptEditorWidget->setUpdatesEnabled(true); @@ -216,3 +219,11 @@ void ScriptEditorWindow::terminateCurrentTab() { this->raise(); } } + +bool ScriptEditorWindow::event(QEvent* event) { + if (event->type() == QEvent::WindowActivate) { + emit windowActivated(); + } + return QWidget::event(event); +} + diff --git a/interface/src/ui/ScriptEditorWindow.h b/interface/src/ui/ScriptEditorWindow.h index 360e902cc2..271a3d685b 100644 --- a/interface/src/ui/ScriptEditorWindow.h +++ b/interface/src/ui/ScriptEditorWindow.h @@ -27,8 +27,12 @@ public: void terminateCurrentTab(); +signals: + void windowActivated(); + protected: void closeEvent(QCloseEvent* event); + virtual bool event(QEvent* event); private: Ui::ScriptEditorWindow* _ScriptEditorWindowUI; From ce874305be23f120852a5fdd0a49c5872d3bc419 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sun, 29 Jun 2014 21:50:16 -0700 Subject: [PATCH 6/7] Add checkbox that automatically reloads externally changed files --- interface/src/ui/ScriptEditorWidget.cpp | 13 +++++++------ interface/src/ui/ScriptEditorWindow.cpp | 4 ++++ interface/src/ui/ScriptEditorWindow.h | 1 + interface/ui/scriptEditorWindow.ui | 12 +++++++++++- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/interface/src/ui/ScriptEditorWidget.cpp b/interface/src/ui/ScriptEditorWidget.cpp index 3829cb6a2e..513bbd899a 100644 --- a/interface/src/ui/ScriptEditorWidget.cpp +++ b/interface/src/ui/ScriptEditorWidget.cpp @@ -219,12 +219,13 @@ void ScriptEditorWidget::onWindowActivated() { _isReloading = true; if (QFileInfo(_currentScript).lastModified() > _currentScriptModified) { - if (QMessageBox::warning(this, _currentScript, - tr("This file has been modified outside of the Interface editor.") + "\n\n" - +(isModified() - ? tr("Do you want to reload it and lose the changes you've made in the Interface editor?") - : tr("Do you want to reload it?")), - QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { + if (static_cast(this->parent()->parent()->parent())->autoReloadScripts() + || QMessageBox::warning(this, _currentScript, + tr("This file has been modified outside of the Interface editor.") + "\n\n" + + (isModified() + ? tr("Do you want to reload it and lose the changes you've made in the Interface editor?") + : tr("Do you want to reload it?")), + QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { loadFile(_currentScript); if (_scriptEditorWidgetUI->onTheFlyCheckBox->isChecked() && isRunning()) { _isRestarting = true; diff --git a/interface/src/ui/ScriptEditorWindow.cpp b/interface/src/ui/ScriptEditorWindow.cpp index 7c8f5c79cb..895d725699 100644 --- a/interface/src/ui/ScriptEditorWindow.cpp +++ b/interface/src/ui/ScriptEditorWindow.cpp @@ -220,6 +220,10 @@ void ScriptEditorWindow::terminateCurrentTab() { } } +bool ScriptEditorWindow::autoReloadScripts() { + return _ScriptEditorWindowUI->autoReloadCheckBox->isChecked(); +} + bool ScriptEditorWindow::event(QEvent* event) { if (event->type() == QEvent::WindowActivate) { emit windowActivated(); diff --git a/interface/src/ui/ScriptEditorWindow.h b/interface/src/ui/ScriptEditorWindow.h index 271a3d685b..1915014b69 100644 --- a/interface/src/ui/ScriptEditorWindow.h +++ b/interface/src/ui/ScriptEditorWindow.h @@ -26,6 +26,7 @@ public: ~ScriptEditorWindow(); void terminateCurrentTab(); + bool autoReloadScripts(); signals: void windowActivated(); diff --git a/interface/ui/scriptEditorWindow.ui b/interface/ui/scriptEditorWindow.ui index 9103fc1f57..0379f51e97 100644 --- a/interface/ui/scriptEditorWindow.ui +++ b/interface/ui/scriptEditorWindow.ui @@ -33,7 +33,7 @@ 0 - + 3 @@ -185,6 +185,16 @@ + + + + font: 13px "Helvetica","Arial","sans-serif"; + + + Automatically reload externally changed files + + + From 687a81a223c9e76b17bce9967ca8edb111f08ce9 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 30 Jun 2014 13:18:58 -0700 Subject: [PATCH 7/7] fix crash in SendNack on server shutdown --- .../src/octree/OctreeInboundPacketProcessor.cpp | 16 ++++++++++++++-- .../src/octree/OctreeInboundPacketProcessor.h | 3 +++ assignment-client/src/octree/OctreeServer.cpp | 2 ++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index 76a6845342..a228b87491 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -28,7 +28,8 @@ OctreeInboundPacketProcessor::OctreeInboundPacketProcessor(OctreeServer* myServe _totalLockWaitTime(0), _totalElementsInPacket(0), _totalPackets(0), - _lastNackTime(usecTimestampNow()) + _lastNackTime(usecTimestampNow()), + _shuttingDown(false) { } @@ -72,6 +73,10 @@ void OctreeInboundPacketProcessor::midProcess() { } void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet) { + if (_shuttingDown) { + qDebug() << "OctreeInboundPacketProcessor::processPacket() while shutting down... ignoring incoming packet"; + return; + } bool debugProcessPacket = _myServer->wantsVerboseDebug(); @@ -182,8 +187,13 @@ void OctreeInboundPacketProcessor::trackInboundPacket(const QUuid& nodeUUID, uns } int OctreeInboundPacketProcessor::sendNackPackets() { - int packetsSent = 0; + + if (_shuttingDown) { + qDebug() << "OctreeInboundPacketProcessor::sendNackPackets() while shutting down... ignore"; + return packetsSent; + } + char packet[MAX_PACKET_SIZE]; NodeToSenderStatsMapIterator i = _singleSenderStats.begin(); @@ -241,6 +251,8 @@ int OctreeInboundPacketProcessor::sendNackPackets() { // send it NodeList::getInstance()->writeUnverifiedDatagram(packet, dataAt - packet, destinationNode); packetsSent++; + + qDebug() << "NACK Sent back to editor/client... destinationNode=" << nodeUUID; } i++; } diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.h b/assignment-client/src/octree/OctreeInboundPacketProcessor.h index 46a57205cb..e09696a5fd 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.h +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.h @@ -73,6 +73,8 @@ public: NodeToSenderStatsMap& getSingleSenderStats() { return _singleSenderStats; } + void shuttingDown() { _shuttingDown = true;} + protected: virtual void processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet); @@ -100,5 +102,6 @@ private: NodeToSenderStatsMap _singleSenderStats; quint64 _lastNackTime; + bool _shuttingDown; }; #endif // hifi_OctreeInboundPacketProcessor_h diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 48c8674c03..23719b86cf 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -1097,6 +1097,8 @@ void OctreeServer::forceNodeShutdown(SharedNodePointer node) { void OctreeServer::aboutToFinish() { qDebug() << qPrintable(_safeServerName) << "server STARTING about to finish..."; + qDebug() << qPrintable(_safeServerName) << "inform Octree Inbound Packet Processor that we are shutting down..."; + _octreeInboundPacketProcessor->shuttingDown(); foreach (const SharedNodePointer& node, NodeList::getInstance()->getNodeHash()) { qDebug() << qPrintable(_safeServerName) << "server about to finish while node still connected node:" << *node; forceNodeShutdown(node);