Add "Delete Selected Save file" in Settings -> General Menu

* Add "Saves" Text Separator.
* Renamed "Enable Delete All Saves" checkbox to "Enable Delete All/Selected Saves".
* Add "Select Save File To Delete" Slider.
* Add "Delete Selected Save File" Button.

The User can use the Slider to select the file to delete then press
the "Delete Selected Save File" Button to delete the selected file.
It will Disable itself and reset SoH.
This commit is contained in:
Glought 2025-07-27 09:08:53 -07:00
commit dff2f76965
3 changed files with 40 additions and 11 deletions

View file

@ -47,6 +47,7 @@ DEFINE_HOOK(OnVanillaBehavior, (GIVanillaBehavior flag, bool* result, va_list or
DEFINE_HOOK(OnSaveFile, (int32_t fileNum));
DEFINE_HOOK(OnLoadFile, (int32_t fileNum));
DEFINE_HOOK(OnDeleteFile, (int32_t fileNum));
DEFINE_HOOK(OnDeleteSelectedFile, ());
DEFINE_HOOK(OnDeleteAllFiles, ());
DEFINE_HOOK(OnDialogMessage, ());

View file

@ -127,6 +127,11 @@ SaveManager::SaveManager() {
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnDeleteAllFiles>(
[this]() { this->DeleteAllZeldaFiles(); });
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnDeleteSelectedFile>([this]() {
int selectedFileNum = CVarGetInteger(CVAR_SETTING("DeleteSelectedSaveFileNum"), 0);
this->DeleteZeldaFile(selectedFileNum - 1 );
});
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnExitGame>(
[this](uint32_t fileNum) { ThreadPoolWait(); });

View file

@ -187,28 +187,51 @@ void SohMenu::AddMenuSettings() {
SDL_OpenURL(std::string("file:///" + std::filesystem::absolute(filesPath).string()).c_str());
})
.Options(ButtonOptions().Tooltip("Opens the folder that contains the save and mods folders, etc."));
AddWidget(path, "Enable Delete All Saves", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_SETTING("EnableDeleteAllSaveFilesButton"))
AddWidget(path, "Saves", WIDGET_SEPARATOR_TEXT);
auto deleteSaveFilesDisabledFunc = [](WidgetInfo& info) {
info.options->disabled = !CVarGetInteger(CVAR_SETTING("EnableDeleteAllSelectedSaveFiles"), 0);
info.options->disabledTooltip =
"This button is disabled because \"Enable Delete All/Selected Saves\" is turned off.";
};
AddWidget(path, "Enable Delete All/Selected Saves", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_SETTING("EnableDeleteAllSelectedSaveFiles"))
.RaceDisable(false)
.Options(CheckboxOptions()
.Tooltip("Turn on to enable the \"Delete All Saves\" button.Turns off automatically "
"when \"Delete All Saves\" is pressed")
.Tooltip("Turn on to enable the Save deletion options below.Turns off automatically "
"when \"Delete All/Selected Saves\" button is pressed")
.DefaultValue(false));
AddWidget(path, "Delete All Saves", WIDGET_BUTTON)
.RaceDisable(false)
.PreFunc([](WidgetInfo& info) {
info.options->disabled = !CVarGetInteger(CVAR_SETTING("EnableDeleteAllSaveFilesButton"), 0);
info.options->disabledTooltip =
"This button is disabled because \"Enable Delete All Saves\" is turned off.";
})
.PreFunc(deleteSaveFilesDisabledFunc)
.Callback([](WidgetInfo& info) {
GameInteractor::Instance->ExecuteHooks<GameInteractor::OnDeleteAllFiles>();
CVarSetInteger(CVAR_SETTING("EnableDeleteAllSaveFilesButton"), 0);
CVarSetInteger(CVAR_SETTING("EnableDeleteAllSelectedSaveFiles"), 0);
std::reinterpret_pointer_cast<Ship::ConsoleWindow>(
Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console"))
->Dispatch("reset");
})
.Options(ButtonOptions().Tooltip("Warning deletes all save files"));
.Options(ButtonOptions().Tooltip("Warning deletes all save files"));
AddWidget(path, "Select Save File To Delete: ", WIDGET_CVAR_SLIDER_INT)
.CVar(CVAR_SETTING("DeleteSelectedSaveFileNum"))
.PreFunc(deleteSaveFilesDisabledFunc)
.Options(IntSliderOptions()
.Min(1)
.Max(3)
.DefaultValue(1)
.Format("File %d ")
.Tooltip("Select which save file to delete.Then press \"Delete Selected Save File\" to delete."));
AddWidget(path, "Delete Selected Save File", WIDGET_BUTTON)
.RaceDisable(false)
.PreFunc(deleteSaveFilesDisabledFunc)
.Callback([](WidgetInfo& info) {
GameInteractor::Instance->ExecuteHooks<GameInteractor::OnDeleteSelectedFile>();
CVarSetInteger(CVAR_SETTING("EnableDeleteAllSelectedSaveFiles"), 0);
std::reinterpret_pointer_cast<Ship::ConsoleWindow>(
Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console"))
->Dispatch("reset");
})
.Options(ButtonOptions().Tooltip("Warning deletes selected save file"));
AddWidget(path, "Boot", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Boot Sequence", WIDGET_CVAR_COMBOBOX)