Files
clearpilot/selfdrive/ui/qt/home.cc
Brian Hanson ed9c14616a offroad UI: replace stock home with clean grid launcher
- Strip out date, version, update/alert widgets from OffroadHome
- Replace with grid layout: Dashcam and Settings buttons
- Skip sidebar when tapping splash screen
- Settings button still opens original comma settings
- Dashcam button placeholder (viewer not yet built)
- Add DASHCAM_PROJECT.md with plans for footage viewer

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 07:41:47 +00:00

173 lines
4.6 KiB
C++
Executable File

#include "selfdrive/ui/qt/home.h"
#include <QHBoxLayout>
#include <QMouseEvent>
#include <QStackedWidget>
#include <QVBoxLayout>
#include "selfdrive/ui/qt/util.h"
// HomeWindow: the container for the offroad and onroad UIs
HomeWindow::HomeWindow(QWidget* parent) : QWidget(parent) {
// CLEARPILOT Sidebar set to invisible in drive view.
params.putBool("Sidebar", false);
QHBoxLayout *main_layout = new QHBoxLayout(this);
main_layout->setMargin(0);
main_layout->setSpacing(0);
sidebar = new Sidebar(this);
main_layout->addWidget(sidebar);
QObject::connect(sidebar, &Sidebar::openSettings, this, &HomeWindow::openSettings);
QObject::connect(sidebar, &Sidebar::openOnroad, this, &HomeWindow::showOnroad);
slayout = new QStackedLayout();
main_layout->addLayout(slayout);
home = new OffroadHome(this);
QObject::connect(home, &OffroadHome::openSettings, this, &HomeWindow::openSettings);
slayout->addWidget(home);
onroad = new OnroadWindow(this);
slayout->addWidget(onroad);
// CLEARPILOT
ready = new ReadyWindow(this);
slayout->addWidget(ready);
driver_view = new DriverViewWindow(this);
connect(driver_view, &DriverViewWindow::done, [=] {
showDriverView(false);
});
slayout->addWidget(driver_view);
setAttribute(Qt::WA_NoSystemBackground);
QObject::connect(uiState(), &UIState::uiUpdate, this, &HomeWindow::updateState);
QObject::connect(uiState(), &UIState::offroadTransition, this, &HomeWindow::offroadTransition);
QObject::connect(uiState(), &UIState::offroadTransition, sidebar, &Sidebar::offroadTransition);
}
// Debug function to activate onroad UI
void HomeWindow::showOnroad() {
sidebar->setVisible(false);
slayout->setCurrentWidget(onroad);
// sidebar->setVisible(params.getBool("Sidebar"));
}
void HomeWindow::showSidebar(bool show) {
sidebar->setVisible(show);
}
void HomeWindow::updateState(const UIState &s) {
// const SubMaster &sm = *(s.sm);
if (s.scene.started) {
showDriverView(s.scene.driver_camera_timer >= 10, true);
}
}
void HomeWindow::offroadTransition(bool offroad) {
if (offroad) {
sidebar->setVisible(false);
slayout->setCurrentWidget(ready);
} else {
sidebar->setVisible(false);
slayout->setCurrentWidget(onroad);
}
}
void HomeWindow::showDriverView(bool show, bool started) {
if (show) {
emit closeSettings();
slayout->setCurrentWidget(driver_view);
sidebar->setVisible(show == false);
} else {
if (started) {
slayout->setCurrentWidget(onroad);
sidebar->setVisible(params.getBool("Sidebar"));
} else {
slayout->setCurrentWidget(home);
sidebar->setVisible(show == false);
}
}
}
void HomeWindow::mousePressEvent(QMouseEvent* e) {
// CLEARPILOT todo - tap on main goes straight to settings
// Unless we click a debug widget.
// CLEARPILOT - click ready shows home (no sidebar)
if (!onroad->isVisible() && ready->isVisible()) {
sidebar->setVisible(false);
slayout->setCurrentWidget(home);
}
// Todo: widgets
if (onroad->isVisible()) {
emit openSettings();
}
}
void HomeWindow::mouseDoubleClickEvent(QMouseEvent* e) {
HomeWindow::mousePressEvent(e);
// const SubMaster &sm = *(uiState()->sm);
}
// CLEARPILOT: OffroadHome — clean grid launcher
OffroadHome::OffroadHome(QWidget* parent) : QFrame(parent) {
QVBoxLayout* main_layout = new QVBoxLayout(this);
main_layout->setContentsMargins(80, 80, 80, 80);
main_layout->setSpacing(0);
// grid of launcher buttons
QGridLayout *grid = new QGridLayout();
grid->setSpacing(40);
// Dashcam viewer button
QPushButton *dashcam_btn = new QPushButton("Dashcam");
dashcam_btn->setFixedSize(400, 300);
dashcam_btn->setStyleSheet(R"(
QPushButton {
background-color: #333333;
color: white;
border-radius: 20px;
font-size: 48px;
font-weight: 600;
}
QPushButton:pressed {
background-color: #555555;
}
)");
grid->addWidget(dashcam_btn, 0, 0);
// Settings button
QPushButton *settings_btn = new QPushButton("Settings");
settings_btn->setFixedSize(400, 300);
settings_btn->setStyleSheet(R"(
QPushButton {
background-color: #333333;
color: white;
border-radius: 20px;
font-size: 48px;
font-weight: 600;
}
QPushButton:pressed {
background-color: #555555;
}
)");
QObject::connect(settings_btn, &QPushButton::clicked, [=]() { emit openSettings(); });
grid->addWidget(settings_btn, 0, 1);
main_layout->addStretch();
main_layout->addLayout(grid);
main_layout->addStretch();
setStyleSheet(R"(
OffroadHome {
background-color: black;
}
)");
}