27 setAcceptRichText(
false);
29 setPlainText(initialSourceCode);
38 setLineWrapMode(QTextEdit::NoWrap);
40 fontSizes << 8 << 9 << 10 << 11 << 12 << 13 << 14 << 16 << 20 << 28 << 36 << 48;
43 connect(
this, &QTextEdit::cursorPositionChanged,
this, &VuoCodeEditor::cursorPositionChanged);
44 cursorPositionChanged();
49void VuoCodeEditor::setFontSize(
int fontSize)
51 currentFontSize = fontSize;
54 QFont font(
"Menlo", fontSize);
57 QFontMetricsF fontMetrics(font);
58 setTabStopDistance(spacesPerTab * fontMetrics.horizontalAdvance(
' '));
63 setCursorWidth(fontSize/5.);
81 foreach (
int fontSize, fontSizes)
82 if (fontSize > currentFontSize)
84 setFontSize(fontSize);
94 QList<int>::reverse_iterator i;
95 for (i = fontSizes.rbegin(); i != fontSizes.rend(); ++i)
96 if (*i < currentFontSize)
108 return currentFontSize == 11;
116 QTextCursor cursor = textCursor();
117 cursor.movePosition(QTextCursor::Start);
118 cursor.movePosition(QTextCursor::NextBlock, QTextCursor::MoveAnchor, lineNumber - 1);
121 cursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::MoveAnchor);
122 cursor.movePosition(QTextCursor::StartOfBlock, QTextCursor::KeepAnchor);
124 setTextCursor(cursor);
128void VuoCodeEditor::keyPressEvent(QKeyEvent *event)
130 int key =
event->key();
131 Qt::KeyboardModifiers modifiers =
event->modifiers();
133 if (key == Qt::Key_Tab)
135 else if (key == Qt::Key_BracketRight
136 && modifiers & Qt::ControlModifier
137 && !(modifiers & Qt::ShiftModifier))
139 else if (key == Qt::Key_BracketLeft
140 && modifiers & Qt::ControlModifier
141 && !(modifiers & Qt::ShiftModifier))
143 else if (key == Qt::Key_Backtab)
145 else if (key == Qt::Key_Return
146 && !((modifiers & Qt::AltModifier) || (modifiers & Qt::ControlModifier)))
147 handleLinebreak(
false);
148 else if (key == Qt::Key_BraceRight)
150 else if (key == Qt::Key_Slash && modifiers & Qt::ControlModifier)
153 QTextEdit::keyPressEvent(event);
160void VuoCodeEditor::handleTab(
bool forward)
162 QTextCursor cursor = textCursor();
164 if (!cursor.hasSelection())
167 cursor.insertText(
"\t");
171 cursor.beginEditBlock();
173 int selectionEnd = cursor.selectionEnd();
174 cursor.setPosition(cursor.selectionStart());
175 cursor.movePosition(QTextCursor::StartOfBlock);
179 cursor.insertText(
"\t");
183 if (toPlainText().at(cursor.position()) ==
'\t')
187 cursor.movePosition(QTextCursor::NextCharacter);
190 if (!cursor.movePosition(QTextCursor::NextBlock))
192 }
while (cursor.position() < selectionEnd);
194 cursor.endEditBlock();
201void VuoCodeEditor::handleLinebreak(
bool dontBreakAtCursor)
203 QTextCursor cursor = textCursor();
204 cursor.beginEditBlock();
206 if (dontBreakAtCursor)
207 cursor.movePosition(QTextCursor::EndOfLine);
208 cursor.insertText(
"\n");
209 QTextCursor insertionCursor = cursor;
214 cursor.movePosition(QTextCursor::PreviousBlock);
215 while (toPlainText().at(cursor.position()) ==
'\t')
218 if (!cursor.movePosition(QTextCursor::NextCharacter))
223 cursor.movePosition(QTextCursor::StartOfBlock);
224 int startPos = cursor.position();
225 cursor.movePosition(QTextCursor::EndOfBlock);
226 while (toPlainText().at(cursor.position()).isSpace() && cursor.position() >= startPos)
227 if (!cursor.movePosition(QTextCursor::PreviousCharacter))
229 if (toPlainText().at(cursor.position()) ==
'{')
233 for (
int i = 0; i < indentLevel; ++i)
234 insertionCursor.insertText(
"\t");
236 cursor.endEditBlock();
240 setTextCursor(insertionCursor);
246void VuoCodeEditor::handleBlockEnd()
248 QTextCursor cursor = textCursor();
249 cursor.beginEditBlock();
251 if (toPlainText().length()
252 && toPlainText().at(fmax(0, cursor.position() - 1)) ==
'\t')
253 cursor.deletePreviousChar();
255 cursor.insertText(
"}");
257 cursor.endEditBlock();
264int VuoCodeEditor::toggleLineComment(QTextCursor &cursor)
266 cursor.movePosition(QTextCursor::StartOfBlock);
268 while (cursor.position() < toPlainText().length()
269 && toPlainText().at(cursor.position()).isSpace())
270 cursor.movePosition(QTextCursor::NextCharacter);
272 if (toPlainText().mid(cursor.position(), 2) ==
"//")
280 cursor.movePosition(QTextCursor::StartOfBlock);
281 cursor.insertText(
"//");
289void VuoCodeEditor::handleComment()
291 QTextCursor cursor = textCursor();
292 cursor.beginEditBlock();
294 if (cursor.hasSelection())
296 int selectionEnd = cursor.selectionEnd();
297 cursor.setPosition(cursor.selectionStart());
299 int delta = toggleLineComment(cursor);
300 selectionEnd += delta;
301 if (!cursor.movePosition(QTextCursor::NextBlock))
303 }
while (cursor.position() < selectionEnd);
306 toggleLineComment(cursor);
308 cursor.endEditBlock();
311void VuoCodeEditor::resizeEvent(QResizeEvent *event)
313 QTextEdit::resizeEvent(event);
314 gutter->resize(event->size());
317int VuoCodeEditor::getCurrentLineNumber()
319 QTextCursor cursor = textCursor();
320 cursor.movePosition(QTextCursor::StartOfLine);
323 while (cursor.movePosition(QTextCursor::PreviousBlock))
329void VuoCodeEditor::cursorPositionChanged()
332 QTextEdit::ExtraSelection selection;
334 selection.format.setProperty(QTextFormat::FullWidthSelection,
true);
335 selection.cursor = textCursor();
336 selection.cursor.clearSelection();
337 QList<QTextEdit::ExtraSelection> extraSelections;
338 extraSelections.append(selection);
339 setExtraSelections(extraSelections);
361 p.setColor(QPalette::Base, background);
363 p.setColor(QPalette::Active, QPalette::Highlight, isDark ?
"#12418c" :
"#74acec");
364 p.setColor(QPalette::Inactive, QPalette::Highlight, isDark ?
"#606060" :
"#e0e0e0");
365 p.setColor(QPalette::Active, QPalette::HighlightedText, isDark ?
"#c0c0c0" :
"#404040");
366 p.setColor(QPalette::Inactive, QPalette::HighlightedText, isDark ?
"#c0c0c0" :
"#404040");
408 setStyleSheet(VUO_QSTRINGIFY(
413 ).arg(background.name())
415 .arg(isDark ?
"#a0a0a0" :
"#606060"));
417 if (highlighter && isDark != this->isDark)
419 this->isDark = isDark;
421 highlighter->rehighlight();
422 cursorPositionChanged();