diff --git a/tools/cabana/detailwidget.cc b/tools/cabana/detailwidget.cc index 579bb1af75..c7bfdee164 100644 --- a/tools/cabana/detailwidget.cc +++ b/tools/cabana/detailwidget.cc @@ -12,6 +12,7 @@ DetailWidget::DetailWidget(QWidget *parent) : QWidget(parent) { QVBoxLayout *main_layout = new QVBoxLayout(this); + main_layout->setContentsMargins(0, 0, 0, 0); main_layout->setSpacing(0); // tabbar diff --git a/tools/cabana/mainwin.cc b/tools/cabana/mainwin.cc index 9ba69f8a90..2478155fcf 100644 --- a/tools/cabana/mainwin.cc +++ b/tools/cabana/mainwin.cc @@ -6,14 +6,18 @@ #include #include +#include "tools/replay/util.h" + MainWindow::MainWindow() : QWidget() { QVBoxLayout *main_layout = new QVBoxLayout(this); + main_layout->setContentsMargins(11, 11, 11, 5); + main_layout->setSpacing(0); QHBoxLayout *h_layout = new QHBoxLayout(); + h_layout->setContentsMargins(0, 0, 0, 0); main_layout->addLayout(h_layout); QSplitter *splitter = new QSplitter(Qt::Horizontal, this); - messages_widget = new MessagesWidget(this); splitter->addWidget(messages_widget); @@ -27,7 +31,7 @@ MainWindow::MainWindow() : QWidget() { QWidget *right_container = new QWidget(this); right_container->setFixedWidth(640); r_layout = new QVBoxLayout(right_container); - + r_layout->setContentsMargins(11, 0, 0, 0); QHBoxLayout *right_hlayout = new QHBoxLayout(); QLabel *fingerprint_label = new QLabel(this); right_hlayout->addWidget(fingerprint_label); @@ -47,6 +51,30 @@ MainWindow::MainWindow() : QWidget() { h_layout->addWidget(right_container); + // status bar + status_bar = new QStatusBar(this); + status_bar->setContentsMargins(0, 0, 0, 0); + status_bar->setSizeGripEnabled(true); + progress_bar = new QProgressBar(); + progress_bar->setRange(0, 100); + progress_bar->setTextVisible(true); + progress_bar->setFixedSize({230, 16}); + progress_bar->setVisible(false); + status_bar->addPermanentWidget(progress_bar); + main_layout->addWidget(status_bar); + + qRegisterMetaType("uint64_t"); + qRegisterMetaType("ReplyMsgType"); + installMessageHandler([this](ReplyMsgType type, const std::string msg) { + // use queued connection to recv the log messages from replay. + emit logMessageFromReplay(QString::fromStdString(msg), 3000); + }); + installDownloadProgressHandler([this](uint64_t cur, uint64_t total, bool success) { + emit updateProgressBar(cur, total, success); + }); + + QObject::connect(this, &MainWindow::logMessageFromReplay, 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(charts_widget, &ChartsWidget::dock, this, &MainWindow::dockCharts); @@ -54,6 +82,17 @@ MainWindow::MainWindow() : QWidget() { QObject::connect(can, &CANMessages::eventsMerged, [=]() { fingerprint_label->setText(can->carFingerprint() ); }); } +void MainWindow::updateDownloadProgress(uint64_t cur, uint64_t total, bool success) { + if (success && cur < total) { + progress_bar->setValue((cur / (double)total) * 100); + progress_bar->setFormat(tr("Downloading %p% (%1)").arg(formattedDataSize(total).c_str())); + progress_bar->show(); + } else { + progress_bar->hide(); + } +} + + void MainWindow::dockCharts(bool dock) { if (dock && floating_window) { floating_window->removeEventFilter(charts_widget); diff --git a/tools/cabana/mainwin.h b/tools/cabana/mainwin.h index 792390d5c1..56d2da145b 100644 --- a/tools/cabana/mainwin.h +++ b/tools/cabana/mainwin.h @@ -1,5 +1,8 @@ #pragma once +#include +#include + #include "tools/cabana/chartswidget.h" #include "tools/cabana/detailwidget.h" #include "tools/cabana/messageswidget.h" @@ -12,8 +15,13 @@ public: MainWindow(); void dockCharts(bool dock); +signals: + void logMessageFromReplay(const QString &msg, int timeout); + void updateProgressBar(uint64_t cur, uint64_t total, bool success); + protected: void closeEvent(QCloseEvent *event) override; + void updateDownloadProgress(uint64_t cur, uint64_t total, bool success); void setOption(); VideoWidget *video_widget; @@ -22,4 +30,6 @@ protected: ChartsWidget *charts_widget; QWidget *floating_window = nullptr; QVBoxLayout *r_layout; + QProgressBar *progress_bar; + QStatusBar *status_bar; }; diff --git a/tools/cabana/messageswidget.cc b/tools/cabana/messageswidget.cc index c34d883b3f..46776a4f5d 100644 --- a/tools/cabana/messageswidget.cc +++ b/tools/cabana/messageswidget.cc @@ -13,6 +13,7 @@ MessagesWidget::MessagesWidget(QWidget *parent) : QWidget(parent) { QVBoxLayout *main_layout = new QVBoxLayout(this); + main_layout->setContentsMargins(0, 0, 0, 0); // DBC file selector QHBoxLayout *dbc_file_layout = new QHBoxLayout();