| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -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) { | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |