diff --git a/frogpilot/ui/qt/offroad/data_settings.cc b/frogpilot/ui/qt/offroad/data_settings.cc index d83320d0..7c05acf0 100644 --- a/frogpilot/ui/qt/offroad/data_settings.cc +++ b/frogpilot/ui/qt/offroad/data_settings.cc @@ -1,3 +1,5 @@ +#include + #include "frogpilot/ui/qt/offroad/data_settings.h" FrogPilotDataPanel::FrogPilotDataPanel(FrogPilotSettingsWindow *parent, bool forceOpen) : FrogPilotListWidget(parent), parent(parent) { @@ -14,6 +16,47 @@ FrogPilotDataPanel::FrogPilotDataPanel(FrogPilotSettingsWindow *parent, bool for ScrollView *statsLabelsPanel = new ScrollView(statsLabelsList, this); dataLayout->addWidget(statsLabelsPanel); + ButtonControl *deleteDrivingDataButton = new ButtonControl(tr("Delete Driving Data"), tr("DELETE"), tr("Delete all stored driving footage and data to free up storage space or to simply just erase driving data.")); + QObject::connect(deleteDrivingDataButton, &ButtonControl::clicked, [=]() { + if (ConfirmationDialog::confirm(tr("Delete all driving data and footage?"), tr("Delete"), this)) { + std::thread([=]() { + parent->keepScreenOn = true; + + deleteDrivingDataButton->setEnabled(false); + deleteDrivingDataButton->setValue(tr("Deleting...")); + + std::vector drivePaths = {"/data/media/0/realdata/", "/data/media/0/realdata_HD/", "/data/media/0/realdata_konik/"}; + for (const QString &path : drivePaths) { + QDir dir(path); + if (!dir.exists()) { + continue; + } + + for (const QFileInfo &entry : dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot)) { + char preserveValue[10] = {0}; + bool isPreserved = (getxattr(entry.absoluteFilePath().toUtf8().constData(), "user.preserve", preserveValue, sizeof(preserveValue)) > 0 && strcmp(preserveValue, "1") == 0); + if (!isPreserved) { + QDir(entry.absoluteFilePath()).removeRecursively(); + } + } + } + + deleteDrivingDataButton->setValue(tr("Deleted!")); + + util::sleep_for(2500); + + deleteDrivingDataButton->setEnabled(true); + deleteDrivingDataButton->setValue(""); + + parent->keepScreenOn = false; + }).detach(); + } + }); + if (forceOpenDescriptions) { + deleteDrivingDataButton->showDescription(); + } + dataMainList->addItem(deleteDrivingDataButton); + FrogPilotButtonsControl *frogpilotBackupButton = new FrogPilotButtonsControl(tr("FrogPilot Backups"), tr("Create, delete, or restore FrogPilot backups."), "", {tr("BACKUP"), tr("DELETE"), tr("DELETE ALL"), tr("RESTORE")}); QObject::connect(frogpilotBackupButton, &FrogPilotButtonsControl::buttonClicked, [=](int id) { QDir backupDir("/data/backups");