@ -32,8 +32,6 @@ MapWindow::MapWindow(const QMapboxGLSettings &settings) : m_settings(settings), 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  // Instructions
   
			
		
	
		
			
				
					  map_instructions  =  new  MapInstructions ( this ) ;   
			
		
	
		
			
				
					  QObject : : connect ( this ,  & MapWindow : : instructionsChanged ,  map_instructions ,  & MapInstructions : : updateInstructions ) ;   
			
		
	
		
			
				
					  QObject : : connect ( this ,  & MapWindow : : distanceChanged ,  map_instructions ,  & MapInstructions : : updateDistance ) ;   
			
		
	
		
			
				
					  map_instructions - > setVisible ( false ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  map_eta  =  new  MapETA ( this ) ;   
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -207,8 +205,7 @@ void MapWindow::updateState(const UIState &s) { 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					      if  ( locationd_valid )  {   
			
		
	
		
			
				
					        m_map - > setPitch ( MAX_PITCH ) ;  // TODO: smooth pitching based on maneuver distance
   
			
		
	
		
			
				
					        emit  distanceChanged ( i . getManeuverDistance ( ) ) ;  // TODO: combine with instructionsChanged
   
			
		
	
		
			
				
					        emit  instructionsChanged ( i ) ;   
			
		
	
		
			
				
					        map_instructions - > updateInstructions ( i ) ;   
			
		
	
		
			
				
					      }   
			
		
	
		
			
				
					    }  else  {   
			
		
	
		
			
				
					      clearRoute ( ) ;   
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -416,33 +413,16 @@ MapInstructions::MapInstructions(QWidget * parent) : QWidget(parent) { 
			
		
	
		
			
				
					  setPalette ( pal ) ;   
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					void MapInstructions : : update Distance( float  d )  {  
			
		
	
		
			
				
					QString MapInstructions : : get Distance( float  d )  {  
			
		
	
		
			
				
					  d  =  std : : max ( d ,  0.0f ) ;   
			
		
	
		
			
				
					  QString  distance_str ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  if  ( uiState ( ) - > scene . is_metric )  {   
			
		
	
		
			
				
					    if  ( d  >  500 )  {   
			
		
	
		
			
				
					      distance_str . setNum ( d  /  1000 ,  ' f ' ,  1 ) ;   
			
		
	
		
			
				
					      distance_str  + =  tr ( "  km " ) ;   
			
		
	
		
			
				
					    }  else  {   
			
		
	
		
			
				
					      distance_str . setNum ( 50  *  int ( d  /  50 ) ) ;   
			
		
	
		
			
				
					      distance_str  + =  tr ( "  m " ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					    return  ( d  >  500 )  ?  QString : : number ( d  /  1000 ,  ' f ' ,  1 )  +  tr ( "  km " )   
			
		
	
		
			
				
					                     :  QString : : number ( 50  *  int ( d  /  50 ) )  +  tr ( "  m " ) ;   
			
		
	
		
			
				
					  }  else  {   
			
		
	
		
			
				
					    float  miles  =  d  *  METER_TO_MILE ;   
			
		
	
		
			
				
					    float  feet  =  d  *  METER_TO_FOOT ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    if  ( feet  >  500 )  {   
			
		
	
		
			
				
					      distance_str . setNum ( miles ,  ' f ' ,  1 ) ;   
			
		
	
		
			
				
					      distance_str  + =  tr ( "  mi " ) ;   
			
		
	
		
			
				
					    }  else  {   
			
		
	
		
			
				
					      distance_str . setNum ( 50  *  int ( feet  /  50 ) ) ;   
			
		
	
		
			
				
					      distance_str  + =  tr ( "  ft " ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					    return  ( feet  >  500 )  ?  QString : : number ( d  *  METER_TO_MILE ,  ' f ' ,  1 )  +  tr ( "  mi " )   
			
		
	
		
			
				
					                        :  QString : : number ( 50  *  int ( feet  /  50 ) )  +  tr ( "  ft " ) ;   
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  distance - > setAlignment ( Qt : : AlignLeft ) ;   
			
		
	
		
			
				
					  distance - > setText ( distance_str ) ;   
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					void  MapInstructions : : showError ( QString  error_text )  {  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -464,6 +444,8 @@ void MapInstructions::noError() { 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					void  MapInstructions : : updateInstructions ( cereal : : NavInstruction : : Reader  instruction )  {  
			
		
	
		
			
				
					  setUpdatesEnabled ( false ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  // Show instruction text
   
			
		
	
		
			
				
					  QString  primary_str  =  QString : : fromStdString ( instruction . getManeuverPrimaryText ( ) ) ;   
			
		
	
		
			
				
					  QString  secondary_str  =  QString : : fromStdString ( instruction . getManeuverSecondaryText ( ) ) ;   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -471,6 +453,8 @@ void MapInstructions::updateInstructions(cereal::NavInstruction::Reader instruct 
			
		
	
		
			
				
					  primary - > setText ( primary_str ) ;   
			
		
	
		
			
				
					  secondary - > setVisible ( secondary_str . length ( )  >  0 ) ;   
			
		
	
		
			
				
					  secondary - > setText ( secondary_str ) ;   
			
		
	
		
			
				
					  distance - > setAlignment ( Qt : : AlignLeft ) ;   
			
		
	
		
			
				
					  distance - > setText ( getDistance ( instruction . getManeuverDistance ( ) ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  // Show arrow with direction
   
			
		
	
		
			
				
					  QString  type  =  QString : : fromStdString ( instruction . getManeuverType ( ) ) ;   
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -502,15 +486,13 @@ void MapInstructions::updateInstructions(cereal::NavInstruction::Reader instruct 
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  // Show lanes
   
			
		
	
		
			
				
					  bool  has_lanes  =  false ;   
			
		
	
		
			
				
					  clearLayout ( lane_layout ) ;   
			
		
	
		
			
				
					  for  ( auto  const  & lane :  instruction . getLanes ( ) )  {   
			
		
	
		
			
				
					    has_lanes  =  true ;   
			
		
	
		
			
				
					    bool  active  =  lane . getActive ( ) ;   
			
		
	
		
			
				
					  auto  lanes  =  instruction . getLanes ( ) ;   
			
		
	
		
			
				
					  for  ( int  i  =  0 ;  i  <  lanes . size ( ) ;  + + i )  {   
			
		
	
		
			
				
					    bool  active  =  lanes [ i ] . getActive ( ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    // TODO: only use active direction if active
   
			
		
	
		
			
				
					    bool  left  =  false ,  straight  =  false ,  right  =  false ;   
			
		
	
		
			
				
					    for  ( auto  const  & direction :  lane . getDirections ( ) )  {   
			
		
	
		
			
				
					    for  ( auto  const  & direction :  lanes [ i ]  . getDirections ( ) )  {   
			
		
	
		
			
				
					      left  | =  direction  = =  cereal : : NavInstruction : : Direction : : LEFT ;   
			
		
	
		
			
				
					      right  | =  direction  = =  cereal : : NavInstruction : : Direction : : RIGHT ;   
			
		
	
		
			
				
					      straight  | =  direction  = =  cereal : : NavInstruction : : Direction : : STRAIGHT ;   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -530,13 +512,20 @@ void MapInstructions::updateInstructions(cereal::NavInstruction::Reader instruct 
			
		
	
		
			
				
					      fn  + =  " _inactive " ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    auto  icon  =  new  QLabel ;   
			
		
	
		
			
				
					    icon - > setPixmap ( loadPixmap ( fn  +  ICON_SUFFIX ,  { 125 ,  125 } ,  Qt : : IgnoreAspectRatio ) ) ;   
			
		
	
		
			
				
					    icon - > setSizePolicy ( QSizePolicy ( QSizePolicy : : Fixed ,  QSizePolicy : : Fixed ) ) ;   
			
		
	
		
			
				
					    lane_layout - > addWidget ( icon ) ;   
			
		
	
		
			
				
					    QLabel  * label  =  ( i  <  lane_labels . size ( ) )  ?  lane_labels [ i ]  :  lane_labels . emplace_back ( new  QLabel ) ;   
			
		
	
		
			
				
					    if  ( ! label - > parentWidget ( ) )  {   
			
		
	
		
			
				
					      lane_layout - > addWidget ( label ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					    label - > setPixmap ( loadPixmap ( fn  +  ICON_SUFFIX ,  { 125 ,  125 } ,  Qt : : IgnoreAspectRatio ) ) ;   
			
		
	
		
			
				
					    label - > setVisible ( true ) ;   
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  for  ( int  i  =  lanes . size ( ) ;  i  <  lane_labels . size ( ) ;  + + i )  {   
			
		
	
		
			
				
					    lane_labels [ i ] - > setVisible ( false ) ;   
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					  lane_widget - > setVisible ( has_lanes ) ;   
			
		
	
		
			
				
					  lane_widget - > setVisible ( lanes . size ( )  >  0 ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  setUpdatesEnabled ( true ) ;   
			
		
	
		
			
				
					  setVisible ( true ) ;   
			
		
	
		
			
				
					}