# include "selfdrive/ui/qt/home.h"
# include <QDateTime>
# include <QHBoxLayout>
# include <QMouseEvent>
# include <QVBoxLayout>
# include "selfdrive/common/params.h"
# include "selfdrive/ui/qt/util.h"
# include "selfdrive/ui/qt/widgets/drive_stats.h"
# include "selfdrive/ui/qt/widgets/setup.h"
// HomeWindow: the container for the offroad and onroad UIs
HomeWindow : : HomeWindow ( QWidget * parent ) : QWidget ( parent ) {
QHBoxLayout * main_layout = new QHBoxLayout ( this ) ;
main_layout - > setMargin ( 0 ) ;
main_layout - > setSpacing ( 0 ) ;
sidebar = new Sidebar ( this ) ;
main_layout - > addWidget ( sidebar ) ;
QObject : : connect ( this , & HomeWindow : : update , sidebar , & Sidebar : : updateState ) ;
QObject : : connect ( sidebar , & Sidebar : : openSettings , this , & HomeWindow : : openSettings ) ;
slayout = new QStackedLayout ( ) ;
main_layout - > addLayout ( slayout ) ;
home = new OffroadHome ( ) ;
slayout - > addWidget ( home ) ;
onroad = new OnroadWindow ( this ) ;
slayout - > addWidget ( onroad ) ;
QObject : : connect ( this , & HomeWindow : : update , onroad , & OnroadWindow : : update ) ;
QObject : : connect ( this , & HomeWindow : : offroadTransitionSignal , onroad , & OnroadWindow : : offroadTransitionSignal ) ;
driver_view = new DriverViewWindow ( this ) ;
connect ( driver_view , & DriverViewWindow : : done , [ = ] {
showDriverView ( false ) ;
} ) ;
slayout - > addWidget ( driver_view ) ;
setAttribute ( Qt : : WA_NoSystemBackground ) ;
}
void HomeWindow : : showSidebar ( bool show ) {
sidebar - > setVisible ( show ) ;
}
void HomeWindow : : offroadTransition ( bool offroad ) {
sidebar - > setVisible ( offroad ) ;
if ( offroad ) {
slayout - > setCurrentWidget ( home ) ;
} else {
slayout - > setCurrentWidget ( onroad ) ;
}
emit offroadTransitionSignal ( offroad ) ;
}
void HomeWindow : : showDriverView ( bool show ) {
if ( show ) {
emit closeSettings ( ) ;
slayout - > setCurrentWidget ( driver_view ) ;
} else {
slayout - > setCurrentWidget ( home ) ;
}
sidebar - > setVisible ( show = = false ) ;
}
void HomeWindow : : mousePressEvent ( QMouseEvent * e ) {
// Handle sidebar collapsing
if ( onroad - > isVisible ( ) & & ( ! sidebar - > isVisible ( ) | | e - > x ( ) > sidebar - > width ( ) ) ) {
// TODO: Handle this without exposing pointer to map widget
// Hide map first if visible, then hide sidebar
if ( onroad - > map ! = nullptr & & onroad - > map - > isVisible ( ) ) {
onroad - > map - > setVisible ( false ) ;
} else if ( ! sidebar - > isVisible ( ) ) {
sidebar - > setVisible ( true ) ;
} else {
sidebar - > setVisible ( false ) ;
if ( onroad - > map ! = nullptr ) onroad - > map - > setVisible ( true ) ;
}
}
}
// OffroadHome: the offroad home page
OffroadHome : : OffroadHome ( QWidget * parent ) : QFrame ( parent ) {
QVBoxLayout * main_layout = new QVBoxLayout ( this ) ;
main_layout - > setMargin ( 50 ) ;
// top header
QHBoxLayout * header_layout = new QHBoxLayout ( ) ;
header_layout - > setSpacing ( 16 ) ;
date = new QLabel ( ) ;
header_layout - > addWidget ( date , 1 , Qt : : AlignHCenter | Qt : : AlignLeft ) ;
update_notif = new QPushButton ( " UPDATE " ) ;
update_notif - > setVisible ( false ) ;
update_notif - > setStyleSheet ( " background-color: #364DEF; " ) ;
QObject : : connect ( update_notif , & QPushButton : : clicked , [ = ] ( ) { center_layout - > setCurrentIndex ( 1 ) ; } ) ;
header_layout - > addWidget ( update_notif , 0 , Qt : : AlignHCenter | Qt : : AlignRight ) ;
alert_notif = new QPushButton ( ) ;
alert_notif - > setVisible ( false ) ;
alert_notif - > setStyleSheet ( " background-color: #E22C2C; " ) ;
QObject : : connect ( alert_notif , & QPushButton : : clicked , [ = ] { center_layout - > setCurrentIndex ( 2 ) ; } ) ;
header_layout - > addWidget ( alert_notif , 0 , Qt : : AlignHCenter | Qt : : AlignRight ) ;
header_layout - > addWidget ( new QLabel ( getBrandVersion ( ) ) , 0 , Qt : : AlignHCenter | Qt : : AlignRight ) ;
main_layout - > addLayout ( header_layout ) ;
// main content
main_layout - > addSpacing ( 25 ) ;
center_layout = new QStackedLayout ( ) ;
QWidget * statsAndSetupWidget = new QWidget ( this ) ;
QHBoxLayout * statsAndSetup = new QHBoxLayout ( statsAndSetupWidget ) ;
statsAndSetup - > setMargin ( 0 ) ;
DriveStats * drive = new DriveStats ( ) ;
drive - > setFixedSize ( 800 , 800 ) ;
statsAndSetup - > addWidget ( drive ) ;
statsAndSetup - > addWidget ( new SetupWidget ) ;
center_layout - > addWidget ( statsAndSetupWidget ) ;
// add update & alerts widgets
update_widget = new UpdateAlert ( ) ;
QObject : : connect ( update_widget , & UpdateAlert : : dismiss , [ = ] ( ) { center_layout - > setCurrentIndex ( 0 ) ; } ) ;
center_layout - > addWidget ( update_widget ) ;
alerts_widget = new OffroadAlert ( ) ;
QObject : : connect ( alerts_widget , & OffroadAlert : : dismiss , [ = ] ( ) { center_layout - > setCurrentIndex ( 0 ) ; } ) ;
center_layout - > addWidget ( alerts_widget ) ;
main_layout - > addLayout ( center_layout , 1 ) ;
// set up refresh timer
timer = new QTimer ( this ) ;
timer - > callOnTimeout ( this , & OffroadHome : : refresh ) ;
setStyleSheet ( R " (
* {
color : white ;
}
OffroadHome {
background - color : black ;
}
OffroadHome > QPushButton {
padding : 15 px 30 px ;
border - radius : 5 px ;
font - size : 40 px ;
font - weight : 500 ;
}
OffroadHome > QLabel {
font - size : 55 px ;
}
) " );
refresh ( ) ;
}
void OffroadHome : : showEvent ( QShowEvent * event ) {
timer - > start ( 10 * 1000 ) ;
}
void OffroadHome : : hideEvent ( QHideEvent * event ) {
timer - > stop ( ) ;
}
void OffroadHome : : refresh ( ) {
date - > setText ( QDateTime : : currentDateTime ( ) . toString ( " dddd, MMMM d " ) ) ;
bool updateAvailable = update_widget - > refresh ( ) ;
int alerts = alerts_widget - > refresh ( ) ;
// pop-up new notification
int idx = center_layout - > currentIndex ( ) ;
if ( ! updateAvailable & & ! alerts ) {
idx = 0 ;
} else if ( updateAvailable & & ( ! update_notif - > isVisible ( ) | | ( ! alerts & & idx = = 2 ) ) ) {
idx = 1 ;
} else if ( alerts & & ( ! alert_notif - > isVisible ( ) | | ( ! updateAvailable & & idx = = 1 ) ) ) {
idx = 2 ;
}
center_layout - > setCurrentIndex ( idx ) ;
update_notif - > setVisible ( updateAvailable ) ;
alert_notif - > setVisible ( alerts ) ;
if ( alerts ) {
alert_notif - > setText ( QString : : number ( alerts ) + " ALERT " + ( alerts > 1 ? " S " : " " ) ) ;
}
}