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/ScriptEditorWindow.cpp (1 of 15 files). Show all

Unified · Split

interface/src/ui/ScriptEditorWindow.cpp+135−7
@@ -13,8 +13,10 @@ · 12 unmodified lines
1313 #include <QFrame>
1414 #include <QLayoutItem>
1515 #include <QMainWindow>
16+#include <QMessageBox.h>
1617 #include <QPalette>
1718 #include <QScrollBar>
19+#include <QShortcut>
1820 #include <QSizePolicy>
1921 #include <QTimer>
2022 #include <QWidget>
@@ -31,32 +33,158 @@ ScriptEditorWindow::ScriptEditorWindow() : · 10 unmodified lines
3133 {
3234 ui->setupUi(this);
3335 show();
36+ addScriptEditorWidget("New script");
37+ loadMenu = new QMenu();
38+ connect(loadMenu, SIGNAL(aboutToShow()), this, SLOT(loadMenuAboutToShow()));
39+ ui->loadButton->setMenu(loadMenu);
40+
41+ saveMenu = new QMenu();
42+ saveMenu->addAction("Save as..", this, SLOT(saveScriptAsClicked()), Qt::CTRL|Qt::SHIFT|Qt::Key_S);
43+
44+ ui->saveButton->setMenu(saveMenu);
45+
46+ connect(new QShortcut(QKeySequence("Ctrl+N"), this), SIGNAL(activated()), this, SLOT(newScriptClicked()));
47+ connect(new QShortcut(QKeySequence("Ctrl+S"), this), SIGNAL(activated()), this, SLOT(saveScriptClicked()));
48+ connect(new QShortcut(QKeySequence("Ctrl+O"), this), SIGNAL(activated()), this, SLOT(loadScriptClicked()));
49+ connect(new QShortcut(QKeySequence("F5"), this), SIGNAL(activated()), this, SLOT(toggleRunScriptClicked()));
3450 }
3551
3652 ScriptEditorWindow::~ScriptEditorWindow() {
3753 delete ui;
3854 }
3955
40−void ScriptEditorWindow::loadScriptClicked(){
56+void ScriptEditorWindow::setRunningState(bool run) {
57+ if (ui->tabWidget->currentIndex() != -1) {
58+ ((ScriptEditorWidget*)ui->tabWidget->currentWidget())->setRunning(run);
59+ }
60+ this->updateButtons();
61+}
62+
63+void ScriptEditorWindow::updateButtons() {
64+ ui->toggleRunButton->setEnabled(ui->tabWidget->currentIndex() != -1);
65+ ui->toggleRunButton->setIcon(ui->tabWidget->currentIndex() != -1 && ((ScriptEditorWidget*)ui->tabWidget->currentWidget())->isRunning() ? QIcon("../resources/icons/stop-script.svg"):QIcon("../resources/icons/start-script.svg"));
66+}
4167
68+void ScriptEditorWindow::loadScriptMenu(const QString& scriptName) {
69+ addScriptEditorWidget("loading...")->loadFile(scriptName);
70+ updateButtons();
4271 }
4372
44−void ScriptEditorWindow::newScriptClicked(){
45− addScriptEditorWidget(QString("new Script"));
73+void ScriptEditorWindow::loadScriptClicked() {
74+ QString scriptName = QFileDialog::getOpenFileName(this, tr("Interface"), QString(), tr("Javascript (*.js)"));
75+ if (!scriptName.isEmpty()) {
76+ addScriptEditorWidget("loading...")->loadFile(scriptName);
77+ updateButtons();
78+ }
4679 }
4780
48−void ScriptEditorWindow::toggleRunScriptClicked(){
81+void ScriptEditorWindow::loadMenuAboutToShow() {
82+ loadMenu->clear();
83+ QStringList runningScripts = Application::getInstance()->getRunningScripts();
84+ if (runningScripts.count() > 0) {
85+ QSignalMapper* signalMapper = new QSignalMapper(this);
86+ foreach (const QString& runningScript, runningScripts) {
87+ QAction* runningScriptAction = new QAction(runningScript, loadMenu);
88+ connect(runningScriptAction, SIGNAL(triggered()), signalMapper, SLOT(map()));
89+ signalMapper->setMapping(runningScriptAction, runningScript);
90+ loadMenu->addAction(runningScriptAction);
91+ }
92+ connect(signalMapper, SIGNAL(mapped(const QString &)), this, SLOT(loadScriptMenu(const QString &)));
93+ } else {
94+ QAction* naAction = new QAction("(no running scripts)",loadMenu);
95+ naAction->setDisabled(true);
96+ loadMenu->addAction(naAction);
97+ }
98+}
4999
100+void ScriptEditorWindow::newScriptClicked() {
101+ addScriptEditorWidget(QString("New script"));
50102 }
51103
52−void ScriptEditorWindow::saveScriptClicked(){
104+void ScriptEditorWindow::toggleRunScriptClicked() {
105+ this->setRunningState(!(ui->tabWidget->currentIndex() !=-1 && ((ScriptEditorWidget*)ui->tabWidget->currentWidget())->isRunning()));
106+}
107+
108+void ScriptEditorWindow::saveScriptClicked() {
109+ if (ui->tabWidget->currentIndex() != -1) {
110+ ScriptEditorWidget* currentScriptWidget = (ScriptEditorWidget*)ui->tabWidget->currentWidget();
111+ currentScriptWidget->save();
112+ }
113+}
53114
115+void ScriptEditorWindow::saveScriptAsClicked() {
116+ if (ui->tabWidget->currentIndex() != -1) {
117+ ScriptEditorWidget* currentScriptWidget = (ScriptEditorWidget*)ui->tabWidget->currentWidget();
118+ currentScriptWidget->saveAs();
119+ }
54120 }
55121
56−void ScriptEditorWindow::addScriptEditorWidget(QString title){
57− ScriptEditorWidget* newScriptEditorWidget = new ScriptEditorWidget();//ScriptEditorWidget();
122+ScriptEditorWidget* ScriptEditorWindow::addScriptEditorWidget(QString title) {
123+ ScriptEditorWidget* newScriptEditorWidget = new ScriptEditorWidget();
124+ connect(newScriptEditorWidget, SIGNAL(scriptnameChanged()), this, SLOT(updateScriptNameOrStatus()));
125+ connect(newScriptEditorWidget, SIGNAL(scriptModified()), this, SLOT(updateScriptNameOrStatus()));
126+ connect(newScriptEditorWidget, SIGNAL(runningStateChanged()), this, SLOT(updateButtons()));
58127 ui->tabWidget->addTab(newScriptEditorWidget, title);
59128 ui->tabWidget->setCurrentWidget(newScriptEditorWidget);
60129 newScriptEditorWidget->setUpdatesEnabled(true);
61130 newScriptEditorWidget->adjustSize();
131+ return newScriptEditorWidget;
132+}
133+
134+void ScriptEditorWindow::tabSwitched(int tabIndex) {
135+ this->updateButtons();
136+ if (ui->tabWidget->currentIndex() != -1) {
137+ ScriptEditorWidget* currentScriptWidget = (ScriptEditorWidget*)ui->tabWidget->currentWidget();
138+ QString modifiedStar = (currentScriptWidget->isModified()?"*":"");
139+ if (currentScriptWidget->getScriptName().length() > 0) {
140+ this->setWindowTitle("Script Editor ["+currentScriptWidget->getScriptName()+modifiedStar+"]");
141+ } else {
142+ this->setWindowTitle("Script Editor [New script"+modifiedStar+"]");
143+ }
144+ } else {
145+ this->setWindowTitle("Script Editor");
146+ }
147+}
148+
149+void ScriptEditorWindow::tabCloseRequested(int tabIndex) {
150+ ScriptEditorWidget* closingScriptWidget = (ScriptEditorWidget*)ui->tabWidget->widget(tabIndex);
151+ if(closingScriptWidget->questionSave()) {
152+ ui->tabWidget->removeTab(tabIndex);
153+ }
154+}
155+
156+void ScriptEditorWindow::closeEvent(QCloseEvent *event) {
157+ bool unsaved_docs_warning = false;
158+ for (int i = 0; i < ui->tabWidget->count(); i++ && !unsaved_docs_warning){
159+ if(((ScriptEditorWidget*)ui->tabWidget->widget(i))->isModified()){
160+ unsaved_docs_warning = true;
161+ }
162+ }
163+
164+ if (!unsaved_docs_warning || QMessageBox::warning(this, tr("Interface"), tr("There are some unsaved scripts, are you sure you want to close the editor? Changes will be lost!"), QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Cancel) == QMessageBox::Discard) {
165+ event->accept();
166+ } else {
167+ event->ignore();
168+ }
169+}
170+
171+void ScriptEditorWindow::updateScriptNameOrStatus() {
172+ ScriptEditorWidget* source = (ScriptEditorWidget*)QObject::sender();
173+ QString modifiedStar = (source->isModified()?"*":"");
174+ if (source->getScriptName().length() > 0) {
175+ for (int i = 0; i < ui->tabWidget->count(); i++){
176+ if (ui->tabWidget->widget(i) == source) {
177+ ui->tabWidget->setTabText(i,modifiedStar+QFileInfo(source->getScriptName()).fileName());
178+ ui->tabWidget->setTabToolTip(i, source->getScriptName());
179+ }
180+ }
181+ }
182+
183+ if (ui->tabWidget->currentWidget() == source) {
184+ if (source->getScriptName().length() > 0) {
185+ this->setWindowTitle("Script Editor ["+source->getScriptName()+modifiedStar+"]");
186+ } else {
187+ this->setWindowTitle("Script Editor [New script"+modifiedStar+"]");
188+ }
189+ }
62190 }