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 | #include <QFrame> | 13 | #include <QFrame> |
| 14 | #include <QLayoutItem> | 14 | #include <QLayoutItem> |
| 15 | #include <QMainWindow> | 15 | #include <QMainWindow> |
| 16 | #include <QMessageBox.h> | ||
| 16 | #include <QPalette> | 17 | #include <QPalette> |
| 17 | #include <QScrollBar> | 18 | #include <QScrollBar> |
| 19 | #include <QShortcut> | ||
| 18 | #include <QSizePolicy> | 20 | #include <QSizePolicy> |
| 19 | #include <QTimer> | 21 | #include <QTimer> |
| 20 | #include <QWidget> | 22 | #include <QWidget> |
| @@ -31,32 +33,158 @@ ScriptEditorWindow::ScriptEditorWindow() : · 10 unmodified lines | |||
| 31 | { | 33 | { |
| 32 | ui->setupUi(this); | 34 | ui->setupUi(this); |
| 33 | show(); | 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 | ScriptEditorWindow::~ScriptEditorWindow() { | 52 | ScriptEditorWindow::~ScriptEditorWindow() { |
| 37 | delete ui; | 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(){ | 73 | void ScriptEditorWindow::loadScriptClicked() { |
| 45 | addScriptEditorWidget(QString("new Script")); | 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){ | 122 | ScriptEditorWidget* ScriptEditorWindow::addScriptEditorWidget(QString title) { |
| 57 | ScriptEditorWidget* newScriptEditorWidget = new ScriptEditorWidget();//ScriptEditorWidget(); | 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 | ui->tabWidget->addTab(newScriptEditorWidget, title); | 127 | ui->tabWidget->addTab(newScriptEditorWidget, title); |
| 59 | ui->tabWidget->setCurrentWidget(newScriptEditorWidget); | 128 | ui->tabWidget->setCurrentWidget(newScriptEditorWidget); |
| 60 | newScriptEditorWidget->setUpdatesEnabled(true); | 129 | newScriptEditorWidget->setUpdatesEnabled(true); |
| 61 | newScriptEditorWidget->adjustSize(); | 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 | } |