added CodeEditor with line numbering from Qt sample code
This commit is contained in:
35
ChangeLog
35
ChangeLog
@@ -1,3 +1,38 @@
|
||||
2017-01-31 17:32
|
||||
|
||||
* [r97] src/commands.hxx, src/webrunner.cxx:
|
||||
better progress indicator
|
||||
|
||||
2017-01-30 15:09
|
||||
|
||||
* [r96] src/testgui.hxx, src/testgui.ui, src/webtester.cxx:
|
||||
fixed window title and file modification dialog
|
||||
|
||||
2017-01-27 15:57
|
||||
|
||||
* [r95] src/testgui.hxx, src/testgui.ui:
|
||||
url as combobox with completion
|
||||
|
||||
2017-01-24 14:17
|
||||
|
||||
* [r94] src/commands.hxx, src/testgui.hxx, src/testgui.ui:
|
||||
show test result as check mark or cross
|
||||
|
||||
2017-01-20 10:58
|
||||
|
||||
* [r93] doc/footer.html.in[ADD], doc/header.html.in[ADD],
|
||||
doc/plantuml.jar[ADD], doc/style.css[ADD],
|
||||
makefile_test.inc.am[ADD]:
|
||||
packager fixed - fix
|
||||
|
||||
2017-01-20 10:57
|
||||
|
||||
* [r92] ChangeLog, bootstrap.sh, build-in-docker.conf,
|
||||
debian/changelog.in, doc/footer.html.in[DEL],
|
||||
doc/header.html.in[DEL], doc/plantuml.jar[DEL],
|
||||
doc/style.css[DEL], makefile_test.inc.am[DEL]:
|
||||
packager fixed
|
||||
|
||||
2017-01-20 08:30
|
||||
|
||||
* [r91] COPYING, INSTALL, README, configure.ac, src/commands.hxx,
|
||||
|
107
src/editor.hxx
Normal file
107
src/editor.hxx
Normal file
@@ -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
|
@@ -9,7 +9,7 @@
|
||||
bin_PROGRAMS = webtester webrunner
|
||||
|
||||
webtester_MOCFILES = moc_testgui.cxx moc_commands.cxx moc_webpage.cxx \
|
||||
moc_networkaccessmanager.cxx
|
||||
moc_networkaccessmanager.cxx moc_editor.cxx
|
||||
webtester_UIFILES = ui_testgui.hxx
|
||||
webtester_SOURCES = version.cxx webtester.cxx exceptions.hxx version.hxx \
|
||||
${webtester_MOCFILES} ${webtester_UIFILES}
|
||||
|
@@ -8,6 +8,7 @@
|
||||
#define TESTGUI_HXX
|
||||
|
||||
#include <webpage.hxx>
|
||||
#include <editor.hxx>
|
||||
#include <commands.hxx>
|
||||
#include <QMainWindow>
|
||||
#include <QSettings>
|
||||
|
@@ -81,8 +81,8 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QWebView" name="_web" native="true">
|
||||
<property name="url" stdset="0">
|
||||
<widget class="QWebView" name="_web">
|
||||
<property name="url">
|
||||
<url>
|
||||
<string>about:blank</string>
|
||||
</url>
|
||||
@@ -97,12 +97,12 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>888</width>
|
||||
<height>20</height>
|
||||
<height>26</height>
|
||||
</rect>
|
||||
</property>
|
||||
<widget class="QMenu" name="menuViews">
|
||||
<property name="title">
|
||||
<string>Views</string>
|
||||
<string>&Views</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuFile">
|
||||
@@ -173,7 +173,7 @@
|
||||
</widget>
|
||||
<widget class="QDockWidget" name="_linksDock">
|
||||
<property name="windowTitle">
|
||||
<string>Links</string>
|
||||
<string>&Links</string>
|
||||
</property>
|
||||
<attribute name="dockWidgetArea">
|
||||
<number>2</number>
|
||||
@@ -238,7 +238,7 @@
|
||||
</widget>
|
||||
<widget class="QDockWidget" name="_executeDock">
|
||||
<property name="windowTitle">
|
||||
<string>Execute JavaScript on First Selected Item</string>
|
||||
<string>Execute &JavaScript on First Selected Item</string>
|
||||
</property>
|
||||
<attribute name="dockWidgetArea">
|
||||
<number>8</number>
|
||||
@@ -391,7 +391,7 @@ this.dispatchEvent(evObj);</string>
|
||||
</widget>
|
||||
<widget class="QDockWidget" name="_scriptDock">
|
||||
<property name="windowTitle">
|
||||
<string>Test Script</string>
|
||||
<string>&Test Script</string>
|
||||
</property>
|
||||
<attribute name="dockWidgetArea">
|
||||
<number>4</number>
|
||||
@@ -401,7 +401,7 @@ this.dispatchEvent(evObj);</string>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_6">
|
||||
<item>
|
||||
<widget class="QPlainTextEdit" name="_testscript"/>
|
||||
<widget class="CodeEditor" name="_testscript"/>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_8">
|
||||
@@ -529,7 +529,7 @@ this.dispatchEvent(evObj);</string>
|
||||
</widget>
|
||||
<widget class="QDockWidget" name="_logDock">
|
||||
<property name="windowTitle">
|
||||
<string>Script Run Log</string>
|
||||
<string>Scri&pt Run Log</string>
|
||||
</property>
|
||||
<attribute name="dockWidgetArea">
|
||||
<number>8</number>
|
||||
@@ -544,7 +544,7 @@ this.dispatchEvent(evObj);</string>
|
||||
</widget>
|
||||
<widget class="QDockWidget" name="_setupScriptDock">
|
||||
<property name="windowTitle">
|
||||
<string>Setup Script</string>
|
||||
<string>Set&up Script</string>
|
||||
</property>
|
||||
<attribute name="dockWidgetArea">
|
||||
<number>4</number>
|
||||
@@ -603,7 +603,7 @@ this.dispatchEvent(evObj);</string>
|
||||
</widget>
|
||||
<widget class="QDockWidget" name="_scriptCommandsDock">
|
||||
<property name="windowTitle">
|
||||
<string>Script Commands</string>
|
||||
<string>Script &Commands</string>
|
||||
</property>
|
||||
<attribute name="dockWidgetArea">
|
||||
<number>4</number>
|
||||
@@ -688,7 +688,7 @@ this.dispatchEvent(evObj);</string>
|
||||
</action>
|
||||
<action name="_actionOpen">
|
||||
<property name="text">
|
||||
<string>Open ...</string>
|
||||
<string>&Open ...</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+O</string>
|
||||
@@ -696,7 +696,7 @@ this.dispatchEvent(evObj);</string>
|
||||
</action>
|
||||
<action name="_actionSaveAs">
|
||||
<property name="text">
|
||||
<string>Save As ...</string>
|
||||
<string>Save &As ...</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+Shift+S</string>
|
||||
@@ -704,7 +704,7 @@ this.dispatchEvent(evObj);</string>
|
||||
</action>
|
||||
<action name="_actionQuit">
|
||||
<property name="text">
|
||||
<string>Quit</string>
|
||||
<string>&Quit</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+Q</string>
|
||||
@@ -712,7 +712,7 @@ this.dispatchEvent(evObj);</string>
|
||||
</action>
|
||||
<action name="_actionRun">
|
||||
<property name="text">
|
||||
<string>Run</string>
|
||||
<string>&Run</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+R</string>
|
||||
@@ -720,12 +720,12 @@ this.dispatchEvent(evObj);</string>
|
||||
</action>
|
||||
<action name="_actionRunLine">
|
||||
<property name="text">
|
||||
<string>Run Line</string>
|
||||
<string>Run &Line</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="_actionClear">
|
||||
<property name="text">
|
||||
<string>Clear</string>
|
||||
<string>&Clear</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="_actionLog">
|
||||
@@ -744,7 +744,7 @@ this.dispatchEvent(evObj);</string>
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Save</string>
|
||||
<string>&Save</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+S</string>
|
||||
@@ -755,7 +755,7 @@ this.dispatchEvent(evObj);</string>
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Revert to saved</string>
|
||||
<string>R&evert to saved</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+Shift+R</string>
|
||||
@@ -763,12 +763,12 @@ this.dispatchEvent(evObj);</string>
|
||||
</action>
|
||||
<action name="_actionOpenSetupScript">
|
||||
<property name="text">
|
||||
<string>Open Setup Script ...</string>
|
||||
<string>O&pen Setup Script ...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="_actionCommands">
|
||||
<property name="text">
|
||||
<string>Commands ...</string>
|
||||
<string>&Commands ...</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
@@ -778,6 +778,11 @@ this.dispatchEvent(evObj);</string>
|
||||
<extends>QWidget</extends>
|
||||
<header>QtWebKitWidgets/QWebView</header>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>CodeEditor</class>
|
||||
<extends>QPlainTextEdit</extends>
|
||||
<header>editor.hxx</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<tabstops>
|
||||
<tabstop>_load</tabstop>
|
||||
|
Reference in New Issue
Block a user