diff --git a/tools/cabana/dbcmanager.h b/tools/cabana/dbcmanager.h index 41471a6169..7571d1c44e 100644 --- a/tools/cabana/dbcmanager.h +++ b/tools/cabana/dbcmanager.h @@ -54,6 +54,8 @@ private: std::map msgs; }; +const QString UNTITLED = "untitled"; + // TODO: Add helper function in dbc.h double get_raw_value(uint8_t *data, size_t data_size, const Signal &sig); bool operator==(const Signal &l, const Signal &r); @@ -63,7 +65,7 @@ int bigEndianBitIndex(int index); void updateSigSizeParamsFromRange(Signal &s, int start_bit, int size); std::pair getSignalRange(const Signal *s); DBCManager *dbc(); -inline QString msgName(const QString &id, const char *def = "untitled") { +inline QString msgName(const QString &id) { auto msg = dbc()->msg(id); - return msg ? msg->name : def; + return msg ? msg->name : UNTITLED; } diff --git a/tools/cabana/detailwidget.cc b/tools/cabana/detailwidget.cc index 25d9b3b9ca..27c8cbccc9 100644 --- a/tools/cabana/detailwidget.cc +++ b/tools/cabana/detailwidget.cc @@ -1,6 +1,5 @@ #include "tools/cabana/detailwidget.h" -#include #include #include #include @@ -190,11 +189,13 @@ void DetailWidget::removeMsg() { // EditMessageDialog -EditMessageDialog::EditMessageDialog(const QString &msg_id, const QString &title, int size, QWidget *parent) : QDialog(parent) { - setWindowTitle(tr("Edit message")); +EditMessageDialog::EditMessageDialog(const QString &msg_id, const QString &title, int size, QWidget *parent) + : original_name(title), QDialog(parent) { + setWindowTitle(tr("Edit message: %1").arg(msg_id)); QFormLayout *form_layout = new QFormLayout(this); - form_layout->addRow("ID", new QLabel(msg_id)); + form_layout->addRow("", error_label = new QLabel); + error_label->setVisible(false); name_edit = new QLineEdit(title, this); name_edit->setValidator(new NameValidator(name_edit)); form_layout->addRow(tr("Name"), name_edit); @@ -205,12 +206,28 @@ EditMessageDialog::EditMessageDialog(const QString &msg_id, const QString &title size_spin->setValue(size); form_layout->addRow(tr("Size"), size_spin); - auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); - form_layout->addRow(buttonBox); + btn_box = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + btn_box->button(QDialogButtonBox::Ok)->setEnabled(false); + form_layout->addRow(btn_box); + setFixedWidth(parent->width() * 0.9); + connect(name_edit, &QLineEdit::textEdited, this, &EditMessageDialog::validateName); + connect(btn_box, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(btn_box, &QDialogButtonBox::rejected, this, &QDialog::reject); +} - connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); - connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); +void EditMessageDialog::validateName(const QString &text) { + bool valid = false; + error_label->setVisible(false); + if (!text.isEmpty() && text != original_name && text.compare(UNTITLED, Qt::CaseInsensitive) != 0) { + valid = std::none_of(dbc()->messages().begin(), dbc()->messages().end(), + [&text](auto &m) { return m.second.name == text; }); + if (!valid) { + error_label->setText(tr("Name already exists")); + error_label->setVisible(true); + } + } + btn_box->button(QDialogButtonBox::Ok)->setEnabled(valid); } // WelcomeWidget diff --git a/tools/cabana/detailwidget.h b/tools/cabana/detailwidget.h index 0983f49924..c5d5fe9a4d 100644 --- a/tools/cabana/detailwidget.h +++ b/tools/cabana/detailwidget.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -14,8 +15,12 @@ class EditMessageDialog : public QDialog { public: EditMessageDialog(const QString &msg_id, const QString &title, int size, QWidget *parent); + void validateName(const QString &text); + QString original_name; + QDialogButtonBox *btn_box; QLineEdit *name_edit; + QLabel *error_label; QSpinBox *size_spin; };