UI: refactor onboarding (#21223)

* refactor onboarding

* skip training guide if is dashcam

* apply review

* cleanup include

* move public ctro up

* slots is private

* cleanup headers

* set style sheet in onboardingwindow

* rebase master

* match ui

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
old-commit-hash: 8781f586c5
commatwo_master
Dean Lee 4 years ago committed by GitHub
parent c7eef35429
commit abffb4db29
  1. 2
      selfdrive/thermald/thermald.py
  2. 57
      selfdrive/ui/qt/offroad/onboarding.cc
  3. 25
      selfdrive/ui/qt/offroad/onboarding.h
  4. 7
      selfdrive/ui/qt/offroad/settings.cc
  5. 47
      selfdrive/ui/qt/window.cc
  6. 15
      selfdrive/ui/qt/window.h

@ -345,7 +345,7 @@ def thermald_thread():
# with 2% left, we killall, otherwise the phone will take a long time to boot # with 2% left, we killall, otherwise the phone will take a long time to boot
startup_conditions["free_space"] = msg.deviceState.freeSpacePercent > 2 startup_conditions["free_space"] = msg.deviceState.freeSpacePercent > 2
startup_conditions["completed_training"] = params.get("CompletedTrainingVersion") == training_version or \ startup_conditions["completed_training"] = params.get("CompletedTrainingVersion") == training_version or \
(current_branch in ['dashcam', 'dashcam-staging']) params.get_bool("Passive")
startup_conditions["not_driver_view"] = not params.get_bool("IsDriverViewEnabled") startup_conditions["not_driver_view"] = not params.get_bool("IsDriverViewEnabled")
startup_conditions["not_taking_snapshot"] = not params.get_bool("IsTakingSnapshot") startup_conditions["not_taking_snapshot"] = not params.get_bool("IsTakingSnapshot")
# if any CPU gets above 107 or the battery gets above 63, kill all processes # if any CPU gets above 107 or the battery gets above 63, kill all processes

@ -88,15 +88,6 @@ void TermsPage::showEvent(QShowEvent *event) {
accept_btn->setEnabled(false); accept_btn->setEnabled(false);
buttons->addWidget(accept_btn); buttons->addWidget(accept_btn);
QObject::connect(accept_btn, &QPushButton::released, this, &TermsPage::acceptedTerms); QObject::connect(accept_btn, &QPushButton::released, this, &TermsPage::acceptedTerms);
setStyleSheet(R"(
QPushButton {
padding: 50px;
font-size: 50px;
border-radius: 10px;
background-color: #292929;
}
)");
} }
void TermsPage::enableAccept() { void TermsPage::enableAccept() {
@ -137,23 +128,14 @@ void DeclinePage::showEvent(QShowEvent *event) {
Params().putBool("DoUninstall", true); Params().putBool("DoUninstall", true);
} }
}); });
setStyleSheet(R"(
QPushButton {
padding: 50px;
font-size: 50px;
border-radius: 10px;
background-color: #292929;
}
)");
} }
void OnboardingWindow::updateActiveScreen() { void OnboardingWindow::updateActiveScreen() {
updateOnboardingStatus(); accepted_terms = params.get("HasAcceptedTerms") == current_terms_version;
training_done = params.get("CompletedTrainingVersion") == current_training_version;
if (!accepted_terms) { if (!accepted_terms) {
setCurrentIndex(0); setCurrentIndex(0);
} else if (!training_done) { } else if (!training_done && !params.getBool("Passive")) {
setCurrentIndex(1); setCurrentIndex(1);
} else { } else {
emit onboardingDone(); emit onboardingDone();
@ -161,35 +143,27 @@ void OnboardingWindow::updateActiveScreen() {
} }
OnboardingWindow::OnboardingWindow(QWidget *parent) : QStackedWidget(parent) { OnboardingWindow::OnboardingWindow(QWidget *parent) : QStackedWidget(parent) {
params = Params(); current_terms_version = params.get("TermsVersion");
current_terms_version = params.get("TermsVersion", false); current_training_version = params.get("TrainingVersion");
current_training_version = params.get("TrainingVersion", false);
TermsPage* terms = new TermsPage(this); TermsPage* terms = new TermsPage(this);
addWidget(terms); addWidget(terms);
connect(terms, &TermsPage::acceptedTerms, [=]() { connect(terms, &TermsPage::acceptedTerms, [=]() {
Params().put("HasAcceptedTerms", current_terms_version); Params().put("HasAcceptedTerms", current_terms_version);
updateActiveScreen(); updateActiveScreen();
}); });
connect(terms, &TermsPage::declinedTerms, [=]() { setCurrentIndex(2); });
TrainingGuide* tr = new TrainingGuide(this); TrainingGuide* tr = new TrainingGuide(this);
addWidget(tr);
connect(tr, &TrainingGuide::completedTraining, [=]() { connect(tr, &TrainingGuide::completedTraining, [=]() {
Params().put("CompletedTrainingVersion", current_training_version); Params().put("CompletedTrainingVersion", current_training_version);
updateActiveScreen(); updateActiveScreen();
}); });
addWidget(tr);
DeclinePage* declinePage = new DeclinePage(this); DeclinePage* declinePage = new DeclinePage(this);
addWidget(declinePage); addWidget(declinePage);
connect(declinePage, &DeclinePage::getBack, [=]() { updateActiveScreen(); });
connect(terms, &TermsPage::declinedTerms, [=]() {
setCurrentIndex(2);
});
connect(declinePage, &DeclinePage::getBack, [=]() {
updateActiveScreen();
});
setStyleSheet(R"( setStyleSheet(R"(
* { * {
@ -198,7 +172,8 @@ OnboardingWindow::OnboardingWindow(QWidget *parent) : QStackedWidget(parent) {
} }
QPushButton { QPushButton {
padding: 50px; padding: 50px;
border-radius: 30px; font-size: 50px;
border-radius: 10px;
background-color: #292929; background-color: #292929;
} }
QPushButton:disabled { QPushButton:disabled {
@ -206,16 +181,8 @@ OnboardingWindow::OnboardingWindow(QWidget *parent) : QStackedWidget(parent) {
background-color: #222222; background-color: #222222;
} }
)"); )");
updateActiveScreen();
}
void OnboardingWindow::updateOnboardingStatus() {
accepted_terms = params.get("HasAcceptedTerms", false).compare(current_terms_version) == 0;
training_done = params.get("CompletedTrainingVersion", false).compare(current_training_version) == 0;
} }
bool OnboardingWindow::isOnboardingDone() { void OnboardingWindow::showEvent(QShowEvent *event) {
updateOnboardingStatus(); updateActiveScreen();
return accepted_terms && training_done;
} }

@ -14,12 +14,11 @@ class TrainingGuide : public QFrame {
public: public:
explicit TrainingGuide(QWidget *parent = 0) : QFrame(parent) {}; explicit TrainingGuide(QWidget *parent = 0) : QFrame(parent) {};
protected: private:
void showEvent(QShowEvent *event) override; void showEvent(QShowEvent *event) override;
void paintEvent(QPaintEvent *event) override; void paintEvent(QPaintEvent *event) override;
void mouseReleaseEvent(QMouseEvent* e) override; void mouseReleaseEvent(QMouseEvent* e) override;
private:
QImage image; QImage image;
QPoint imageCorner; QPoint imageCorner;
int currentIndex = 0; int currentIndex = 0;
@ -58,16 +57,15 @@ class TermsPage : public QFrame {
public: public:
explicit TermsPage(QWidget *parent = 0) : QFrame(parent) {}; explicit TermsPage(QWidget *parent = 0) : QFrame(parent) {};
protected: public slots:
void showEvent(QShowEvent *event) override; void enableAccept();
private: private:
void showEvent(QShowEvent *event) override;
QPushButton *accept_btn; QPushButton *accept_btn;
QPushButton *decline_btn; QPushButton *decline_btn;
public slots:
void enableAccept();
signals: signals:
void acceptedTerms(); void acceptedTerms();
void declinedTerms(); void declinedTerms();
@ -79,10 +77,8 @@ class DeclinePage : public QFrame {
public: public:
explicit DeclinePage(QWidget *parent = 0) : QFrame(parent) {}; explicit DeclinePage(QWidget *parent = 0) : QFrame(parent) {};
protected:
void showEvent(QShowEvent *event) override;
private: private:
void showEvent(QShowEvent *event) override;
QPushButton *back_btn; QPushButton *back_btn;
QPushButton *uninstall_btn; QPushButton *uninstall_btn;
@ -95,20 +91,17 @@ class OnboardingWindow : public QStackedWidget {
public: public:
explicit OnboardingWindow(QWidget *parent = 0); explicit OnboardingWindow(QWidget *parent = 0);
bool isOnboardingDone();
private: private:
void showEvent(QShowEvent *event) override;
void updateActiveScreen();
Params params; Params params;
std::string current_terms_version; std::string current_terms_version;
std::string current_training_version; std::string current_training_version;
bool accepted_terms = false; bool accepted_terms = false;
bool training_done = false; bool training_done = false;
void updateOnboardingStatus();
signals: signals:
void onboardingDone(); void onboardingDone();
void resetTrainingGuide();
public slots:
void updateActiveScreen();
}; };

@ -147,13 +147,16 @@ DevicePanel::DevicePanel(QWidget* parent) : QWidget(parent) {
resetCalibBtn->setDescription(desc); resetCalibBtn->setDescription(desc);
}); });
auto retrainingBtn = new ButtonControl("Review Training Guide", "REVIEW", "Review the rules, features, and limitations of openpilot"); ButtonControl *retrainingBtn = nullptr;
if (!params.getBool("Passive")) {
retrainingBtn = new ButtonControl("Review Training Guide", "REVIEW", "Review the rules, features, and limitations of openpilot");
connect(retrainingBtn, &ButtonControl::released, [=]() { connect(retrainingBtn, &ButtonControl::released, [=]() {
if (ConfirmationDialog::confirm("Are you sure you want to review the training guide?", this)) { if (ConfirmationDialog::confirm("Are you sure you want to review the training guide?", this)) {
Params().remove("CompletedTrainingVersion"); Params().remove("CompletedTrainingVersion");
emit reviewTrainingGuide(); emit reviewTrainingGuide();
} }
}); });
}
auto uninstallBtn = new ButtonControl("Uninstall " + getBrand(), "UNINSTALL"); auto uninstallBtn = new ButtonControl("Uninstall " + getBrand(), "UNINSTALL");
connect(uninstallBtn, &ButtonControl::released, [=]() { connect(uninstallBtn, &ButtonControl::released, [=]() {
@ -163,10 +166,12 @@ DevicePanel::DevicePanel(QWidget* parent) : QWidget(parent) {
}); });
for (auto btn : {dcamBtn, resetCalibBtn, retrainingBtn, uninstallBtn}) { for (auto btn : {dcamBtn, resetCalibBtn, retrainingBtn, uninstallBtn}) {
if (btn) {
main_layout->addWidget(horizontal_line()); main_layout->addWidget(horizontal_line());
connect(parent, SIGNAL(offroadTransition(bool)), btn, SLOT(setEnabled(bool))); connect(parent, SIGNAL(offroadTransition(bool)), btn, SLOT(setEnabled(bool)));
main_layout->addWidget(btn); main_layout->addWidget(btn);
} }
}
// power buttons // power buttons
QHBoxLayout *power_layout = new QHBoxLayout(); QHBoxLayout *power_layout = new QHBoxLayout();

@ -8,6 +8,12 @@ MainWindow::MainWindow(QWidget *parent) : QWidget(parent) {
main_layout = new QStackedLayout(this); main_layout = new QStackedLayout(this);
main_layout->setMargin(0); main_layout->setMargin(0);
onboardingWindow = new OnboardingWindow(this);
main_layout->addWidget(onboardingWindow);
QObject::connect(onboardingWindow, &OnboardingWindow::onboardingDone, [=]() {
main_layout->setCurrentWidget(homeWindow);
});
homeWindow = new HomeWindow(this); homeWindow = new HomeWindow(this);
main_layout->addWidget(homeWindow); main_layout->addWidget(homeWindow);
QObject::connect(homeWindow, &HomeWindow::openSettings, this, &MainWindow::openSettings); QObject::connect(homeWindow, &HomeWindow::openSettings, this, &MainWindow::openSettings);
@ -21,26 +27,25 @@ MainWindow::MainWindow(QWidget *parent) : QWidget(parent) {
main_layout->addWidget(settingsWindow); main_layout->addWidget(settingsWindow);
QObject::connect(settingsWindow, &SettingsWindow::closeSettings, this, &MainWindow::closeSettings); QObject::connect(settingsWindow, &SettingsWindow::closeSettings, this, &MainWindow::closeSettings);
QObject::connect(&qs, &QUIState::offroadTransition, settingsWindow, &SettingsWindow::offroadTransition); QObject::connect(&qs, &QUIState::offroadTransition, settingsWindow, &SettingsWindow::offroadTransition);
QObject::connect(settingsWindow, &SettingsWindow::reviewTrainingGuide, this, &MainWindow::reviewTrainingGuide); QObject::connect(settingsWindow, &SettingsWindow::reviewTrainingGuide, [=]() {
main_layout->setCurrentWidget(onboardingWindow);
});
QObject::connect(settingsWindow, &SettingsWindow::showDriverView, [=] { QObject::connect(settingsWindow, &SettingsWindow::showDriverView, [=] {
homeWindow->showDriverView(true); homeWindow->showDriverView(true);
}); });
onboardingWindow = new OnboardingWindow(this);
onboardingDone = onboardingWindow->isOnboardingDone();
main_layout->addWidget(onboardingWindow);
main_layout->setCurrentWidget(onboardingWindow);
QObject::connect(onboardingWindow, &OnboardingWindow::onboardingDone, [=]() {
onboardingDone = true;
closeSettings();
});
onboardingWindow->updateActiveScreen();
device.setAwake(true, true); device.setAwake(true, true);
QObject::connect(&qs, &QUIState::uiUpdate, &device, &Device::update); QObject::connect(&qs, &QUIState::uiUpdate, &device, &Device::update);
QObject::connect(&qs, &QUIState::offroadTransition, this, &MainWindow::offroadTransition); QObject::connect(&qs, &QUIState::offroadTransition, [=](bool offroad) {
QObject::connect(&device, &Device::displayPowerChanged, this, &MainWindow::closeSettings); if (!offroad) {
closeSettings();
}
});
QObject::connect(&device, &Device::displayPowerChanged, [=]() {
if(main_layout->currentWidget() != onboardingWindow) {
closeSettings();
}
});
// load fonts // load fonts
QFontDatabase::addApplicationFont("../assets/fonts/opensans_regular.ttf"); QFontDatabase::addApplicationFont("../assets/fonts/opensans_regular.ttf");
@ -56,26 +61,12 @@ MainWindow::MainWindow(QWidget *parent) : QWidget(parent) {
)"); )");
} }
void MainWindow::offroadTransition(bool offroad) {
if(!offroad) {
closeSettings();
}
}
void MainWindow::openSettings() { void MainWindow::openSettings() {
main_layout->setCurrentWidget(settingsWindow); main_layout->setCurrentWidget(settingsWindow);
} }
void MainWindow::closeSettings() { void MainWindow::closeSettings() {
if(onboardingDone) {
main_layout->setCurrentWidget(homeWindow); main_layout->setCurrentWidget(homeWindow);
}
}
void MainWindow::reviewTrainingGuide() {
onboardingDone = false;
main_layout->setCurrentWidget(onboardingWindow);
onboardingWindow->updateActiveScreen();
} }
bool MainWindow::eventFilter(QObject *obj, QEvent *event) { bool MainWindow::eventFilter(QObject *obj, QEvent *event) {

@ -6,18 +6,18 @@
#include "selfdrive/ui/qt/home.h" #include "selfdrive/ui/qt/home.h"
#include "selfdrive/ui/qt/offroad/onboarding.h" #include "selfdrive/ui/qt/offroad/onboarding.h"
#include "selfdrive/ui/qt/offroad/settings.h" #include "selfdrive/ui/qt/offroad/settings.h"
#include "selfdrive/ui/ui.h"
class MainWindow : public QWidget { class MainWindow : public QWidget {
Q_OBJECT Q_OBJECT
protected:
bool eventFilter(QObject *obj, QEvent *event) override;
public: public:
explicit MainWindow(QWidget *parent = 0); explicit MainWindow(QWidget *parent = 0);
private: private:
bool eventFilter(QObject *obj, QEvent *event) override;
void openSettings();
void closeSettings();
Device device; Device device;
QUIState qs; QUIState qs;
@ -25,11 +25,4 @@ private:
HomeWindow *homeWindow; HomeWindow *homeWindow;
SettingsWindow *settingsWindow; SettingsWindow *settingsWindow;
OnboardingWindow *onboardingWindow; OnboardingWindow *onboardingWindow;
bool onboardingDone = false;
public slots:
void offroadTransition(bool offroad);
void openSettings();
void closeSettings();
void reviewTrainingGuide();
}; };

Loading…
Cancel
Save