#include #include #include #include #include #include #include "qt_window.hpp" #define USERDATA "/dev/disk/by-partlabel/userdata" #define NVME "/dev/nvme0n1" bool do_reset() { std::vector cmds = { "sudo umount " NVME, "yes | sudo mkfs.ext4 " NVME, "sudo umount " USERDATA, "yes | sudo mkfs.ext4 " USERDATA, "sudo reboot", }; for (auto &cmd : cmds) { int ret = std::system(cmd); if (ret != 0) return false; } return true; } int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget window; setMainWindow(&window); QVBoxLayout *layout = new QVBoxLayout(); layout->setContentsMargins(125, 125, 125, 125); QLabel *title = new QLabel("System Reset"); title->setStyleSheet(R"( font-weight: 500; font-size: 100px; )"); layout->addWidget(title, 0, Qt::AlignTop); QLabel *body = new QLabel("System reset triggered. Press confirm to erase all content and settings. Press cancel to resume boot."); body->setWordWrap(true); body->setAlignment(Qt::AlignCenter); body->setStyleSheet("font-size: 65px;"); layout->addWidget(body, 1, Qt::AlignCenter); QHBoxLayout *btn_layout = new QHBoxLayout(); QPushButton *cancel_btn = new QPushButton("Cancel"); btn_layout->addWidget(cancel_btn, 0, Qt::AlignLeft); QObject::connect(cancel_btn, SIGNAL(released()), &a, SLOT(quit())); QPushButton *confirm_btn = new QPushButton("Confirm"); btn_layout->addWidget(confirm_btn, 0, Qt::AlignRight); QObject::connect(confirm_btn, &QPushButton::released, [=]() { const QString confirm_txt = "Are you sure you want to reset your device?"; if (body->text() != confirm_txt) { body->setText(confirm_txt); } else { body->setText("Resetting device..."); cancel_btn->hide(); confirm_btn->hide(); QCoreApplication::processEvents(QEventLoop::AllEvents, 1000); #ifdef __aarch64__ bool ret = do_reset(); if (!ret) { body->setText("Reset failed."); cancel_btn->show(); } #endif } }); layout->addLayout(btn_layout); window.setLayout(layout); window.setStyleSheet(R"( * { color: white; background-color: black; } QPushButton { padding: 50px; padding-right: 100px; padding-left: 100px; border: 7px solid white; border-radius: 20px; font-size: 50px; } )"); return a.exec(); }