| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -8,47 +8,31 @@ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#include <QtCharts/QLineSeries> | 
					 | 
					 | 
					 | 
					#include <QtCharts/QLineSeries> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#include <QtCharts/QValueAxis> | 
					 | 
					 | 
					 | 
					#include <QtCharts/QValueAxis> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#include <QtConcurrent> | 
					 | 
					 | 
					 | 
					#include <QtConcurrent> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					#include <QToolBar> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// ChartsWidget
 | 
					 | 
					 | 
					 | 
					// ChartsWidget
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					ChartsWidget::ChartsWidget(QWidget *parent) : QWidget(parent) { | 
					 | 
					 | 
					 | 
					ChartsWidget::ChartsWidget(QWidget *parent) : QWidget(parent) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  QVBoxLayout *main_layout = new QVBoxLayout(this); | 
					 | 
					 | 
					 | 
					  QVBoxLayout *main_layout = new QVBoxLayout(this); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  // title bar
 | 
					 | 
					 | 
					 | 
					  // toolbar
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  title_bar = new QWidget(this); | 
					 | 
					 | 
					 | 
					  QToolBar *toolbar = new QToolBar(tr("Charts"), this); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  title_bar->setVisible(false); | 
					 | 
					 | 
					 | 
					  title_label = new QLabel(); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  QHBoxLayout *title_layout = new QHBoxLayout(title_bar); | 
					 | 
					 | 
					 | 
					  title_label->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Preferred); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  title_layout->setContentsMargins(0, 0, 0, 0); | 
					 | 
					 | 
					 | 
					  toolbar->addWidget(title_label); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  title_label = new QLabel(tr("Charts")); | 
					 | 
					 | 
					 | 
					  toolbar->addWidget(range_label = new QLabel()); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					  reset_zoom_btn = toolbar->addAction("⟲"); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  title_layout->addWidget(title_label); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  title_layout->addStretch(); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  range_label = new QLabel(); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  title_layout->addWidget(range_label); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  reset_zoom_btn = new QPushButton("⟲", this); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  reset_zoom_btn->setFixedSize(30, 30); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  reset_zoom_btn->setToolTip(tr("Reset zoom (drag on chart to zoom X-Axis)")); | 
					 | 
					 | 
					 | 
					  reset_zoom_btn->setToolTip(tr("Reset zoom (drag on chart to zoom X-Axis)")); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  title_layout->addWidget(reset_zoom_btn); | 
					 | 
					 | 
					 | 
					  remove_all_btn = toolbar->addAction("✖"); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  remove_all_btn = new QPushButton("✖", this); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  remove_all_btn->setToolTip(tr("Remove all charts")); | 
					 | 
					 | 
					 | 
					  remove_all_btn->setToolTip(tr("Remove all charts")); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  remove_all_btn->setFixedSize(30, 30); | 
					 | 
					 | 
					 | 
					  dock_btn = toolbar->addAction(""); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  title_layout->addWidget(remove_all_btn); | 
					 | 
					 | 
					 | 
					  main_layout->addWidget(toolbar); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					  updateToolBar(); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  dock_btn = new QPushButton(); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  dock_btn->setFixedSize(30, 30); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  title_layout->addWidget(dock_btn); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  main_layout->addWidget(title_bar, 0, Qt::AlignTop); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  // charts
 | 
					 | 
					 | 
					 | 
					  // charts
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  QWidget *charts_container = new QWidget(this); | 
					 | 
					 | 
					 | 
					  QWidget *charts_container = new QWidget(this); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  QVBoxLayout *charts_main = new QVBoxLayout(charts_container); | 
					 | 
					 | 
					 | 
					  charts_layout = new QVBoxLayout(charts_container); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  charts_layout = new QVBoxLayout(); | 
					 | 
					 | 
					 | 
					  charts_layout->addStretch(); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  charts_main->addLayout(charts_layout); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  charts_main->addStretch(); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  QScrollArea *charts_scroll = new QScrollArea(this); | 
					 | 
					 | 
					 | 
					  QScrollArea *charts_scroll = new QScrollArea(this); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  charts_scroll->setWidgetResizable(true); | 
					 | 
					 | 
					 | 
					  charts_scroll->setWidgetResizable(true); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -67,12 +51,12 @@ ChartsWidget::ChartsWidget(QWidget *parent) : QWidget(parent) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }); | 
					 | 
					 | 
					 | 
					  }); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  QObject::connect(can, &CANMessages::eventsMerged, this, &ChartsWidget::eventsMerged); | 
					 | 
					 | 
					 | 
					  QObject::connect(can, &CANMessages::eventsMerged, this, &ChartsWidget::eventsMerged); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  QObject::connect(can, &CANMessages::updated, this, &ChartsWidget::updateState); | 
					 | 
					 | 
					 | 
					  QObject::connect(can, &CANMessages::updated, this, &ChartsWidget::updateState); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  QObject::connect(remove_all_btn, &QPushButton::clicked, [this]() { removeAll(); }); | 
					 | 
					 | 
					 | 
					  QObject::connect(remove_all_btn, &QAction::triggered, [this]() { removeAll(); }); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  QObject::connect(reset_zoom_btn, &QPushButton::clicked, this, &ChartsWidget::zoomReset); | 
					 | 
					 | 
					 | 
					  QObject::connect(reset_zoom_btn, &QAction::triggered, this, &ChartsWidget::zoomReset); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  QObject::connect(dock_btn, &QPushButton::clicked, [this]() { | 
					 | 
					 | 
					 | 
					  QObject::connect(dock_btn, &QAction::triggered, [this]() { | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    emit dock(!docking); | 
					 | 
					 | 
					 | 
					    emit dock(!docking); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    docking = !docking; | 
					 | 
					 | 
					 | 
					    docking = !docking; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    updateTitleBar(); | 
					 | 
					 | 
					 | 
					    updateToolBar(); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }); | 
					 | 
					 | 
					 | 
					  }); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -91,7 +75,7 @@ void ChartsWidget::eventsMerged() { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					void ChartsWidget::zoomIn(double min, double max) { | 
					 | 
					 | 
					 | 
					void ChartsWidget::zoomIn(double min, double max) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  zoomed_range = {min, max}; | 
					 | 
					 | 
					 | 
					  zoomed_range = {min, max}; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  is_zoomed = zoomed_range != display_range; | 
					 | 
					 | 
					 | 
					  is_zoomed = zoomed_range != display_range; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  updateTitleBar(); | 
					 | 
					 | 
					 | 
					  updateToolBar(); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  emit rangeChanged(min, max, is_zoomed); | 
					 | 
					 | 
					 | 
					  emit rangeChanged(min, max, is_zoomed); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  updateState(); | 
					 | 
					 | 
					 | 
					  updateState(); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -130,16 +114,11 @@ void ChartsWidget::updateState() { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } | 
					 | 
					 | 
					 | 
					  } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					void ChartsWidget::updateTitleBar() { | 
					 | 
					 | 
					 | 
					void ChartsWidget::updateToolBar() { | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  title_bar->setVisible(!charts.isEmpty()); | 
					 | 
					 | 
					 | 
					  remove_all_btn->setEnabled(!charts.isEmpty()); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (charts.isEmpty()) return; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  range_label->setVisible(is_zoomed); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  reset_zoom_btn->setEnabled(is_zoomed); | 
					 | 
					 | 
					 | 
					  reset_zoom_btn->setEnabled(is_zoomed); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (is_zoomed) { | 
					 | 
					 | 
					 | 
					  range_label->setText(is_zoomed ? tr("%1 - %2").arg(zoomed_range.first, 0, 'f', 2).arg(zoomed_range.second, 0, 'f', 2) : ""); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    range_label->setText(tr("%1 - %2").arg(zoomed_range.first, 0, 'f', 2).arg(zoomed_range.second, 0, 'f', 2)); | 
					 | 
					 | 
					 | 
					  title_label->setText(charts.size() > 0 ? tr("Charts (%1)").arg(charts.size()) : tr("Charts")); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  title_label->setText(tr("Charts (%1)").arg(charts.size())); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  dock_btn->setText(docking ? "⬈" : "⬋"); | 
					 | 
					 | 
					 | 
					  dock_btn->setText(docking ? "⬈" : "⬋"); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  dock_btn->setToolTip(docking ? tr("Undock charts") : tr("Dock charts")); | 
					 | 
					 | 
					 | 
					  dock_btn->setToolTip(docking ? tr("Undock charts") : tr("Dock charts")); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -159,7 +138,7 @@ void ChartsWidget::showChart(const QString &id, const Signal *sig, bool show) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    emit chartOpened(chart->id, chart->signal); | 
					 | 
					 | 
					 | 
					    emit chartOpened(chart->id, chart->signal); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    updateState(); | 
					 | 
					 | 
					 | 
					    updateState(); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } | 
					 | 
					 | 
					 | 
					  } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  updateTitleBar(); | 
					 | 
					 | 
					 | 
					  updateToolBar(); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					bool ChartsWidget::isChartOpened(const QString &id, const Signal *sig) { | 
					 | 
					 | 
					 | 
					bool ChartsWidget::isChartOpened(const QString &id, const Signal *sig) { | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -170,7 +149,7 @@ bool ChartsWidget::isChartOpened(const QString &id, const Signal *sig) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					void ChartsWidget::removeChart(ChartView *chart) { | 
					 | 
					 | 
					 | 
					void ChartsWidget::removeChart(ChartView *chart) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  charts.removeOne(chart); | 
					 | 
					 | 
					 | 
					  charts.removeOne(chart); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  chart->deleteLater(); | 
					 | 
					 | 
					 | 
					  chart->deleteLater(); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  updateTitleBar(); | 
					 | 
					 | 
					 | 
					  updateToolBar(); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  emit chartClosed(chart->id, chart->signal); | 
					 | 
					 | 
					 | 
					  emit chartClosed(chart->id, chart->signal); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -191,7 +170,7 @@ void ChartsWidget::signalUpdated(const Signal *sig) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					bool ChartsWidget::eventFilter(QObject *obj, QEvent *event) { | 
					 | 
					 | 
					 | 
					bool ChartsWidget::eventFilter(QObject *obj, QEvent *event) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (obj != this && event->type() == QEvent::Close) { | 
					 | 
					 | 
					 | 
					  if (obj != this && event->type() == QEvent::Close) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    emit dock_btn->clicked(); | 
					 | 
					 | 
					 | 
					    emit dock_btn->triggered(); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    return true; | 
					 | 
					 | 
					 | 
					    return true; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } | 
					 | 
					 | 
					 | 
					  } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  return false; | 
					 | 
					 | 
					 | 
					  return false; | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |