From 038254db48cc7b85beb12200e1c38ef34dff72c1 Mon Sep 17 00:00:00 2001 From: gymnast86 Date: Mon, 8 Jun 2026 21:05:30 -0700 Subject: [PATCH] decouple generation modal from config menu --- files.cmake | 2 + src/dusk/ui/rando_config.cpp | 69 +------------------- src/dusk/ui/rando_config.hpp | 11 ---- src/dusk/ui/rando_seed_generation.cpp | 93 +++++++++++++++++++++++++++ src/dusk/ui/rando_seed_generation.hpp | 15 +++++ 5 files changed, 112 insertions(+), 78 deletions(-) create mode 100644 src/dusk/ui/rando_seed_generation.cpp create mode 100644 src/dusk/ui/rando_seed_generation.hpp diff --git a/files.cmake b/files.cmake index 012a35a03d..831bdb474f 100644 --- a/files.cmake +++ b/files.cmake @@ -1521,6 +1521,8 @@ set(DUSK_FILES src/dusk/ui/window.hpp src/dusk/ui/rando_config.cpp src/dusk/ui/rando_config.hpp + src/dusk/ui/rando_seed_generation.cpp + src/dusk/ui/rando_seed_generation.hpp src/dusk/achievements.cpp src/dusk/iso_validate.cpp src/dusk/livesplit.cpp diff --git a/src/dusk/ui/rando_config.cpp b/src/dusk/ui/rando_config.cpp index da9a4487f2..3a9187865a 100644 --- a/src/dusk/ui/rando_config.cpp +++ b/src/dusk/ui/rando_config.cpp @@ -13,6 +13,7 @@ #include "modal.hpp" #include "number_button.hpp" #include "pane.hpp" +#include "rando_seed_generation.hpp" #include "string_button.hpp" namespace dusk::ui { @@ -24,18 +25,7 @@ struct ConfigBoolProps { std::function isDisabled; }; -static std::atomic seedGenStatus = SeedGenerateStatus::Ready; -static std::string generationStatusMsg{}; -static void StartSeedGeneration() { - if (GenerateAndWriteSeed(generationStatusMsg)) { - seedGenStatus.store(SeedGenerateStatus::Success); - } else { - seedGenStatus.store(SeedGenerateStatus::Error); - } - - DuskLog.debug("{}", generationStatusMsg); -} randomizer::seedgen::settings::Setting* FindSetting(const std::string& key) { if (key.empty()) { @@ -410,27 +400,6 @@ void rando_starting_item_number_toggle(Pane& leftPane, Pane& rightPane, std::str }); } -Modal* RandomizerWindow::show_seed_gen_modal(std::string_view message) { - auto* modal = dynamic_cast(&push_document(std::make_unique(Modal::Props{ - .title = "Randomizer", - .bodyRml = escape(message), - .onDismiss = [this](Modal& modal) { - mDoAud_seStartMenu(kSoundWindowClose); - modal.pop(); - m_genSeedModal = nullptr; - }, - .icon = "verifying", - }))); - // Allow manual line breaks in this modal for error messages - modal->root()->SetProperty("white-space", "pre-line"); - - if (auto* doc = top_document()) { - doc->focus(); - } - - return modal; -} - struct ExcludedTabLocData { std::string name {}; std::string lowercaseName{}; @@ -822,11 +791,7 @@ RandomizerWindow::RandomizerWindow() { DuskLog.info("Created new Seed for generator."); } - seedGenStatus.store(SeedGenerateStatus::Generating); - std::thread randoGenerationThread(StartSeedGeneration); - randoGenerationThread.detach(); - - m_genSeedModal = show_seed_gen_modal("Generating Seed..."); + GenerateRandomizerSeed(); }),rightPane, [](Pane& pane) { pane.clear(); @@ -1176,36 +1141,6 @@ RandomizerWindow::RandomizerWindow() { } } -void RandomizerWindow::update() { - Window::update(); - - auto curSeedGenStatus = seedGenStatus.load(); - if (curSeedGenStatus == SeedGenerateStatus::Success || - curSeedGenStatus == SeedGenerateStatus::Error) - { - if (curSeedGenStatus == SeedGenerateStatus::Success) { - mDoAud_seStartMenu(kSoundSeedGenerateSuccess); - m_genSeedModal->set_icon("celebration"); - } else { - mDoAud_seStartMenu(kSoundSeedGenerateError); - m_genSeedModal->set_icon("error"); - } - - m_genSeedModal->set_body(escape(generationStatusMsg)); - m_genSeedModal->add_action({ - .label = "OK", - .onPressed = [this](Modal& modal) { - mDoAud_seStartMenu(kSoundWindowClose); - modal.pop(); - m_genSeedModal = nullptr; - } - }); - m_genSeedModal->focus(); - - seedGenStatus.store(SeedGenerateStatus::Ready); - } -} - std::filesystem::path GetRandomizerPath() { return data::configured_data_path() / "randomizer"; } diff --git a/src/dusk/ui/rando_config.hpp b/src/dusk/ui/rando_config.hpp index 6a97554cc4..46518a35be 100644 --- a/src/dusk/ui/rando_config.hpp +++ b/src/dusk/ui/rando_config.hpp @@ -7,7 +7,6 @@ namespace randomizer::seedgen::config { } namespace dusk::ui { -class Modal; class Pane; std::filesystem::path GetRandomizerPath(); @@ -16,24 +15,14 @@ class Pane; std::filesystem::path GetRandomizerSeedsPath(); randomizer::seedgen::config::Config& GetRandomizerConfig(); - enum class SeedGenerateStatus { - Ready, - Generating, - Success, - Error, - }; class RandomizerWindow : public Window { public: - RandomizerWindow(); - void update() override; - Modal* show_seed_gen_modal(std::string_view message); void rando_excluded_locations_update_left_pane(Pane& innerLeftPane, Pane& rightPane, bool forceUpdate = false); auto& get_locations_for_left_pane(); private: - Modal* m_genSeedModal = nullptr; std::string m_excludedLocationsFilter{}; }; } diff --git a/src/dusk/ui/rando_seed_generation.cpp b/src/dusk/ui/rando_seed_generation.cpp new file mode 100644 index 0000000000..12c15b381d --- /dev/null +++ b/src/dusk/ui/rando_seed_generation.cpp @@ -0,0 +1,93 @@ +#include "rando_seed_generation.hpp" + +#include "modal.hpp" +#include "dusk/logging.h" +#include "dusk/randomizer/game/randomizer_context.hpp" +#include "m_Do/m_Do_audio.h" + +#include + +namespace dusk::ui { + +enum class SeedGenerateStatus { + Ready, + Generating, + Success, + Error, +}; + +static std::atomic seedGenStatus = SeedGenerateStatus::Ready; +static std::string generationStatusMsg{}; + +RandomizerGenerationModal::RandomizerGenerationModal() : + Modal({ + .title = "Randomizer", + .bodyRml = "Generating Seed...", + .onDismiss = [this](Modal& modal) { + mDoAud_seStartMenu(kSoundWindowClose); + modal.pop(); + }, + .icon = "verifying", + }) { + mRoot->SetProperty("white-space", "pre-line"); +} + +void RandomizerGenerationModal::update() { + Document::update(); + + auto curSeedGenStatus = seedGenStatus.load(); + + // Change the modal text if we've finished attempting to generate + if (curSeedGenStatus == SeedGenerateStatus::Success || + curSeedGenStatus == SeedGenerateStatus::Error) + { + if (curSeedGenStatus == SeedGenerateStatus::Success) { + mDoAud_seStartMenu(kSoundSeedGenerateSuccess); + set_icon("celebration"); + } else { + mDoAud_seStartMenu(kSoundSeedGenerateError); + set_icon("error"); + } + + set_body(escape(generationStatusMsg)); + add_action({ + .label = "OK", + .onPressed = [this](Modal& modal) { + mDoAud_seStartMenu(kSoundWindowClose); + modal.pop(); + } + }); + + // Refocus so that we focus the new button + focus(); + + seedGenStatus.store(SeedGenerateStatus::Ready); + } +} + +static void StartSeedGeneration() { + if (GenerateAndWriteSeed(generationStatusMsg)) { + seedGenStatus.store(SeedGenerateStatus::Success); + } else { + seedGenStatus.store(SeedGenerateStatus::Error); + } + + DuskLog.debug("{}", generationStatusMsg); +} + +void GenerateRandomizerSeed() { + // Start Generation Thread + seedGenStatus.store(SeedGenerateStatus::Generating); + std::thread randoGenerationThread(StartSeedGeneration); + randoGenerationThread.detach(); + + // Create Seed Generation Modal + push_document(std::make_unique()); + + // Focus Modal + if (auto* doc = top_document()) { + doc->focus(); + } +} + +} diff --git a/src/dusk/ui/rando_seed_generation.hpp b/src/dusk/ui/rando_seed_generation.hpp new file mode 100644 index 0000000000..a00a34edaa --- /dev/null +++ b/src/dusk/ui/rando_seed_generation.hpp @@ -0,0 +1,15 @@ +#pragma once +#include "modal.hpp" + +namespace dusk::ui { + +class RandomizerGenerationModal : public Modal { +public: + explicit RandomizerGenerationModal(); + + void update() override; +}; + +void GenerateRandomizerSeed(); + +}