parent
32f090c2f0
commit
cb040f47a1
7 changed files with 172 additions and 24 deletions
@ -1 +1 @@ |
||||
/usr/share/automake-1.14/COPYING |
||||
/usr/share/automake-1.15/COPYING |
@ -1 +1 @@ |
||||
/usr/share/automake-1.14/INSTALL |
||||
/usr/share/automake-1.15/INSTALL |
@ -0,0 +1,107 @@ |
||||
#ifndef EDITOR_HXX |
||||
#define EDITOR_HXX |
||||
/// from qt http://doc.qt.io/qt-5/qtwidgets-widgets-codeeditor-example.html
|
||||
|
||||
#include <QPlainTextEdit> |
||||
#include <QPainter> |
||||
#include <QTextBlock> |
||||
#include <QResizeEvent> |
||||
|
||||
class CodeEditor; |
||||
|
||||
class LineNumberArea: public QWidget { |
||||
public: |
||||
LineNumberArea(CodeEditor *editor); |
||||
QSize sizeHint() const override; |
||||
protected: |
||||
void paintEvent(QPaintEvent *event) override; |
||||
private: |
||||
CodeEditor *codeEditor; |
||||
}; |
||||
|
||||
class CodeEditor: public QPlainTextEdit { |
||||
Q_OBJECT; |
||||
public: |
||||
CodeEditor(QWidget *parent = 0): QPlainTextEdit(parent) { |
||||
lineNumberArea = new LineNumberArea(this); |
||||
connect(this, SIGNAL(blockCountChanged(int)), this, SLOT(updateLineNumberAreaWidth(int))); |
||||
connect(this, SIGNAL(updateRequest(QRect,int)), this, SLOT(updateLineNumberArea(QRect,int))); |
||||
connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(highlightCurrentLine())); |
||||
updateLineNumberAreaWidth(0); |
||||
highlightCurrentLine(); |
||||
} |
||||
void lineNumberAreaPaintEvent(QPaintEvent *event) { |
||||
QPainter painter(lineNumberArea); |
||||
painter.fillRect(event->rect(), Qt::lightGray); |
||||
QTextBlock block = firstVisibleBlock(); |
||||
int blockNumber = block.blockNumber(); |
||||
int top = (int) blockBoundingGeometry(block).translated(contentOffset()).top(); |
||||
int bottom = top + (int) blockBoundingRect(block).height(); |
||||
while (block.isValid() && top <= event->rect().bottom()) { |
||||
if (block.isVisible() && bottom >= event->rect().top()) { |
||||
QString number = QString::number(blockNumber + 1); |
||||
painter.setPen(Qt::black); |
||||
painter.drawText(0, top, lineNumberArea->width(), fontMetrics().height(), |
||||
Qt::AlignRight, number); |
||||
} |
||||
block = block.next(); |
||||
top = bottom; |
||||
bottom = top + (int) blockBoundingRect(block).height(); |
||||
++blockNumber; |
||||
} |
||||
} |
||||
int lineNumberAreaWidth() { |
||||
int digits(1); |
||||
int max = qMax(1, blockCount()); |
||||
while (max >= 10) { |
||||
max /= 10; |
||||
++digits; |
||||
} |
||||
int space = 3 + fontMetrics().width(QLatin1Char('9')) * digits; |
||||
return space; |
||||
} |
||||
protected: |
||||
void resizeEvent(QResizeEvent *e) override { |
||||
QPlainTextEdit::resizeEvent(e); |
||||
QRect cr = contentsRect(); |
||||
lineNumberArea->setGeometry(QRect(cr.left(), cr.top(), lineNumberAreaWidth(), cr.height())); |
||||
} |
||||
private Q_SLOTS: |
||||
void updateLineNumberAreaWidth(int newBlockCount) { |
||||
setViewportMargins(lineNumberAreaWidth(), 0, 0, 0); |
||||
} |
||||
void highlightCurrentLine() { |
||||
QList<QTextEdit::ExtraSelection> extraSelections; |
||||
if (!isReadOnly()) { |
||||
QTextEdit::ExtraSelection selection; |
||||
QColor lineColor = QColor(Qt::yellow).lighter(160); |
||||
selection.format.setBackground(lineColor); |
||||
selection.format.setProperty(QTextFormat::FullWidthSelection, true); |
||||
selection.cursor = textCursor(); |
||||
selection.cursor.clearSelection(); |
||||
extraSelections.append(selection); |
||||
} |
||||
setExtraSelections(extraSelections); |
||||
} |
||||
void updateLineNumberArea(const QRect &rect, int dy) { |
||||
if (dy) |
||||
lineNumberArea->scroll(0, dy); |
||||
else |
||||
lineNumberArea->update(0, rect.y(), lineNumberArea->width(), rect.height()); |
||||
if (rect.contains(viewport()->rect())) |
||||
updateLineNumberAreaWidth(0); |
||||
} |
||||
private: |
||||
QWidget *lineNumberArea; |
||||
}; |
||||
|
||||
inline LineNumberArea::LineNumberArea(CodeEditor *editor): QWidget(editor) { |
||||
codeEditor = editor; |
||||
} |
||||
inline QSize LineNumberArea::sizeHint() const { |
||||
return QSize(codeEditor->lineNumberAreaWidth(), 0); |
||||
} |
||||
inline void LineNumberArea::paintEvent(QPaintEvent *event) { |
||||
codeEditor->lineNumberAreaPaintEvent(event); |
||||
} |
||||
#endif |
Loading…
Reference in new issue