diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/editor.cc | 2 | ||||
-rw-r--r-- | src/editor.h | 16 | ||||
-rw-r--r-- | src/highlighter.cc | 94 | ||||
-rw-r--r-- | src/highlighter.h | 29 | ||||
-rw-r--r-- | src/mainwin.cc | 50 |
5 files changed, 118 insertions, 73 deletions
diff --git a/src/editor.cc b/src/editor.cc index 92aeefe..08bf005 100644 --- a/src/editor.cc +++ b/src/editor.cc @@ -1,7 +1,6 @@ #include "editor.h" #include "Preferences.h" -#ifndef _QCODE_EDIT_ void Editor::indentSelection() { QTextCursor cursor = textCursor(); @@ -109,4 +108,3 @@ void Editor::wheelEvent ( QWheelEvent * event ) } } -#endif diff --git a/src/editor.h b/src/editor.h index bb338b0..09484f5 100644 --- a/src/editor.h +++ b/src/editor.h @@ -3,26 +3,11 @@ #include <QWidget> #include <QWheelEvent> -#ifdef _QCODE_EDIT_ -#include <qeditor.h> -class Editor : public QEditor -#else #include <QTextEdit> class Editor : public QTextEdit -#endif { Q_OBJECT public: -#ifdef _QCODE_EDIT_ - Editor(QWidget *parent) : QEditor(parent) {} - QString toPlainText() const { return text(); } - void setPlainText(const QString& text) { setText(text); } -public slots: - //void zoomIn() { zoom(1); } - void zoomIn(int n = 1) { zoom(n); } - //void zoomOut() { zoom(-1); } - void zoomOut(int n = 1) { zoom(-n); } -#else Editor(QWidget *parent) : QTextEdit(parent) { setAcceptRichText(false); } public slots: void zoomIn(); @@ -36,5 +21,4 @@ public slots: void uncommentSelection(); private: void wheelEvent ( QWheelEvent * event ); -#endif }; diff --git a/src/highlighter.cc b/src/highlighter.cc index 64ea980..6e51ecc 100644 --- a/src/highlighter.cc +++ b/src/highlighter.cc @@ -24,20 +24,103 @@ * */ +// Syntax Highlight code by Chris Olah + #include "highlighter.h" #include "parsersettings.h" // extern int parser_error_pos; -#ifdef _QCODE_EDIT_ -Highlighter::Highlighter(QDocument *parent) -#else -Highlighter::Highlighter(QTextDocument *parent) -#endif +Highlighter::Highlighter(QTextDocument *parent, mode_e mode) : QSyntaxHighlighter(parent) { + this->mode = mode; + operators << "!" << "&&" << "||" << "+" << "-" << "*" << "/" << "%" << "!" << "#" << ";"; + KeyWords << "for" << "intersection_for" << "if" << "assign" + << "module" << "function" + << "$children" << "child" << "$fn" << "$fa" << "$fb" // Lump special variables in here + << "union" << "intersection" << "difference" << "render"; //Lump CSG in here + Primitives3D << "cube" << "cylinder" << "sphere" << "polyhedron"; + Primitives2D << "square" << "polygon" << "circle"; + Transforms << "scale" << "translate" << "rotate" << "multmatrix" << "color" + << "linear_extrude" << "rotate_extrude"; // Lump extrudes in here. + Imports << "include" << "use" << "import_stl"; + + //this->OperatorStyle.setForeground + KeyWordStyle.setForeground(Qt::darkGreen); + TransformStyle.setForeground(Qt::darkGreen); + PrimitiveStyle3D.setForeground(Qt::darkBlue); + PrimitiveStyle2D.setForeground(Qt::blue); + ImportStyle.setForeground(Qt::darkYellow); + QuoteStyle.setForeground(Qt::darkMagenta); + CommentStyle.setForeground(Qt::darkCyan); + ErrorStyle.setForeground(Qt::red); } void Highlighter::highlightBlock(const QString &text) { + if ( mode == NORMAL_MODE) { + state_e state = (state_e) previousBlockState(); + //Key words and Primitives + QStringList::iterator it; + + for (it = KeyWords.begin(); it != KeyWords.end(); ++it){ + for (int i = 0; i < text.count(*it); ++i){ + setFormat(text.indexOf(*it),it->size(),KeyWordStyle); + } + } + for (it = Primitives3D.begin(); it != Primitives3D.end(); ++it){ + for (int i = 0; i < text.count(*it); ++i){ + setFormat(text.indexOf(*it),it->size(),PrimitiveStyle3D); + } + } + for (it = Primitives2D.begin(); it != Primitives2D.end(); ++it){ + for (int i = 0; i < text.count(*it); ++i){ + setFormat(text.indexOf(*it),it->size(),PrimitiveStyle2D); + } + } + for (it = Transforms.begin(); it != Transforms.end(); ++it){ + for (int i = 0; i < text.count(*it); ++i){ + setFormat(text.indexOf(*it),it->size(),TransformStyle); + } + } + for (it = Imports.begin(); it != Imports.end(); ++it){ + for (int i = 0; i < text.count(*it); ++i){ + setFormat(text.indexOf(*it),it->size(),ImportStyle); + } + } + + // Quoting and Comments. + for (int n = 0; n < text.size(); ++n){ + if (state == NORMAL){ + if (text[n] == '"'){ + state = QUOTE; + setFormat(n,1,QuoteStyle); + } else if (text[n] == '/'){ + if (text[n+1] == '/'){ + setFormat(n,text.size(),CommentStyle); + break; + } else if (text[n+1] == '*'){ + setFormat(n++,2,CommentStyle); + state = COMMENT; + } + } + } else if (state == QUOTE){ + setFormat(n,1,QuoteStyle); + if (text[n] == '"' && text[n-1] != '\\') + state = NORMAL; + } else if (state == COMMENT){ + setFormat(n,1,CommentStyle); + if (text[n] == '*' && text[n+1] == '/'){ + setFormat(++n,1,CommentStyle); + state = NORMAL; + } + } + } + + } // not ErrorMode (syntax highlighting) + + + // Errors + else if (mode == ERROR_MODE) { int n = previousBlockState(); if (n < 0) n = 0; @@ -53,5 +136,6 @@ void Highlighter::highlightBlock(const QString &text) setFormat(parser_error_pos - n, 1, style); #endif } + } // if errormode } diff --git a/src/highlighter.h b/src/highlighter.h index 1bd54d2..a6e2dc3 100644 --- a/src/highlighter.h +++ b/src/highlighter.h @@ -3,18 +3,29 @@ #include <QSyntaxHighlighter> -#ifdef _QCODE_EDIT_ -#include "qdocument.h" -#endif - class Highlighter : public QSyntaxHighlighter { public: -#ifdef _QCODE_EDIT_ - Highlighter(QDocument *parent); -#else - Highlighter(QTextDocument *parent); -#endif + enum state_e {NORMAL=-1,QUOTE,COMMENT}; + enum mode_e {NORMAL_MODE, ERROR_MODE}; + mode_e mode; + + QStringList operators; + QStringList KeyWords; + QStringList Primitives3D; + QStringList Primitives2D; + QStringList Transforms; + QStringList Imports; + QTextCharFormat ErrorStyle; + QTextCharFormat OperatorStyle; + QTextCharFormat CommentStyle; + QTextCharFormat QuoteStyle; + QTextCharFormat KeyWordStyle; + QTextCharFormat PrimitiveStyle3D; + QTextCharFormat PrimitiveStyle2D; + QTextCharFormat TransformStyle; + QTextCharFormat ImportStyle; + Highlighter(QTextDocument *parent, mode_e mode); void highlightBlock(const QString &text); }; diff --git a/src/mainwin.cc b/src/mainwin.cc index dde6761..af4a532 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -70,11 +70,6 @@ #include <QSettings> #include <QProgressDialog> #include <QMutexLocker> -#ifdef _QCODE_EDIT_ -#include "qdocument.h" -#include "qformatscheme.h" -#include "qlanguagefactory.h" -#endif #include <fstream> @@ -185,16 +180,8 @@ MainWindow::MainWindow(const QString &filename) fps = 0; fsteps = 1; - highlighter = NULL; -#ifdef _QCODE_EDIT_ - QFormatScheme *formats = new QFormatScheme("qxs/openscad.qxf"); - QDocument::setDefaultFormatScheme(formats); - QLanguageFactory *languages = new QLanguageFactory(formats,this); - languages->addDefinitionPath("qxs"); - languages->setLanguage(editor, "openscad"); -#else + highlighter = new Highlighter(editor->document(), Highlighter::NORMAL_MODE); editor->setTabStopWidth(30); -#endif editor->setLineWrapping(true); // Not designable this->glview->statusLabel = new QLabel(this); @@ -348,13 +335,8 @@ MainWindow::MainWindow(const QString &filename) updateRecentFileActions(); connect(editor->document(), SIGNAL(contentsChanged()), this, SLOT(animateUpdateDocChanged())); -#ifdef _QCODE_EDIT_ - connect(editor, SIGNAL(contentModified(bool)), this, SLOT(setWindowModified(bool))); - connect(editor, SIGNAL(contentModified(bool)), fileActionSave, SLOT(setEnabled(bool))); -#else connect(editor->document(), SIGNAL(modificationChanged(bool)), this, SLOT(setWindowModified(bool))); connect(editor->document(), SIGNAL(modificationChanged(bool)), fileActionSave, SLOT(setEnabled(bool))); -#endif connect(this->glview, SIGNAL(doAnimateUpdate()), this, SLOT(animateUpdate())); connect(Preferences::inst(), SIGNAL(requestRedraw()), this->glview, SLOT(updateGL())); @@ -483,12 +465,7 @@ void MainWindow::openFile(const QString &new_filename) { #ifdef ENABLE_MDI -#ifdef _QCODE_EDIT_ - if (this->editor->document()->lines() > 1 || - !this->editor->document()->text(true, false).trimmed().isEmpty()) { -#else if (!editor->toPlainText().isEmpty()) { -#endif new MainWindow(new_filename); clearCurrentOutput(); return; @@ -957,11 +934,7 @@ void MainWindow::hideEditor() void MainWindow::pasteViewportTranslation() { -#ifdef _QCODE_EDIT_ - QDocumentCursor cursor = editor->cursor(); -#else QTextCursor cursor = editor->textCursor(); -#endif QString txt; txt.sprintf("[ %.2f, %.2f, %.2f ]", -this->glview->object_trans_x, -this->glview->object_trans_y, -this->glview->object_trans_z); cursor.insertText(txt); @@ -969,11 +942,7 @@ void MainWindow::pasteViewportTranslation() void MainWindow::pasteViewportRotation() { -#ifdef _QCODE_EDIT_ - QDocumentCursor cursor = editor->cursor(); -#else QTextCursor cursor = editor->textCursor(); -#endif QString txt; txt.sprintf("[ %.2f, %.2f, %.2f ]", fmodf(360 - this->glview->object_rot_x + 90, 360), fmodf(360 - this->glview->object_rot_y, 360), fmodf(360 - this->glview->object_rot_z, 360)); @@ -1067,23 +1036,22 @@ bool MainWindow::compileTopLevelDocument(bool reload) QFileInfo(this->fileName).absolutePath().toLocal8Bit(), false); - // Error highlighting - delete this->highlighter; - this->highlighter = NULL; + // Syntax & Error highlighting if (!this->root_module) { - this->highlighter = new Highlighter(editor->document()); + if (highlighter->mode==Highlighter::NORMAL_MODE) { + delete this->highlighter; + highlighter = new Highlighter(editor->document(), Highlighter::ERROR_MODE); + } if (!animate_panel->isVisible()) { -#ifdef _QCODE_EDIT_ - QDocumentCursor cursor = editor->cursor(); - cursor.setPosition(parser_error_pos); -#else QTextCursor cursor = editor->textCursor(); cursor.setPosition(parser_error_pos); editor->setTextCursor(cursor); -#endif } + } else if (highlighter->mode==Highlighter::ERROR_MODE) { + delete this->highlighter; + this->highlighter = new Highlighter(editor->document(), Highlighter::NORMAL_MODE); } } |