# include  "selfdrive/ui/qt/offroad/settings.h" 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <cassert> 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <cmath> 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <string> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <QDebug> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "selfdrive/ui/qt/offroad/networking.h" 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef ENABLE_MAPS 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "selfdrive/ui/qt/maps/map_settings.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "common/params.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "common/util.h" 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "system/hardware/hw.h" 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "selfdrive/ui/qt/widgets/controls.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "selfdrive/ui/qt/widgets/input.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "selfdrive/ui/qt/widgets/scrollview.h" 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "selfdrive/ui/qt/widgets/ssh_keys.h" 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "selfdrive/ui/qt/widgets/toggle.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "selfdrive/ui/ui.h" 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "selfdrive/ui/qt/util.h" 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "selfdrive/ui/qt/qt_window.h" 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								TogglesPanel : : TogglesPanel ( SettingsWindow  * parent )  :  ListWidget ( parent )  { 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  // param, title, desc, icon
   
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  std : : vector < std : : tuple < QString ,  QString ,  QString ,  QString > >  toggles { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      " OpenpilotEnabledToggle " , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      tr ( " Enable openpilot " ) , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      tr ( " Use the openpilot system for adaptive cruise control and lane keep driver assistance. Your attention is required at all times to use this feature. Changing this setting takes effect when the car is powered off. " ) , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      " ../assets/offroad/icon_openpilot.png " , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      " IsLdwEnabled " , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      tr ( " Enable Lane Departure Warnings " ) , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      tr ( " Receive alerts to steer back into the lane when your vehicle drifts over a detected lane line without a turn signal activated while driving over 31 mph (50 km/h). " ) , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      " ../assets/offroad/icon_warning.png " , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      " IsRHD " , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      tr ( " Enable Right-Hand Drive " ) , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      tr ( " Allow openpilot to obey left-hand traffic conventions and perform driver monitoring on right driver seat. " ) , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      " ../assets/offroad/icon_openpilot_mirrored.png " , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      " IsMetric " , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      tr ( " Use Metric System " ) , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      tr ( " Display speed in km/h instead of mph. " ) , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      " ../assets/offroad/icon_metric.png " , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      " RecordFront " , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      tr ( " Record and Upload Driver Camera " ) , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      tr ( " Upload data from the driver facing camera and help improve the driver monitoring algorithm. " ) , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      " ../assets/offroad/icon_monitoring.png " , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      " DisengageOnAccelerator " , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      tr ( " Disengage On Accelerator Pedal " ) , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      tr ( " When enabled, pressing the accelerator pedal will disengage openpilot. " ) , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      " ../assets/offroad/icon_disengage_on_accelerator.svg " , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef ENABLE_MAPS 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      " NavSettingTime24h " , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      tr ( " Show ETA in 24h format " ) , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      tr ( " Use 24h format instead of am/pm " ) , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      " ../assets/offroad/icon_metric.png " , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  } ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  Params  params ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  if  ( params . getBool ( " DisableRadar_Allow " ) )  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    toggles . push_back ( { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      " DisableRadar " , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      tr ( " openpilot Longitudinal Control " ) , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      tr ( " openpilot will disable the car's radar and will take over control of gas and brakes. Warning: this disables AEB! " ) , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      " ../assets/offroad/icon_speed_limit.png " , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  } 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  for  ( auto  & [ param ,  title ,  desc ,  icon ]  :  toggles )  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  toggle  =  new  ParamControl ( param ,  title ,  desc ,  icon ,  this ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    bool  locked  =  params . getBool ( ( param  +  " Lock " ) . toStdString ( ) ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    toggle - > setEnabled ( ! locked ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    addItem ( toggle ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								DevicePanel : : DevicePanel ( SettingsWindow  * parent )  :  ListWidget ( parent )  { 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  setSpacing ( 50 ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  addItem ( new  LabelControl ( tr ( " Dongle ID " ) ,  getDongleId ( ) . value_or ( tr ( " N/A " ) ) ) ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  addItem ( new  LabelControl ( tr ( " Serial " ) ,  params . get ( " HardwareSerial " ) . c_str ( ) ) ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  // offroad-only buttons
   
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  auto  dcamBtn  =  new  ButtonControl ( tr ( " Driver Camera " ) ,  tr ( " PREVIEW " ) , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                   tr ( " Preview the driver facing camera to help optimize device mounting position for best driver monitoring experience. (vehicle must be off) " ) ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  connect ( dcamBtn ,  & ButtonControl : : clicked ,  [ = ] ( )  {  emit  showDriverView ( ) ;  } ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  addItem ( dcamBtn ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  auto  resetCalibBtn  =  new  ButtonControl ( tr ( " Reset Calibration " ) ,  tr ( " RESET " ) ,  " " ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  connect ( resetCalibBtn ,  & ButtonControl : : showDescription ,  this ,  & DevicePanel : : updateCalibDescription ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  connect ( resetCalibBtn ,  & ButtonControl : : clicked ,  [ & ] ( )  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ConfirmationDialog : : confirm ( tr ( " Are you sure you want to reset calibration? " ) ,  this ) )  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      params . remove ( " CalibrationParams " ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  } ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  addItem ( resetCalibBtn ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  if  ( ! params . getBool ( " Passive " ) )  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  retrainingBtn  =  new  ButtonControl ( tr ( " Review Training Guide " ) ,  tr ( " REVIEW " ) ,  tr ( " Review the rules, features, and limitations of openpilot " ) ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    connect ( retrainingBtn ,  & ButtonControl : : clicked ,  [ = ] ( )  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      if  ( ConfirmationDialog : : confirm ( tr ( " Are you sure you want to review the training guide? " ) ,  this ) )  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								        emit  reviewTrainingGuide ( ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    addItem ( retrainingBtn ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  } 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  if  ( Hardware : : TICI ( ) )  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  regulatoryBtn  =  new  ButtonControl ( tr ( " Regulatory " ) ,  tr ( " VIEW " ) ,  " " ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    connect ( regulatoryBtn ,  & ButtonControl : : clicked ,  [ = ] ( )  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      const  std : : string  txt  =  util : : read_file ( " ../assets/offroad/fcc.html " ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      RichTextDialog : : alert ( QString : : fromStdString ( txt ) ,  this ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    addItem ( regulatoryBtn ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  } 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  QObject : : connect ( uiState ( ) ,  & UIState : : offroadTransition ,  [ = ] ( bool  offroad )  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( auto  btn  :  findChildren < ButtonControl  * > ( ) )  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      btn - > setEnabled ( offroad ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  } ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  // power buttons
   
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  QHBoxLayout  * power_layout  =  new  QHBoxLayout ( ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  power_layout - > setSpacing ( 30 ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  QPushButton  * reboot_btn  =  new  QPushButton ( tr ( " Reboot " ) ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  reboot_btn - > setObjectName ( " reboot_btn " ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  power_layout - > addWidget ( reboot_btn ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  QObject : : connect ( reboot_btn ,  & QPushButton : : clicked ,  this ,  & DevicePanel : : reboot ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  QPushButton  * poweroff_btn  =  new  QPushButton ( tr ( " Power Off " ) ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  poweroff_btn - > setObjectName ( " poweroff_btn " ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  power_layout - > addWidget ( poweroff_btn ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  QObject : : connect ( poweroff_btn ,  & QPushButton : : clicked ,  this ,  & DevicePanel : : poweroff ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  if  ( ! Hardware : : PC ( ) )  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    connect ( uiState ( ) ,  & UIState : : offroadTransition ,  poweroff_btn ,  & QPushButton : : setVisible ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  setStyleSheet ( R " ( 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    # reboot_btn { height: 120px; border-radius: 15px; background-color: #393939; } 
   
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    # reboot_btn:pressed { background-color: #4a4a4a; } 
   
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    # poweroff_btn { height: 120px; border-radius: 15px; background-color: #E22C2C; } 
   
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    # poweroff_btn:pressed { background-color: #FF2424; } 
   
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ) " ); 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  addItem ( power_layout ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  DevicePanel : : updateCalibDescription ( )  { 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  QString  desc  = 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      tr ( " openpilot requires the device to be mounted within 4° left or right and  " 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								         " within 5° up or 8° down. openpilot is continuously calibrating, resetting is rarely required. " ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  std : : string  calib_bytes  =  Params ( ) . get ( " CalibrationParams " ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  if  ( ! calib_bytes . empty ( ) )  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    try  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      AlignedBuffer  aligned_buf ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      capnp : : FlatArrayMessageReader  cmsg ( aligned_buf . align ( calib_bytes . data ( ) ,  calib_bytes . size ( ) ) ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      auto  calib  =  cmsg . getRoot < cereal : : Event > ( ) . getLiveCalibration ( ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      if  ( calib . getCalStatus ( )  ! =  0 )  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        double  pitch  =  calib . getRpyCalib ( ) [ 1 ]  *  ( 180  /  M_PI ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        double  yaw  =  calib . getRpyCalib ( ) [ 2 ]  *  ( 180  /  M_PI ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								        desc  + =  tr ( "  Your device is pointed %1° %2 and %3° %4. " ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    . arg ( QString : : number ( std : : abs ( pitch ) ,  ' g ' ,  1 ) ,  pitch  >  0  ?  tr ( " down " )  :  tr ( " up " ) , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                         QString : : number ( std : : abs ( yaw ) ,  ' g ' ,  1 ) ,  yaw  >  0  ?  tr ( " left " )  :  tr ( " right " ) ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  catch  ( kj : : Exception )  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      qInfo ( )  < <  " invalid CalibrationParams " ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  qobject_cast < ButtonControl  * > ( sender ( ) ) - > setDescription ( desc ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  DevicePanel : : reboot ( )  { 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  if  ( ! uiState ( ) - > engaged ( ) )  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ConfirmationDialog : : confirm ( tr ( " Are you sure you want to reboot? " ) ,  this ) )  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      // Check engaged again in case it changed while the dialog was open
   
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      if  ( ! uiState ( ) - > engaged ( ) )  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								        Params ( ) . putBool ( " DoReboot " ,  true ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  }  else  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ConfirmationDialog : : alert ( tr ( " Disengage to Reboot " ) ,  this ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  DevicePanel : : poweroff ( )  { 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  if  ( ! uiState ( ) - > engaged ( ) )  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ConfirmationDialog : : confirm ( tr ( " Are you sure you want to power off? " ) ,  this ) )  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      // Check engaged again in case it changed while the dialog was open
   
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      if  ( ! uiState ( ) - > engaged ( ) )  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								        Params ( ) . putBool ( " DoShutdown " ,  true ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  }  else  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ConfirmationDialog : : alert ( tr ( " Disengage to Power Off " ) ,  this ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								SoftwarePanel : : SoftwarePanel ( QWidget *  parent )  :  ListWidget ( parent )  { 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  gitBranchLbl  =  new  LabelControl ( tr ( " Git Branch " ) ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  gitCommitLbl  =  new  LabelControl ( tr ( " Git Commit " ) ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  osVersionLbl  =  new  LabelControl ( tr ( " OS Version " ) ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  versionLbl  =  new  LabelControl ( tr ( " Version " ) ,  " " ,  QString : : fromStdString ( params . get ( " ReleaseNotes " ) ) . trimmed ( ) ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  lastUpdateLbl  =  new  LabelControl ( tr ( " Last Update Check " ) ,  " " ,  tr ( " The last time openpilot successfully checked for an update. The updater only runs while the car is off. " ) ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  updateBtn  =  new  ButtonControl ( tr ( " Check for Update " ) ,  " " ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  connect ( updateBtn ,  & ButtonControl : : clicked ,  [ = ] ( )  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( params . getBool ( " IsOffroad " ) )  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      fs_watch - > addPath ( QString : : fromStdString ( params . getParamPath ( " LastUpdateTime " ) ) ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      fs_watch - > addPath ( QString : : fromStdString ( params . getParamPath ( " UpdateFailedCount " ) ) ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      updateBtn - > setText ( tr ( " CHECKING " ) ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      updateBtn - > setEnabled ( false ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    std : : system ( " pkill -1 -f selfdrive.updated " ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  } ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  auto  uninstallBtn  =  new  ButtonControl ( tr ( " Uninstall  " )  +  getBrand ( ) ,  tr ( " UNINSTALL " ) ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  connect ( uninstallBtn ,  & ButtonControl : : clicked ,  [ & ] ( )  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ConfirmationDialog : : confirm ( tr ( " Are you sure you want to uninstall? " ) ,  this ) )  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      params . putBool ( " DoUninstall " ,  true ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  connect ( uiState ( ) ,  & UIState : : offroadTransition ,  uninstallBtn ,  & QPushButton : : setEnabled ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  QWidget  * widgets [ ]  =  { versionLbl ,  lastUpdateLbl ,  updateBtn ,  gitBranchLbl ,  gitCommitLbl ,  osVersionLbl ,  uninstallBtn } ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  for  ( QWidget *  w  :  widgets )  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    addItem ( w ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  fs_watch  =  new  QFileSystemWatcher ( this ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  QObject : : connect ( fs_watch ,  & QFileSystemWatcher : : fileChanged ,  [ = ] ( const  QString  path )  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( path . contains ( " UpdateFailedCount " )  & &  std : : atoi ( params . get ( " UpdateFailedCount " ) . c_str ( ) )  >  0 )  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      lastUpdateLbl - > setText ( tr ( " failed to fetch update " ) ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      updateBtn - > setText ( tr ( " CHECK " ) ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      updateBtn - > setEnabled ( true ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    }  else  if  ( path . contains ( " LastUpdateTime " ) )  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      updateLabels ( ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  } ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								} 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  SoftwarePanel : : showEvent ( QShowEvent  * event )  { 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  updateLabels ( ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  SoftwarePanel : : updateLabels ( )  { 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  QString  lastUpdate  =  " " ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  auto  tm  =  params . get ( " LastUpdateTime " ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  if  ( ! tm . empty ( ) )  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    lastUpdate  =  timeAgo ( QDateTime : : fromString ( QString : : fromStdString ( tm  +  " Z " ) ,  Qt : : ISODate ) ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  versionLbl - > setText ( getBrandVersion ( ) ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  lastUpdateLbl - > setText ( lastUpdate ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  updateBtn - > setText ( tr ( " CHECK " ) ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  updateBtn - > setEnabled ( true ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  gitBranchLbl - > setText ( QString : : fromStdString ( params . get ( " GitBranch " ) ) ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  gitCommitLbl - > setText ( QString : : fromStdString ( params . get ( " GitCommit " ) ) . left ( 10 ) ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  osVersionLbl - > setText ( QString : : fromStdString ( Hardware : : get_os_version ( ) ) . trimmed ( ) ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  SettingsWindow : : showEvent ( QShowEvent  * event )  { 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  panel_widget - > setCurrentIndex ( 0 ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  nav_btns - > buttons ( ) [ 0 ] - > setChecked ( true ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								} 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								SettingsWindow : : SettingsWindow ( QWidget  * parent )  :  QFrame ( parent )  { 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  // setup two main layouts
   
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  sidebar_widget  =  new  QWidget ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  QVBoxLayout  * sidebar_layout  =  new  QVBoxLayout ( sidebar_widget ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  sidebar_layout - > setMargin ( 0 ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  panel_widget  =  new  QStackedWidget ( ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  panel_widget - > setStyleSheet ( R " ( 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    border - radius :  30 px ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    background - color :  # 292929 ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ) " ); 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  // close button
   
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  QPushButton  * close_btn  =  new  QPushButton ( tr ( " × " ) ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  close_btn - > setStyleSheet ( R " ( 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    QPushButton  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      font - size :  140 px ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      padding - bottom :  20 px ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      font - weight :  bold ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      border  1 px  grey  solid ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      border - radius :  100 px ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      background - color :  # 292929 ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      font - weight :  400 ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    QPushButton : pressed  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      background - color :  # 3 B3B3B ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ) " ); 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  close_btn - > setFixedSize ( 200 ,  200 ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  sidebar_layout - > addSpacing ( 45 ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  sidebar_layout - > addWidget ( close_btn ,  0 ,  Qt : : AlignCenter ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  QObject : : connect ( close_btn ,  & QPushButton : : clicked ,  this ,  & SettingsWindow : : closeSettings ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  // setup panels
   
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  DevicePanel  * device  =  new  DevicePanel ( this ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  QObject : : connect ( device ,  & DevicePanel : : reviewTrainingGuide ,  this ,  & SettingsWindow : : reviewTrainingGuide ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  QObject : : connect ( device ,  & DevicePanel : : showDriverView ,  this ,  & SettingsWindow : : showDriverView ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  QList < QPair < QString ,  QWidget  * > >  panels  =  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    { tr ( " Device " ) ,  device } , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    { tr ( " Network " ) ,  new  Networking ( this ) } , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    { tr ( " Toggles " ) ,  new  TogglesPanel ( this ) } , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { tr ( " Software " ) ,  new  SoftwarePanel ( this ) } , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef ENABLE_MAPS 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  auto  map_panel  =  new  MapPanel ( this ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  panels . push_back ( { tr ( " Navigation " ) ,  map_panel } ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  QObject : : connect ( map_panel ,  & MapPanel : : closeSettings ,  this ,  & SettingsWindow : : closeSettings ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  const  int  padding  =  panels . size ( )  >  3  ?  25  :  35 ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  nav_btns  =  new  QButtonGroup ( this ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  for  ( auto  & [ name ,  panel ]  :  panels )  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    QPushButton  * btn  =  new  QPushButton ( name ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    btn - > setCheckable ( true ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    btn - > setChecked ( nav_btns - > buttons ( ) . size ( )  = =  0 ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    btn - > setStyleSheet ( QString ( R " ( 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      QPushButton  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        color :  grey ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        border :  none ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        background :  none ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        font - size :  65 px ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        font - weight :  500 ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        padding - top :  % 1 px ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        padding - bottom :  % 1 px ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      QPushButton : checked  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        color :  white ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      QPushButton : pressed  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        color :  # ADADAD ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) " ).arg(padding)); 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    nav_btns - > addButton ( btn ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    sidebar_layout - > addWidget ( btn ,  0 ,  Qt : : AlignRight ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    const  int  lr_margin  =  name  ! =  tr ( " Network " )  ?  50  :  0 ;   // Network panel handles its own margins
   
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    panel - > setContentsMargins ( lr_margin ,  25 ,  lr_margin ,  25 ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ScrollView  * panel_frame  =  new  ScrollView ( panel ,  this ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    panel_widget - > addWidget ( panel_frame ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    QObject : : connect ( btn ,  & QPushButton : : clicked ,  [ = ,  w  =  panel_frame ] ( )  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      btn - > setChecked ( true ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      panel_widget - > setCurrentWidget ( w ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  sidebar_layout - > setContentsMargins ( 50 ,  50 ,  100 ,  50 ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  // main settings layout, sidebar + main panel
   
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  QHBoxLayout  * main_layout  =  new  QHBoxLayout ( this ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  sidebar_widget - > setFixedWidth ( 500 ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  main_layout - > addWidget ( sidebar_widget ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  main_layout - > addWidget ( panel_widget ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  setStyleSheet ( R " ( 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    *  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      color :  white ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      font - size :  50 px ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SettingsWindow  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      background - color :  black ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  ) " ); 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}