- Tags haben jetzt einen Verlauf

- Suchfunktion hat jetzt weiter und zurück
- Tags mit Bindestrich werden erkannt
This commit is contained in:
2026-08-18 00:24:43 +02:00
parent 1422efdc2f
commit a942f8385b
12 changed files with 415 additions and 224 deletions

View File

@@ -7,9 +7,17 @@
#include <QApplication>
#include <QClipboard>
#include <QDateTime>
#include <QShortcut>
#include <QKeySequence>
// Tag names may contain letters, digits, underscore AND hyphen (e.g.
// [I2C-BUS]) - keep this in sync with the tagRe in serialworker.cpp, which
// is what actually decides whether a tag is detected/emitted in the first
// place. If the two regexes disagree, hyphenated tags can end up detected
// by one but not recognised as "having a tag" by the other (breaking either
// cyan highlighting or the tag filter).
const QRegularExpression RawView::s_tagRe(
R"(\[([A-Z][A-Z0-9_]*)\])", QRegularExpression::CaseInsensitiveOption);
R"(\[([A-Z][A-Z0-9_-]*)\])", QRegularExpression::CaseInsensitiveOption);
RawView::RawView(QWidget *parent)
: QWidget(parent)
@@ -30,6 +38,22 @@ void RawView::setupUi()
m_searchEdit->setPlaceholderText(tr("Search…"));
m_searchEdit->setClearButtonEnabled(true);
connect(m_searchEdit, &QLineEdit::textChanged, this, &RawView::onSearch);
connect(m_searchEdit, &QLineEdit::returnPressed, this, &RawView::findNext);
m_findPrevBtn = new QPushButton(tr(""), this);
m_findPrevBtn->setMaximumWidth(28);
m_findPrevBtn->setToolTip(tr("Previous match (Shift+F3)"));
connect(m_findPrevBtn, &QPushButton::clicked, this, &RawView::findPrevious);
m_findNextBtn = new QPushButton(tr(""), this);
m_findNextBtn->setMaximumWidth(28);
m_findNextBtn->setToolTip(tr("Next match (F3 / Enter)"));
connect(m_findNextBtn, &QPushButton::clicked, this, &RawView::findNext);
auto *nextShortcut = new QShortcut(QKeySequence(Qt::Key_F3), this);
connect(nextShortcut, &QShortcut::activated, this, &RawView::findNext);
auto *prevShortcut = new QShortcut(QKeySequence(Qt::SHIFT | Qt::Key_F3), this);
connect(prevShortcut, &QShortcut::activated, this, &RawView::findPrevious);
m_autoScrollCb = new QCheckBox(tr("Auto-scroll"), this);
m_autoScrollCb->setChecked(true); // default ON
@@ -47,6 +71,8 @@ void RawView::setupUi()
toolbar->addWidget(new QLabel(tr("Search:"), this));
toolbar->addWidget(m_searchEdit, 1);
toolbar->addWidget(m_findPrevBtn);
toolbar->addWidget(m_findNextBtn);
toolbar->addWidget(m_autoScrollCb);
toolbar->addWidget(m_lineCountLbl);
toolbar->addWidget(m_copyBtn);
@@ -122,18 +148,64 @@ void RawView::copyToClipboard()
QApplication::clipboard()->setText(m_textEdit->toPlainText());
}
bool RawView::searchAndSelect(const QString &text, QTextDocument::FindFlags flags, bool wrapAllowed)
{
if (text.isEmpty())
return false;
QTextDocument *doc = m_textEdit->document();
QTextCursor cursor = doc->find(text, m_textEdit->textCursor(), flags);
if (cursor.isNull() && wrapAllowed) {
// No further match in the search direction from here - wrap around
// to the start (or end, for backward search) and try once more so
// the user can keep pressing "next"/"previous" in a loop.
QTextCursor wrapCursor(doc);
if (flags.testFlag(QTextDocument::FindBackward))
wrapCursor.movePosition(QTextCursor::End);
cursor = doc->find(text, wrapCursor, flags);
}
if (cursor.isNull())
return false;
m_textEdit->setTextCursor(cursor);
return true;
}
void RawView::onSearch(const QString &text)
{
QTextDocument *doc = m_textEdit->document();
QTextCursor cursor = doc->find(text);
if (!cursor.isNull()) {
m_textEdit->setTextCursor(cursor);
m_searchEdit->setStyleSheet(QString());
} else if (!text.isEmpty()) {
m_searchEdit->setStyleSheet("background: #5c2222;");
} else {
if (text.isEmpty()) {
m_searchEdit->setStyleSheet(QString());
return;
}
// Whenever the search text itself changes, restart from the top of the
// document so editing the query doesn't leave the view stranded at
// wherever the cursor happened to be from a previous search.
QTextCursor cursor(m_textEdit->document());
m_textEdit->setTextCursor(cursor);
const bool found = searchAndSelect(text, {}, true);
m_searchEdit->setStyleSheet(found ? QString() : "background: #5c2222;");
}
void RawView::findNext()
{
const QString text = m_searchEdit->text();
if (text.isEmpty())
return;
const bool found = searchAndSelect(text, {}, true);
m_searchEdit->setStyleSheet(found ? QString() : "background: #5c2222;");
}
void RawView::findPrevious()
{
const QString text = m_searchEdit->text();
if (text.isEmpty())
return;
const bool found = searchAndSelect(text, QTextDocument::FindBackward, true);
m_searchEdit->setStyleSheet(found ? QString() : "background: #5c2222;");
}
void RawView::onScrollValueChanged(int value)