Cabana: Move history logs to a tabbed widget (#26481)

* tabwidget

* cleanup

* update state  before show

* cleanup

* remove spacing

* fix right panel stretch issue

* fix missing }
pull/26499/head
Dean Lee 2 years ago committed by GitHub
parent fbf2f3816b
commit 8e91ce1eb4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 55
      tools/cabana/detailwidget.cc
  2. 6
      tools/cabana/detailwidget.h
  3. 4
      tools/cabana/historylog.cc
  4. 7
      tools/cabana/mainwin.cc
  5. 15
      tools/cabana/signaledit.cc
  6. 6
      tools/cabana/signaledit.h

@ -64,31 +64,35 @@ DetailWidget::DetailWidget(ChartsWidget *charts, QWidget *parent) : charts(chart
frame_layout->addWidget(warning_widget); frame_layout->addWidget(warning_widget);
main_layout->addWidget(title_frame); main_layout->addWidget(title_frame);
QWidget *container = new QWidget(this); // msg widget
QVBoxLayout *container_layout = new QVBoxLayout(container); QWidget *msg_widget = new QWidget(this);
container_layout->setSpacing(0); QVBoxLayout *msg_layout = new QVBoxLayout(msg_widget);
container_layout->setContentsMargins(0, 0, 0, 0); msg_layout->setContentsMargins(0, 0, 0, 0);
scroll = new QScrollArea(this);
scroll->setWidget(container);
scroll->setWidgetResizable(true);
scroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
main_layout->addWidget(scroll);
// binary view // binary view
binary_view = new BinaryView(this); binary_view = new BinaryView(this);
container_layout->addWidget(binary_view); msg_layout->addWidget(binary_view);
// signals // signals
signals_layout = new QVBoxLayout(); signals_layout = new QVBoxLayout();
container_layout->addLayout(signals_layout); signals_layout->setSpacing(0);
msg_layout->addLayout(signals_layout);
msg_layout->addStretch(0);
scroll = new QScrollArea(this);
scroll->setFrameShape(QFrame::NoFrame);
scroll->setWidget(msg_widget);
scroll->setWidgetResizable(true);
scroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// history log tab_widget = new QTabWidget(this);
tab_widget->setTabPosition(QTabWidget::South);
tab_widget->addTab(scroll, "Msg");
history_log = new HistoryLog(this); history_log = new HistoryLog(this);
container_layout->addWidget(history_log); tab_widget->addTab(history_log, "Logs");
main_layout->addWidget(tab_widget);
QObject::connect(binary_view, &BinaryView::resizeSignal, this, &DetailWidget::resizeSignal); QObject::connect(binary_view, &BinaryView::resizeSignal, this, &DetailWidget::resizeSignal);
QObject::connect(binary_view, &BinaryView::addSignal, this, &DetailWidget::addSignal); QObject::connect(binary_view, &BinaryView::addSignal, this, &DetailWidget::addSignal);
QObject::connect(tab_widget, &QTabWidget::currentChanged, [this]() { updateState(); });
QObject::connect(can, &CANMessages::msgsReceived, this, &DetailWidget::updateState); QObject::connect(can, &CANMessages::msgsReceived, this, &DetailWidget::updateState);
QObject::connect(dbc(), &DBCManager::DBCFileChanged, [this]() { dbcMsgChanged(); }); QObject::connect(dbc(), &DBCManager::DBCFileChanged, [this]() { dbcMsgChanged(); });
QObject::connect(tabbar, &QTabBar::customContextMenuRequested, this, &DetailWidget::showTabBarContextMenu); QObject::connect(tabbar, &QTabBar::customContextMenuRequested, this, &DetailWidget::showTabBarContextMenu);
@ -151,6 +155,7 @@ void DetailWidget::dbcMsgChanged(int show_form_idx) {
form = new SignalEdit(i); form = new SignalEdit(i);
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::showFormClicked, this, &DetailWidget::showFormClicked);
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, charts, &ChartsWidget::showChart); QObject::connect(form, &SignalEdit::showChart, charts, &ChartsWidget::showChart);
@ -176,16 +181,26 @@ void DetailWidget::dbcMsgChanged(int show_form_idx) {
warning_label->setText(warnings.join('\n')); warning_label->setText(warnings.join('\n'));
warning_widget->setVisible(!warnings.isEmpty()); warning_widget->setVisible(!warnings.isEmpty());
QTimer::singleShot(1, [this]() { setUpdatesEnabled(true); }); setUpdatesEnabled(true);
} }
void DetailWidget::updateState(const QHash<QString, CanData> * msgs) { void DetailWidget::updateState(const QHash<QString, CanData> * msgs) {
time_label->setText(QString::number(can->currentSec(), 'f', 3)); time_label->setText(QString::number(can->currentSec(), 'f', 3));
if (!msgs->contains(msg_id)) if (msg_id.isEmpty() || (msgs && !msgs->contains(msg_id)))
return; return;
binary_view->updateState(); if (tab_widget->currentIndex() == 0)
history_log->updateState(); binary_view->updateState();
else
history_log->updateState();
}
void DetailWidget::showFormClicked() {
auto s = qobject_cast<SignalEdit *>(sender());
setUpdatesEnabled(false);
for (auto f : signal_list)
f->updateForm(f == s && !f->isFormVisible());
setUpdatesEnabled(true);
} }
void DetailWidget::updateChartState(const QString &id, const Signal *sig, bool opened) { void DetailWidget::updateChartState(const QString &id, const Signal *sig, bool opened) {

@ -1,7 +1,7 @@
#pragma once #pragma once
#include <QScrollArea> #include <QScrollArea>
#include <QTabBar> #include <QTabWidget>
#include <QToolBar> #include <QToolBar>
#include <QUndoStack> #include <QUndoStack>
@ -28,6 +28,7 @@ public:
QUndoStack *undo_stack = nullptr; QUndoStack *undo_stack = nullptr;
private: private:
void showFormClicked();
void updateChartState(const QString &id, const Signal *sig, bool opened); void updateChartState(const QString &id, const Signal *sig, bool opened);
void showTabBarContextMenu(const QPoint &pt); void showTabBarContextMenu(const QPoint &pt);
void addSignal(int start_bit, int size, bool little_endian); void addSignal(int start_bit, int size, bool little_endian);
@ -36,13 +37,14 @@ private:
void removeSignal(const Signal *sig); void removeSignal(const Signal *sig);
void editMsg(); void editMsg();
void removeMsg(); void removeMsg();
void updateState(const QHash<QString, CanData> * msgs); void updateState(const QHash<QString, CanData> * msgs = nullptr);
QString msg_id; QString msg_id;
QLabel *name_label, *time_label, *warning_label; QLabel *name_label, *time_label, *warning_label;
QWidget *warning_widget; QWidget *warning_widget;
QVBoxLayout *signals_layout; QVBoxLayout *signals_layout;
QTabBar *tabbar; QTabBar *tabbar;
QTabWidget *tab_widget;
QToolBar *toolbar; QToolBar *toolbar;
QAction *remove_msg_act; QAction *remove_msg_act;
HistoryLog *history_log; HistoryLog *history_log;

@ -86,10 +86,8 @@ HistoryLog::HistoryLog(QWidget *parent) : QTableView(parent) {
horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | (Qt::Alignment)Qt::TextWordWrap); horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | (Qt::Alignment)Qt::TextWordWrap);
horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents); horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
verticalHeader()->setVisible(false); verticalHeader()->setVisible(false);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
setFrameShape(QFrame::NoFrame); setFrameShape(QFrame::NoFrame);
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding); setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
setStyleSheet("QTableView::item { border:0px; padding-left:5px; padding-right:5px; }"); setStyleSheet("QTableView::item { border:0px; padding-left:5px; padding-right:5px; }");
} }

@ -72,7 +72,7 @@ MainWindow::MainWindow() : QMainWindow() {
video_widget = new VideoWidget(this); video_widget = new VideoWidget(this);
r_layout->addWidget(video_widget, 0, Qt::AlignTop); r_layout->addWidget(video_widget, 0, Qt::AlignTop);
r_layout->addWidget(charts_widget); r_layout->addWidget(charts_widget, 1);
main_layout->addWidget(right_container); main_layout->addWidget(right_container);
setCentralWidget(central_widget); setCentralWidget(central_widget);
@ -192,9 +192,10 @@ void MainWindow::saveDBCToFile() {
if (!file_name.isEmpty()) { if (!file_name.isEmpty()) {
settings.last_dir = QFileInfo(file_name).absolutePath(); settings.last_dir = QFileInfo(file_name).absolutePath();
QFile file(file_name); QFile file(file_name);
if (file.open(QIODevice::WriteOnly)) if (file.open(QIODevice::WriteOnly)) {
file.write(dbc()->generateDBC().toUtf8()); file.write(dbc()->generateDBC().toUtf8());
detail_widget->undo_stack->clear(); detail_widget->undo_stack->clear();
}
} }
} }
@ -216,7 +217,7 @@ void MainWindow::updateDownloadProgress(uint64_t cur, uint64_t total, bool succe
void MainWindow::dockCharts(bool dock) { void MainWindow::dockCharts(bool dock) {
if (dock && floating_window) { if (dock && floating_window) {
floating_window->removeEventFilter(charts_widget); floating_window->removeEventFilter(charts_widget);
r_layout->addWidget(charts_widget); r_layout->addWidget(charts_widget, 1);
floating_window->deleteLater(); floating_window->deleteLater();
floating_window = nullptr; floating_window = nullptr;
} else if (!dock && !floating_window) { } else if (!dock && !floating_window) {

@ -4,7 +4,6 @@
#include <QFormLayout> #include <QFormLayout>
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QScrollArea> #include <QScrollArea>
#include <QTimer>
#include <QToolBar> #include <QToolBar>
#include <QVBoxLayout> #include <QVBoxLayout>
@ -189,26 +188,12 @@ void SignalEdit::updateForm(bool visible) {
icon->setText(visible ? "" : "> "); icon->setText(visible ? "" : "> ");
} }
void SignalEdit::showFormClicked() {
parentWidget()->setUpdatesEnabled(false);
for (auto &edit : parentWidget()->findChildren<SignalEdit*>())
edit->updateForm(edit == this && !form->isVisible());
QTimer::singleShot(1, [this]() { parentWidget()->setUpdatesEnabled(true); });
}
void SignalEdit::signalHovered(const Signal *s) { void SignalEdit::signalHovered(const Signal *s) {
auto bg_color = sig == s ? hoverColor(getColor(form_idx)) : QColor(getColor(form_idx)); auto bg_color = sig == s ? hoverColor(getColor(form_idx)) : QColor(getColor(form_idx));
auto color = sig == s ? "white" : "black"; auto color = sig == s ? "white" : "black";
color_label->setStyleSheet(QString("color:%1; background-color:%2").arg(color).arg(bg_color.name())); color_label->setStyleSheet(QString("color:%1; background-color:%2").arg(color).arg(bg_color.name()));
} }
void SignalEdit::hideEvent(QHideEvent *event) {
msg_id = "";
sig = nullptr;
updateForm(false);
QWidget::hideEvent(event);
}
void SignalEdit::enterEvent(QEvent *event) { void SignalEdit::enterEvent(QEvent *event) {
emit highlight(sig); emit highlight(sig);
QWidget::enterEvent(event); QWidget::enterEvent(event);

@ -34,6 +34,8 @@ public:
void setSignal(const QString &msg_id, const Signal *sig); void setSignal(const QString &msg_id, const Signal *sig);
void setChartOpened(bool opened); void setChartOpened(bool opened);
void signalHovered(const Signal *sig); void signalHovered(const Signal *sig);
void updateForm(bool show);
inline bool isFormVisible() const { return form->isVisible(); }
const Signal *sig = nullptr; const Signal *sig = nullptr;
QString msg_id; QString msg_id;
@ -42,14 +44,12 @@ signals:
void showChart(const QString &name, const Signal *sig, bool show); void showChart(const QString &name, const Signal *sig, bool show);
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);
void showFormClicked();
protected: protected:
void hideEvent(QHideEvent *event) override;
void enterEvent(QEvent *event) override; void enterEvent(QEvent *event) override;
void leaveEvent(QEvent *event) override; void leaveEvent(QEvent *event) override;
void saveSignal(); void saveSignal();
void updateForm(bool show);
void showFormClicked();
SignalForm *form = nullptr; SignalForm *form = nullptr;
ElidedLabel *title; ElidedLabel *title;

Loading…
Cancel
Save