From 896bf97a4363aafad99ae51703b7936b1eb31af3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= <159546+serprex@users.noreply.github.com> Date: Sun, 30 Aug 2026 14:32:27 +0000 Subject: [PATCH] Move Tracker namespace to its own file (#7135) Reuse for item tracker BeginFloatingWindows --- .../randomizer/randomizer_check_tracker.cpp | 3 +- .../randomizer_entrance_tracker.cpp | 43 +---------- .../randomizer/randomizer_entrance_tracker.h | 6 -- .../randomizer/randomizer_hint_tracker.cpp | 4 +- .../randomizer/randomizer_item_tracker.cpp | 77 +++++++------------ .../randomizer/randomizer_tracker_windows.cpp | 59 ++++++++++++++ .../randomizer/randomizer_tracker_windows.h | 15 ++++ 7 files changed, 106 insertions(+), 101 deletions(-) create mode 100644 soh/soh/Enhancements/randomizer/randomizer_tracker_windows.cpp create mode 100644 soh/soh/Enhancements/randomizer/randomizer_tracker_windows.h diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index e3ca0930b0..e58cd15a08 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -10,6 +10,7 @@ #include "randomizer_check_tracker.h" #include "randomizer_entrance_tracker.h" #include "randomizer_item_tracker.h" +#include "randomizer_tracker_windows.h" #include "randomizerTypes.h" #include "soh/Enhancements/randomizer/randomizerEnums.h" #include "soh/Enhancements/randomizer/static_data.h" @@ -1300,7 +1301,7 @@ void CheckTrackerWindow::DrawElement() { ImGui::SetNextWindowSize(ImVec2(400, 540), ImGuiCond_FirstUseEver); } if (Trackers::BeginFloatWindows( - "Check Tracker", mIsVisible, Color_Background, + "Check Tracker", &mIsVisible, Color_Background, static_cast(CVarGetInteger(CVAR_TRACKER_CHECK("WindowType"), TRACKER_WINDOW_WINDOW)), CVarGetInteger(CVAR_TRACKER_CHECK("Draggable"), 1), ImGuiWindowFlags_NoScrollbar)) { if (!GameInteractor::IsSaveLoaded() || !initialized) { diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp index 4e12438e85..a45c09030d 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp @@ -1,4 +1,5 @@ #include "randomizer_entrance_tracker.h" +#include "randomizer_tracker_windows.h" #include "soh/OTRGlobals.h" #include "soh/SohGui/SohGui.hpp" @@ -840,7 +841,7 @@ void EntranceTrackerWindow::DrawElement() { ImGui::SetNextWindowSize(ImVec2(600, 375), ImGuiCond_FirstUseEver); } if (Trackers::BeginFloatWindows( - "Entrance Tracker", mIsVisible, Color_Background, + "Entrance Tracker", &mIsVisible, Color_Background, static_cast(CVarGetInteger(CVAR_TRACKER_ENTRANCE("WindowType"), TRACKER_WINDOW_WINDOW)), CVarGetInteger(CVAR_TRACKER_ENTRANCE("Draggable"), 1), ImGuiWindowFlags_NoScrollbar)) { if (!GameInteractor::IsSaveLoaded()) { @@ -1090,43 +1091,3 @@ void RegisterCheckTrackerWidgets() { static RegisterMenuInitFunc menuInitFunc(RegisterCheckTrackerWidgets); } // namespace EntranceTracker - -namespace Trackers { -// Windowing stuff -bool BeginFloatWindows(std::string UniqueName, bool& open, Color_RGBA8& bgCol, TrackerWindowType windowType, - bool draggable, ImGuiWindowFlags flags) { - ImGuiWindowFlags windowFlags = flags; - - if (windowFlags == 0) { - windowFlags |= ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_NoFocusOnAppearing; - } - - if (windowType == TRACKER_WINDOW_FLOATING) { - ImGui::SetNextWindowViewport(ImGui::GetMainViewport()->ID); - windowFlags |= ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoTitleBar | - ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar; - - if (!draggable) { - windowFlags |= ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoMove; - } - } - auto maybeParent = ImGui::GetCurrentWindow(); - ImGuiWindow* window = ImGui::FindWindowByName(UniqueName.c_str()); - ImVec4 bgColVec = VecFromRGBA8(bgCol); - if (window != NULL && window->DockTabIsVisible && window->ParentWindow != NULL && - std::string(window->ParentWindow->Name).compare(0, strlen("Main - Deck"), "Main - Deck") == 0) { - bgColVec.w = 1.0f; - } - ImGui::PushStyleColor(ImGuiCol_WindowBg, bgColVec); - ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0)); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f); - return ImGui::Begin(UniqueName.c_str(), &open, windowFlags); -} - -void EndFloatWindows() { - ImGui::PopStyleVar(); - ImGui::PopStyleColor(); - ImGui::PopStyleColor(); - ImGui::End(); -} // namespace Trackers -} // namespace Trackers diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.h b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.h index b0d3eece86..145d4c4e8e 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.h +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.h @@ -136,9 +136,3 @@ class EntranceTrackerWindow final : public Ship::GuiWindow { void UpdateElement() override{}; }; } // namespace EntranceTracker - -namespace Trackers { -bool BeginFloatWindows(std::string UniqueName, bool& open, Color_RGBA8& bgCol, TrackerWindowType windowType, - bool draggable, ImGuiWindowFlags flags = 0); -void EndFloatWindows(); -} // namespace Trackers diff --git a/soh/soh/Enhancements/randomizer/randomizer_hint_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_hint_tracker.cpp index 3267771e37..63774187cd 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_hint_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_hint_tracker.cpp @@ -19,7 +19,7 @@ #include "soh/Enhancements/randomizer/item_category_adj.h" #include "soh/Enhancements/randomizer/randomizer_check_objects.h" #include "soh/Enhancements/randomizer/randomizer_check_tracker.h" -#include "soh/Enhancements/randomizer/randomizer_entrance_tracker.h" +#include "soh/Enhancements/randomizer/randomizer_tracker_windows.h" #include "soh/Enhancements/randomizer/SeedContext.h" #include "soh/Enhancements/randomizer/static_data.h" @@ -664,7 +664,7 @@ void HintTrackerWindow::DrawElement() { ImGui::SetNextWindowSize(ImVec2(500, 600), ImGuiCond_FirstUseEver); if (Trackers::BeginFloatWindows( - "Hint Tracker", mIsVisible, Color_Background, + "Hint Tracker", &mIsVisible, Color_Background, static_cast(CVarGetInteger(CVAR_TRACKER_HINT("WindowType"), TRACKER_WINDOW_WINDOW)), CVarGetInteger(CVAR_TRACKER_HINT("Draggable"), 1))) { ImGui::SetWindowFontScale(CVarGetFloat(CVAR_TRACKER_HINT("FontSize"), 1.0f)); diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 7c09509ad0..76bedfa15b 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -8,6 +8,7 @@ #include "randomizer_check_objects.h" #include "randomizer_check_tracker.h" #include "randomizer_item_tracker.h" +#include "randomizer_tracker_windows.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/randomizer/dungeon.h" #include "soh/Enhancements/randomizer/item.h" @@ -1359,46 +1360,20 @@ void DrawTotalChecks() { } // Windowing stuff -void BeginFloatingWindows(std::string UniqueName, ImGuiWindowFlags flags = 0) { - ImGuiWindowFlags windowFlags = flags; - - if (windowFlags == 0) { - windowFlags |= - ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoResize; +static void BeginFloatingWindows(const std::string& UniqueName, ImGuiWindowFlags flags = 0) { + if (flags == 0) { + flags = ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoResize; } - - if (CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_FLOATING) { - ImGui::SetNextWindowViewport(ImGui::GetMainViewport()->ID); - windowFlags |= ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoTitleBar | - ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar; - - if (!CVarGetInteger(CVAR_TRACKER_ITEM("Draggable"), 0)) { - windowFlags |= ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoMove; - } - } - auto color = VecFromRGBA8(CVarGetColor(CVAR_TRACKER_ITEM("BgColor.Value"), { 0, 0, 0, 0 })); - auto maybeParent = ImGui::GetCurrentWindow(); - ImGuiWindow* window = ImGui::FindWindowByName(UniqueName.c_str()); - if (window != NULL && window->DockTabIsVisible && window->ParentWindow != NULL && - std::string(window->ParentWindow->Name).compare(0, strlen("Main - Deck"), "Main - Deck") == 0) { - color.w = 1.0f; - } - ImGui::PushStyleColor(ImGuiCol_WindowBg, color); - ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0)); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f); if (presetLoaded && presetPos.contains(UniqueName)) { ImGui::SetNextWindowSize(presetSize[UniqueName]); ImGui::SetNextWindowPos(presetPos[UniqueName]); presetSize.erase(UniqueName); presetPos.erase(UniqueName); } - ImGui::Begin(UniqueName.c_str(), nullptr, windowFlags); -} -void EndFloatingWindows() { - ImGui::PopStyleVar(); - ImGui::PopStyleColor(); - ImGui::PopStyleColor(); - ImGui::End(); + Trackers::BeginFloatWindows( + UniqueName, nullptr, CVarGetColor(CVAR_TRACKER_ITEM("BgColor.Value"), { 0, 0, 0, 0 }), + static_cast(CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING)), + CVarGetInteger(CVAR_TRACKER_ITEM("Draggable"), 0), flags); } /** @@ -1813,28 +1788,28 @@ void ItemTrackerWindow::DrawElement() { SECTION_DISPLAY_MAIN_WINDOW) { DrawNotes(); } - EndFloatingWindows(); + Trackers::EndFloatWindows(); } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Inventory"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Inventory Items Tracker"); DrawItemsInRows(inventoryItems); - EndFloatingWindows(); + Trackers::EndFloatWindows(); } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Equipment"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Equipment Items Tracker"); DrawItemsInRows(equipmentItems, 3); - EndFloatingWindows(); + Trackers::EndFloatWindows(); } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Misc"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Misc Items Tracker"); DrawItemsInRows(miscItems, 4); - EndFloatingWindows(); + Trackers::EndFloatWindows(); } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), SECTION_DISPLAY_MAIN_WINDOW) == @@ -1850,14 +1825,14 @@ void ItemTrackerWindow::DrawElement() { } else { DrawItemsInRows(dungeonRewards, 3); } - EndFloatingWindows(); + Trackers::EndFloatWindows(); } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Songs"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Songs Tracker"); DrawItemsInRows(songItems); - EndFloatingWindows(); + Trackers::EndFloatWindows(); } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), SECTION_DISPLAY_HIDDEN) == @@ -1872,56 +1847,56 @@ void ItemTrackerWindow::DrawElement() { } else { DrawItemsInRows(dungeonItems); } - EndFloatingWindows(); + Trackers::EndFloatWindows(); } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Greg"), SECTION_DISPLAY_EXTENDED_HIDDEN) == SECTION_DISPLAY_EXTENDED_SEPARATE) { BeginFloatingWindows("Greg Tracker"); DrawItemsInRows(gregItems); - EndFloatingWindows(); + Trackers::EndFloatWindows(); } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.TriforcePieces"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Triforce Piece Tracker"); DrawItemsInRows(triforcePieces); - EndFloatingWindows(); + Trackers::EndFloatWindows(); } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.BeanSouls"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Bean Soul Tracker"); DrawItemsInRows(beanSoulItems); - EndFloatingWindows(); + Trackers::EndFloatWindows(); } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.BossSouls"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Boss Soul Tracker"); DrawItemsInRows(bossSoulItems); - EndFloatingWindows(); + Trackers::EndFloatWindows(); } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.JabberNuts"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Jabber Nut Tracker"); DrawItemsInRows(jabbernutItems); - EndFloatingWindows(); + Trackers::EndFloatWindows(); } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.OcarinaButtons"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Ocarina Button Tracker"); DrawItemsInRows(ocarinaButtonItems); - EndFloatingWindows(); + Trackers::EndFloatWindows(); } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.OverworldKeys"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Overworld Key Tracker"); DrawItemsInRows(overworldKeyItems); - EndFloatingWindows(); + Trackers::EndFloatWindows(); } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.SilverRupees"), SECTION_DISPLAY_HIDDEN) == @@ -1930,14 +1905,14 @@ void ItemTrackerWindow::DrawElement() { TrackSilverRupees(&questMatchingSilverRupeeItems); BeginFloatingWindows("Silver Rupee Tracker"); DrawItemsInRows(questMatchingSilverRupeeItems); - EndFloatingWindows(); + Trackers::EndFloatWindows(); } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.FishingPole"), SECTION_DISPLAY_EXTENDED_HIDDEN) == SECTION_DISPLAY_EXTENDED_SEPARATE) { BeginFloatingWindows("Fishing Pole Tracker"); DrawItemsInRows(fishingPoleItems); - EndFloatingWindows(); + Trackers::EndFloatWindows(); } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Notes"), SECTION_DISPLAY_HIDDEN) == @@ -1949,7 +1924,7 @@ void ItemTrackerWindow::DrawElement() { ImGui::SetNextWindowSize(ImVec2(400, 300), ImGuiCond_FirstUseEver); BeginFloatingWindows("Personal Notes", ImGuiWindowFlags_NoFocusOnAppearing); DrawNotes(true); - EndFloatingWindows(); + Trackers::EndFloatWindows(); } if (CVarGetInteger("gTrackers.ItemTracker.TotalChecks.DisplayType", SECTION_DISPLAY_MINIMAL_HIDDEN) == @@ -1957,7 +1932,7 @@ void ItemTrackerWindow::DrawElement() { ImGui::SetNextWindowSize(ImVec2(450, 300), ImGuiCond_FirstUseEver); BeginFloatingWindows("Total Checks"); DrawTotalChecks(); - EndFloatingWindows(); + Trackers::EndFloatWindows(); } } if (presetLoaded) { diff --git a/soh/soh/Enhancements/randomizer/randomizer_tracker_windows.cpp b/soh/soh/Enhancements/randomizer/randomizer_tracker_windows.cpp new file mode 100644 index 0000000000..2b23434550 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/randomizer_tracker_windows.cpp @@ -0,0 +1,59 @@ +#include "randomizer_tracker_windows.h" + +#include + +#include + +#include "soh/SohGui/UIWidgets.hpp" + +namespace Trackers { +bool IsDockedToMainDeck(const std::string& UniqueName) { + ImGuiWindow* window = ImGui::FindWindowByName(UniqueName.c_str()); + if (window == NULL) { + return false; + } + ImGuiDockNode* node = window->DockNode; + if (node == NULL && window->DockId != 0) { + node = ImGui::DockBuilderGetNode(window->DockId); + } + if (node == NULL) { + return false; + } + ImGuiWindow* host = ImGui::DockNodeGetRootNode(node)->HostWindow; + return host != NULL && strncmp(host->Name, "Main - Deck", strlen("Main - Deck")) == 0; +} + +bool BeginFloatWindows(const std::string& UniqueName, bool* open, const Color_RGBA8& bgCol, + TrackerWindowType windowType, bool draggable, ImGuiWindowFlags flags) { + ImGuiWindowFlags windowFlags = flags; + + if (windowFlags == 0) { + windowFlags |= ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_NoFocusOnAppearing; + } + + if (windowType == TRACKER_WINDOW_FLOATING) { + ImGui::SetNextWindowViewport(ImGui::GetMainViewport()->ID); + windowFlags |= ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoTitleBar | + ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar; + + if (!draggable) { + windowFlags |= ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoMove; + } + } + ImVec4 bgColVec = VecFromRGBA8(bgCol); + if (IsDockedToMainDeck(UniqueName)) { + bgColVec.w = 1.0f; + } + ImGui::PushStyleColor(ImGuiCol_WindowBg, bgColVec); + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f); + return ImGui::Begin(UniqueName.c_str(), open, windowFlags); +} + +void EndFloatWindows() { + ImGui::PopStyleVar(); + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + ImGui::End(); +} +} // namespace Trackers diff --git a/soh/soh/Enhancements/randomizer/randomizer_tracker_windows.h b/soh/soh/Enhancements/randomizer/randomizer_tracker_windows.h new file mode 100644 index 0000000000..bcbdb29160 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/randomizer_tracker_windows.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#include +#include + +#include "randomizerEnums.h" + +namespace Trackers { +bool IsDockedToMainDeck(const std::string& UniqueName); +bool BeginFloatWindows(const std::string& UniqueName, bool* open, const Color_RGBA8& bgCol, + TrackerWindowType windowType, bool draggable, ImGuiWindowFlags flags = 0); +void EndFloatWindows(); +} // namespace Trackers