From d79a43d62b0bddea9444a767b6b3c853258e9ce0 Mon Sep 17 00:00:00 2001 From: Willem Melching Date: Fri, 10 Mar 2023 20:20:59 +0100 Subject: [PATCH] cabana: autocomplete signal names (#27553) old-commit-hash: c32a45b5b59396d7c7b90ede8db4e8ad678f39c5 --- tools/cabana/dbcmanager.cc | 13 +++++++++++++ tools/cabana/dbcmanager.h | 1 + tools/cabana/signaledit.cc | 9 +++++++++ 3 files changed, 23 insertions(+) diff --git a/tools/cabana/dbcmanager.cc b/tools/cabana/dbcmanager.cc index e9ebcd2791..b3a90e0b70 100644 --- a/tools/cabana/dbcmanager.cc +++ b/tools/cabana/dbcmanager.cc @@ -178,6 +178,19 @@ void DBCManager::removeSignal(const MessageId &id, const QString &sig_name) { } } +QStringList DBCManager::signalNames() { + // Used for autocompletion + QStringList ret; + for (auto const& [_, msg] : msgs) { + for (auto sig: msg.getSignals()) { + ret << sig->name; + } + } + ret.sort(); + ret.removeDuplicates(); + return ret; +} + DBCManager *dbc() { static DBCManager dbc_manager(nullptr); return &dbc_manager; diff --git a/tools/cabana/dbcmanager.h b/tools/cabana/dbcmanager.h index 3b222b1dcb..4be7593808 100644 --- a/tools/cabana/dbcmanager.h +++ b/tools/cabana/dbcmanager.h @@ -30,6 +30,7 @@ public: auto it = msgs.find(address); return it != msgs.end() ? &it->second : nullptr; } + QStringList signalNames(); signals: void signalAdded(uint32_t address, const cabana::Signal *sig); diff --git a/tools/cabana/signaledit.cc b/tools/cabana/signaledit.cc index 8c28d92437..5fb56dc1bc 100644 --- a/tools/cabana/signaledit.cc +++ b/tools/cabana/signaledit.cc @@ -1,6 +1,7 @@ #include "tools/cabana/signaledit.h" #include +#include #include #include #include @@ -368,6 +369,14 @@ QWidget *SignalItemDelegate::createEditor(QWidget *parent, const QStyleOptionVie QLineEdit *e = new QLineEdit(parent); e->setFrame(false); e->setValidator(index.row() == 0 ? name_validator : double_validator); + + if (item->type == SignalModel::Item::Name) { + QCompleter *completer = new QCompleter(dbc()->signalNames()); + completer->setCaseSensitivity(Qt::CaseInsensitive); + completer->setFilterMode(Qt::MatchContains); + e->setCompleter(completer); + } + return e; } else if (item->type == SignalModel::Item::Size) { QSpinBox *spin = new QSpinBox(parent);