X-Git-Url: https://git.sven.stormbind.net/?a=blobdiff_plain;f=src%2Fscripteditor.cpp;fp=src%2Fscripteditor.cpp;h=a9b631dfb0188c8ddc1ff6079af0b4dbada697f0;hb=d483bd8e6523c23c6f1d8908a2e0611c2bc9ff4f;hp=0000000000000000000000000000000000000000;hpb=7dfa3fe589d1722d49681f42cdb0bf1e6efb5223;p=sven%2Fvym.git diff --git a/src/scripteditor.cpp b/src/scripteditor.cpp new file mode 100644 index 0000000..a9b631d --- /dev/null +++ b/src/scripteditor.cpp @@ -0,0 +1,235 @@ +#include "scripteditor.h" + +#include +#include +#include + +#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 modelCommands; +extern QList 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(); + } +}