mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-07-01 11:32:21 +08:00
Cabana: sync button state with chart (#26285)
sync button state with charts old-commit-hash: 9c7e3759441f0dff1200f7946e77f06c6a101c26
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user