Cabana: fix signal list glitch (#26357)

* fix signal list glitch

* fix glitch when open new msg

* reduce spacing

* fix binaryview glitch

* spacing 3

* create form on demand

* dont close form after save

* remove timer

* remove sizepolicy

* cleanup
old-commit-hash: 0e3edf7877
taco
Dean Lee 3 years ago committed by GitHub
parent d3c22d56ac
commit 5d965010be
  1. 11
      tools/cabana/binaryview.cc
  2. 5
      tools/cabana/binaryview.h
  3. 61
      tools/cabana/detailwidget.cc
  4. 1
      tools/cabana/detailwidget.h
  5. 55
      tools/cabana/signaledit.cc
  6. 12
      tools/cabana/signaledit.h

@ -11,7 +11,7 @@
// BinaryView // BinaryView
const int CELL_HEIGHT = 30; const int CELL_HEIGHT = 26;
BinaryView::BinaryView(QWidget *parent) : QTableView(parent) { BinaryView::BinaryView(QWidget *parent) : QTableView(parent) {
model = new BinaryViewModel(this); model = new BinaryViewModel(this);
@ -105,15 +105,9 @@ void BinaryView::leaveEvent(QEvent *event) {
} }
void BinaryView::setMessage(const QString &message_id) { void BinaryView::setMessage(const QString &message_id) {
msg_id = message_id;
model->setMessage(message_id); model->setMessage(message_id);
clearSelection(); clearSelection();
updateState(); updateState();
updateGeometry();
}
void BinaryView::updateState() {
model->updateState();
} }
const Signal *BinaryView::getResizingSignal() const { const Signal *BinaryView::getResizingSignal() const {
@ -176,6 +170,9 @@ void BinaryViewModel::setMessage(const QString &message_id) {
items[idx].sigs.push_back(&dbc_msg->sigs[i]); items[idx].sigs.push_back(&dbc_msg->sigs[i]);
} }
} }
} else {
row_count = can->lastMessage(msg_id).dat.size();
items.resize(row_count * column_count);
} }
endResetModel(); endResetModel();

@ -57,10 +57,10 @@ class BinaryView : public QTableView {
public: public:
BinaryView(QWidget *parent = nullptr); BinaryView(QWidget *parent = nullptr);
void setMessage(const QString &message_id); void setMessage(const QString &message_id);
void updateState();
void highlight(const Signal *sig); void highlight(const Signal *sig);
const Signal *hoveredSignal() const { return hovered_sig; }
QSet<const Signal*> getOverlappingSignals() const; QSet<const Signal*> getOverlappingSignals() const;
inline const Signal *hoveredSignal() const { return hovered_sig; }
inline void updateState() { model->updateState(); }
signals: signals:
void signalHovered(const Signal *sig); void signalHovered(const Signal *sig);
@ -75,7 +75,6 @@ private:
void leaveEvent(QEvent *event) override; void leaveEvent(QEvent *event) override;
const Signal *getResizingSignal() const; const Signal *getResizingSignal() const;
QString msg_id;
QModelIndex anchor_index; QModelIndex anchor_index;
BinaryViewModel *model; BinaryViewModel *model;
BinaryItemDelegate *delegate; BinaryItemDelegate *delegate;

@ -31,7 +31,6 @@ DetailWidget::DetailWidget(ChartsWidget *charts, QWidget *parent) : charts(chart
QFrame *title_frame = new QFrame(this); QFrame *title_frame = new QFrame(this);
QVBoxLayout *frame_layout = new QVBoxLayout(title_frame); QVBoxLayout *frame_layout = new QVBoxLayout(title_frame);
title_frame->setFrameShape(QFrame::StyledPanel); title_frame->setFrameShape(QFrame::StyledPanel);
title_frame->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
// message title // message title
QHBoxLayout *title_layout = new QHBoxLayout(); QHBoxLayout *title_layout = new QHBoxLayout();
@ -80,7 +79,6 @@ DetailWidget::DetailWidget(ChartsWidget *charts, QWidget *parent) : charts(chart
// signals // signals
signals_container = new QWidget(this); signals_container = new QWidget(this);
signals_container->setLayout(new QVBoxLayout); signals_container->setLayout(new QVBoxLayout);
signals_container->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
container_layout->addWidget(signals_container); container_layout->addWidget(signals_container);
// history log // history log
@ -147,32 +145,35 @@ void DetailWidget::setMessage(const QString &message_id) {
void DetailWidget::dbcMsgChanged(int show_form_idx) { void DetailWidget::dbcMsgChanged(int show_form_idx) {
if (msg_id.isEmpty()) return; if (msg_id.isEmpty()) return;
warning_widget->hide(); setUpdatesEnabled(false);
QStringList warnings; QStringList warnings;
for (auto f : signal_list) f->hide();
clearLayout(signals_container->layout()); const Msg *msg = dbc()->msg(msg_id);
QString msg_name = tr("untitled"); if (msg) {
if (auto msg = dbc()->msg(msg_id)) {
for (int i = 0; i < msg->sigs.size(); ++i) { for (int i = 0; i < msg->sigs.size(); ++i) {
auto form = new SignalEdit(i, msg_id, &(msg->sigs[i])); SignalEdit *form = i < signal_list.size() ? signal_list[i] : nullptr;
form->setChartOpened(charts->isChartOpened(msg_id, &(msg->sigs[i]))); if (!form) {
signals_container->layout()->addWidget(form); form = new SignalEdit(i);
QObject::connect(form, &SignalEdit::showFormClicked, this, &DetailWidget::showForm); QObject::connect(form, &SignalEdit::showFormClicked, this, &DetailWidget::showForm);
QObject::connect(form, &SignalEdit::remove, this, &DetailWidget::removeSignal); QObject::connect(form, &SignalEdit::remove, this, &DetailWidget::removeSignal);
QObject::connect(form, &SignalEdit::save, this, &DetailWidget::saveSignal); QObject::connect(form, &SignalEdit::save, this, &DetailWidget::saveSignal);
QObject::connect(form, &SignalEdit::highlight, binary_view, &BinaryView::highlight); QObject::connect(form, &SignalEdit::highlight, binary_view, &BinaryView::highlight);
QObject::connect(binary_view, &BinaryView::signalHovered, form, &SignalEdit::signalHovered); QObject::connect(binary_view, &BinaryView::signalHovered, form, &SignalEdit::signalHovered);
QObject::connect(form, &SignalEdit::showChart, [this, sig = &msg->sigs[i]](bool show) { charts->showChart(msg_id, sig, show); }); QObject::connect(form, &SignalEdit::showChart, charts, &ChartsWidget::showChart);
if (i == show_form_idx) { signals_container->layout()->addWidget(form);
QTimer::singleShot(0, [=]() { emit form->showFormClicked(); }); signal_list.push_back(form);
} }
form->setSignal(msg_id, &(msg->sigs[i]), i == show_form_idx);
form->setChartOpened(charts->isChartOpened(msg_id, &(msg->sigs[i])));
form->show();
} }
msg_name = msg->name.c_str();
if (msg->size != can->lastMessage(msg_id).dat.size()) if (msg->size != can->lastMessage(msg_id).dat.size())
warnings.push_back(tr("Message size (%1) is incorrect.").arg(msg->size)); warnings.push_back(tr("Message size (%1) is incorrect.").arg(msg->size));
} }
edit_btn->setVisible(true); edit_btn->setVisible(true);
name_label->setText(msg_name); name_label->setText(msg ? msg->name.c_str() : "untitled");
binary_view->setMessage(msg_id); binary_view->setMessage(msg_id);
history_log->setMessage(msg_id); history_log->setMessage(msg_id);
@ -183,10 +184,9 @@ void DetailWidget::dbcMsgChanged(int show_form_idx) {
warnings.push_back(tr("%1 has overlapping bits.").arg(s->name.c_str())); warnings.push_back(tr("%1 has overlapping bits.").arg(s->name.c_str()));
} }
if (!warnings.isEmpty()) { warning_label->setText(warnings.join('\n'));
warning_label->setText(warnings.join('\n')); warning_widget->setVisible(!warnings.isEmpty());
warning_widget->show(); setUpdatesEnabled(true);
}
} }
void DetailWidget::updateState() { void DetailWidget::updateState() {
@ -199,18 +199,15 @@ void DetailWidget::updateState() {
void DetailWidget::showForm() { void DetailWidget::showForm() {
SignalEdit *sender = qobject_cast<SignalEdit *>(QObject::sender()); SignalEdit *sender = qobject_cast<SignalEdit *>(QObject::sender());
for (auto f : signals_container->findChildren<SignalEdit *>()) { setUpdatesEnabled(false);
for (auto f : signal_list)
f->setFormVisible(f == sender && !f->isFormVisible()); f->setFormVisible(f == sender && !f->isFormVisible());
if (f == sender) QTimer::singleShot(1, [this]() { setUpdatesEnabled(true); });
QTimer::singleShot(0, [=]() { scroll->ensureWidgetVisible(f); });
}
} }
void DetailWidget::updateChartState(const QString &id, const Signal *sig, bool opened) { void DetailWidget::updateChartState(const QString &id, const Signal *sig, bool opened) {
if (id == msg_id) { for (auto f : signal_list)
for (auto f : signals_container->findChildren<SignalEdit *>()) if (f->msg_id == id && f->sig == sig) f->setChartOpened(opened);
if (f->sig == sig) f->setChartOpened(opened);
}
} }
void DetailWidget::editMsg() { void DetailWidget::editMsg() {
@ -265,7 +262,7 @@ void DetailWidget::saveSignal(const Signal *sig, const Signal &new_sig) {
dbc()->updateSignal(msg_id, sig->name.c_str(), new_sig); dbc()->updateSignal(msg_id, sig->name.c_str(), new_sig);
// update binary view and history log // update binary view and history log
dbcMsgChanged(); updateState();
} }
void DetailWidget::removeSignal(const Signal *sig) { void DetailWidget::removeSignal(const Signal *sig) {

@ -50,4 +50,5 @@ private:
BinaryView *binary_view; BinaryView *binary_view;
QScrollArea *scroll; QScrollArea *scroll;
ChartsWidget *charts; ChartsWidget *charts;
QList<SignalEdit *> signal_list;
}; };

@ -13,40 +13,37 @@
// SignalForm // SignalForm
SignalForm::SignalForm(const Signal &sig, QWidget *parent) : QWidget(parent) { SignalForm::SignalForm(QWidget *parent) : QWidget(parent) {
QFormLayout *form_layout = new QFormLayout(this); QFormLayout *form_layout = new QFormLayout(this);
form_layout->setContentsMargins(0, 0, 0, 0);
name = new QLineEdit(sig.name.c_str()); name = new QLineEdit();
form_layout->addRow(tr("Name"), name); form_layout->addRow(tr("Name"), name);
size = new QSpinBox(); size = new QSpinBox();
size->setMinimum(1); size->setMinimum(1);
size->setValue(sig.size);
form_layout->addRow(tr("Size"), size); form_layout->addRow(tr("Size"), size);
endianness = new QComboBox(); endianness = new QComboBox();
endianness->addItems({"Little", "Big"}); endianness->addItems({"Little", "Big"});
endianness->setCurrentIndex(sig.is_little_endian ? 0 : 1);
form_layout->addRow(tr("Endianness"), endianness); form_layout->addRow(tr("Endianness"), endianness);
form_layout->addRow(tr("lsb"), new QLabel(QString::number(sig.lsb))); ;
form_layout->addRow(tr("msb"), new QLabel(QString::number(sig.msb))); form_layout->addRow(tr("lsb"), lsb = new QLabel());
form_layout->addRow(tr("msb"), msb = new QLabel());
sign = new QComboBox(); sign = new QComboBox();
sign->addItems({"Signed", "Unsigned"}); sign->addItems({"Signed", "Unsigned"});
sign->setCurrentIndex(sig.is_signed ? 0 : 1);
form_layout->addRow(tr("sign"), sign); form_layout->addRow(tr("sign"), sign);
auto double_validator = new QDoubleValidator(this); auto double_validator = new QDoubleValidator(this);
factor = new QLineEdit(); factor = new QLineEdit();
factor->setValidator(double_validator); factor->setValidator(double_validator);
factor->setText(QString::number(sig.factor));
form_layout->addRow(tr("Factor"), factor); form_layout->addRow(tr("Factor"), factor);
offset = new QLineEdit(); offset = new QLineEdit();
offset->setValidator(double_validator); offset->setValidator(double_validator);
offset->setText(QString::number(sig.offset));
form_layout->addRow(tr("Offset"), offset); form_layout->addRow(tr("Offset"), offset);
// TODO: parse the following parameters in opendbc // TODO: parse the following parameters in opendbc
@ -66,18 +63,15 @@ SignalForm::SignalForm(const Signal &sig, QWidget *parent) : QWidget(parent) {
// SignalEdit // SignalEdit
SignalEdit::SignalEdit(int index, const QString &msg_id, const Signal *sig, QWidget *parent) : msg_id(msg_id), sig(sig), form_idx(index), QWidget(parent) { SignalEdit::SignalEdit(int index, QWidget *parent) : form_idx(index), QWidget(parent) {
QVBoxLayout *main_layout = new QVBoxLayout(this); QVBoxLayout *main_layout = new QVBoxLayout(this);
main_layout->setContentsMargins(0, 0, 0, 0); main_layout->setContentsMargins(0, 0, 0, 0);
// title bar // title bar
QHBoxLayout *title_layout = new QHBoxLayout(); QHBoxLayout *title_layout = new QHBoxLayout();
icon = new QLabel(">"); icon = new QLabel();
icon->setStyleSheet("font-weight:bold");
title_layout->addWidget(icon); title_layout->addWidget(icon);
title = new ElidedLabel(this); title = new ElidedLabel(this);
title->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
title->setText(QString("%1. %2").arg(index + 1).arg(sig->name.c_str()));
title->setStyleSheet(QString("font-weight:bold; color:%1").arg(getColor(index))); title->setStyleSheet(QString("font-weight:bold; color:%1").arg(getColor(index)));
title_layout->addWidget(title, 1); title_layout->addWidget(title, 1);
@ -96,9 +90,6 @@ SignalEdit::SignalEdit(int index, const QString &msg_id, const Signal *sig, QWid
// signal form // signal form
form_container = new QWidget(this); form_container = new QWidget(this);
QVBoxLayout *v_layout = new QVBoxLayout(form_container); QVBoxLayout *v_layout = new QVBoxLayout(form_container);
form = new SignalForm(*sig, this);
v_layout->addWidget(form);
QHBoxLayout *h = new QHBoxLayout(); QHBoxLayout *h = new QHBoxLayout();
QPushButton *remove_btn = new QPushButton(tr("Remove Signal")); QPushButton *remove_btn = new QPushButton(tr("Remove Signal"));
h->addWidget(remove_btn); h->addWidget(remove_btn);
@ -106,8 +97,6 @@ SignalEdit::SignalEdit(int index, const QString &msg_id, const Signal *sig, QWid
QPushButton *save_btn = new QPushButton(tr("Save")); QPushButton *save_btn = new QPushButton(tr("Save"));
h->addWidget(save_btn); h->addWidget(save_btn);
v_layout->addLayout(h); v_layout->addLayout(h);
form_container->setVisible(false);
main_layout->addWidget(form_container); main_layout->addWidget(form_container);
// bottom line // bottom line
@ -119,11 +108,19 @@ SignalEdit::SignalEdit(int index, const QString &msg_id, const Signal *sig, QWid
QObject::connect(remove_btn, &QPushButton::clicked, [this]() { emit remove(this->sig); }); QObject::connect(remove_btn, &QPushButton::clicked, [this]() { emit remove(this->sig); });
QObject::connect(title, &ElidedLabel::clicked, this, &SignalEdit::showFormClicked); QObject::connect(title, &ElidedLabel::clicked, this, &SignalEdit::showFormClicked);
QObject::connect(save_btn, &QPushButton::clicked, this, &SignalEdit::saveSignal); QObject::connect(save_btn, &QPushButton::clicked, this, &SignalEdit::saveSignal);
QObject::connect(plot_btn, &QPushButton::clicked, [this]() { emit showChart(!chart_opened); }); QObject::connect(plot_btn, &QPushButton::clicked, [this]() { emit showChart(msg_id, sig, !chart_opened); });
QObject::connect(seek_btn, &QPushButton::clicked, [this, msg_id]() { QObject::connect(seek_btn, &QPushButton::clicked, [this]() {
SignalFindDlg dlg(msg_id, this->sig, this); SignalFindDlg dlg(msg_id, sig, this);
dlg.exec(); dlg.exec();
}); });
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
}
void SignalEdit::setSignal(const QString &message_id, const Signal *signal, bool show_form) {
msg_id = message_id;
sig = signal;
title->setText(QString("%1. %2").arg(form_idx + 1).arg(sig->name.c_str()));
setFormVisible(show_form);
} }
void SignalEdit::saveSignal() { void SignalEdit::saveSignal() {
@ -152,6 +149,20 @@ void SignalEdit::setChartOpened(bool opened) {
} }
void SignalEdit::setFormVisible(bool visible) { void SignalEdit::setFormVisible(bool visible) {
if (visible) {
if (!form) {
form = new SignalForm(this);
((QVBoxLayout *)form_container->layout())->insertWidget(0, form);
}
form->name->setText(sig->name.c_str());
form->size->setValue(sig->size);
form->endianness->setCurrentIndex(sig->is_little_endian ? 0 : 1);
form->sign->setCurrentIndex(sig->is_signed ? 0 : 1);
form->factor->setText(QString::number(sig->factor));
form->offset->setText(QString::number(sig->offset));
form->msb->setText(QString::number(sig->msb));
form->lsb->setText(QString::number(sig->lsb));
}
form_container->setVisible(visible); form_container->setVisible(visible);
icon->setText(visible ? "" : ">"); icon->setText(visible ? "" : ">");
} }

@ -14,9 +14,10 @@
class SignalForm : public QWidget { class SignalForm : public QWidget {
public: public:
SignalForm(const Signal &sig, QWidget *parent); SignalForm(QWidget *parent);
QLineEdit *name, *unit, *comment, *val_desc, *offset, *factor, *min_val, *max_val; QLineEdit *name, *unit, *comment, *val_desc, *offset, *factor, *min_val, *max_val;
QLabel *lsb, *msb;
QSpinBox *size; QSpinBox *size;
QComboBox *sign, *endianness; QComboBox *sign, *endianness;
}; };
@ -25,16 +26,18 @@ class SignalEdit : public QWidget {
Q_OBJECT Q_OBJECT
public: public:
SignalEdit(int index, const QString &msg_id, const Signal *sig, QWidget *parent = nullptr); SignalEdit(int index, QWidget *parent = nullptr);
void setSignal(const QString &msg_id, const Signal *sig, bool show_form);
void setChartOpened(bool opened); void setChartOpened(bool opened);
void setFormVisible(bool show); void setFormVisible(bool show);
void signalHovered(const Signal *sig); void signalHovered(const Signal *sig);
inline bool isFormVisible() const { return form_container->isVisible(); } inline bool isFormVisible() const { return form_container->isVisible(); }
const Signal *sig = nullptr; const Signal *sig = nullptr;
QString msg_id;
signals: signals:
void highlight(const Signal *sig); void highlight(const Signal *sig);
void showChart(bool show); void showChart(const QString &name, const Signal *sig, bool show);
void showFormClicked(); void showFormClicked();
void remove(const Signal *sig); void remove(const Signal *sig);
void save(const Signal *sig, const Signal &new_sig); void save(const Signal *sig, const Signal &new_sig);
@ -44,12 +47,11 @@ protected:
void leaveEvent(QEvent *event) override; void leaveEvent(QEvent *event) override;
void saveSignal(); void saveSignal();
SignalForm *form; SignalForm *form = nullptr;
ElidedLabel *title; ElidedLabel *title;
QWidget *form_container; QWidget *form_container;
QLabel *icon; QLabel *icon;
int form_idx = 0; int form_idx = 0;
QString msg_id;
bool chart_opened = false; bool chart_opened = false;
QPushButton *plot_btn; QPushButton *plot_btn;
}; };

Loading…
Cancel
Save