From 7df5ba01e6b4548f7ad146a83e8d9b262eeac4fe Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 14 Oct 2015 22:21:51 +0200 Subject: [PATCH] JSConsole: executeCommand works async now --- interface/src/ui/JSConsole.cpp | 18 ++++++++++++++++-- interface/src/ui/JSConsole.h | 8 ++++---- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/interface/src/ui/JSConsole.cpp b/interface/src/ui/JSConsole.cpp index 6a8b1116a7..b50f84d538 100644 --- a/interface/src/ui/JSConsole.cpp +++ b/interface/src/ui/JSConsole.cpp @@ -9,9 +9,11 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include #include #include #include +#include #include @@ -55,6 +57,8 @@ JSConsole::JSConsole(QWidget* parent, ScriptEngine* scriptEngine) : setScriptEngine(scriptEngine); resizeTextInput(); + + connect(&_executeWatcher, SIGNAL(finished()), this, SLOT(commandFinished())); } JSConsole::~JSConsole() { @@ -96,9 +100,19 @@ void JSConsole::executeCommand(const QString& command) { appendMessage(">", "" + command.toHtmlEscaped() + ""); + QFuture future = QtConcurrent::run(this, &JSConsole::executeCommandInWatcher, command); + _executeWatcher.setFuture(future); +} + +QScriptValue JSConsole::executeCommandInWatcher(const QString& command) { QScriptValue result; QMetaObject::invokeMethod(_scriptEngine, "evaluate", Qt::ConnectionType::BlockingQueuedConnection, Q_RETURN_ARG(QScriptValue, result), Q_ARG(const QString&, command)); + return result; +} + +void JSConsole::commandFinished() { + QScriptValue result = _executeWatcher.result(); _ui->promptTextEdit->setDisabled(false); @@ -106,11 +120,11 @@ void JSConsole::executeCommand(const QString& command) { if (window()->isActiveWindow()) { _ui->promptTextEdit->setFocus(); } - + 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() + ""; + QString resultStr = "" + result.toString().toHtmlEscaped() + ""; appendMessage(gutter, resultStr); resetCurrentCommandHistory(); diff --git a/interface/src/ui/JSConsole.h b/interface/src/ui/JSConsole.h index dd104723d0..cb58beab35 100644 --- a/interface/src/ui/JSConsole.h +++ b/interface/src/ui/JSConsole.h @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -37,10 +38,6 @@ public: public slots: void executeCommand(const QString& command); -signals: - void commandExecuting(const QString& command); - void commandFinished(const QString& result); - protected: void setAndSelectCommand(const QString& command); virtual bool eventFilter(QObject* sender, QEvent* event); @@ -52,13 +49,16 @@ protected slots: void resizeTextInput(); void handlePrint(const QString& message); void handleError(const QString& message); + void commandFinished(); private: void appendMessage(const QString& gutter, const QString& message); void setToNextCommandInHistory(); void setToPreviousCommandInHistory(); void resetCurrentCommandHistory(); + QScriptValue executeCommandInWatcher(const QString& command); + QFutureWatcher _executeWatcher; Ui::Console* _ui; int _currentCommandInHistory; QList _commandHistory;