open file by click on include line

master
Marc Wäckerlin 7 years ago
parent 2a0b44e768
commit 5de8a2c24e
  1. 11
      ChangeLog
  2. 24
      src/editor.hxx
  3. 2
      src/scriptfile.hxx
  4. 15
      src/testgui.hxx

@ -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 2017-01-31 17:32
* [r97] src/commands.hxx, src/webrunner.cxx: * [r97] src/commands.hxx, src/webrunner.cxx:

@ -11,6 +11,8 @@
#include <QRegularExpressionMatch> #include <QRegularExpressionMatch>
#include <cassert> #include <cassert>
#include <iostream>
class Highlighter: public QSyntaxHighlighter { class Highlighter: public QSyntaxHighlighter {
Q_OBJECT; Q_OBJECT;
Q_SIGNALS: Q_SIGNALS:
@ -29,8 +31,10 @@ class Highlighter: public QSyntaxHighlighter {
QTextCharFormat fmt; QTextCharFormat fmt;
if (QFile(m.captured(1)).exists()) { if (QFile(m.captured(1)).exists()) {
fmt.setForeground(Qt::darkGreen); fmt.setForeground(Qt::darkGreen);
fmt.setFontWeight(QFont::Bold);
} else { } else {
fmt.setForeground(Qt::darkRed); fmt.setForeground(Qt::darkRed);
fmt.setFontStrikeOut(true);
} }
setFormat(m.capturedStart(1), m.capturedLength(1), fmt); setFormat(m.capturedStart(1), m.capturedLength(1), fmt);
include(m.captured(1)); include(m.captured(1));
@ -47,6 +51,7 @@ class Highlighter: public QSyntaxHighlighter {
Expression(QString s): re(s) {} Expression(QString s): re(s) {}
Expression(QString s, QTextCharFormat f): re(s), fmt(f) {} Expression(QString s, QTextCharFormat f): re(s), fmt(f) {}
Expression& weight(int w) {fmt.setFontWeight(w); return *this;} 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;} Expression& fg(const QBrush& b) {fmt.setForeground(b); return *this;}
QRegularExpression re; QRegularExpression re;
QTextCharFormat fmt; QTextCharFormat fmt;
@ -70,6 +75,7 @@ class CodeEditor: public QPlainTextEdit {
Q_OBJECT; Q_OBJECT;
Q_SIGNALS: Q_SIGNALS:
void include(QString); void include(QString);
void link(QString);
public: public:
CodeEditor(QWidget *parent = 0): QPlainTextEdit(parent) { CodeEditor(QWidget *parent = 0): QPlainTextEdit(parent) {
Highlighter *highlighter(new Highlighter(document())); Highlighter *highlighter(new Highlighter(document()));
@ -111,6 +117,23 @@ class CodeEditor: public QPlainTextEdit {
int space = 3 + fontMetrics().width(QLatin1Char('9')) * digits; int space = 3 + fontMetrics().width(QLatin1Char('9')) * digits;
return space; 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: protected:
void resizeEvent(QResizeEvent *e) override { void resizeEvent(QResizeEvent *e) override {
QPlainTextEdit::resizeEvent(e); QPlainTextEdit::resizeEvent(e);
@ -144,6 +167,7 @@ class CodeEditor: public QPlainTextEdit {
} }
private: private:
QWidget *lineNumberArea; QWidget *lineNumberArea;
QString clickedAnchor;
}; };
inline LineNumberArea::LineNumberArea(CodeEditor *editor): QWidget(editor) { inline LineNumberArea::LineNumberArea(CodeEditor *editor): QWidget(editor) {

@ -7,12 +7,14 @@
class ScriptFile: public QDockWidget, protected Ui::ScriptFile { class ScriptFile: public QDockWidget, protected Ui::ScriptFile {
Q_OBJECT; Q_OBJECT;
Q_SIGNALS: Q_SIGNALS:
void link(QString);
void include(QString); void include(QString);
void close(ScriptFile*); void close(ScriptFile*);
public: public:
ScriptFile(QWidget* p=0): QDockWidget(p) { ScriptFile(QWidget* p=0): QDockWidget(p) {
setupUi(this); setupUi(this);
assert(connect(_editor, SIGNAL(include(QString)), SIGNAL(include(QString)))); assert(connect(_editor, SIGNAL(include(QString)), SIGNAL(include(QString))));
assert(connect(_editor, SIGNAL(link(QString)), SIGNAL(link(QString))));
_searchBar->hide(); _searchBar->hide();
_replaceBar->hide(); _replaceBar->hide();
_pageBar->hide(); _pageBar->hide();

@ -69,7 +69,8 @@ class TestGUI: public QMainWindow, protected Ui::TestGUI {
SLOT(unsupportedContent(QNetworkReply*)))); SLOT(unsupportedContent(QNetworkReply*))));
assert(connect(page, SIGNAL(downloadRequested(const QNetworkRequest&)), assert(connect(page, SIGNAL(downloadRequested(const QNetworkRequest&)),
SLOT(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 (setupScript.size()) loadSetup(setupScript);
if (scriptFile.size()) loadFile(scriptFile); if (scriptFile.size()) loadFile(scriptFile);
} }
@ -343,7 +344,8 @@ class TestGUI: public QMainWindow, protected Ui::TestGUI {
void include(QString name) { void include(QString name) {
if (_testscripts.contains(name)) return; if (_testscripts.contains(name)) return;
_testscripts[name] = new ScriptFile(this); _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*)))); assert(connect(_testscripts[name], SIGNAL(close(ScriptFile*)), SLOT(remove(ScriptFile*))));
QFile file(name); QFile file(name);
try { try {
@ -354,10 +356,11 @@ class TestGUI: public QMainWindow, protected Ui::TestGUI {
throw std::runtime_error("file read failed"); throw std::runtime_error("file read failed");
_testscripts[name]->name(name); _testscripts[name]->name(name);
tabifyDockWidget(_scriptDock, _testscripts[name]); tabifyDockWidget(_scriptDock, _testscripts[name]);
QDockWidget* d(0); // QDockWidget* d(0);
for (QWidget* w(QApplication::focusWidget()); w&&!(d=qobject_cast<QDockWidget*>(w)); // for (QWidget* w(QApplication::focusWidget()); w&&!(d=qobject_cast<QDockWidget*>(w));
w=qobject_cast<QWidget*>(w->parent())); // w=qobject_cast<QWidget*>(w->parent()));
if (d) d->raise(); // if (d) d->raise();
_testscripts[name]->raise();
} catch(const std::exception& x) { } catch(const std::exception& x) {
remove(_testscripts[name]); remove(_testscripts[name]);
} }

Loading…
Cancel
Save