]> git.sven.stormbind.net Git - sven/vym.git/blob - src/scripteditor.cpp
Replace Pierre as the maintainer
[sven/vym.git] / src / scripteditor.cpp
1 #include "scripteditor.h"
2
3 #include <QFileDialog>
4 #include <QMessageBox>
5 #include <QTextStream>
6
7 #include "command.h"
8 #include "file.h"
9 #include "macros.h"
10
11 #include "mainwindow.h"
12 #include "options.h"
13 #include "settings.h"
14 #include "slideitem.h"
15 #include "slidemodel.h"
16 #include "vymmodel.h"
17
18 extern QString vymName;
19 extern QList<Command *> modelCommands;
20 extern QList<Command *> vymCommands;
21 extern QDir lastMapDir;
22 extern Macros macros;
23 extern Main *mainWindow;
24 extern Options options;
25 extern Settings settings;
26
27 ScriptEditor::ScriptEditor(QWidget *parent) : QWidget(parent)
28 {
29     ui.setupUi(this);
30
31     codeEditor = new CodeEditor(this);
32     ui.fileVerticalLayout->insertWidget(0, codeEditor);
33
34     macroEditor = new CodeEditor(this);
35     ui.macroVerticalLayout->insertWidget(0, macroEditor);
36
37     slideEditor = new CodeEditor(this);
38     ui.slideVerticalLayout->insertWidget(0, slideEditor);
39
40     connect(ui.slideSaveButton, SIGNAL(clicked()), this, SLOT(saveSlide()));
41     connect(ui.slideRunButton, SIGNAL(clicked()), this, SLOT(runSlide()));
42     connect(ui.macroRunButton, SIGNAL(clicked()), this, SLOT(runMacro()));
43     connect(ui.fileRunButton, SIGNAL(clicked()), this, SLOT(runScript()));
44     connect(ui.macroLoadButton, SIGNAL(clicked()), this, SLOT(reloadMacros()));
45     connect(ui.macroSaveButton, SIGNAL(clicked()), this, SLOT(saveMacros()));
46     connect(ui.fileLoadButton, SIGNAL(clicked()), this, SLOT(loadScript()));
47     connect(ui.fileSaveButton, SIGNAL(clicked()), this, SLOT(saveScript()));
48     connect(ui.fileSaveAsButton, SIGNAL(clicked()), this, SLOT(saveScriptAs()));
49
50     vymModelID = -1;
51
52     // Initialize Editor
53     QFont font;
54     font.setFamily("Courier");
55     font.setFixedPitch(true);
56     font.setPointSize(12);
57     slideEditor->setFont(font);
58     macroEditor->setFont(font);
59     codeEditor->setFont(font);
60
61     // Define tab width
62     const int tabStop = 4; // 4 characters
63     QFontMetrics metrics(font);
64     int w = tabStop * metrics.width(' ');
65     codeEditor->setTabStopWidth(w);
66     slideEditor->setTabStopWidth(w);
67     macroEditor->setTabStopWidth(w);
68
69     ui.modeTabWidget->setTabText(0, tr("Slide", "Mode in scriptEditor"));
70     ui.modeTabWidget->setTabText(1, tr("Macro", "Mode in scriptEditor"));
71     ui.modeTabWidget->setTabText(2, tr("Script", "Mode in scriptEditor"));
72
73     ui.scriptPathLineEdit->setText(
74         tr("No script selected", "scriptname in scriptEditor"));
75
76     reloadMacros();
77
78     highlighterMacro = new Highlighter(macroEditor->document());
79     highlighterSlide = new Highlighter(slideEditor->document());
80     highlighterFile = new Highlighter(codeEditor->document());
81     QStringList list;
82     foreach (Command *c, modelCommands)
83         list.append(c->getName());
84     foreach (Command *c, vymCommands)
85         list.append(c->getName());
86     highlighterMacro->addKeywords(list);
87     highlighterSlide->addKeywords(list);
88     highlighterFile->addKeywords(list);
89
90     // QAction *a = new QAction( tr( "Save","ScriptEditor" ), ui.editor);
91     // a->setShortcut (Qt::CTRL + Qt::Key_S );
92     // a->setShortcutContext (Qt::WidgetWithChildrenShortcut);
93     // addAction (a);
94     // connect( a, SIGNAL( triggered() ), this, SLOT( saveSlide() ) );
95 }
96
97 QString ScriptEditor::getScriptFile() { return codeEditor->toPlainText(); }
98
99 void ScriptEditor::saveSlide()
100 {
101     VymModel *vm = mainWindow->getModel(vymModelID);
102     if (!vm) {
103         QMessageBox::warning(
104             0, tr("Warning"),
105             tr("Couldn't get model to save script into slide!"));
106         return;
107     }
108     SlideItem *si = vm->getSlideModel()->findSlideID(slideID);
109     if (!si) {
110         QMessageBox::warning(
111             0, tr("Warning"),
112             tr("Couldn't find slide to save script into slide!"));
113         return;
114     }
115     si->setInScript(slideEditor->toPlainText());
116 }
117
118 void ScriptEditor::setSlideScript(uint model_id, uint slide_id,
119                                   const QString &s)
120 {
121     vymModelID = model_id;
122     slideID = slide_id;
123     mode = Slide;
124     slideEditor->setPlainText(s);
125 }
126
127 void ScriptEditor::runMacro() { emit runScript(macroEditor->toPlainText()); }
128
129 void ScriptEditor::runSlide() { emit runScript(slideEditor->toPlainText()); }
130
131 void ScriptEditor::runScript() { emit runScript(codeEditor->toPlainText()); }
132
133 void ScriptEditor::reloadMacros()
134 {
135     QString m = macros.get();
136     if (!m.isEmpty()) {
137         macroEditor->setPlainText(m);
138         ui.macroPathLineEdit->setText(macros.getPath());
139     }
140 }
141
142 void ScriptEditor::saveMacros()
143 {
144     if (saveStringToDisk(macros.getPath(), macroEditor->toPlainText()))
145         mainWindow->statusMessage(
146             tr("Macros saved to %1").arg(macros.getPath()));
147     else {
148         QString error(QObject::tr("Error"));
149         QString msg(QObject::tr("Couldn't write macros to \"%1\"\n.")
150                         .arg(macros.getPath()));
151         QMessageBox::warning(0, error, msg);
152     }
153 }
154
155 bool ScriptEditor::loadScript(QString fn)
156 {
157     if (fn.isEmpty()) {
158         QString filter("VYM scripts (*.vys);;All (*)");
159         fn = QFileDialog::getOpenFileName(this,
160                                           vymName + " - " + tr("Load script"),
161                                           lastMapDir.path(), filter);
162     }
163
164     if (!fn.isEmpty()) {
165         filename = fn;
166         QString s;
167         if (loadStringFromDisk(filename, s)) {
168             codeEditor->setPlainText(s);
169             ui.scriptPathLineEdit->setText(filename);
170             lastMapDir.setPath(filename.left(filename.lastIndexOf("/")));
171             return true;
172         }
173         else {
174             QString error(QObject::tr("Error"));
175             QString msg(
176                 QObject::tr("Couldn't read script from \"%1\"\n.").arg(fn));
177             QMessageBox::warning(0, error, msg);
178         }
179     }
180     return false;
181 }
182
183 void ScriptEditor::saveScript()
184 {
185     if (filename.isEmpty())
186         saveScriptAs();
187     else {
188         if (saveStringToDisk(filename, codeEditor->toPlainText()))
189             mainWindow->statusMessage(tr("Script saved to %1").arg(filename));
190         else {
191             QString error(QObject::tr("Error"));
192             QString msg(QObject::tr("Couldn't write script to \"%1\"\n.")
193                             .arg(filename));
194             QMessageBox::warning(0, error, msg);
195         }
196     }
197 }
198
199 void ScriptEditor::saveScriptAs()
200 {
201     QString filter("VYM scripts (*.vys *.js);;All (*)");
202     QString fn = QFileDialog::getSaveFileName(
203         this, QString(vymName + " - " + tr("Save script")), QString(),
204         "VYM script (*js *.vys);;All files (*)", 0,
205         QFileDialog::DontConfirmOverwrite);
206
207     if (!fn.isEmpty()) {
208         QFile file(fn);
209         if (file.exists()) {
210             QMessageBox mb(
211                 vymName,
212                 tr("The file %1\nexists already.\nDo you want to overwrite it?",
213                    "dialog 'save as'")
214                     .arg(fn),
215                 QMessageBox::Warning, QMessageBox::Yes | QMessageBox::Default,
216                 QMessageBox::Cancel | QMessageBox::Escape, Qt::NoButton);
217             mb.setButtonText(QMessageBox::Yes, tr("Overwrite"));
218             mb.setButtonText(QMessageBox::No, tr("Cancel"));
219             switch (mb.exec()) {
220             case QMessageBox::Yes:
221                 // save
222                 filename = fn;
223                 ui.scriptPathLineEdit->setText(filename);
224                 lastMapDir.setPath(filename.left(filename.lastIndexOf("/")));
225                 saveScript();
226                 return;
227             case QMessageBox::Cancel:
228                 // do nothing
229                 return;
230             }
231         }
232         filename = fn;
233         saveScript();
234     }
235 }