diff --git a/interface/src/ui/JSConsole.cpp b/interface/src/ui/JSConsole.cpp
index 6e5b22399d..6a8b1116a7 100644
--- a/interface/src/ui/JSConsole.cpp
+++ b/interface/src/ui/JSConsole.cpp
@@ -35,7 +35,8 @@ JSConsole::JSConsole(QWidget* parent, ScriptEngine* scriptEngine) :
_ui(new Ui::Console),
_currentCommandInHistory(NO_CURRENT_HISTORY_COMMAND),
_commandHistory(),
- _scriptEngine(scriptEngine) {
+ _ownScriptEngine(scriptEngine == NULL),
+ _scriptEngine(NULL) {
_ui->setupUi(this);
_ui->promptTextEdit->setLineWrapMode(QTextEdit::NoWrap);
@@ -51,23 +52,40 @@ JSConsole::JSConsole(QWidget* parent, ScriptEngine* scriptEngine) :
connect(_ui->scrollArea->verticalScrollBar(), SIGNAL(rangeChanged(int, int)), this, SLOT(scrollToBottom()));
connect(_ui->promptTextEdit, SIGNAL(textChanged()), this, SLOT(resizeTextInput()));
-
- if (_scriptEngine == NULL) {
- _scriptEngine = qApp->loadScript(QString(), false);
- }
-
- connect(_scriptEngine, SIGNAL(evaluationFinished(QScriptValue, bool)),
- this, SLOT(handleEvalutationFinished(QScriptValue, bool)));
- connect(_scriptEngine, SIGNAL(printedMessage(const QString&)), this, SLOT(handlePrint(const QString&)));
- connect(_scriptEngine, SIGNAL(errorMessage(const QString&)), this, SLOT(handleError(const QString&)));
+ setScriptEngine(scriptEngine);
resizeTextInput();
}
JSConsole::~JSConsole() {
+ disconnect(_scriptEngine, SIGNAL(printedMessage(const QString&)), this, SLOT(handlePrint(const QString&)));
+ disconnect(_scriptEngine, SIGNAL(errorMessage(const QString&)), this, SLOT(handleError(const QString&)));
+ if (_ownScriptEngine) {
+ _scriptEngine->deleteLater();
+ }
delete _ui;
}
+void JSConsole::setScriptEngine(ScriptEngine* scriptEngine) {
+ if (_scriptEngine == scriptEngine && scriptEngine != NULL) {
+ return;
+ }
+ if (_scriptEngine != NULL) {
+ disconnect(_scriptEngine, SIGNAL(printedMessage(const QString&)), this, SLOT(handlePrint(const QString&)));
+ disconnect(_scriptEngine, SIGNAL(errorMessage(const QString&)), this, SLOT(handleError(const QString&)));
+ if (_ownScriptEngine) {
+ _scriptEngine->deleteLater();
+ }
+ }
+
+ // if scriptEngine is NULL then create one and keep track of it using _ownScriptEngine
+ _ownScriptEngine = scriptEngine == NULL;
+ _scriptEngine = _ownScriptEngine ? qApp->loadScript(QString(), false) : scriptEngine;
+
+ connect(_scriptEngine, SIGNAL(printedMessage(const QString&)), this, SLOT(handlePrint(const QString&)));
+ connect(_scriptEngine, SIGNAL(errorMessage(const QString&)), this, SLOT(handleError(const QString&)));
+}
+
void JSConsole::executeCommand(const QString& command) {
_commandHistory.prepend(command);
if (_commandHistory.length() > MAX_HISTORY_SIZE) {
@@ -78,12 +96,10 @@ void JSConsole::executeCommand(const QString& command) {
appendMessage(">", "" + command.toHtmlEscaped() + "");
- QMetaObject::invokeMethod(_scriptEngine, "evaluate", Q_ARG(const QString&, command));
+ QScriptValue result;
+ QMetaObject::invokeMethod(_scriptEngine, "evaluate", Qt::ConnectionType::BlockingQueuedConnection,
+ Q_RETURN_ARG(QScriptValue, result), Q_ARG(const QString&, command));
- resetCurrentCommandHistory();
-}
-
-void JSConsole::handleEvalutationFinished(QScriptValue result, bool isException) {
_ui->promptTextEdit->setDisabled(false);
// Make sure focus is still on this window - some commands are blocking and can take awhile to execute.
@@ -91,10 +107,13 @@ void JSConsole::handleEvalutationFinished(QScriptValue result, bool isException)
_ui->promptTextEdit->setFocus();
}
- QString gutter = (isException || result.isError()) ? GUTTER_ERROR : GUTTER_PREVIOUS_COMMAND;
- QString resultColor = (isException || result.isError()) ? RESULT_ERROR_STYLE : RESULT_SUCCESS_STYLE;
+ bool error = (_scriptEngine->hasUncaughtException() || result.isError());
+ QString gutter = error ? GUTTER_ERROR : GUTTER_PREVIOUS_COMMAND;
+ QString resultColor = error ? RESULT_ERROR_STYLE : RESULT_SUCCESS_STYLE;
QString resultStr = "" + result.toString().toHtmlEscaped() + "";
appendMessage(gutter, resultStr);
+
+ resetCurrentCommandHistory();
}
void JSConsole::handleError(const QString& message) {
@@ -233,3 +252,13 @@ void JSConsole::appendMessage(const QString& gutter, const QString& message) {
_ui->logArea->updateGeometry();
scrollToBottom();
}
+
+void JSConsole::clear() {
+ QLayoutItem* item;
+ while ((item = _ui->logArea->layout()->takeAt(0)) != NULL) {
+ delete item->widget();
+ delete item;
+ }
+ _ui->logArea->updateGeometry();
+ scrollToBottom();
+}
diff --git a/interface/src/ui/JSConsole.h b/interface/src/ui/JSConsole.h
index 98afdf7bf8..dd104723d0 100644
--- a/interface/src/ui/JSConsole.h
+++ b/interface/src/ui/JSConsole.h
@@ -31,6 +31,9 @@ public:
JSConsole(QWidget* parent, ScriptEngine* scriptEngine = NULL);
~JSConsole();
+ void setScriptEngine(ScriptEngine* scriptEngine = NULL);
+ void clear();
+
public slots:
void executeCommand(const QString& command);
@@ -47,7 +50,6 @@ protected:
protected slots:
void scrollToBottom();
void resizeTextInput();
- void handleEvalutationFinished(QScriptValue result, bool isException);
void handlePrint(const QString& message);
void handleError(const QString& message);
@@ -60,6 +62,8 @@ private:
Ui::Console* _ui;
int _currentCommandInHistory;
QList _commandHistory;
+ // Keeps track if the script engine is created inside the JSConsole
+ bool _ownScriptEngine;
QString _rootCommand;
ScriptEngine* _scriptEngine;
};