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();
49 void VuoCodeEditor::setFontSize(
int fontSize)
51 currentFontSize = fontSize;
54 QFont font(
"Menlo", fontSize);
57 QFontMetricsF fontMetrics(font);
58 qreal spaceWidth = fontMetrics.width(
' ');
59 qreal tabWidth = spacesPerTab * spaceWidth;
60 setTabStopWidth(ceil(tabWidth));
63 qreal pitch = (ceil(tabWidth) - tabWidth) / spacesPerTab;
64 font.setLetterSpacing(QFont::AbsoluteSpacing, pitch);
68 setCursorWidth(fontSize/5.);
86 foreach (
int fontSize, fontSizes)
87 if (fontSize > currentFontSize)
89 setFontSize(fontSize);
99 QList<int>::reverse_iterator i;
100 for (i = fontSizes.rbegin(); i != fontSizes.rend(); ++i)
101 if (*i < currentFontSize)
113 return currentFontSize == 11;
121 QTextCursor cursor = textCursor();
122 cursor.movePosition(QTextCursor::Start);
123 cursor.movePosition(QTextCursor::NextBlock, QTextCursor::MoveAnchor, lineNumber - 1);
126 cursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::MoveAnchor);
127 cursor.movePosition(QTextCursor::StartOfBlock, QTextCursor::KeepAnchor);
129 setTextCursor(cursor);
133 void VuoCodeEditor::keyPressEvent(QKeyEvent *event)
135 int key =
event->key();
136 Qt::KeyboardModifiers modifiers =
event->modifiers();
138 if (key == Qt::Key_Tab)
140 else if (key == Qt::Key_BracketRight
141 && modifiers & Qt::ControlModifier
142 && !(modifiers & Qt::ShiftModifier))
144 else if (key == Qt::Key_BracketLeft
145 && modifiers & Qt::ControlModifier
146 && !(modifiers & Qt::ShiftModifier))
148 else if (key == Qt::Key_Backtab)
150 else if (key == Qt::Key_Return
151 && !((modifiers & Qt::AltModifier) || (modifiers & Qt::ControlModifier)))
152 handleLinebreak(
false);
153 else if (key == Qt::Key_BraceRight)
155 else if (key == Qt::Key_Slash && modifiers & Qt::ControlModifier)
158 QTextEdit::keyPressEvent(event);
165 void VuoCodeEditor::handleTab(
bool forward)
167 QTextCursor cursor = textCursor();
169 if (!cursor.hasSelection())
172 cursor.insertText(
"\t");
176 cursor.beginEditBlock();
178 int selectionEnd = cursor.selectionEnd();
179 cursor.setPosition(cursor.selectionStart());
180 cursor.movePosition(QTextCursor::StartOfBlock);
184 cursor.insertText(
"\t");
188 if (toPlainText().at(cursor.position()) ==
'\t')
192 cursor.movePosition(QTextCursor::NextCharacter);
195 if (!cursor.movePosition(QTextCursor::NextBlock))
197 }
while (cursor.position() < selectionEnd);
199 cursor.endEditBlock();
206 void VuoCodeEditor::handleLinebreak(
bool dontBreakAtCursor)
208 QTextCursor cursor = textCursor();
209 cursor.beginEditBlock();
211 if (dontBreakAtCursor)
212 cursor.movePosition(QTextCursor::EndOfLine);
213 cursor.insertText(
"\n");
214 QTextCursor insertionCursor = cursor;
219 cursor.movePosition(QTextCursor::PreviousBlock);
220 while (toPlainText().at(cursor.position()) ==
'\t')
223 if (!cursor.movePosition(QTextCursor::NextCharacter))
228 cursor.movePosition(QTextCursor::StartOfBlock);
229 int startPos = cursor.position();
230 cursor.movePosition(QTextCursor::EndOfBlock);
231 while (toPlainText().at(cursor.position()).isSpace() && cursor.position() >= startPos)
232 if (!cursor.movePosition(QTextCursor::PreviousCharacter))
234 if (toPlainText().at(cursor.position()) ==
'{')
238 for (
int i = 0; i < indentLevel; ++i)
239 insertionCursor.insertText(
"\t");
241 cursor.endEditBlock();
245 setTextCursor(insertionCursor);
251 void VuoCodeEditor::handleBlockEnd()
253 QTextCursor cursor = textCursor();
254 cursor.beginEditBlock();
256 if (toPlainText().length()
257 && toPlainText().at(fmax(0, cursor.position() - 1)) ==
'\t')
258 cursor.deletePreviousChar();
260 cursor.insertText(
"}");
262 cursor.endEditBlock();
269 int VuoCodeEditor::toggleLineComment(QTextCursor &cursor)
271 cursor.movePosition(QTextCursor::StartOfBlock);
273 while (cursor.position() < toPlainText().length()
274 && toPlainText().at(cursor.position()).isSpace())
275 cursor.movePosition(QTextCursor::NextCharacter);
277 if (toPlainText().mid(cursor.position(), 2) ==
"//")
285 cursor.movePosition(QTextCursor::StartOfBlock);
286 cursor.insertText(
"//");
294 void VuoCodeEditor::handleComment()
296 QTextCursor cursor = textCursor();
297 cursor.beginEditBlock();
299 if (cursor.hasSelection())
301 int selectionEnd = cursor.selectionEnd();
302 cursor.setPosition(cursor.selectionStart());
304 int delta = toggleLineComment(cursor);
305 selectionEnd += delta;
306 if (!cursor.movePosition(QTextCursor::NextBlock))
308 }
while (cursor.position() < selectionEnd);
311 toggleLineComment(cursor);
313 cursor.endEditBlock();
316 void VuoCodeEditor::resizeEvent(QResizeEvent *event)
318 QTextEdit::resizeEvent(event);
319 gutter->resize(event->size());
322 int VuoCodeEditor::getCurrentLineNumber()
324 QTextCursor cursor = textCursor();
325 cursor.movePosition(QTextCursor::StartOfLine);
328 while (cursor.movePosition(QTextCursor::PreviousBlock))
334 void VuoCodeEditor::cursorPositionChanged()
337 QTextEdit::ExtraSelection selection;
339 selection.format.setProperty(QTextFormat::FullWidthSelection,
true);
340 selection.cursor = textCursor();
341 selection.cursor.clearSelection();
342 QList<QTextEdit::ExtraSelection> extraSelections;
343 extraSelections.append(selection);
344 setExtraSelections(extraSelections);
366 p.setColor(QPalette::Base, background);
368 p.setColor(QPalette::Active, QPalette::Highlight, isDark ?
"#12418c" :
"#74acec");
369 p.setColor(QPalette::Inactive, QPalette::Highlight, isDark ?
"#606060" :
"#e0e0e0");
370 p.setColor(QPalette::Active, QPalette::HighlightedText, isDark ?
"#c0c0c0" :
"#404040");
371 p.setColor(QPalette::Inactive, QPalette::HighlightedText, isDark ?
"#c0c0c0" :
"#404040");
413 setStyleSheet(VUO_QSTRINGIFY(
418 ).arg(background.name())
420 .arg(isDark ?
"#a0a0a0" :
"#606060"));
422 if (highlighter && isDark != this->isDark)
424 this->isDark = isDark;
426 highlighter->rehighlight();
427 cursorPositionChanged();