| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -8,11 +8,12 @@ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#include <QPixmap> | 
					 | 
					 | 
					 | 
					#include <QPixmap> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#include <QStyleOptionSlider> | 
					 | 
					 | 
					 | 
					#include <QStyleOptionSlider> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#include <QTimeEdit> | 
					 | 
					 | 
					 | 
					#include <QTimeEdit> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#include <QTimer> | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#include <QToolTip> | 
					 | 
					 | 
					 | 
					#include <QToolTip> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#include <QVBoxLayout> | 
					 | 
					 | 
					 | 
					#include <QVBoxLayout> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#include <QtConcurrent> | 
					 | 
					 | 
					 | 
					#include <QtConcurrent> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					const int MIN_VIDEO_HEIGHT = 100; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					static const QColor timeline_colors[] = { | 
					 | 
					 | 
					 | 
					static const QColor timeline_colors[] = { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  [(int)TimelineType::None] = QColor(111, 143, 175), | 
					 | 
					 | 
					 | 
					  [(int)TimelineType::None] = QColor(111, 143, 175), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  [(int)TimelineType::Engaged] = QColor(0, 163, 108), | 
					 | 
					 | 
					 | 
					  [(int)TimelineType::Engaged] = QColor(0, 163, 108), | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -22,7 +23,7 @@ static const QColor timeline_colors[] = { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  [(int)TimelineType::AlertCritical] = QColor(199, 0, 57), | 
					 | 
					 | 
					 | 
					  [(int)TimelineType::AlertCritical] = QColor(199, 0, 57), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}; | 
					 | 
					 | 
					 | 
					}; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					inline QString formatTime(int seconds) { | 
					 | 
					 | 
					 | 
					static inline QString formatTime(int seconds) { | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  return QDateTime::fromTime_t(seconds).toString(seconds > 60 * 60 ? "hh:mm:ss" : "mm:ss"); | 
					 | 
					 | 
					 | 
					  return QDateTime::fromTime_t(seconds).toString(seconds > 60 * 60 ? "hh:mm:ss" : "mm:ss"); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -106,7 +107,7 @@ QWidget *VideoWidget::createCameraWidget() { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  slider_layout->addWidget(end_time_label); | 
					 | 
					 | 
					 | 
					  slider_layout->addWidget(end_time_label); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  l->addLayout(slider_layout); | 
					 | 
					 | 
					 | 
					  l->addLayout(slider_layout); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  cam_widget->setMinimumHeight(100); | 
					 | 
					 | 
					 | 
					  cam_widget->setMinimumHeight(MIN_VIDEO_HEIGHT); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  cam_widget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding); | 
					 | 
					 | 
					 | 
					  cam_widget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); | 
					 | 
					 | 
					 | 
					  setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -164,16 +165,12 @@ void VideoWidget::updatePlayBtnState() { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// Slider
 | 
					 | 
					 | 
					 | 
					// Slider
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					Slider::Slider(QWidget *parent) : QSlider(Qt::Horizontal, parent) { | 
					 | 
					 | 
					 | 
					Slider::Slider(QWidget *parent) : timer(this), QSlider(Qt::Horizontal, parent) { | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  QTimer *timer = new QTimer(this); | 
					 | 
					 | 
					 | 
					  timer.callOnTimeout([this]() { | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  timer->setInterval(2000); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  timer->callOnTimeout([this]() { | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    timeline = can->getTimeline(); | 
					 | 
					 | 
					 | 
					    timeline = can->getTimeline(); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    update(); | 
					 | 
					 | 
					 | 
					    update(); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }); | 
					 | 
					 | 
					 | 
					  }); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  setMouseTracking(true); | 
					 | 
					 | 
					 | 
					  setMouseTracking(true); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  QObject::connect(can, SIGNAL(streamStarted()), timer, SLOT(start())); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  QObject::connect(can, &AbstractStream::streamStarted, this, &Slider::streamStarted); | 
					 | 
					 | 
					 | 
					  QObject::connect(can, &AbstractStream::streamStarted, this, &Slider::streamStarted); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -187,11 +184,13 @@ void Slider::streamStarted() { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  thumnail_future.waitForFinished(); | 
					 | 
					 | 
					 | 
					  thumnail_future.waitForFinished(); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  abort_load_thumbnail = false; | 
					 | 
					 | 
					 | 
					  abort_load_thumbnail = false; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  thumbnails.clear(); | 
					 | 
					 | 
					 | 
					  thumbnails.clear(); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  timeline.clear(); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  timer.start(2000); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  thumnail_future = QtConcurrent::run(this, &Slider::loadThumbnails); | 
					 | 
					 | 
					 | 
					  thumnail_future = QtConcurrent::run(this, &Slider::loadThumbnails); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					void Slider::loadThumbnails() { | 
					 | 
					 | 
					 | 
					void Slider::loadThumbnails() { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  const auto segments = can->route()->segments(); | 
					 | 
					 | 
					 | 
					  const auto &segments = can->route()->segments(); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  for (auto it = segments.rbegin(); it != segments.rend() && !abort_load_thumbnail; ++it) { | 
					 | 
					 | 
					 | 
					  for (auto it = segments.rbegin(); it != segments.rend() && !abort_load_thumbnail; ++it) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    std::string qlog = it->second.qlog.toStdString(); | 
					 | 
					 | 
					 | 
					    std::string qlog = it->second.qlog.toStdString(); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!qlog.empty()) { | 
					 | 
					 | 
					 | 
					    if (!qlog.empty()) { | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -280,3 +279,8 @@ void Slider::mouseMoveEvent(QMouseEvent *e) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  QToolTip::showText(pt, thumb, this, rect()); | 
					 | 
					 | 
					 | 
					  QToolTip::showText(pt, thumb, this, rect()); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  QSlider::mouseMoveEvent(e); | 
					 | 
					 | 
					 | 
					  QSlider::mouseMoveEvent(e); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					void Slider::leaveEvent(QEvent *event) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  QToolTip::hideText(); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  QSlider::leaveEvent(event); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
					 | 
					 | 
					
  |