|  |  |  | @ -6,14 +6,18 @@ | 
			
		
	
		
			
				
					|  |  |  |  | #include <QSplitter> | 
			
		
	
		
			
				
					|  |  |  |  | #include <QVBoxLayout> | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #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>("uint64_t"); | 
			
		
	
		
			
				
					|  |  |  |  |   qRegisterMetaType<ReplyMsgType>("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); | 
			
		
	
	
		
			
				
					|  |  |  | 
 |