Cabana: sync button state with chart (#26285)

sync button state with charts
pull/26283/head^2
Dean Lee 3 years ago committed by GitHub
parent 80b088c332
commit 9c7e375944
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 14
      tools/cabana/chartswidget.cc
  2. 5
      tools/cabana/chartswidget.h
  3. 14
      tools/cabana/detailwidget.cc
  4. 7
      tools/cabana/detailwidget.h
  5. 5
      tools/cabana/mainwin.cc
  6. 18
      tools/cabana/signaledit.cc
  7. 7
      tools/cabana/signaledit.h

@ -142,9 +142,11 @@ void ChartsWidget::updateTitleBar() {
dock_btn->setToolTip(docking ? tr("Undock charts") : tr("Dock charts"));
}
void ChartsWidget::addChart(const QString &id, const Signal *sig) {
void ChartsWidget::showChart(const QString &id, const Signal *sig, bool show) {
auto it = std::find_if(charts.begin(), charts.end(), [=](auto c) { return c->id == id && c->signal == sig; });
if (it == charts.end()) {
if (it != charts.end()) {
if (!show) removeChart((*it));
} else if (show) {
auto chart = new ChartWidget(id, sig, this);
chart->chart_view->updateSeries(display_range);
QObject::connect(chart, &ChartWidget::remove, [=]() { removeChart(chart); });
@ -152,14 +154,21 @@ void ChartsWidget::addChart(const QString &id, const Signal *sig) {
QObject::connect(chart->chart_view, &ChartView::zoomReset, this, &ChartsWidget::zoomReset);
charts_layout->insertWidget(0, chart);
charts.push_back(chart);
emit chartOpened(chart->id, chart->signal);
}
updateTitleBar();
}
bool ChartsWidget::isChartOpened(const QString &id, const Signal *sig) {
auto it = std::find_if(charts.begin(), charts.end(), [=](auto c) { return c->id == id && c->signal == sig; });
return it != charts.end();
}
void ChartsWidget::removeChart(ChartWidget *chart) {
charts.removeOne(chart);
chart->deleteLater();
updateTitleBar();
emit chartClosed(chart->id, chart->signal);
}
void ChartsWidget::removeAll(const Signal *sig) {
@ -168,6 +177,7 @@ void ChartsWidget::removeAll(const Signal *sig) {
auto c = it.next();
if (sig == nullptr || c->signal == sig) {
c->deleteLater();
emit chartClosed(c->id, c->signal);
it.remove();
}
}

@ -73,12 +73,15 @@ class ChartsWidget : public QWidget {
public:
ChartsWidget(QWidget *parent = nullptr);
void addChart(const QString &id, const Signal *sig);
void showChart(const QString &id, const Signal *sig, bool show);
void removeChart(ChartWidget *chart);
bool isChartOpened(const QString &id, const Signal *sig);
signals:
void dock(bool floating);
void rangeChanged(double min, double max, bool is_zommed);
void chartOpened(const QString &id, const Signal *sig);
void chartClosed(const QString &id, const Signal *sig);
private:
void eventsMerged();

@ -12,7 +12,7 @@
// DetailWidget
DetailWidget::DetailWidget(QWidget *parent) : QWidget(parent) {
DetailWidget::DetailWidget(ChartsWidget *charts, QWidget *parent) : charts(charts), QWidget(parent) {
main_layout = new QHBoxLayout(this);
main_layout->setContentsMargins(0, 0, 0, 0);
@ -110,6 +110,8 @@ DetailWidget::DetailWidget(QWidget *parent) : QWidget(parent) {
}
tabbar->removeTab(index);
});
QObject::connect(charts, &ChartsWidget::chartOpened, [this](const QString &id, const Signal *sig) { updateChartState(id, sig, true); });
QObject::connect(charts, &ChartsWidget::chartClosed, [this](const QString &id, const Signal *sig) { updateChartState(id, sig, false); });
}
void DetailWidget::showTabBarContextMenu(const QPoint &pt) {
@ -157,13 +159,14 @@ void DetailWidget::dbcMsgChanged(int show_form_idx) {
if (auto msg = dbc()->msg(msg_id)) {
for (int i = 0; i < msg->sigs.size(); ++i) {
auto form = new SignalEdit(i, msg_id, &(msg->sigs[i]));
form->setChartOpened(charts->isChartOpened(msg_id, &(msg->sigs[i])));
signals_container->layout()->addWidget(form);
QObject::connect(form, &SignalEdit::showChart, [this, sig = &msg->sigs[i]]() { emit showChart(msg_id, sig); });
QObject::connect(form, &SignalEdit::showFormClicked, this, &DetailWidget::showForm);
QObject::connect(form, &SignalEdit::remove, this, &DetailWidget::removeSignal);
QObject::connect(form, &SignalEdit::save, this, &DetailWidget::saveSignal);
QObject::connect(form, &SignalEdit::highlight, binary_view, &BinaryView::highlight);
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); });
if (i == show_form_idx) {
QTimer::singleShot(0, [=]() { emit form->showFormClicked(); });
}
@ -222,6 +225,13 @@ void DetailWidget::showForm() {
}
}
void DetailWidget::updateChartState(const QString &id, const Signal *sig, bool opened) {
if (id == msg_id) {
for (auto f : signals_container->findChildren<SignalEdit *>())
if (f->sig == sig) f->setChartOpened(opened);
}
}
void DetailWidget::editMsg() {
auto msg = dbc()->msg(msg_id);
QString name = msg ? msg->name.c_str() : "untitled";

@ -5,6 +5,7 @@
#include <QVBoxLayout>
#include "tools/cabana/binaryview.h"
#include "tools/cabana/chartswidget.h"
#include "tools/cabana/historylog.h"
#include "tools/cabana/signaledit.h"
@ -40,16 +41,15 @@ class DetailWidget : public QWidget {
Q_OBJECT
public:
DetailWidget(QWidget *parent);
DetailWidget(ChartsWidget *charts, QWidget *parent);
void setMessage(const QString &message_id);
void dbcMsgChanged(int show_form_idx = -1);
signals:
void showChart(const QString &msg_id, const Signal *sig);
void removeChart(const Signal *sig);
void binaryViewMoved(bool in);
private:
void updateChartState(const QString &id, const Signal *sig, bool opened);
void showTabBarContextMenu(const QPoint &pt);
void addSignal(int start_bit, int to);
void resizeSignal(const Signal *sig, int from, int to);
@ -74,4 +74,5 @@ private:
HistoryLog *history_log;
BinaryView *binary_view;
ScrollArea *scroll;
ChartsWidget *charts;
};

@ -26,7 +26,8 @@ MainWindow::MainWindow() : QWidget() {
messages_widget = new MessagesWidget(this);
splitter->addWidget(messages_widget);
detail_widget = new DetailWidget(this);
charts_widget = new ChartsWidget(this);
detail_widget = new DetailWidget(charts_widget, this);
splitter->addWidget(detail_widget);
h_layout->addWidget(splitter);
@ -50,7 +51,6 @@ MainWindow::MainWindow() : QWidget() {
video_widget = new VideoWidget(this);
r_layout->addWidget(video_widget, 0, Qt::AlignTop);
charts_widget = new ChartsWidget(this);
r_layout->addWidget(charts_widget);
h_layout->addWidget(right_container);
@ -81,7 +81,6 @@ MainWindow::MainWindow() : QWidget() {
QObject::connect(this, &MainWindow::showMessage, status_bar, &QStatusBar::showMessage);
QObject::connect(this, &MainWindow::updateProgressBar, this, &MainWindow::updateDownloadProgress);
QObject::connect(messages_widget, &MessagesWidget::msgSelectionChanged, detail_widget, &DetailWidget::setMessage);
QObject::connect(detail_widget, &DetailWidget::showChart, charts_widget, &ChartsWidget::addChart);
QObject::connect(detail_widget, &DetailWidget::binaryViewMoved, [this](bool in) { splitter->setSizes({in ? 100 : 0, 500}); });
QObject::connect(charts_widget, &ChartsWidget::dock, this, &MainWindow::dockCharts);
QObject::connect(charts_widget, &ChartsWidget::rangeChanged, video_widget, &VideoWidget::rangeChanged);

@ -82,15 +82,14 @@ SignalEdit::SignalEdit(int index, const QString &msg_id, const Signal *sig, QWid
title_layout->addWidget(title, 1);
QPushButton *seek_btn = new QPushButton("");
seek_btn->setStyleSheet("font-weight:bold;font-size:20px");
seek_btn->setStyleSheet("QPushButton{font-weight:bold;font-size:18px}");
seek_btn->setToolTip(tr("Find signal values"));
seek_btn->setFixedSize(20, 20);
seek_btn->setFixedSize(25, 25);
title_layout->addWidget(seek_btn);
QPushButton *plot_btn = new QPushButton("📈");
plot_btn->setToolTip(tr("Show Plot"));
plot_btn->setFixedSize(20, 20);
QObject::connect(plot_btn, &QPushButton::clicked, this, &SignalEdit::showChart);
plot_btn = new QPushButton(this);
plot_btn->setStyleSheet("QPushButton {font-size:18px}");
plot_btn->setFixedSize(25, 25);
title_layout->addWidget(plot_btn);
main_layout->addLayout(title_layout);
@ -120,6 +119,7 @@ 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(title, &ElidedLabel::clicked, this, &SignalEdit::showFormClicked);
QObject::connect(save_btn, &QPushButton::clicked, this, &SignalEdit::saveSignal);
QObject::connect(plot_btn, &QPushButton::clicked, [this]() { emit showChart(!chart_opened); });
QObject::connect(seek_btn, &QPushButton::clicked, [this, msg_id]() {
SignalFindDlg dlg(msg_id, this->sig, this);
dlg.exec();
@ -145,6 +145,12 @@ void SignalEdit::saveSignal() {
emit save(this->sig, s);
}
void SignalEdit::setChartOpened(bool opened) {
plot_btn->setText(opened ? "" : "📈");
plot_btn->setToolTip(opened ? tr("Close Plot") :tr("Show Plot"));
chart_opened = opened;
}
void SignalEdit::setFormVisible(bool visible) {
form_container->setVisible(visible);
icon->setText(visible ? "" : ">");

@ -26,13 +26,15 @@ class SignalEdit : public QWidget {
public:
SignalEdit(int index, const QString &msg_id, const Signal *sig, QWidget *parent = nullptr);
void setChartOpened(bool opened);
void setFormVisible(bool show);
void signalHovered(const Signal *sig);
inline bool isFormVisible() const { return form_container->isVisible(); }
const Signal *sig = nullptr;
signals:
void highlight(const Signal *sig);
void showChart();
void showChart(bool show);
void showFormClicked();
void remove(const Signal *sig);
void save(const Signal *sig, const Signal &new_sig);
@ -48,7 +50,8 @@ protected:
QLabel *icon;
int form_idx = 0;
QString msg_id;
const Signal *sig = nullptr;
bool chart_opened = false;
QPushButton *plot_btn;
};
class SignalFindDlg : public QDialog {

Loading…
Cancel
Save