12 #include <sys/param.h>
19 qreal VuoCodeGutter::leftMargin = 5;
20 qreal VuoCodeGutter::rightMargin = 5;
31 lineNumberFont = QFont(
"Menlo");
33 connect(codeEditor, &QTextEdit::textChanged,
this, &VuoCodeGutter::textChanged);
34 connect(codeEditor->verticalScrollBar(), &QAbstractSlider::valueChanged,
this, &VuoCodeGutter::handleSliderMoved);
42 lineNumberFont.setPointSize(codeEditor->font().pointSize() * .8);
47 void VuoCodeGutter::paintEvent(QPaintEvent *event)
49 QRect r =
event->rect();
51 QPainter painter(
this);
55 painter.setFont(lineNumberFont);
56 QFontMetrics lineNumberFontMetrics(lineNumberFont);
57 int lineHeight = codeEditor->fontMetrics().height();
58 int baselineAdjustment = codeEditor->fontMetrics().ascent() - lineNumberFontMetrics.ascent();
59 int gutterWidth = width() - rightMargin;
64 QTextCursor cursor = codeEditor->textCursor();
65 cursor.movePosition(QTextCursor::Start);
66 QTextBlock block = cursor.block();
67 int viewportHeight = codeEditor->viewport()->geometry().height();
76 vector<VuoShaderIssues::Issue>::iterator issueIterator = issues.begin();
78 int iconSize = codeEditor->
errorIcon->height() / window()->devicePixelRatio();
83 qreal y = block.layout()->position().y() - scrollPosition;
86 if (y > viewportHeight)
89 painter.drawText(QRectF(0, y + baselineAdjustment + 1, gutterWidth, lineHeight),
90 Qt::AlignRight, QString::number(lineNumber));
92 bool haveIssue =
false;
93 while (issueIterator != issues.end())
95 if (issueIterator->lineNumber == lineNumber)
100 if (issueIterator->lineNumber > lineNumber)
105 painter.drawPixmap(leftMargin, y + (lineHeight - iconSize) / 2, iconSize, iconSize, *codeEditor->
errorIcon);
106 }
while ((block = block.next()).isValid());
110 void VuoCodeGutter::handleSliderMoved(
int value)
112 scrollPosition = value;
116 void VuoCodeGutter::textChanged()
122 void VuoCodeGutter::resizeEvent(QResizeEvent *event)
124 int lineNumberDigits =
MAX(2, log10(codeEditor->document()->lineCount()) + 1);
125 QFontMetrics lineNumberFontMetrics(lineNumberFont);
126 int iconSize = codeEditor->
errorIcon->height() / window()->devicePixelRatio();
127 int width = leftMargin + iconSize + leftMargin + lineNumberFontMetrics.width(
'0') * lineNumberDigits + rightMargin;
129 if (width == size().width())
132 QRect c = codeEditor->rect();
133 setGeometry(QRect(c.left(), c.top(), width, c.height()));
135 codeEditor->setViewportMargins(width, 0, 0, 0);
137 if (codeEditor->parent())