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
* [r97] src/commands.hxx, src/webrunner.cxx:

@ -11,6 +11,8 @@
#include <QRegularExpressionMatch>
#include <cassert>
#include <iostream>
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) {

@ -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();

@ -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<QDockWidget*>(w));
w=qobject_cast<QWidget*>(w->parent()));
if (d) d->raise();
// QDockWidget* d(0);
// for (QWidget* w(QApplication::focusWidget()); w&&!(d=qobject_cast<QDockWidget*>(w));
// w=qobject_cast<QWidget*>(w->parent()));
// if (d) d->raise();
_testscripts[name]->raise();
} catch(const std::exception& x) {
remove(_testscripts[name]);
}

Loading…
Cancel
Save