diff --git a/ChangeLog b/ChangeLog index a46cdf3..5ca4809 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2017-01-31 23:04 + + * [r99] scripts/wt-mode.el, src/editor.hxx: + simple syntax highlighting + +2017-01-31 19:54 + + * [r98] COPYING, ChangeLog, INSTALL, src/editor.hxx[ADD], + src/makefile.am, src/testgui.hxx, src/testgui.ui: + added CodeEditor with line numbering from Qt sample code + 2017-01-31 17:32 * [r97] src/commands.hxx, src/webrunner.cxx: diff --git a/src/editor.hxx b/src/editor.hxx index 97ddcf5..dbb4d28 100644 --- a/src/editor.hxx +++ b/src/editor.hxx @@ -11,6 +11,8 @@ #include #include +#include + class Highlighter: public QSyntaxHighlighter { Q_OBJECT; Q_SIGNALS: @@ -29,8 +31,10 @@ class Highlighter: public QSyntaxHighlighter { QTextCharFormat fmt; if (QFile(m.captured(1)).exists()) { fmt.setForeground(Qt::darkGreen); + fmt.setFontWeight(QFont::Bold); } else { fmt.setForeground(Qt::darkRed); + fmt.setFontStrikeOut(true); } setFormat(m.capturedStart(1), m.capturedLength(1), fmt); include(m.captured(1)); @@ -47,6 +51,7 @@ class Highlighter: public QSyntaxHighlighter { Expression(QString s): re(s) {} Expression(QString s, QTextCharFormat f): re(s), fmt(f) {} Expression& weight(int w) {fmt.setFontWeight(w); return *this;} + Expression& strike(bool s=true) {fmt.setFontStrikeOut(s); return *this;} Expression& fg(const QBrush& b) {fmt.setForeground(b); return *this;} QRegularExpression re; QTextCharFormat fmt; @@ -70,6 +75,7 @@ class CodeEditor: public QPlainTextEdit { Q_OBJECT; Q_SIGNALS: void include(QString); + void link(QString); public: CodeEditor(QWidget *parent = 0): QPlainTextEdit(parent) { Highlighter *highlighter(new Highlighter(document())); @@ -111,6 +117,23 @@ class CodeEditor: public QPlainTextEdit { int space = 3 + fontMetrics().width(QLatin1Char('9')) * digits; return space; } + void mousePressEvent(QMouseEvent *e) { + clickedAnchor = (e->button() & Qt::LeftButton) + ? document()->findBlock(cursorForPosition(e->pos()).position()).text() + : QString(); + QPlainTextEdit::mousePressEvent(e); + } + void mouseReleaseEvent(QMouseEvent *e) { + if (e->button() & Qt::LeftButton && !clickedAnchor.isEmpty() + && document()->findBlock(cursorForPosition(e->pos()).position()).text() == clickedAnchor) { + static QRegularExpression inc("^ *include +([^ ].*.\\.wt)"); + QRegularExpressionMatch m(inc.match(clickedAnchor)); + if (m.hasMatch() && QFile(m.captured(1)).exists()) { + link(m.captured(1)); + } + } + QPlainTextEdit::mouseReleaseEvent(e); + } protected: void resizeEvent(QResizeEvent *e) override { QPlainTextEdit::resizeEvent(e); @@ -144,6 +167,7 @@ class CodeEditor: public QPlainTextEdit { } private: QWidget *lineNumberArea; + QString clickedAnchor; }; inline LineNumberArea::LineNumberArea(CodeEditor *editor): QWidget(editor) { diff --git a/src/scriptfile.hxx b/src/scriptfile.hxx index 9a3a231..7a3b9b5 100644 --- a/src/scriptfile.hxx +++ b/src/scriptfile.hxx @@ -7,12 +7,14 @@ class ScriptFile: public QDockWidget, protected Ui::ScriptFile { Q_OBJECT; Q_SIGNALS: + void link(QString); void include(QString); void close(ScriptFile*); public: ScriptFile(QWidget* p=0): QDockWidget(p) { setupUi(this); assert(connect(_editor, SIGNAL(include(QString)), SIGNAL(include(QString)))); + assert(connect(_editor, SIGNAL(link(QString)), SIGNAL(link(QString)))); _searchBar->hide(); _replaceBar->hide(); _pageBar->hide(); diff --git a/src/testgui.hxx b/src/testgui.hxx index 22fb565..5b18771 100644 --- a/src/testgui.hxx +++ b/src/testgui.hxx @@ -69,7 +69,8 @@ class TestGUI: public QMainWindow, protected Ui::TestGUI { SLOT(unsupportedContent(QNetworkReply*)))); assert(connect(page, SIGNAL(downloadRequested(const QNetworkRequest&)), SLOT(downloadRequested(const QNetworkRequest&)))); - assert(connect(_testscript, SIGNAL(include(QString)), SLOT(include(QString)))); + //assert(connect(_testscript, SIGNAL(include(QString)), SLOT(include(QString)))); + assert(connect(_testscript, SIGNAL(link(QString)), SLOT(include(QString)))); if (setupScript.size()) loadSetup(setupScript); if (scriptFile.size()) loadFile(scriptFile); } @@ -343,7 +344,8 @@ class TestGUI: public QMainWindow, protected Ui::TestGUI { 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(include(QString)), SLOT(include(QString)))); + assert(connect(_testscripts[name], SIGNAL(link(QString)), SLOT(include(QString)))); assert(connect(_testscripts[name], SIGNAL(close(ScriptFile*)), SLOT(remove(ScriptFile*)))); QFile file(name); try { @@ -354,10 +356,11 @@ class TestGUI: public QMainWindow, protected Ui::TestGUI { 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(w)); - w=qobject_cast(w->parent())); - if (d) d->raise(); + // QDockWidget* d(0); + // for (QWidget* w(QApplication::focusWidget()); w&&!(d=qobject_cast(w)); + // w=qobject_cast(w->parent())); + // if (d) d->raise(); + _testscripts[name]->raise(); } catch(const std::exception& x) { remove(_testscripts[name]); }