Remove more Qt, part 2 (#35968)
parent
2d8030de0b
commit
1c46640ea6
4 changed files with 1 additions and 609 deletions
@ -1,23 +0,0 @@ |
|||||||
import os |
|
||||||
import platform |
|
||||||
from cffi import FFI |
|
||||||
|
|
||||||
import sip |
|
||||||
|
|
||||||
from openpilot.common.basedir import BASEDIR |
|
||||||
|
|
||||||
def suffix(): |
|
||||||
return ".dylib" if platform.system() == "Darwin" else ".so" |
|
||||||
|
|
||||||
|
|
||||||
def get_ffi(): |
|
||||||
lib = os.path.join(BASEDIR, "selfdrive", "ui", "qt", "libpython_helpers" + suffix()) |
|
||||||
|
|
||||||
ffi = FFI() |
|
||||||
ffi.cdef("void set_main_window(void *w);") |
|
||||||
return ffi, ffi.dlopen(lib) |
|
||||||
|
|
||||||
|
|
||||||
def set_main_window(widget): |
|
||||||
ffi, lib = get_ffi() |
|
||||||
lib.set_main_window(ffi.cast('void*', sip.unwrapinstance(widget))) |
|
@ -1,541 +0,0 @@ |
|||||||
#include "selfdrive/ui/qt/setup/setup.h" |
|
||||||
|
|
||||||
#include <cstdio> |
|
||||||
#include <cstdlib> |
|
||||||
#include <sstream> |
|
||||||
#include <string> |
|
||||||
|
|
||||||
#include <QApplication> |
|
||||||
#include <QLabel> |
|
||||||
#include <QVBoxLayout> |
|
||||||
|
|
||||||
#include <curl/curl.h> |
|
||||||
|
|
||||||
#include "common/util.h" |
|
||||||
#include "system/hardware/hw.h" |
|
||||||
#include "selfdrive/ui/qt/api.h" |
|
||||||
#include "selfdrive/ui/qt/qt_window.h" |
|
||||||
#include "selfdrive/ui/qt/network/networking.h" |
|
||||||
#include "selfdrive/ui/qt/util.h" |
|
||||||
#include "selfdrive/ui/qt/widgets/input.h" |
|
||||||
|
|
||||||
const std::string USER_AGENT = "AGNOSSetup-"; |
|
||||||
const QString OPENPILOT_URL = "https://openpilot.comma.ai"; |
|
||||||
|
|
||||||
bool is_elf(char *fname) { |
|
||||||
FILE *fp = fopen(fname, "rb"); |
|
||||||
if (fp == NULL) { |
|
||||||
return false; |
|
||||||
} |
|
||||||
char buf[4]; |
|
||||||
size_t n = fread(buf, 1, 4, fp); |
|
||||||
fclose(fp); |
|
||||||
return n == 4 && buf[0] == 0x7f && buf[1] == 'E' && buf[2] == 'L' && buf[3] == 'F'; |
|
||||||
} |
|
||||||
|
|
||||||
void Setup::download(QString url) { |
|
||||||
// autocomplete incomplete urls
|
|
||||||
if (QRegularExpression("^([^/.]+)/([^/]+)$").match(url).hasMatch()) { |
|
||||||
url.prepend("https://installer.comma.ai/"); |
|
||||||
} |
|
||||||
|
|
||||||
CURL *curl = curl_easy_init(); |
|
||||||
if (!curl) { |
|
||||||
emit finished(url, tr("Something went wrong. Reboot the device.")); |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
auto version = util::read_file("/VERSION"); |
|
||||||
|
|
||||||
struct curl_slist *list = NULL; |
|
||||||
std::string header = "X-openpilot-serial: " + Hardware::get_serial(); |
|
||||||
list = curl_slist_append(list, header.c_str()); |
|
||||||
|
|
||||||
char tmpfile[] = "/tmp/installer_XXXXXX"; |
|
||||||
FILE *fp = fdopen(mkstemp(tmpfile), "wb"); |
|
||||||
|
|
||||||
curl_easy_setopt(curl, CURLOPT_URL, url.toStdString().c_str()); |
|
||||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL); |
|
||||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); |
|
||||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); |
|
||||||
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); |
|
||||||
curl_easy_setopt(curl, CURLOPT_USERAGENT, (USER_AGENT + version).c_str()); |
|
||||||
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list); |
|
||||||
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30L); |
|
||||||
|
|
||||||
int ret = curl_easy_perform(curl); |
|
||||||
long res_status = 0; |
|
||||||
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &res_status); |
|
||||||
|
|
||||||
if (ret != CURLE_OK || res_status != 200) { |
|
||||||
emit finished(url, tr("Ensure the entered URL is valid, and the device’s internet connection is good.")); |
|
||||||
} else if (!is_elf(tmpfile)) { |
|
||||||
emit finished(url, tr("No custom software found at this URL.")); |
|
||||||
} else { |
|
||||||
rename(tmpfile, "/tmp/installer"); |
|
||||||
|
|
||||||
FILE *fp_url = fopen("/tmp/installer_url", "w"); |
|
||||||
fprintf(fp_url, "%s", url.toStdString().c_str()); |
|
||||||
fclose(fp_url); |
|
||||||
|
|
||||||
emit finished(url); |
|
||||||
} |
|
||||||
|
|
||||||
curl_slist_free_all(list); |
|
||||||
curl_easy_cleanup(curl); |
|
||||||
fclose(fp); |
|
||||||
} |
|
||||||
|
|
||||||
QWidget * Setup::low_voltage() { |
|
||||||
QWidget *widget = new QWidget(); |
|
||||||
QVBoxLayout *main_layout = new QVBoxLayout(widget); |
|
||||||
main_layout->setContentsMargins(55, 0, 55, 55); |
|
||||||
main_layout->setSpacing(0); |
|
||||||
|
|
||||||
// inner text layout: warning icon, title, and body
|
|
||||||
QVBoxLayout *inner_layout = new QVBoxLayout(); |
|
||||||
inner_layout->setContentsMargins(110, 144, 365, 0); |
|
||||||
main_layout->addLayout(inner_layout); |
|
||||||
|
|
||||||
QLabel *triangle = new QLabel(); |
|
||||||
triangle->setPixmap(QPixmap(ASSET_PATH + "icons/warning.png")); |
|
||||||
inner_layout->addWidget(triangle, 0, Qt::AlignTop | Qt::AlignLeft); |
|
||||||
inner_layout->addSpacing(80); |
|
||||||
|
|
||||||
QLabel *title = new QLabel(tr("WARNING: Low Voltage")); |
|
||||||
title->setStyleSheet("font-size: 90px; font-weight: 500; color: #FF594F;"); |
|
||||||
inner_layout->addWidget(title, 0, Qt::AlignTop | Qt::AlignLeft); |
|
||||||
|
|
||||||
inner_layout->addSpacing(25); |
|
||||||
|
|
||||||
QLabel *body = new QLabel(tr("Power your device in a car with a harness or proceed at your own risk.")); |
|
||||||
body->setWordWrap(true); |
|
||||||
body->setAlignment(Qt::AlignTop | Qt::AlignLeft); |
|
||||||
body->setStyleSheet("font-size: 80px; font-weight: 300;"); |
|
||||||
inner_layout->addWidget(body); |
|
||||||
|
|
||||||
inner_layout->addStretch(); |
|
||||||
|
|
||||||
// power off + continue buttons
|
|
||||||
QHBoxLayout *blayout = new QHBoxLayout(); |
|
||||||
blayout->setSpacing(50); |
|
||||||
main_layout->addLayout(blayout, 0); |
|
||||||
|
|
||||||
QPushButton *poweroff = new QPushButton(tr("Power off")); |
|
||||||
poweroff->setObjectName("navBtn"); |
|
||||||
blayout->addWidget(poweroff); |
|
||||||
QObject::connect(poweroff, &QPushButton::clicked, this, [=]() { |
|
||||||
Hardware::poweroff(); |
|
||||||
}); |
|
||||||
|
|
||||||
QPushButton *cont = new QPushButton(tr("Continue")); |
|
||||||
cont->setObjectName("navBtn"); |
|
||||||
blayout->addWidget(cont); |
|
||||||
QObject::connect(cont, &QPushButton::clicked, this, &Setup::nextPage); |
|
||||||
|
|
||||||
return widget; |
|
||||||
} |
|
||||||
|
|
||||||
QWidget * Setup::custom_software_warning() { |
|
||||||
QWidget *widget = new QWidget(); |
|
||||||
QVBoxLayout *main_layout = new QVBoxLayout(widget); |
|
||||||
main_layout->setContentsMargins(55, 0, 55, 55); |
|
||||||
main_layout->setSpacing(0); |
|
||||||
|
|
||||||
QVBoxLayout *inner_layout = new QVBoxLayout(); |
|
||||||
inner_layout->setContentsMargins(110, 110, 300, 0); |
|
||||||
main_layout->addLayout(inner_layout); |
|
||||||
|
|
||||||
QLabel *title = new QLabel(tr("WARNING: Custom Software")); |
|
||||||
title->setStyleSheet("font-size: 90px; font-weight: 500; color: #FF594F;"); |
|
||||||
inner_layout->addWidget(title, 0, Qt::AlignTop | Qt::AlignLeft); |
|
||||||
|
|
||||||
inner_layout->addSpacing(25); |
|
||||||
|
|
||||||
QLabel *body = new QLabel(tr("Use caution when installing third-party software. Third-party software has not been tested by comma, and may cause damage to your device and/or vehicle.\n\nIf you'd like to proceed, use https://flash.comma.ai to restore your device to a factory state later.")); |
|
||||||
body->setWordWrap(true); |
|
||||||
body->setAlignment(Qt::AlignTop | Qt::AlignLeft); |
|
||||||
body->setStyleSheet("font-size: 65px; font-weight: 300;"); |
|
||||||
inner_layout->addWidget(body); |
|
||||||
|
|
||||||
inner_layout->addStretch(); |
|
||||||
|
|
||||||
QHBoxLayout *blayout = new QHBoxLayout(); |
|
||||||
blayout->setSpacing(50); |
|
||||||
main_layout->addLayout(blayout, 0); |
|
||||||
|
|
||||||
QPushButton *back = new QPushButton(tr("Back")); |
|
||||||
back->setObjectName("navBtn"); |
|
||||||
blayout->addWidget(back); |
|
||||||
QObject::connect(back, &QPushButton::clicked, this, &Setup::prevPage); |
|
||||||
|
|
||||||
QPushButton *cont = new QPushButton(tr("Continue")); |
|
||||||
cont->setObjectName("navBtn"); |
|
||||||
blayout->addWidget(cont); |
|
||||||
QObject::connect(cont, &QPushButton::clicked, this, [=]() { |
|
||||||
QTimer::singleShot(0, [=]() { |
|
||||||
setCurrentWidget(downloading_widget); |
|
||||||
}); |
|
||||||
QString url = InputDialog::getText(tr("Enter URL"), this, tr("for Custom Software")); |
|
||||||
if (!url.isEmpty()) { |
|
||||||
QTimer::singleShot(1000, this, [=]() { |
|
||||||
download(url); |
|
||||||
}); |
|
||||||
} else { |
|
||||||
setCurrentWidget(software_selection_widget); |
|
||||||
} |
|
||||||
}); |
|
||||||
|
|
||||||
return widget; |
|
||||||
} |
|
||||||
|
|
||||||
QWidget * Setup::getting_started() { |
|
||||||
QWidget *widget = new QWidget(); |
|
||||||
|
|
||||||
QHBoxLayout *main_layout = new QHBoxLayout(widget); |
|
||||||
main_layout->setMargin(0); |
|
||||||
|
|
||||||
QVBoxLayout *vlayout = new QVBoxLayout(); |
|
||||||
vlayout->setContentsMargins(165, 280, 100, 0); |
|
||||||
main_layout->addLayout(vlayout); |
|
||||||
|
|
||||||
QLabel *title = new QLabel(tr("Getting Started")); |
|
||||||
title->setStyleSheet("font-size: 90px; font-weight: 500;"); |
|
||||||
vlayout->addWidget(title, 0, Qt::AlignTop | Qt::AlignLeft); |
|
||||||
|
|
||||||
vlayout->addSpacing(90); |
|
||||||
QLabel *desc = new QLabel(tr("Before we get on the road, let’s finish installation and cover some details.")); |
|
||||||
desc->setWordWrap(true); |
|
||||||
desc->setStyleSheet("font-size: 80px; font-weight: 300;"); |
|
||||||
vlayout->addWidget(desc, 0, Qt::AlignTop | Qt::AlignLeft); |
|
||||||
|
|
||||||
vlayout->addStretch(); |
|
||||||
|
|
||||||
QPushButton *btn = new QPushButton(); |
|
||||||
btn->setIcon(QIcon(":/images/button_continue_triangle.svg")); |
|
||||||
btn->setIconSize(QSize(54, 106)); |
|
||||||
btn->setFixedSize(310, 1080); |
|
||||||
btn->setProperty("primary", true); |
|
||||||
btn->setStyleSheet("border: none;"); |
|
||||||
main_layout->addWidget(btn, 0, Qt::AlignRight); |
|
||||||
QObject::connect(btn, &QPushButton::clicked, this, &Setup::nextPage); |
|
||||||
|
|
||||||
return widget; |
|
||||||
} |
|
||||||
|
|
||||||
QWidget * Setup::network_setup() { |
|
||||||
QWidget *widget = new QWidget(); |
|
||||||
QVBoxLayout *main_layout = new QVBoxLayout(widget); |
|
||||||
main_layout->setContentsMargins(55, 50, 55, 50); |
|
||||||
|
|
||||||
// title
|
|
||||||
QLabel *title = new QLabel(tr("Connect to Wi-Fi")); |
|
||||||
title->setStyleSheet("font-size: 90px; font-weight: 500;"); |
|
||||||
main_layout->addWidget(title, 0, Qt::AlignLeft | Qt::AlignTop); |
|
||||||
|
|
||||||
main_layout->addSpacing(25); |
|
||||||
|
|
||||||
// wifi widget
|
|
||||||
Networking *networking = new Networking(this, false); |
|
||||||
networking->setStyleSheet("Networking {background-color: #292929; border-radius: 13px;}"); |
|
||||||
main_layout->addWidget(networking, 1); |
|
||||||
|
|
||||||
main_layout->addSpacing(35); |
|
||||||
|
|
||||||
// back + continue buttons
|
|
||||||
QHBoxLayout *blayout = new QHBoxLayout; |
|
||||||
main_layout->addLayout(blayout); |
|
||||||
blayout->setSpacing(50); |
|
||||||
|
|
||||||
QPushButton *back = new QPushButton(tr("Back")); |
|
||||||
back->setObjectName("navBtn"); |
|
||||||
QObject::connect(back, &QPushButton::clicked, this, &Setup::prevPage); |
|
||||||
blayout->addWidget(back); |
|
||||||
|
|
||||||
QPushButton *cont = new QPushButton(); |
|
||||||
cont->setObjectName("navBtn"); |
|
||||||
cont->setProperty("primary", true); |
|
||||||
cont->setEnabled(false); |
|
||||||
QObject::connect(cont, &QPushButton::clicked, this, &Setup::nextPage); |
|
||||||
blayout->addWidget(cont); |
|
||||||
|
|
||||||
// setup timer for testing internet connection
|
|
||||||
HttpRequest *request = new HttpRequest(this, false, 2500); |
|
||||||
QObject::connect(request, &HttpRequest::requestDone, [=](const QString &, bool success) { |
|
||||||
cont->setEnabled(success); |
|
||||||
if (success) { |
|
||||||
const bool wifi = networking->wifi->currentNetworkType() == NetworkType::WIFI; |
|
||||||
cont->setText(wifi ? tr("Continue") : tr("Continue without Wi-Fi")); |
|
||||||
} else { |
|
||||||
cont->setText(tr("Waiting for internet")); |
|
||||||
} |
|
||||||
repaint(); |
|
||||||
}); |
|
||||||
request->sendRequest(OPENPILOT_URL); |
|
||||||
QTimer *timer = new QTimer(this); |
|
||||||
QObject::connect(timer, &QTimer::timeout, [=]() { |
|
||||||
if (!request->active() && cont->isVisible()) { |
|
||||||
request->sendRequest(OPENPILOT_URL); |
|
||||||
} |
|
||||||
}); |
|
||||||
timer->start(1000); |
|
||||||
|
|
||||||
return widget; |
|
||||||
} |
|
||||||
|
|
||||||
QWidget * radio_button(QString title, QButtonGroup *group) { |
|
||||||
QPushButton *btn = new QPushButton(title); |
|
||||||
btn->setCheckable(true); |
|
||||||
group->addButton(btn); |
|
||||||
btn->setStyleSheet(R"( |
|
||||||
QPushButton { |
|
||||||
height: 230; |
|
||||||
padding-left: 100px; |
|
||||||
padding-right: 100px; |
|
||||||
text-align: left; |
|
||||||
font-size: 80px; |
|
||||||
font-weight: 400; |
|
||||||
border-radius: 10px; |
|
||||||
background-color: #4F4F4F; |
|
||||||
} |
|
||||||
QPushButton:checked { |
|
||||||
background-color: #465BEA; |
|
||||||
} |
|
||||||
)"); |
|
||||||
|
|
||||||
// checkmark icon
|
|
||||||
QPixmap pix(":/icons/circled_check.svg"); |
|
||||||
btn->setIcon(pix); |
|
||||||
btn->setIconSize(QSize(0, 0)); |
|
||||||
btn->setLayoutDirection(Qt::RightToLeft); |
|
||||||
QObject::connect(btn, &QPushButton::toggled, [=](bool checked) { |
|
||||||
btn->setIconSize(checked ? QSize(104, 104) : QSize(0, 0)); |
|
||||||
}); |
|
||||||
return btn; |
|
||||||
} |
|
||||||
|
|
||||||
QWidget * Setup::software_selection() { |
|
||||||
QWidget *widget = new QWidget(); |
|
||||||
QVBoxLayout *main_layout = new QVBoxLayout(widget); |
|
||||||
main_layout->setContentsMargins(55, 50, 55, 50); |
|
||||||
main_layout->setSpacing(0); |
|
||||||
|
|
||||||
// title
|
|
||||||
QLabel *title = new QLabel(tr("Choose Software to Install")); |
|
||||||
title->setStyleSheet("font-size: 90px; font-weight: 500;"); |
|
||||||
main_layout->addWidget(title, 0, Qt::AlignLeft | Qt::AlignTop); |
|
||||||
|
|
||||||
main_layout->addSpacing(50); |
|
||||||
|
|
||||||
// openpilot + custom radio buttons
|
|
||||||
QButtonGroup *group = new QButtonGroup(widget); |
|
||||||
group->setExclusive(true); |
|
||||||
|
|
||||||
QWidget *openpilot = radio_button(tr("openpilot"), group); |
|
||||||
main_layout->addWidget(openpilot); |
|
||||||
|
|
||||||
main_layout->addSpacing(30); |
|
||||||
|
|
||||||
QWidget *custom = radio_button(tr("Custom Software"), group); |
|
||||||
main_layout->addWidget(custom); |
|
||||||
|
|
||||||
main_layout->addStretch(); |
|
||||||
|
|
||||||
// back + continue buttons
|
|
||||||
QHBoxLayout *blayout = new QHBoxLayout; |
|
||||||
main_layout->addLayout(blayout); |
|
||||||
blayout->setSpacing(50); |
|
||||||
|
|
||||||
QPushButton *back = new QPushButton(tr("Back")); |
|
||||||
back->setObjectName("navBtn"); |
|
||||||
QObject::connect(back, &QPushButton::clicked, this, &Setup::prevPage); |
|
||||||
blayout->addWidget(back); |
|
||||||
|
|
||||||
QPushButton *cont = new QPushButton(tr("Continue")); |
|
||||||
cont->setObjectName("navBtn"); |
|
||||||
cont->setEnabled(false); |
|
||||||
cont->setProperty("primary", true); |
|
||||||
blayout->addWidget(cont); |
|
||||||
|
|
||||||
QObject::connect(cont, &QPushButton::clicked, [=]() { |
|
||||||
if (group->checkedButton() != openpilot) { |
|
||||||
QTimer::singleShot(0, [=]() { |
|
||||||
setCurrentWidget(custom_software_warning_widget); |
|
||||||
}); |
|
||||||
} else { |
|
||||||
QTimer::singleShot(0, [=]() { |
|
||||||
setCurrentWidget(downloading_widget); |
|
||||||
}); |
|
||||||
QTimer::singleShot(1000, this, [=]() { |
|
||||||
download(OPENPILOT_URL); |
|
||||||
}); |
|
||||||
} |
|
||||||
}); |
|
||||||
|
|
||||||
connect(group, QOverload<QAbstractButton *>::of(&QButtonGroup::buttonClicked), [=](QAbstractButton *btn) { |
|
||||||
btn->setChecked(true); |
|
||||||
cont->setEnabled(true); |
|
||||||
}); |
|
||||||
|
|
||||||
return widget; |
|
||||||
} |
|
||||||
|
|
||||||
QWidget * Setup::downloading() { |
|
||||||
QWidget *widget = new QWidget(); |
|
||||||
QVBoxLayout *main_layout = new QVBoxLayout(widget); |
|
||||||
QLabel *txt = new QLabel(tr("Downloading...")); |
|
||||||
txt->setStyleSheet("font-size: 90px; font-weight: 500;"); |
|
||||||
main_layout->addWidget(txt, 0, Qt::AlignCenter); |
|
||||||
return widget; |
|
||||||
} |
|
||||||
|
|
||||||
QWidget * Setup::download_failed(QLabel *url, QLabel *body) { |
|
||||||
QWidget *widget = new QWidget(); |
|
||||||
QVBoxLayout *main_layout = new QVBoxLayout(widget); |
|
||||||
main_layout->setContentsMargins(55, 185, 55, 55); |
|
||||||
main_layout->setSpacing(0); |
|
||||||
|
|
||||||
QLabel *title = new QLabel(tr("Download Failed")); |
|
||||||
title->setStyleSheet("font-size: 90px; font-weight: 500;"); |
|
||||||
main_layout->addWidget(title, 0, Qt::AlignTop | Qt::AlignLeft); |
|
||||||
|
|
||||||
main_layout->addSpacing(67); |
|
||||||
|
|
||||||
url->setWordWrap(true); |
|
||||||
url->setAlignment(Qt::AlignTop | Qt::AlignLeft); |
|
||||||
url->setStyleSheet("font-family: \"JetBrains Mono\"; font-size: 64px; font-weight: 400; margin-right: 100px;"); |
|
||||||
main_layout->addWidget(url); |
|
||||||
|
|
||||||
main_layout->addSpacing(48); |
|
||||||
|
|
||||||
body->setWordWrap(true); |
|
||||||
body->setAlignment(Qt::AlignTop | Qt::AlignLeft); |
|
||||||
body->setStyleSheet("font-size: 80px; font-weight: 300; margin-right: 100px;"); |
|
||||||
main_layout->addWidget(body); |
|
||||||
|
|
||||||
main_layout->addStretch(); |
|
||||||
|
|
||||||
// reboot + start over buttons
|
|
||||||
QHBoxLayout *blayout = new QHBoxLayout(); |
|
||||||
blayout->setSpacing(50); |
|
||||||
main_layout->addLayout(blayout, 0); |
|
||||||
|
|
||||||
QPushButton *reboot = new QPushButton(tr("Reboot device")); |
|
||||||
reboot->setObjectName("navBtn"); |
|
||||||
blayout->addWidget(reboot); |
|
||||||
QObject::connect(reboot, &QPushButton::clicked, this, [=]() { |
|
||||||
Hardware::reboot(); |
|
||||||
}); |
|
||||||
|
|
||||||
QPushButton *restart = new QPushButton(tr("Start over")); |
|
||||||
restart->setObjectName("navBtn"); |
|
||||||
restart->setProperty("primary", true); |
|
||||||
blayout->addWidget(restart); |
|
||||||
QObject::connect(restart, &QPushButton::clicked, this, [=]() { |
|
||||||
setCurrentIndex(1); |
|
||||||
}); |
|
||||||
|
|
||||||
widget->setStyleSheet(R"( |
|
||||||
QLabel { |
|
||||||
margin-left: 117; |
|
||||||
} |
|
||||||
)"); |
|
||||||
return widget; |
|
||||||
} |
|
||||||
|
|
||||||
void Setup::prevPage() { |
|
||||||
setCurrentIndex(currentIndex() - 1); |
|
||||||
} |
|
||||||
|
|
||||||
void Setup::nextPage() { |
|
||||||
setCurrentIndex(currentIndex() + 1); |
|
||||||
} |
|
||||||
|
|
||||||
Setup::Setup(QWidget *parent) : QStackedWidget(parent) { |
|
||||||
if (std::getenv("MULTILANG")) { |
|
||||||
selectLanguage(); |
|
||||||
} |
|
||||||
|
|
||||||
std::stringstream buffer; |
|
||||||
buffer << std::ifstream("/sys/class/hwmon/hwmon1/in1_input").rdbuf(); |
|
||||||
float voltage = (float)std::atoi(buffer.str().c_str()) / 1000.; |
|
||||||
if (voltage < 7) { |
|
||||||
addWidget(low_voltage()); |
|
||||||
} |
|
||||||
|
|
||||||
addWidget(getting_started()); |
|
||||||
addWidget(network_setup()); |
|
||||||
software_selection_widget = software_selection(); |
|
||||||
addWidget(software_selection_widget); |
|
||||||
custom_software_warning_widget = custom_software_warning(); |
|
||||||
addWidget(custom_software_warning_widget); |
|
||||||
downloading_widget = downloading(); |
|
||||||
addWidget(downloading_widget); |
|
||||||
|
|
||||||
QLabel *url_label = new QLabel(); |
|
||||||
QLabel *body_label = new QLabel(); |
|
||||||
failed_widget = download_failed(url_label, body_label); |
|
||||||
addWidget(failed_widget); |
|
||||||
|
|
||||||
QObject::connect(this, &Setup::finished, [=](const QString &url, const QString &error) { |
|
||||||
qDebug() << "finished" << url << error; |
|
||||||
if (error.isEmpty()) { |
|
||||||
// hide setup on success
|
|
||||||
QTimer::singleShot(3000, this, &QWidget::hide); |
|
||||||
} else { |
|
||||||
url_label->setText(url); |
|
||||||
body_label->setText(error); |
|
||||||
setCurrentWidget(failed_widget); |
|
||||||
} |
|
||||||
}); |
|
||||||
|
|
||||||
// TODO: revisit pressed bg color
|
|
||||||
setStyleSheet(R"( |
|
||||||
* { |
|
||||||
color: white; |
|
||||||
font-family: Inter; |
|
||||||
} |
|
||||||
Setup { |
|
||||||
background-color: black; |
|
||||||
} |
|
||||||
QPushButton#navBtn { |
|
||||||
height: 160; |
|
||||||
font-size: 55px; |
|
||||||
font-weight: 400; |
|
||||||
border-radius: 10px; |
|
||||||
background-color: #333333; |
|
||||||
} |
|
||||||
QPushButton#navBtn:disabled, QPushButton[primary='true']:disabled { |
|
||||||
color: #808080; |
|
||||||
background-color: #333333; |
|
||||||
} |
|
||||||
QPushButton#navBtn:pressed { |
|
||||||
background-color: #444444; |
|
||||||
} |
|
||||||
QPushButton[primary='true'], #navBtn[primary='true'] { |
|
||||||
background-color: #465BEA; |
|
||||||
} |
|
||||||
QPushButton[primary='true']:pressed, #navBtn:pressed[primary='true'] { |
|
||||||
background-color: #3049F4; |
|
||||||
} |
|
||||||
)"); |
|
||||||
} |
|
||||||
|
|
||||||
void Setup::selectLanguage() { |
|
||||||
QMap<QString, QString> langs = getSupportedLanguages(); |
|
||||||
QString selection = MultiOptionDialog::getSelection(tr("Select a language"), langs.keys(), "", this); |
|
||||||
if (!selection.isEmpty()) { |
|
||||||
QString selectedLang = langs[selection]; |
|
||||||
Params().put("LanguageSetting", selectedLang.toStdString()); |
|
||||||
if (translator.load(":/" + selectedLang)) { |
|
||||||
qApp->installTranslator(&translator); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
int main(int argc, char *argv[]) { |
|
||||||
QApplication a(argc, argv); |
|
||||||
Setup setup; |
|
||||||
setMainWindow(&setup); |
|
||||||
return a.exec(); |
|
||||||
} |
|
@ -1,38 +0,0 @@ |
|||||||
#pragma once |
|
||||||
|
|
||||||
#include <QLabel> |
|
||||||
#include <QStackedWidget> |
|
||||||
#include <QString> |
|
||||||
#include <QTranslator> |
|
||||||
#include <QWidget> |
|
||||||
|
|
||||||
class Setup : public QStackedWidget { |
|
||||||
Q_OBJECT |
|
||||||
|
|
||||||
public: |
|
||||||
explicit Setup(QWidget *parent = 0); |
|
||||||
|
|
||||||
private: |
|
||||||
void selectLanguage(); |
|
||||||
QWidget *low_voltage(); |
|
||||||
QWidget *custom_software_warning(); |
|
||||||
QWidget *getting_started(); |
|
||||||
QWidget *network_setup(); |
|
||||||
QWidget *software_selection(); |
|
||||||
QWidget *downloading(); |
|
||||||
QWidget *download_failed(QLabel *url, QLabel *body); |
|
||||||
|
|
||||||
QWidget *failed_widget; |
|
||||||
QWidget *downloading_widget; |
|
||||||
QWidget *custom_software_warning_widget; |
|
||||||
QWidget *software_selection_widget; |
|
||||||
QTranslator translator; |
|
||||||
|
|
||||||
signals: |
|
||||||
void finished(const QString &url, const QString &error = ""); |
|
||||||
|
|
||||||
public slots: |
|
||||||
void nextPage(); |
|
||||||
void prevPage(); |
|
||||||
void download(QString url); |
|
||||||
}; |
|
Loading…
Reference in new issue