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 @@ + +image/svg+xml \ 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;