Showing the changes to interface/src/ui/ScriptEditorWindow.cpp (1 of 15 files). Show all
Unified · Split
| @@ -13,8 +13,10 @@ · 12 unmodified lines | ||
| 13 | 13 | #include <QFrame> |
| 14 | 14 | #include <QLayoutItem> |
| 15 | 15 | #include <QMainWindow> |
| 16 | +#include <QMessageBox.h> | |
| 16 | 17 | #include <QPalette> |
| 17 | 18 | #include <QScrollBar> |
| 19 | +#include <QShortcut> | |
| 18 | 20 | #include <QSizePolicy> |
| 19 | 21 | #include <QTimer> |
| 20 | 22 | #include <QWidget> |
| @@ -31,32 +33,158 @@ ScriptEditorWindow::ScriptEditorWindow() : · 10 unmodified lines | ||
| 31 | 33 | { |
| 32 | 34 | ui->setupUi(this); |
| 33 | 35 | 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())); | |
| 34 | 50 | } |
| 35 | 51 | |
| 36 | 52 | ScriptEditorWindow::~ScriptEditorWindow() { |
| 37 | 53 | delete ui; |
| 38 | 54 | } |
| 39 | 55 | |
| 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 | +} | |
| 41 | 67 | |
| 68 | +void ScriptEditorWindow::loadScriptMenu(const QString& scriptName) { | |
| 69 | + addScriptEditorWidget("loading...")->loadFile(scriptName); | |
| 70 | + updateButtons(); | |
| 42 | 71 | } |
| 43 | 72 | |
| 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 | + } | |
| 46 | 79 | } |
| 47 | 80 | |
| 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 | +} | |
| 49 | 99 | |
| 100 | +void ScriptEditorWindow::newScriptClicked() { | |
| 101 | + addScriptEditorWidget(QString("New script")); | |
| 50 | 102 | } |
| 51 | 103 | |
| 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 | +} | |
| 53 | 114 | |
| 115 | +void ScriptEditorWindow::saveScriptAsClicked() { | |
| 116 | + if (ui->tabWidget->currentIndex() != -1) { | |
| 117 | + ScriptEditorWidget* currentScriptWidget = (ScriptEditorWidget*)ui->tabWidget->currentWidget(); | |
| 118 | + currentScriptWidget->saveAs(); | |
| 119 | + } | |
| 54 | 120 | } |
| 55 | 121 | |
| 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())); | |
| 58 | 127 | ui->tabWidget->addTab(newScriptEditorWidget, title); |
| 59 | 128 | ui->tabWidget->setCurrentWidget(newScriptEditorWidget); |
| 60 | 129 | newScriptEditorWidget->setUpdatesEnabled(true); |
| 61 | 130 | 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 | + } | |
| 62 | 190 | } |