]> git.sven.stormbind.net Git - sven/vym.git/blobdiff - src/scripteditor.cpp
New upstream version 2.9.22
[sven/vym.git] / src / scripteditor.cpp
diff --git a/src/scripteditor.cpp b/src/scripteditor.cpp
new file mode 100644 (file)
index 0000000..a9b631d
--- /dev/null
@@ -0,0 +1,235 @@
+#include "scripteditor.h"
+
+#include <QFileDialog>
+#include <QMessageBox>
+#include <QTextStream>
+
+#include "command.h"
+#include "file.h"
+#include "macros.h"
+
+#include "mainwindow.h"
+#include "options.h"
+#include "settings.h"
+#include "slideitem.h"
+#include "slidemodel.h"
+#include "vymmodel.h"
+
+extern QString vymName;
+extern QList<Command *> modelCommands;
+extern QList<Command *> vymCommands;
+extern QDir lastMapDir;
+extern Macros macros;
+extern Main *mainWindow;
+extern Options options;
+extern Settings settings;
+
+ScriptEditor::ScriptEditor(QWidget *parent) : QWidget(parent)
+{
+    ui.setupUi(this);
+
+    codeEditor = new CodeEditor(this);
+    ui.fileVerticalLayout->insertWidget(0, codeEditor);
+
+    macroEditor = new CodeEditor(this);
+    ui.macroVerticalLayout->insertWidget(0, macroEditor);
+
+    slideEditor = new CodeEditor(this);
+    ui.slideVerticalLayout->insertWidget(0, slideEditor);
+
+    connect(ui.slideSaveButton, SIGNAL(clicked()), this, SLOT(saveSlide()));
+    connect(ui.slideRunButton, SIGNAL(clicked()), this, SLOT(runSlide()));
+    connect(ui.macroRunButton, SIGNAL(clicked()), this, SLOT(runMacro()));
+    connect(ui.fileRunButton, SIGNAL(clicked()), this, SLOT(runScript()));
+    connect(ui.macroLoadButton, SIGNAL(clicked()), this, SLOT(reloadMacros()));
+    connect(ui.macroSaveButton, SIGNAL(clicked()), this, SLOT(saveMacros()));
+    connect(ui.fileLoadButton, SIGNAL(clicked()), this, SLOT(loadScript()));
+    connect(ui.fileSaveButton, SIGNAL(clicked()), this, SLOT(saveScript()));
+    connect(ui.fileSaveAsButton, SIGNAL(clicked()), this, SLOT(saveScriptAs()));
+
+    vymModelID = -1;
+
+    // Initialize Editor
+    QFont font;
+    font.setFamily("Courier");
+    font.setFixedPitch(true);
+    font.setPointSize(12);
+    slideEditor->setFont(font);
+    macroEditor->setFont(font);
+    codeEditor->setFont(font);
+
+    // Define tab width
+    const int tabStop = 4; // 4 characters
+    QFontMetrics metrics(font);
+    int w = tabStop * metrics.width(' ');
+    codeEditor->setTabStopWidth(w);
+    slideEditor->setTabStopWidth(w);
+    macroEditor->setTabStopWidth(w);
+
+    ui.modeTabWidget->setTabText(0, tr("Slide", "Mode in scriptEditor"));
+    ui.modeTabWidget->setTabText(1, tr("Macro", "Mode in scriptEditor"));
+    ui.modeTabWidget->setTabText(2, tr("Script", "Mode in scriptEditor"));
+
+    ui.scriptPathLineEdit->setText(
+        tr("No script selected", "scriptname in scriptEditor"));
+
+    reloadMacros();
+
+    highlighterMacro = new Highlighter(macroEditor->document());
+    highlighterSlide = new Highlighter(slideEditor->document());
+    highlighterFile = new Highlighter(codeEditor->document());
+    QStringList list;
+    foreach (Command *c, modelCommands)
+        list.append(c->getName());
+    foreach (Command *c, vymCommands)
+        list.append(c->getName());
+    highlighterMacro->addKeywords(list);
+    highlighterSlide->addKeywords(list);
+    highlighterFile->addKeywords(list);
+
+    // QAction *a = new QAction( tr( "Save","ScriptEditor" ), ui.editor);
+    // a->setShortcut (Qt::CTRL + Qt::Key_S );
+    // a->setShortcutContext (Qt::WidgetWithChildrenShortcut);
+    // addAction (a);
+    // connect( a, SIGNAL( triggered() ), this, SLOT( saveSlide() ) );
+}
+
+QString ScriptEditor::getScriptFile() { return codeEditor->toPlainText(); }
+
+void ScriptEditor::saveSlide()
+{
+    VymModel *vm = mainWindow->getModel(vymModelID);
+    if (!vm) {
+        QMessageBox::warning(
+            0, tr("Warning"),
+            tr("Couldn't get model to save script into slide!"));
+        return;
+    }
+    SlideItem *si = vm->getSlideModel()->findSlideID(slideID);
+    if (!si) {
+        QMessageBox::warning(
+            0, tr("Warning"),
+            tr("Couldn't find slide to save script into slide!"));
+        return;
+    }
+    si->setInScript(slideEditor->toPlainText());
+}
+
+void ScriptEditor::setSlideScript(uint model_id, uint slide_id,
+                                  const QString &s)
+{
+    vymModelID = model_id;
+    slideID = slide_id;
+    mode = Slide;
+    slideEditor->setPlainText(s);
+}
+
+void ScriptEditor::runMacro() { emit runScript(macroEditor->toPlainText()); }
+
+void ScriptEditor::runSlide() { emit runScript(slideEditor->toPlainText()); }
+
+void ScriptEditor::runScript() { emit runScript(codeEditor->toPlainText()); }
+
+void ScriptEditor::reloadMacros()
+{
+    QString m = macros.get();
+    if (!m.isEmpty()) {
+        macroEditor->setPlainText(m);
+        ui.macroPathLineEdit->setText(macros.getPath());
+    }
+}
+
+void ScriptEditor::saveMacros()
+{
+    if (saveStringToDisk(macros.getPath(), macroEditor->toPlainText()))
+        mainWindow->statusMessage(
+            tr("Macros saved to %1").arg(macros.getPath()));
+    else {
+        QString error(QObject::tr("Error"));
+        QString msg(QObject::tr("Couldn't write macros to \"%1\"\n.")
+                        .arg(macros.getPath()));
+        QMessageBox::warning(0, error, msg);
+    }
+}
+
+bool ScriptEditor::loadScript(QString fn)
+{
+    if (fn.isEmpty()) {
+        QString filter("VYM scripts (*.vys);;All (*)");
+        fn = QFileDialog::getOpenFileName(this,
+                                          vymName + " - " + tr("Load script"),
+                                          lastMapDir.path(), filter);
+    }
+
+    if (!fn.isEmpty()) {
+        filename = fn;
+        QString s;
+        if (loadStringFromDisk(filename, s)) {
+            codeEditor->setPlainText(s);
+            ui.scriptPathLineEdit->setText(filename);
+            lastMapDir.setPath(filename.left(filename.lastIndexOf("/")));
+            return true;
+        }
+        else {
+            QString error(QObject::tr("Error"));
+            QString msg(
+                QObject::tr("Couldn't read script from \"%1\"\n.").arg(fn));
+            QMessageBox::warning(0, error, msg);
+        }
+    }
+    return false;
+}
+
+void ScriptEditor::saveScript()
+{
+    if (filename.isEmpty())
+        saveScriptAs();
+    else {
+        if (saveStringToDisk(filename, codeEditor->toPlainText()))
+            mainWindow->statusMessage(tr("Script saved to %1").arg(filename));
+        else {
+            QString error(QObject::tr("Error"));
+            QString msg(QObject::tr("Couldn't write script to \"%1\"\n.")
+                            .arg(filename));
+            QMessageBox::warning(0, error, msg);
+        }
+    }
+}
+
+void ScriptEditor::saveScriptAs()
+{
+    QString filter("VYM scripts (*.vys *.js);;All (*)");
+    QString fn = QFileDialog::getSaveFileName(
+        this, QString(vymName + " - " + tr("Save script")), QString(),
+        "VYM script (*js *.vys);;All files (*)", 0,
+        QFileDialog::DontConfirmOverwrite);
+
+    if (!fn.isEmpty()) {
+        QFile file(fn);
+        if (file.exists()) {
+            QMessageBox mb(
+                vymName,
+                tr("The file %1\nexists already.\nDo you want to overwrite it?",
+                   "dialog 'save as'")
+                    .arg(fn),
+                QMessageBox::Warning, QMessageBox::Yes | QMessageBox::Default,
+                QMessageBox::Cancel | QMessageBox::Escape, Qt::NoButton);
+            mb.setButtonText(QMessageBox::Yes, tr("Overwrite"));
+            mb.setButtonText(QMessageBox::No, tr("Cancel"));
+            switch (mb.exec()) {
+            case QMessageBox::Yes:
+                // save
+                filename = fn;
+                ui.scriptPathLineEdit->setText(filename);
+                lastMapDir.setPath(filename.left(filename.lastIndexOf("/")));
+                saveScript();
+                return;
+            case QMessageBox::Cancel:
+                // do nothing
+                return;
+            }
+        }
+        filename = fn;
+        saveScript();
+    }
+}