Test your websites with this simple GUI based scripted webtester. Generate simple testscripts directly from surfng on the webpage, enhance them with your commands, with variables, loops, checks, … and finally run automated web tests.
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
3.7 KiB
108 lines
3.7 KiB
7 years ago
|
#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
|