automatically open include files in new tabs; show in syntax highlighting, whether a file is readable
This commit is contained in:
@@ -9,9 +9,12 @@
|
||||
#include <QSyntaxHighlighter>
|
||||
#include <QRegularExpression>
|
||||
#include <QRegularExpressionMatch>
|
||||
#include <cassert>
|
||||
|
||||
class Highlighter: public QSyntaxHighlighter {
|
||||
Q_OBJECT;
|
||||
Q_SIGNALS:
|
||||
void include(QString);
|
||||
public:
|
||||
Highlighter(QTextDocument *parent): QSyntaxHighlighter(parent) {
|
||||
QString commands="auth|ca-certificate|call|case|check|clear-cookies|click|clicktype|client-certificate|do|download|echo|execute|exists|exit|expect|fail|for|function|if|ignoreto|include|label|load|not|offline-storage-path|open|screenshot|set|setvalue|sleep|testcase|testsuite|timeout|unset|upload";
|
||||
@@ -20,6 +23,18 @@ class Highlighter: public QSyntaxHighlighter {
|
||||
}
|
||||
protected:
|
||||
void highlightBlock(const QString &text) {
|
||||
static QRegularExpression inc("^ *include +([^ ].*.\\.wt)");
|
||||
QRegularExpressionMatch m(inc.match(text));
|
||||
if (m.hasMatch()) {
|
||||
QTextCharFormat fmt;
|
||||
if (QFile(m.captured(1)).exists()) {
|
||||
fmt.setForeground(Qt::darkGreen);
|
||||
} else {
|
||||
fmt.setForeground(Qt::darkRed);
|
||||
}
|
||||
setFormat(m.capturedStart(1), m.capturedLength(1), fmt);
|
||||
include(m.captured(1));
|
||||
}
|
||||
for (auto e: _expressions) {
|
||||
auto m(e.re.match(text));
|
||||
for (int i(0); i<=m.lastCapturedIndex(); ++i) {
|
||||
@@ -53,13 +68,16 @@ class LineNumberArea: public QWidget {
|
||||
|
||||
class CodeEditor: public QPlainTextEdit {
|
||||
Q_OBJECT;
|
||||
Q_SIGNALS:
|
||||
void include(QString);
|
||||
public:
|
||||
CodeEditor(QWidget *parent = 0): QPlainTextEdit(parent) {
|
||||
new Highlighter(document());
|
||||
Highlighter *highlighter(new Highlighter(document()));
|
||||
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()));
|
||||
assert(connect(this, SIGNAL(blockCountChanged(int)), SLOT(updateLineNumberAreaWidth(int))));
|
||||
assert(connect(this, SIGNAL(updateRequest(QRect,int)), SLOT(updateLineNumberArea(QRect,int))));
|
||||
assert(connect(this, SIGNAL(cursorPositionChanged()), SLOT(highlightCurrentLine())));
|
||||
assert(connect(highlighter, SIGNAL(include(QString)), SIGNAL(include(QString))));
|
||||
updateLineNumberAreaWidth(0);
|
||||
highlightCurrentLine();
|
||||
}
|
||||
|
@@ -8,9 +8,9 @@
|
||||
|
||||
bin_PROGRAMS = webtester webrunner
|
||||
|
||||
webtester_MOCFILES = moc_testgui.cxx moc_commands.cxx moc_webpage.cxx \
|
||||
webtester_MOCFILES = moc_testgui.cxx moc_scriptfile.cxx moc_commands.cxx moc_webpage.cxx \
|
||||
moc_networkaccessmanager.cxx moc_editor.cxx
|
||||
webtester_UIFILES = ui_testgui.hxx
|
||||
webtester_UIFILES = ui_testgui.hxx ui_scriptfile.hxx
|
||||
webtester_SOURCES = version.cxx webtester.cxx exceptions.hxx version.hxx \
|
||||
${webtester_MOCFILES} ${webtester_UIFILES}
|
||||
|
||||
|
@@ -10,6 +10,7 @@
|
||||
#include <webpage.hxx>
|
||||
#include <editor.hxx>
|
||||
#include <commands.hxx>
|
||||
#include <scriptfile.hxx>
|
||||
#include <QMainWindow>
|
||||
#include <QSettings>
|
||||
#include <QWebFrame>
|
||||
@@ -63,11 +64,12 @@ class TestGUI: public QMainWindow, protected Ui::TestGUI {
|
||||
_web->installEventFilter(this); // track mouse and keyboard
|
||||
page->setForwardUnsupportedContent(true);
|
||||
_commands->setText(Script().commands(Script::HTML));
|
||||
connect(page, SIGNAL(uploadFile(QString)), SLOT(uploadFile(QString)));
|
||||
connect(page, SIGNAL(unsupportedContent(QNetworkReply*)),
|
||||
SLOT(unsupportedContent(QNetworkReply*)));
|
||||
connect(page, SIGNAL(downloadRequested(const QNetworkRequest&)),
|
||||
SLOT(downloadRequested(const QNetworkRequest&)));
|
||||
assert(connect(page, SIGNAL(uploadFile(QString)), SLOT(uploadFile(QString))));
|
||||
assert(connect(page, SIGNAL(unsupportedContent(QNetworkReply*)),
|
||||
SLOT(unsupportedContent(QNetworkReply*))));
|
||||
assert(connect(page, SIGNAL(downloadRequested(const QNetworkRequest&)),
|
||||
SLOT(downloadRequested(const QNetworkRequest&))));
|
||||
assert(connect(_testscript, SIGNAL(include(QString)), SLOT(include(QString))));
|
||||
if (setupScript.size()) loadSetup(setupScript);
|
||||
if (scriptFile.size()) loadFile(scriptFile);
|
||||
}
|
||||
@@ -338,6 +340,32 @@ class TestGUI: public QMainWindow, protected Ui::TestGUI {
|
||||
if (!vb) return;
|
||||
vb->setValue(vb->maximum());
|
||||
}
|
||||
void include(QString name) {
|
||||
if (_testscripts.contains(name)) return;
|
||||
_testscripts[name] = new ScriptFile(this);
|
||||
assert(connect(_testscripts[name], SIGNAL(include(QString)), SLOT(include(QString))));
|
||||
assert(connect(_testscripts[name], SIGNAL(close(ScriptFile*)), SLOT(remove(ScriptFile*))));
|
||||
QFile file(name);
|
||||
try {
|
||||
if (!file.open(QIODevice::ReadOnly|QIODevice::Text))
|
||||
throw std::runtime_error("file open failed");
|
||||
_testscripts[name]->editor()->setPlainText(QString::fromUtf8(file.readAll()));
|
||||
if (file.error()!=QFileDevice::NoError)
|
||||
throw std::runtime_error("file read failed");
|
||||
_testscripts[name]->name(name);
|
||||
tabifyDockWidget(_scriptDock, _testscripts[name]);
|
||||
QDockWidget* d(0);
|
||||
for (QWidget* w(QApplication::focusWidget()); w&&!(d=qobject_cast<QDockWidget*>(w));
|
||||
w=qobject_cast<QWidget*>(w->parent()));
|
||||
if (d) d->raise();
|
||||
} catch(const std::exception& x) {
|
||||
remove(_testscripts[name]);
|
||||
}
|
||||
}
|
||||
void remove(ScriptFile* scriptfile) {
|
||||
_testscripts.remove(scriptfile->name());
|
||||
delete scriptfile;
|
||||
}
|
||||
protected:
|
||||
void closeEvent(QCloseEvent* event) {
|
||||
QSettings settings("mrw", "webtester");
|
||||
@@ -452,7 +480,7 @@ class TestGUI: public QMainWindow, protected Ui::TestGUI {
|
||||
void loadFile(QString name) {
|
||||
QFile file(name);
|
||||
try {
|
||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
|
||||
if (!file.open(QIODevice::ReadOnly|QIODevice::Text))
|
||||
throw std::runtime_error("file open failed");
|
||||
_testscript->setPlainText(QString::fromUtf8(file.readAll()));
|
||||
if (file.error()!=QFileDevice::NoError)
|
||||
@@ -900,6 +928,7 @@ class TestGUI: public QMainWindow, protected Ui::TestGUI {
|
||||
bool _typing; // user is typing
|
||||
bool _inEventFilter; // actually handling event filter
|
||||
Script _setupScript;
|
||||
QMap<QString, ScriptFile*> _testscripts;
|
||||
};
|
||||
|
||||
#endif // TESTGUI_HXX
|
||||
|
@@ -134,7 +134,7 @@
|
||||
<widget class="QStatusBar" name="statusbar"/>
|
||||
<widget class="QDockWidget" name="_domDock">
|
||||
<property name="windowTitle">
|
||||
<string>DOM Tree</string>
|
||||
<string>D&OM Tree</string>
|
||||
</property>
|
||||
<attribute name="dockWidgetArea">
|
||||
<number>2</number>
|
||||
@@ -158,7 +158,7 @@
|
||||
</widget>
|
||||
<widget class="QDockWidget" name="_sourceDock">
|
||||
<property name="windowTitle">
|
||||
<string>HTML Source</string>
|
||||
<string>HTML &Source</string>
|
||||
</property>
|
||||
<attribute name="dockWidgetArea">
|
||||
<number>8</number>
|
||||
@@ -596,7 +596,7 @@ this.dispatchEvent(evObj);</string>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPlainTextEdit" name="_setupscript"/>
|
||||
<widget class="CodeEditor" name="_setupscript"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
|
Reference in New Issue
Block a user