History

- few Adjustments in Application class for Script editor - Shortkey for script editor (Alt+S) - highlighter: bold true/false , single line comments - Run scripts from the editor works - More icons from Maximillian, Thanks - Run on the fly checkbox, works if the script is running. - Load/save features

Thijs Wenker committed 12 years ago

Commit c016d651 parent d2d393715 files · +1160 −48Browse files

Showing the changes to interface/src/ui/ScriptEditorWidget.cpp (1 of 15 files). Show all

Unified · Split

interface/src/ui/ScriptEditorWidget.cpp+114−0
@@ -13,6 +13,7 @@ · 12 unmodified lines
13#include <QFrame>13#include <QFrame>
14#include <QLayoutItem>14#include <QLayoutItem>
15#include <QMainWindow>15#include <QMainWindow>
16#include <QMessageBox>
16#include <QPalette>17#include <QPalette>
17#include <QScrollBar>18#include <QScrollBar>
18#include <QSizePolicy>19#include <QSizePolicy>
@@ -30,13 +31,126 @@ ScriptEditorWidget::ScriptEditorWidget() : · 11 unmodified lines
30{31{
31 ui->setupUi(this);32 ui->setupUi(this);
32 33
34 scriptEngine = NULL;
35
36 connect(ui->scriptEdit->document(), SIGNAL(modificationChanged(bool)), this, SIGNAL(scriptModified()));
37 connect(ui->scriptEdit->document(), SIGNAL(contentsChanged()), this, SLOT(onScriptModified()));
38
33 // remove the title bar (see the Qt docs on setTitleBarWidget)39 // remove the title bar (see the Qt docs on setTitleBarWidget)
34 setTitleBarWidget(new QWidget());40 setTitleBarWidget(new QWidget());
35 QFontMetrics fm(this->ui->scriptEdit->font());41 QFontMetrics fm(this->ui->scriptEdit->font());
36 this->ui->scriptEdit->setTabStopWidth(fm.width('0') * 4);42 this->ui->scriptEdit->setTabStopWidth(fm.width('0') * 4);
37 ScriptHighlighting* highlighting = new ScriptHighlighting(this->ui->scriptEdit->document());43 ScriptHighlighting* highlighting = new ScriptHighlighting(this->ui->scriptEdit->document());
44 QTimer::singleShot(0, this->ui->scriptEdit, SLOT(setFocus()));
38}45}
39 46
40ScriptEditorWidget::~ScriptEditorWidget() {47ScriptEditorWidget::~ScriptEditorWidget() {
41 delete ui;48 delete ui;
49}
50
51void ScriptEditorWidget::onScriptModified() {
52 if(ui->onTheFlyCheckBox->isChecked() && isRunning()) {
53 setRunning(false);
54 setRunning(true);
55 }
56}
57
58bool ScriptEditorWidget::isModified() {
59 return ui->scriptEdit->document()->isModified();
60}
61
62bool ScriptEditorWidget::isRunning() {
63 return (scriptEngine != NULL) ? scriptEngine->isRunning() : false;
64}
65
66bool ScriptEditorWidget::setRunning(bool run) {
67 if (run && !save()) {
68 return false;
69 }
70 // Clean-up old connections.
71 disconnect(this, SLOT(onScriptError(const QString&)));
72 disconnect(this, SLOT(onScriptPrint(const QString&)));
73
74 if (run) {
75 scriptEngine = Application::getInstance()->loadScript(this->currentScript, false);
76 connect(scriptEngine, SIGNAL(runningStateChanged()), this, SIGNAL(runningStateChanged()));
77
78 // Make new connections.
79 connect(scriptEngine, SIGNAL(errorMessage(const QString&)), this, SLOT(onScriptError(const QString&)));
80 connect(scriptEngine, SIGNAL(printedMessage(const QString&)), this, SLOT(onScriptPrint(const QString&)));
81 } else {
82 Application::getInstance()->stopScript(this->currentScript);
83 scriptEngine = NULL;
84 }
85 return true;
86}
87
88bool ScriptEditorWidget::saveFile(const QString &scriptPath) {
89 QFile file(scriptPath);
90 if (!file.open(QFile::WriteOnly | QFile::Text)) {
91 QMessageBox::warning(this, tr("Interface"), tr("Cannot write script %1:\n%2.").arg(scriptPath).arg(file.errorString()));
92 return false;
93 }
94
95 QTextStream out(&file);
96 out << ui->scriptEdit->toPlainText();
97
98 setScriptFile(scriptPath);
99 return true;
100}
101
102void ScriptEditorWidget::loadFile(const QString &scriptPath) {
103 QFile file(scriptPath);
104 if (!file.open(QFile::ReadOnly | QFile::Text)) {
105 QMessageBox::warning(this, tr("Interface"), tr("Cannot read script %1:\n%2.").arg(scriptPath).arg(file.errorString()));
106 return;
107 }
108
109 QTextStream in(&file);
110 ui->scriptEdit->setPlainText(in.readAll());
111
112 setScriptFile(scriptPath);
113
114 disconnect(this, SLOT(onScriptError(const QString&)));
115 disconnect(this, SLOT(onScriptPrint(const QString&)));
116
117 scriptEngine = Application::getInstance()->getScriptEngine(scriptPath);
118 if (scriptEngine != NULL) {
119 connect(scriptEngine, SIGNAL(runningStateChanged()), this, SIGNAL(runningStateChanged()));
120 connect(scriptEngine, SIGNAL(errorMessage(const QString&)), this, SLOT(onScriptError(const QString&)));
121 connect(scriptEngine, SIGNAL(printedMessage(const QString&)), this, SLOT(onScriptPrint(const QString&)));
122 }
123}
124
125bool ScriptEditorWidget::save() {
126 return currentScript.isEmpty() ? saveAs() : saveFile(currentScript);
127}
128
129bool ScriptEditorWidget::saveAs() {
130 QString fileName = QFileDialog::getSaveFileName(this, tr("Save script"), QString(), tr("Javascript (*.js)"));
131 return !fileName.isEmpty() ? saveFile(fileName) : false;
132}
133
134void ScriptEditorWidget::setScriptFile(const QString& scriptPath) {
135 currentScript = scriptPath;
136 ui->scriptEdit->document()->setModified(false);
137 setWindowModified(false);
138
139 emit scriptnameChanged();
140}
141
142bool ScriptEditorWidget::questionSave() {
143 if (ui->scriptEdit->document()->isModified()) {
144 QMessageBox::StandardButton button = QMessageBox::warning(this, tr("Interface"), tr("The script has been modified.\nDo you want to save your changes?"), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Save);
145 return button == QMessageBox::Save ? save() : (button == QMessageBox::Cancel ? false : true);
146 }
147 return true;
148}
149
150void ScriptEditorWidget::onScriptError(const QString& message) {
151 ui->debugText->appendPlainText("ERROR: "+ message);
152}
153
154void ScriptEditorWidget::onScriptPrint(const QString& message) {
155 ui->debugText->appendPlainText("> "+message);
42}156}