diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/highlighter.cc | 90 | ||||
| -rw-r--r-- | src/highlighter.h | 21 | ||||
| -rw-r--r-- | src/mainwin.cc | 14 | 
3 files changed, 118 insertions, 7 deletions
| diff --git a/src/highlighter.cc b/src/highlighter.cc index ca4b4cf..6e51ecc 100644 --- a/src/highlighter.cc +++ b/src/highlighter.cc @@ -24,16 +24,103 @@   *   */ +// Syntax Highlight code by Chris Olah +  #include "highlighter.h"  #include "parsersettings.h" // extern int parser_error_pos; -Highlighter::Highlighter(QTextDocument *parent) +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; @@ -49,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 2eead6d..a6e2dc3 100644 --- a/src/highlighter.h +++ b/src/highlighter.h @@ -6,7 +6,26 @@  class Highlighter : public QSyntaxHighlighter  {  public: -	Highlighter(QTextDocument *parent); +	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 72254a3..af4a532 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -180,7 +180,7 @@ MainWindow::MainWindow(const QString &filename)  	fps = 0;  	fsteps = 1; -	highlighter = NULL; +	highlighter = new Highlighter(editor->document(), Highlighter::NORMAL_MODE);  	editor->setTabStopWidth(30);  	editor->setLineWrapping(true); // Not designable @@ -1036,18 +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()) {  				QTextCursor cursor = editor->textCursor();  				cursor.setPosition(parser_error_pos);  				editor->setTextCursor(cursor);  			} +		} else if (highlighter->mode==Highlighter::ERROR_MODE) { +			delete this->highlighter; +			this->highlighter = new Highlighter(editor->document(), Highlighter::NORMAL_MODE);  		}  	} | 
