|  |  | @ -2,75 +2,17 @@ | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | #include <QDateTime> |  |  |  | #include <QDateTime> | 
			
		
	
		
		
			
				
					
					|  |  |  | #include <QLayout> |  |  |  | #include <QLayout> | 
			
		
	
		
		
			
				
					
					|  |  |  | #include <QLayoutItem> |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | #include <QMouseEvent> |  |  |  | #include <QMouseEvent> | 
			
		
	
		
		
			
				
					
					|  |  |  | #include <QPainter> |  |  |  | #include <QPainter> | 
			
		
	
		
		
			
				
					
					|  |  |  | #include <QSurfaceFormat> |  |  |  | #include <QSurfaceFormat> | 
			
		
	
		
		
			
				
					
					|  |  |  | #include <QWidget> |  |  |  | #include <QWidget> | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | #include "selfdrive/common/params.h" |  |  |  | QString getBrand(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | QString getBrandVersion(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | void configFont(QPainter &p, const QString &family, int size, const QString &style); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | inline QString getBrand() { |  |  |  | void clearLayout(QLayout* layout); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |   return Params().getBool("Passive") ? "dashcam" : "openpilot"; |  |  |  | void setQtSurfaceFormat(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | QString timeAgo(const QDateTime &date); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | inline QString getBrandVersion() { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   return getBrand() + " v" + QString::fromStdString(Params().get("Version")).left(14).trimmed(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | inline void configFont(QPainter &p, const QString &family, int size, const QString &style) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   QFont f(family); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   f.setPixelSize(size); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   f.setStyleName(style); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   p.setFont(f); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | inline void clearLayout(QLayout* layout) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   while (QLayoutItem* item = layout->takeAt(0)) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     if (QWidget* widget = item->widget()) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       widget->deleteLater(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     if (QLayout* childLayout = item->layout()) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       clearLayout(childLayout); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     delete item; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | inline QString timeAgo(const QDateTime &date) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   int diff = date.secsTo(QDateTime::currentDateTimeUtc()); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   QString s; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   if (diff < 60) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     s = "now"; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   } else if (diff < 60 * 60) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     int minutes = diff / 60; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     s = QString("%1 minute%2 ago").arg(minutes).arg(minutes > 1 ? "s" : ""); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   } else if (diff < 60 * 60 * 24) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     int hours = diff / (60 * 60); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     s = QString("%1 hour%2 ago").arg(hours).arg(hours > 1 ? "s" : ""); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   } else if (diff < 3600 * 24 * 7) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     int days = diff / (60 * 60 * 24); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     s = QString("%1 day%2 ago").arg(days).arg(days > 1 ? "s" : ""); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   } else { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     s = date.date().toString(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   return s; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | inline void setQtSurfaceFormat() { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   QSurfaceFormat fmt; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | #ifdef __APPLE__ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   fmt.setVersion(3, 2); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   fmt.setProfile(QSurfaceFormat::OpenGLContextProfile::CoreProfile); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   fmt.setRenderableType(QSurfaceFormat::OpenGL); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | #else |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   fmt.setRenderableType(QSurfaceFormat::OpenGLES); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | #endif |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   QSurfaceFormat::setDefaultFormat(fmt); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | class ClickableWidget : public QWidget |  |  |  | class ClickableWidget : public QWidget | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
	
		
		
			
				
					|  |  | 
 |