diff --git a/interface/resources/images/reload-script.svg b/interface/resources/images/reload-script.svg
new file mode 100644
index 0000000000..a33de448dc
--- /dev/null
+++ b/interface/resources/images/reload-script.svg
@@ -0,0 +1,50 @@
+
+
\ No newline at end of file
diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp
index 882997d38a..0bf245368c 100644
--- a/interface/src/Application.cpp
+++ b/interface/src/Application.cpp
@@ -4317,6 +4317,19 @@ ScriptEngine* Application::loadScript(const QString& scriptFilename, bool isUser
return scriptEngine;
}
+void Application::reloadScript(const QString& scriptFilename) {
+ DependencyManager::get()->deleteScript(scriptFilename);
+
+ ScriptEngine* scriptEngine = _scriptEnginesHash.value(scriptFilename);
+ connect(scriptEngine, SIGNAL(finished(const QString&)), SLOT(loadScript(const QString&)));
+ scriptEngine->stop();
+
+ // HACK: ATM scripts cannot set/get their animation priorities, so we clear priorities
+ // whenever a script stops in case it happened to have been setting joint rotations.
+ // TODO: expose animation priorities and provide a layered animation control system.
+ _myAvatar->clearScriptableSettings();
+}
+
void Application::handleScriptEngineLoaded(const QString& scriptFilename) {
ScriptEngine* scriptEngine = qobject_cast(sender());
diff --git a/interface/src/Application.h b/interface/src/Application.h
index c9e5bea76e..39b71cc6a1 100644
--- a/interface/src/Application.h
+++ b/interface/src/Application.h
@@ -400,6 +400,7 @@ public slots:
bool askToLoadScript(const QString& scriptFilenameOrURL);
ScriptEngine* loadScript(const QString& scriptFilename = QString(), bool isUserLoaded = true,
bool loadScriptFromEditor = false, bool activateMainWindow = false);
+ void reloadScript(const QString& scriptFilename);
void scriptFinished(const QString& scriptName);
void stopAllScripts(bool restart = false);
void stopScript(const QString& scriptName);
diff --git a/interface/src/ui/RunningScriptsWidget.cpp b/interface/src/ui/RunningScriptsWidget.cpp
index 31c9271c22..9afed34886 100644
--- a/interface/src/ui/RunningScriptsWidget.cpp
+++ b/interface/src/ui/RunningScriptsWidget.cpp
@@ -32,7 +32,8 @@ RunningScriptsWidget::RunningScriptsWidget(QWidget* parent) :
QWidget(parent, Qt::Window | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint |
Qt::WindowCloseButtonHint),
ui(new Ui::RunningScriptsWidget),
- _signalMapper(this),
+ _reloadSignalMapper(this),
+ _stopSignalMapper(this),
_scriptsModelFilter(this),
_scriptsModel(this) {
ui->setupUi(this);
@@ -64,7 +65,8 @@ RunningScriptsWidget::RunningScriptsWidget(QWidget* parent) :
Application::getInstance(), &Application::loadDialog);
connect(ui->loadScriptFromURLButton, &QPushButton::clicked,
Application::getInstance(), &Application::loadScriptURLDialog);
- connect(&_signalMapper, SIGNAL(mapped(QString)), Application::getInstance(), SLOT(stopScript(const QString&)));
+ connect(&_reloadSignalMapper, SIGNAL(mapped(QString)), Application::getInstance(), SLOT(reloadScript(const QString&)));
+ connect(&_stopSignalMapper, SIGNAL(mapped(QString)), Application::getInstance(), SLOT(stopScript(const QString&)));
UIUtil::scaleWidgetFontSizes(this);
}
@@ -115,6 +117,17 @@ void RunningScriptsWidget::setRunningScripts(const QStringList& list) {
name->setText(name->text() + "(" + QString::number(hash.find(list.at(i)).value()) + ")");
}
++hash[list.at(i)];
+
+ QPushButton* reloadButton = new QPushButton(row);
+ reloadButton->setFlat(true);
+ reloadButton->setIcon(
+ QIcon(QPixmap(PathUtils::resourcesPath() + "images/reload-script.svg").scaledToHeight(CLOSE_ICON_HEIGHT)));
+ reloadButton->setSizePolicy(QSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred));
+ reloadButton->setStyleSheet("border: 0;");
+ reloadButton->setCursor(Qt::PointingHandCursor);
+ connect(reloadButton, SIGNAL(clicked()), &_reloadSignalMapper, SLOT(map()));
+ _reloadSignalMapper.setMapping(reloadButton, url.toString());
+
QPushButton* closeButton = new QPushButton(row);
closeButton->setFlat(true);
closeButton->setIcon(
@@ -122,9 +135,8 @@ void RunningScriptsWidget::setRunningScripts(const QStringList& list) {
closeButton->setSizePolicy(QSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred));
closeButton->setStyleSheet("border: 0;");
closeButton->setCursor(Qt::PointingHandCursor);
-
- connect(closeButton, SIGNAL(clicked()), &_signalMapper, SLOT(map()));
- _signalMapper.setMapping(closeButton, url.toString());
+ connect(closeButton, SIGNAL(clicked()), &_stopSignalMapper, SLOT(map()));
+ _stopSignalMapper.setMapping(closeButton, url.toString());
row->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
@@ -132,6 +144,7 @@ void RunningScriptsWidget::setRunningScripts(const QStringList& list) {
row->layout()->setSpacing(0);
row->layout()->addWidget(name);
+ row->layout()->addWidget(reloadButton);
row->layout()->addWidget(closeButton);
row->setToolTip(url.toString());
diff --git a/interface/src/ui/RunningScriptsWidget.h b/interface/src/ui/RunningScriptsWidget.h
index 5d3f6843af..1686d24a03 100644
--- a/interface/src/ui/RunningScriptsWidget.h
+++ b/interface/src/ui/RunningScriptsWidget.h
@@ -59,7 +59,8 @@ private slots:
private:
Ui::RunningScriptsWidget* ui;
- QSignalMapper _signalMapper;
+ QSignalMapper _reloadSignalMapper;
+ QSignalMapper _stopSignalMapper;
ScriptsModelFilter _scriptsModelFilter;
ScriptsModel _scriptsModel;
ScriptsTableWidget* _recentlyLoadedScriptsTable;