wireguard-tools/contrib/highlighter/gui/highlight.cpp
Jason A. Donenfeld ee88038986 contrib: introduce simple highlighter library
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2019-01-23 14:29:44 +01:00

90 lines
3 KiB
C++

#include <QApplication>
#include <QPlainTextEdit>
#include <QPalette>
#include <QFontDatabase>
#include <QVBoxLayout>
#include <QPushButton>
extern "C" {
#include "../highlighter.h"
}
static QColor colormap[] = {
[HighlightSection] = QColor("#ababab"),
[HighlightField] = QColor("#70c0b1"),
[HighlightPrivateKey] = QColor("#7aa6da"),
[HighlightPublicKey] = QColor("#7aa6da"),
[HighlightPresharedKey] = QColor("#7aa6da"),
[HighlightIP] = QColor("#b9ca4a"),
[HighlightCidr] = QColor("#e78c45"),
[HighlightHost] = QColor("#b9ca4a"),
[HighlightPort] = QColor("#e78c45"),
[HighlightMTU] = QColor("#c397d8"),
[HighlightKeepalive] = QColor("#c397d8"),
[HighlightComment] = QColor("#969896"),
[HighlightDelimiter] = QColor("#7aa6da"),
#ifndef MOBILE_WGQUICK_SUBSET
[HighlightTable] = QColor("#c397d8"),
[HighlightFwMark] = QColor("#c397d8"),
[HighlightSaveConfig] = QColor("#c397d8"),
[HighlightCmd] = QColor("#969896"),
#endif
[HighlightError] = QColor("#d54e53")
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget w;
w.setWindowTitle(QObject::tr("WireGuard Configuration Highlighter"));
QVBoxLayout v;
w.setLayout(&v);
QPlainTextEdit e;
v.addWidget(&e);
QPalette p(e.palette());
p.setColor(QPalette::Base, QColor("#010101"));
p.setColor(QPalette::Text, QColor("#eaeaea"));
e.setPalette(p);
QFont f(QFontDatabase::systemFont(QFontDatabase::FixedFont));
f.setPointSize(16);
e.setFont(f);
e.setMinimumSize(400, 500);
bool guard = false;
QObject::connect(&e, &QPlainTextEdit::textChanged, [&]() {
if (guard)
return;
struct highlight_span *spans = highlight_config(e.toPlainText().toLatin1().data());
if (!spans)
return;
QTextCursor cursor(e.document());
QTextCharFormat format;
cursor.beginEditBlock();
cursor.movePosition(QTextCursor::Start, QTextCursor::MoveAnchor);
cursor.movePosition(QTextCursor::End, QTextCursor::KeepAnchor);
format.setForeground(p.color(QPalette::Text));
format.setUnderlineStyle(QTextCharFormat::NoUnderline);
cursor.mergeCharFormat(format);
for (struct highlight_span *span = spans; span->type != HighlightEnd; ++span) {
cursor.movePosition(QTextCursor::Start, QTextCursor::MoveAnchor);
cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::MoveAnchor, span->start);
cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, span->len);
format.setForeground(colormap[span->type]);
format.setUnderlineStyle(span->type == HighlightError ? QTextCharFormat::SpellCheckUnderline : QTextCharFormat::NoUnderline);
cursor.mergeCharFormat(format);
}
free(spans);
guard = true;
cursor.endEditBlock();
guard = false;
});
QPushButton b;
v.addWidget(&b);
b.setText(QObject::tr("&Randomize colors"));
QObject::connect(&b, &QPushButton::clicked, [&]() {
for (size_t i = 0; i < sizeof(colormap) / sizeof(colormap[0]); ++i)
colormap[i] = QColor::fromHsl(qrand() % 360, qrand() % 192 + 64, qrand() % 128 + 128);
e.setPlainText(e.toPlainText());
});
w.show();
return a.exec();
}