void CodeEditor::repaintLineNumberArea() { //repaint QRect lineNumberAreaRect(lineNumberArea->x(), lineNumberArea->y(), lineNumberArea->width(), lineNumberArea->height()); emit updateRequest(lineNumberAreaRect, 0); }
// returns the width of the line number area int HighlightingItemDelegate::drawLineNumber(QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect, const QModelIndex &index) const { static const int lineNumberAreaHorizontalPadding = 4; const int lineNumber = index.model()->data(index, int(HighlightingItemRole::LineNumber)).toInt(); if (lineNumber < 1) return 0; const bool isSelected = option.state & QStyle::State_Selected; const QString lineText = QString::number(lineNumber); const int minimumLineNumberDigits = qMax(kMinimumLineNumberDigits, lineText.count()); const int fontWidth = painter->fontMetrics().horizontalAdvance(QString(minimumLineNumberDigits, '0')); const int lineNumberAreaWidth = lineNumberAreaHorizontalPadding + fontWidth + lineNumberAreaHorizontalPadding; QRect lineNumberAreaRect(rect); lineNumberAreaRect.setWidth(lineNumberAreaWidth); QPalette::ColorGroup cg = QPalette::Normal; if (!(option.state & QStyle::State_Active)) cg = QPalette::Inactive; else if (!(option.state & QStyle::State_Enabled)) cg = QPalette::Disabled; painter->fillRect(lineNumberAreaRect, QBrush(isSelected ? option.palette.brush(cg, QPalette::Highlight) : option.palette.color(cg, QPalette::Base).darker(111))); QStyleOptionViewItem opt = option; opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; opt.palette.setColor(cg, QPalette::Text, Qt::darkGray); const QStyle *style = QApplication::style(); const int textMargin = style->pixelMetric(QStyle::PM_FocusFrameHMargin, nullptr, nullptr) + 1; const QRect rowRect = lineNumberAreaRect.adjusted(-textMargin, 0, textMargin - lineNumberAreaHorizontalPadding, 0); QItemDelegate::drawDisplay(painter, opt, rowRect, lineText); return lineNumberAreaWidth; }
void CodeEditor::updateDebugLine(int number) { //number > 0 => highlight line //number == -1 => exit from debug mode //number == -2 => does not highlight any line, but does not exit from debug mode //last case for waiting program stops on next instruction or breakpoint if (number == -1) setDebugMode(false); else setDebugMode(true); if (number != -2) currentDebugLine = number; //create rectangle of line number area and highlight debug line throw updateRequest() QRect lineNumberAreaRect(lineNumberArea->x(), lineNumberArea->y(), lineNumberArea->width(), lineNumberArea->height()); emit updateRequest(lineNumberAreaRect, 0); highlightDebugLine(number); highlightCurrentLine(); }