openscad/src/scintillaeditor.cpp

203 lines
5.3 KiB
C++
Raw Normal View History

2014-06-07 17:29:40 +04:00
#include <QString>
#include <QChar>
2014-06-07 19:19:38 +04:00
#include "scintillaeditor.h"
2014-06-17 19:34:54 +04:00
#include "Preferences.h"
2014-06-07 19:19:38 +04:00
2014-06-07 19:22:14 +04:00
ScintillaEditor::ScintillaEditor(QWidget *parent) : EditorInterface(parent)
2014-06-07 19:19:38 +04:00
{
2014-06-07 19:22:14 +04:00
scintillaLayout = new QVBoxLayout(this);
qsci = new QsciScintilla(this);
2014-06-13 04:40:47 +04:00
scintillaLayout->setContentsMargins(0, 0, 0, 0);
2014-06-07 19:22:14 +04:00
scintillaLayout->addWidget(qsci);
2014-06-11 14:29:05 +04:00
qsci->setBraceMatching (QsciScintilla::SloppyBraceMatch);
qsci->setWrapMode(QsciScintilla::WrapWord);
2014-06-12 12:01:28 +04:00
qsci->setWrapVisualFlags(QsciScintilla::WrapFlagByText, QsciScintilla::WrapFlagByText, 0);
qsci->setAutoIndent(true);
2014-06-12 18:56:18 +04:00
qsci->indicatorDefine(QsciScintilla::RoundBoxIndicator, indicatorNumber);
qsci->markerDefine(QsciScintilla::Circle, markerNumber);
2014-06-20 10:37:40 +04:00
qsci->setUtf8(true);
2014-06-19 21:23:00 +04:00
preferenceEditorOption = Preferences::inst()->getValue("editor/syntaxhighlight").toString();
lexer = new ScadLexer(this);
2014-06-11 14:29:05 +04:00
initFont();
2014-06-20 10:37:40 +04:00
initLexer();
initMargin();
qsci->setCaretLineVisible(true);
this->setHighlightScheme(preferenceEditorOption);
2014-06-07 19:19:38 +04:00
}
2014-06-07 19:22:14 +04:00
void ScintillaEditor::indentSelection()
{
2014-06-12 12:01:28 +04:00
2014-06-07 19:22:14 +04:00
}
void ScintillaEditor::unindentSelection()
2014-06-07 17:29:40 +04:00
{
}
2014-06-07 19:22:14 +04:00
void ScintillaEditor::commentSelection()
2014-06-11 14:29:05 +04:00
{
}
2014-06-07 19:22:14 +04:00
void ScintillaEditor::uncommentSelection()
2014-06-11 14:29:05 +04:00
{
}
2014-06-07 19:22:14 +04:00
void ScintillaEditor::setPlainText(const QString &text)
2014-06-07 17:29:40 +04:00
{
qsci->setText(text);
}
2014-06-13 04:40:47 +04:00
2014-06-07 17:29:40 +04:00
QString ScintillaEditor::toPlainText()
{
return qsci->text();
}
2014-06-13 04:40:47 +04:00
2014-06-07 19:22:14 +04:00
void ScintillaEditor::highlightError(int error_pos)
2014-06-11 14:29:05 +04:00
{
2014-06-12 12:01:28 +04:00
int line, index;
qsci->lineIndexFromPosition(error_pos, &line, &index);
2014-06-12 18:56:18 +04:00
qsci->fillIndicatorRange(line, index, line, index+1, indicatorNumber);
2014-06-12 12:01:28 +04:00
qsci->setIndicatorForegroundColor(QColor(255,0,0,100));
2014-06-12 18:56:18 +04:00
qsci->markerAdd(line, markerNumber);
2014-06-11 14:29:05 +04:00
}
2014-06-13 04:40:47 +04:00
2014-06-07 19:22:14 +04:00
void ScintillaEditor::unhighlightLastError()
2014-06-11 14:29:05 +04:00
{
2014-06-12 18:56:18 +04:00
int totalLength = qsci->text().length();
2014-06-12 12:01:28 +04:00
int line, index;
2014-06-12 18:56:18 +04:00
qsci->lineIndexFromPosition(totalLength, &line, &index);
qsci->clearIndicatorRange(0, 0, line, index, indicatorNumber);
qsci->markerDeleteAll(markerNumber);
2014-06-11 14:29:05 +04:00
}
2014-06-13 04:40:47 +04:00
2014-06-19 21:23:00 +04:00
void ScintillaEditor::forLightBackground()
{
2014-06-20 10:37:40 +04:00
lexer->setPaper("#fff");
2014-06-19 21:23:00 +04:00
lexer->setColor(QColor("#272822")); // -> Style: Default text
2014-06-20 10:37:40 +04:00
lexer->setColor(QColor("#ff00ff"), QsciLexerCPP::Keyword); // -> Style: Keyword
lexer->setColor(QColor("#00f0f0"), QsciLexerCPP::KeywordSet2); // -> Style: KeywordSet2
2014-06-19 21:23:00 +04:00
lexer->setColor(Qt::blue, QsciLexerCPP::CommentDocKeyword); // -> used in comments only like /*! \cube */
2014-06-20 10:37:40 +04:00
lexer->setColor(QColor("#00d000"), QsciLexerCPP::GlobalClass); // -> Style: GlobalClass
lexer->setColor(QColor("#111111"), QsciLexerCPP::Operator);
lexer->setColor(QColor("#808000"), QsciLexerCPP::DoubleQuotedString);
lexer->setColor(QColor("#0000d0"), QsciLexerCPP::CommentLine);
lexer->setColor(QColor("#800080"), QsciLexerCPP::Number);
2014-06-19 21:23:00 +04:00
qsci->setMarkerBackgroundColor(QColor(255, 0, 0, 100), markerNumber);
qsci->setCaretLineBackgroundColor(QColor("#ffe4e4"));
2014-06-20 10:37:40 +04:00
qsci->setMarginsBackgroundColor(QColor("#ccc"));
qsci->setMarginsForegroundColor(QColor("#111"));
2014-06-19 21:23:00 +04:00
}
void ScintillaEditor::forDarkBackground()
{
lexer->setPaper(QColor("#272822"));
2014-06-20 10:37:40 +04:00
lexer->setColor(QColor(Qt::white));
lexer->setColor(QColor("#f12971"), QsciLexerCPP::Keyword);
lexer->setColor(QColor("#56dbf0"),QsciLexerCPP::KeywordSet2);
lexer->setColor(QColor("#ccdf32"), QsciLexerCPP::CommentDocKeyword);
lexer->setColor(QColor("#56d8f0"), QsciLexerCPP::GlobalClass);
lexer->setColor(QColor("#d8d8d8"), QsciLexerCPP::Operator);
lexer->setColor(QColor("#e6db74"), QsciLexerCPP::DoubleQuotedString);
lexer->setColor(QColor("#e6db74"), QsciLexerCPP::CommentLine);
lexer->setColor(QColor("#af7dff"), QsciLexerCPP::Number);
qsci->setCaretLineBackgroundColor(QColor(104,225,104, 127));
qsci->setMarkerBackgroundColor(QColor(255, 0, 0, 100), markerNumber);
qsci->setMarginsBackgroundColor(QColor("20,20,20,150"));
qsci->setMarginsForegroundColor(QColor("#fff"));
2014-06-19 21:23:00 +04:00
2014-06-20 10:37:40 +04:00
}
void ScintillaEditor::noColor()
{
lexer->setPaper(Qt::white);
lexer->setColor(Qt::black);
qsci->setMarginsBackgroundColor(QColor("#ccc"));
qsci->setMarginsForegroundColor(QColor("#111"));
}
2014-06-07 19:22:14 +04:00
void ScintillaEditor::setHighlightScheme(const QString &name)
2014-06-11 14:29:05 +04:00
{
2014-06-19 21:23:00 +04:00
if(name == "For Light Background")
{
forLightBackground();
}
else if(name == "For Dark Background")
{
forDarkBackground();
}
2014-06-20 10:37:40 +04:00
else if(name == "Off")
{
noColor();
}
2014-06-11 14:29:05 +04:00
}
2014-06-13 04:40:47 +04:00
2014-06-07 19:22:14 +04:00
void ScintillaEditor::insertPlainText(const QString &text)
2014-06-07 17:29:40 +04:00
{
qsci->setText(text);
}
2014-06-07 19:22:14 +04:00
void ScintillaEditor::undo()
{
qsci->undo();
}
void ScintillaEditor::redo()
{
qsci->redo();
}
void ScintillaEditor::cut()
{
qsci->cut();
}
void ScintillaEditor::copy()
{
qsci->copy();
}
void ScintillaEditor::paste()
{
qsci->paste();
}
void ScintillaEditor::zoomIn()
{
qsci->zoomIn();
}
void ScintillaEditor::zoomOut()
{
qsci->zoomOut();
}
2014-06-11 14:29:05 +04:00
void ScintillaEditor::initFont()
{
2014-06-20 10:37:40 +04:00
QFont font("inconsolata", 12);
2014-06-11 14:29:05 +04:00
font.setFixedPitch(true);
qsci->setFont(font);
}
2014-06-20 10:37:40 +04:00
void ScintillaEditor::initLexer()
{
lexer->setFont(qsci->font());
qsci->setLexer(lexer);
}
2014-06-11 14:29:05 +04:00
void ScintillaEditor::initMargin()
{
QFontMetrics fontmetrics = QFontMetrics(qsci->font());
qsci->setMarginsFont(qsci->font());
qsci->setMarginWidth(0, fontmetrics.width(QString::number(qsci->lines())) + 6);
qsci->setMarginLineNumbers(0, true);
connect(qsci, SIGNAL(textChanged()), this, SLOT(onTextChanged()));
}
void ScintillaEditor::onTextChanged()
{
QFontMetrics fontmetrics = qsci->fontMetrics();
qsci->setMarginWidth(0, fontmetrics.width(QString::number(qsci->lines())) + 6);
}