#include "mytextedit.h"
#include "linenumberwidget.h"
MyTextEdit
::MyTextEdit(QWidget * parent
) : QPlainTextEdit(parent)
, m_lineNumbersWidth(LN_BASE_WIDTH)
{
#if defined(Q_WS_X11)
font.setFamily("Monospace");
#else
font.setFamily("Courier New");
#endif
font.setPointSize(9);
setFont(font);
setViewportMargins(m_lineNumbersWidth, 0, 0, 0);
//setFrameStyle(QFrame::NoFrame);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
m_lineNumberWidget = new LineNumberWidget(this);
font.setPointSize(8); // <- added in build with 4.5.0
m_lineNumberWidget->setFont(font); // <- 4.5.0
QRect vr
= viewport
()->rect
();
m_lineNumberWidget->setGeometry(vr.left() + frameWidth(), vr.top() + frameWidth(), m_lineNumbersWidth, vr.height());
connect(this,
SIGNAL(updateRequest
(QRect,
int)),
this,
SLOT(slot_updateRequest
(QRect,
int)));
}
{
QPlainTextEdit::resizeEvent(e);
QRect vr
= viewport
()->rect
();
m_lineNumberWidget->setGeometry(vr.left() + frameWidth(), vr.top() + frameWidth(), m_lineNumbersWidth, vr.height());
}
void MyTextEdit
::lineNumberWidgetPaintEvent(QPaintEvent * e
) {
p.fillRect(e->rect(), c);
p.
setPen(QColor(175,
175,
75));
QRect vr
= viewport
()->rect
();
int top = (int)blockBoundingGeometry(block).translated(contentOffset()).top();
int bottom = top;
while (block.isValid() && top <= e->rect().bottom())
{
top = bottom;
bottom = top + (int)blockBoundingRect(block).height();
int offset = (fontMetrics().height() - fm.height())/2; // <- 4.5.0
p.drawText(2, top + offset, m_lineNumbersWidth - 4, fm.height(), Qt::AlignRight, number);
block = nextBlock;
}
}
void MyTextEdit
::slot_updateRequest(const QRect & rect,
int dy
) {
m_lineNumberWidget->scroll(0, dy);
m_lineNumberWidget->update(0, rect.y(), 36, rect.height());
}
#include "mytextedit.h"
#include "linenumberwidget.h"
MyTextEdit::MyTextEdit(QWidget * parent)
: QPlainTextEdit(parent)
, m_lineNumbersWidth(LN_BASE_WIDTH)
{
QFont font;
#if defined(Q_WS_X11)
font.setFamily("Monospace");
#else
font.setFamily("Courier New");
#endif
font.setPointSize(9);
setFont(font);
setViewportMargins(m_lineNumbersWidth, 0, 0, 0);
//setFrameStyle(QFrame::NoFrame);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
m_lineNumberWidget = new LineNumberWidget(this);
font.setPointSize(8); // <- added in build with 4.5.0
m_lineNumberWidget->setFont(font); // <- 4.5.0
QRect vr = viewport()->rect();
m_lineNumberWidget->setGeometry(vr.left() + frameWidth(), vr.top() + frameWidth(), m_lineNumbersWidth, vr.height());
connect(this, SIGNAL(updateRequest(QRect,int)), this, SLOT(slot_updateRequest(QRect,int)));
}
void MyTextEdit::resizeEvent(QResizeEvent * e)
{
QPlainTextEdit::resizeEvent(e);
QRect vr = viewport()->rect();
m_lineNumberWidget->setGeometry(vr.left() + frameWidth(), vr.top() + frameWidth(), m_lineNumbersWidth, vr.height());
}
void MyTextEdit::lineNumberWidgetPaintEvent(QPaintEvent * e)
{
QPainter p(m_lineNumberWidget);
QColor c(240, 240, 240);
p.fillRect(e->rect(), c);
p.setPen(QColor(175, 175, 75));
QRect vr = viewport()->rect();
QFontMetrics fm(p.fontMetrics());
QTextBlock block = firstVisibleBlock();
int top = (int)blockBoundingGeometry(block).translated(contentOffset()).top();
int bottom = top;
while (block.isValid() && top <= e->rect().bottom())
{
top = bottom;
bottom = top + (int)blockBoundingRect(block).height();
QTextBlock nextBlock = block.next();
QString number = QString::number(block.blockNumber() + 1);
int offset = (fontMetrics().height() - fm.height())/2; // <- 4.5.0
p.drawText(2, top + offset, m_lineNumbersWidth - 4, fm.height(), Qt::AlignRight, number);
block = nextBlock;
}
}
void MyTextEdit::slot_updateRequest(const QRect & rect, int dy)
{
m_lineNumberWidget->scroll(0, dy);
m_lineNumberWidget->update(0, rect.y(), 36, rect.height());
}
To copy to clipboard, switch view to plain text mode
Bookmarks