From 9a52f0dd19a1d3314b435fade0a5338609e838a1 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Fri, 26 Feb 2010 13:57:50 +0100 Subject: Add scripting support. --- library/components/scriptui.cpp | 153 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 library/components/scriptui.cpp (limited to 'library/components/scriptui.cpp') diff --git a/library/components/scriptui.cpp b/library/components/scriptui.cpp new file mode 100644 index 0000000..43ed447 --- /dev/null +++ b/library/components/scriptui.cpp @@ -0,0 +1,153 @@ +#include "scriptui.h" + +#include "scriptadapter.h" +#include "optionsitem.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +ScriptUi::ScriptUi(ScriptAdapter *adapter, QWidget *parent) + : ToolBoxPage(parent) + , mAdapter(adapter) +{ + QStringList tags; + QList options; + tags << tr("scripting"); + + QGridLayout *scriptingLayout = new QGridLayout(); + { + mScriptList = new QTableWidget(0, 2); + mScriptList->verticalHeader()->setHidden(true); + QStringList headerLabels; + headerLabels << tr("Active scripts") << tr("Status"); + mScriptList->setHorizontalHeaderLabels(headerLabels); + mScriptList->horizontalHeader()->setStretchLastSection(false); + mScriptList->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch); + mScriptList->horizontalHeader()->setResizeMode(1, QHeaderView::Fixed); + mScriptList->setSelectionMode(QAbstractItemView::SingleSelection); + mScriptList->setSelectionBehavior(QAbstractItemView::SelectRows); + + scriptingLayout->addWidget(mScriptList, 1, 0); + + QVBoxLayout *scriptListButtonLayout = new QVBoxLayout(); + { + QPushButton *abortButton = new QPushButton(tr("Abort")); + QPushButton *pauseButton = new QPushButton(tr("Pause")); + connect(abortButton, SIGNAL(clicked()), this, SLOT(abortScript())); + connect(pauseButton, SIGNAL(clicked()), this, SLOT(togglePauseScript())); + + scriptListButtonLayout->addWidget(pauseButton); + scriptListButtonLayout->addWidget(abortButton); + scriptListButtonLayout->addStretch(); + } + scriptingLayout->addLayout(scriptListButtonLayout, 1, 1); + + mFileView = new QTreeView(); + mFileModel = new QFileSystemModel(mFileView); + QDir scriptsDir(QCoreApplication::applicationDirPath()); + scriptsDir.cd(QLatin1String("scripts")); + QStringList nameFilters; + nameFilters << "*.js" << "*.qs"; + mFileModel->setNameFilters(nameFilters); + mFileModel->setNameFilterDisables(false); + mFileModel->setRootPath(scriptsDir.path()); + mFileView->setModel(mFileModel); + mFileView->setColumnHidden(1, true); + mFileView->setColumnHidden(2, true); + mFileView->setColumnHidden(3, true); + mFileView->setHeaderHidden(true); + mFileView->setRootIndex(mFileModel->index(scriptsDir.path())); + connect(mFileView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(runSelectedScript())); + + scriptingLayout->addWidget(mFileView, 0, 0); + + QVBoxLayout *scriptRunnerButtonLayout = new QVBoxLayout(); + { + QPushButton *runButton = new QPushButton(tr("Run")); + connect(runButton, SIGNAL(clicked()), this, SLOT(runSelectedScript())); + + scriptRunnerButtonLayout->addWidget(runButton); + scriptRunnerButtonLayout->addStretch(); + } + scriptingLayout->addLayout(scriptRunnerButtonLayout, 0, 1); + } + + QWidget *tmp = new QWidget(); + tmp->setLayout(scriptingLayout); + + OptionsItem *item = new OptionsItem("", tmp, true); + item->setTags(tags); + options << item; + + connect(mAdapter, SIGNAL(scriptStart(ScriptFiber*)), this, SLOT(addScript(ScriptFiber*))); + connect(mAdapter, SIGNAL(scriptStop(int)), this, SLOT(removeScript(int))); + + setTitle(tr("Scripting")); + setOptions(options); +} + +void ScriptUi::runScript(const QString &filePath) +{ + mAdapter->run(filePath); +} + +void ScriptUi::runSelectedScript() +{ + QModelIndex index = mFileView->currentIndex(); + + if (index.isValid() && !mFileModel->isDir(index)) { + QString scriptFilePath = mFileModel->filePath(index); + runScript(scriptFilePath); + } +} + +void ScriptUi::abortScript() +{ + if (!mScriptList->currentItem()) + return; + + ScriptFiber *script = mAdapter->script(mScriptList->currentIndex().row()); + if (!script) + return; + + script->requestTerminate(); + mScriptList->item(mScriptList->currentItem()->row(), 1)->setText(tr("aborting")); +} + +void ScriptUi::togglePauseScript() +{ + if (!mScriptList->currentItem()) + return; + + ScriptFiber *script = mAdapter->script(mScriptList->currentIndex().row()); + if (!script) + return; + + script->togglePause(); + if (script->isPaused()) + mScriptList->item(mScriptList->currentItem()->row(), 1)->setText(tr("paused")); + else + mScriptList->item(mScriptList->currentItem()->row(), 1)->setText(tr("running")); +} + +void ScriptUi::addScript(ScriptFiber *script) +{ + int newRow = mScriptList->rowCount(); + mScriptList->insertRow(newRow); + mScriptList->setItem(newRow, 0, new QTableWidgetItem(script->name())); + mScriptList->setItem(newRow, 1, new QTableWidgetItem(tr("running"))); +} + +void ScriptUi::removeScript(int index) +{ + mScriptList->removeRow(index); +} -- cgit v1.2.3