From 4b61ea2c0062b3635ab3b794fec784bee1b13962 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Thu, 31 Aug 2017 20:33:27 -0400 Subject: [PATCH] Various changes to support use and loading of multiple scripts in the scripting system. --- scriptcontainer.cpp | 35 +++++++++++------------ scriptcontainer.h | 10 +++++-- scriptingwindow.cpp | 40 ++++++++++++++++++++++---- scriptingwindow.h | 5 ++++ ui/scriptingwindow.ui | 66 +++++++++++++++++++++++++++++-------------- 5 files changed, 108 insertions(+), 48 deletions(-) diff --git a/scriptcontainer.cpp b/scriptcontainer.cpp index 4867497..eb81b48 100644 --- a/scriptcontainer.cpp +++ b/scriptcontainer.cpp @@ -9,7 +9,6 @@ ScriptContainer::ScriptContainer() canHelper = new CANScriptHelper(&scriptEngine); isoHelper = new ISOTPScriptHelper(&scriptEngine); udsHelper = new UDSScriptHelper(&scriptEngine); - elapsedTime.start(); connect(&timer, SIGNAL(timeout()), this, SLOT(tick())); } @@ -17,19 +16,16 @@ void ScriptContainer::compileScript() { QJSValue result = scriptEngine.evaluate(scriptText, fileName); - if (logWidget) - { - logWidget->addItem(""); - logWidget->addItem("Compiling script " + fileName); - } + emit sendLog("Compiling script..."); - if (result.isError() && logWidget) + if (result.isError()) { - logWidget->addItem("SCRIPT EXCEPTION!"); - logWidget->addItem("Line: " + result.property("lineNumber").toString()); - logWidget->addItem(result.property("message").toString()); - logWidget->addItem("Stack:"); - logWidget->addItem(result.property("stack").toString()); + + emit sendLog("SCRIPT EXCEPTION!"); + emit sendLog("Line: " + result.property("lineNumber").toString()); + emit sendLog(result.property("message").toString()); + emit sendLog("Stack:"); + emit sendLog(result.property("stack").toString()); } else { @@ -60,23 +56,24 @@ void ScriptContainer::compileScript() QJSValue res = setupFunction.call(); if (res.isError()) { - logWidget->addItem("Error in setup function on line " + res.property("lineNumber").toString()); - logWidget->addItem(res.property("message").toString()); + emit sendLog("Error in setup function on line " + res.property("lineNumber").toString()); + emit sendLog(res.property("message").toString()); } } if (tickFunction.isCallable()) qDebug() << "tick exists"; } } -void ScriptContainer::setLogWidget(QListWidget *list) +void ScriptContainer::setScriptWindow(ScriptingWindow *win) { - logWidget = list; + window = win; + connect(this, &ScriptContainer::sendLog, window, &ScriptingWindow::log); } void ScriptContainer::log(QJSValue logString) { QString val = logString.toString(); - logWidget->addItem(QString::number(elapsedTime.elapsed()) + ": " + val); + emit sendLog(val); } void ScriptContainer::setTickInterval(QJSValue interval) @@ -99,8 +96,8 @@ void ScriptContainer::tick() QJSValue res = tickFunction.call(); if (res.isError()) { - logWidget->addItem("Error in tick function on line " + res.property("lineNumber").toString()); - logWidget->addItem(res.property("message").toString()); + emit sendLog("Error in tick function on line " + res.property("lineNumber").toString()); + emit sendLog(res.property("message").toString()); } } } diff --git a/scriptcontainer.h b/scriptcontainer.h index 10e1c40..5512068 100644 --- a/scriptcontainer.h +++ b/scriptcontainer.h @@ -12,6 +12,8 @@ #include #include +class ScriptingWindow; + class CANScriptHelper: public QObject { Q_OBJECT @@ -75,7 +77,7 @@ class ScriptContainer : public QObject public: ScriptContainer(); - void setLogWidget(QListWidget *list); + void setScriptWindow(ScriptingWindow *win); QString fileName; QString filePath; @@ -86,6 +88,9 @@ public slots: void setTickInterval(QJSValue interval); void log(QJSValue logString); +signals: + void sendLog(QString text); + private slots: void tick(); @@ -95,11 +100,10 @@ private: QJSValue setupFunction; QJSValue tickFunction; QTimer timer; - QListWidget *logWidget; + ScriptingWindow *window; CANScriptHelper *canHelper; ISOTPScriptHelper *isoHelper; UDSScriptHelper *udsHelper; - QElapsedTimer elapsedTime; }; #endif // SCRIPTCONTAINER_H diff --git a/scriptingwindow.cpp b/scriptingwindow.cpp index 6b88f56..b87a016 100644 --- a/scriptingwindow.cpp +++ b/scriptingwindow.cpp @@ -32,9 +32,11 @@ ScriptingWindow::ScriptingWindow(const QVector *frames, QWidget *paren connect(ui->btnRevertScript, &QAbstractButton::pressed, this, &ScriptingWindow::revertScript); connect(ui->btnSaveScript, &QAbstractButton::pressed, this, &ScriptingWindow::saveScript); connect(ui->btnClearLog, &QAbstractButton::pressed, this, &ScriptingWindow::clickedLogClear); + connect(ui->listLoadedScripts, &QListWidget::currentRowChanged, this, &ScriptingWindow::changeCurrentScript); connect(CANConManager::getInstance(), &CANConManager::framesReceived, this, &ScriptingWindow::newFrames); + elapsedTime.start(); } ScriptingWindow::~ScriptingWindow() @@ -91,6 +93,19 @@ void ScriptingWindow::showEvent(QShowEvent* event) QDialog::showEvent(event); } +void ScriptingWindow::changeCurrentScript() +{ + int sel = ui->listLoadedScripts->currentRow(); + if (sel < 0) return; + + if (currentScript) currentScript->scriptText = editor->toPlainText(); + + ScriptContainer *container = scripts.at(sel); + currentScript = container; + editor->setPlainText(container->scriptText); + editor->setEnabled(true); +} + void ScriptingWindow::loadNewScript() { QString filename; @@ -124,12 +139,12 @@ void ScriptingWindow::loadNewScript() container->fileName = justFileName; container->filePath = filename; container->scriptText = contents; - container->setLogWidget(ui->listLog); + container->setScriptWindow(this); container->compileScript(); scripts.append(container); - currentScript = container; - editor->setPlainText(container->scriptText); - editor->setEnabled(true); + + ui->listLoadedScripts->setCurrentRow(ui->listLoadedScripts->count() - 1); + changeCurrentScript(); } } } @@ -144,7 +159,7 @@ void ScriptingWindow::createNewScript() container->fileName = "UNNAMED_" + QString::number((qrand() % 10000)) + ".js"; container->filePath = QString(); container->scriptText = QString(); - container->setLogWidget(ui->listLog); + container->setScriptWindow(this); scripts.append(container); ui->listLoadedScripts->addItem(container->fileName); currentScript = container; @@ -209,4 +224,19 @@ void ScriptingWindow::recompileScript() void ScriptingWindow::clickedLogClear() { ui->listLog->clear(); + elapsedTime.start(); +} + +void ScriptingWindow::log(QString text) +{ + ScriptContainer *cont = qobject_cast(sender()); + if (cont != NULL) + ui->listLog->addItem(QString::number(elapsedTime.elapsed()) + "(" + cont->fileName + "): " + text); + else + ui->listLog->addItem(QString::number(elapsedTime.elapsed()) + ": " + text); + + if (ui->cbAutoScroll->isChecked()) + { + ui->listLog->scrollToBottom(); + } } diff --git a/scriptingwindow.h b/scriptingwindow.h index 1f77cbf..66589c5 100644 --- a/scriptingwindow.h +++ b/scriptingwindow.h @@ -24,6 +24,9 @@ public: void showEvent(QShowEvent*); ~ScriptingWindow(); +public slots: + void log(QString text); + private slots: void loadNewScript(); void createNewScript(); @@ -32,6 +35,7 @@ private slots: void saveScript(); void revertScript(); void recompileScript(); + void changeCurrentScript(); void newFrames(const CANConnection*, const QVector&); void clickedLogClear(); @@ -45,6 +49,7 @@ private: QList scripts; ScriptContainer *currentScript; const QVector *modelFrames; + QElapsedTimer elapsedTime; }; #endif // SCRIPTINGWINDOW_H diff --git a/ui/scriptingwindow.ui b/ui/scriptingwindow.ui index 4b83343..8bee7d7 100644 --- a/ui/scriptingwindow.ui +++ b/ui/scriptingwindow.ui @@ -13,9 +13,22 @@ Scripting Interface - + + + + + Public Variables: + + + Qt::AlignCenter + + + + + + @@ -30,30 +43,34 @@ - - - Load New Script - - - - - - - Create New Script - - - - - - - Remove Current Script - - + + + + + New + + + + + + + Del + + + + + + + Load + + + + - + @@ -102,6 +119,13 @@ + + + + Auto Scroll Log Window + + +