diff --git a/soh/soh/AboutWindow.cpp b/soh/soh/AboutWindow.cpp new file mode 100644 index 000000000..f0d71eac4 --- /dev/null +++ b/soh/soh/AboutWindow.cpp @@ -0,0 +1,104 @@ +#include "AboutWindow.h" +#include +#include +#include "soh/ResourceManagerHelpers.h" + +extern "C" { +#include "variables.h" +} + +AboutWindow::~AboutWindow() { + SPDLOG_TRACE("destruct about window"); +} + +void AboutWindow::InitElement() { + mIsTaggedVersion = gGitCommitTag[0] != 0; +} + +void AboutWindow::Draw() { + if (!IsVisible()) { + return; + } + + ImGuiWindowFlags windowFlags = ImGuiWindowFlags_AlwaysAutoResize | + ImGuiWindowFlags_NoResize | + ImGuiWindowFlags_NoDocking | + ImGuiWindowFlags_NoScrollWithMouse | + ImGuiWindowFlags_NoScrollbar; + + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(16 * ImGui::GetIO().FontGlobalScale, 8 * ImGui::GetIO().FontGlobalScale)); + + if (!ImGui::Begin(GetName().c_str(), &mIsVisible, windowFlags)) { + ImGui::End(); + } else { + DrawElement(); + ImGui::End(); + } + + ImGui::PopStyleVar(); + + // Sync up the IsVisible flag if it was changed by ImGui + SyncVisibilityConsoleVariable(); +} + +const char* AboutWindow::GetGameVersionString(uint32_t index) { + uint32_t gameVersion = ResourceMgr_GetGameVersion(index); + switch (gameVersion) { + case OOT_NTSC_US_10: + return "NTSC-U 1.0"; + case OOT_NTSC_US_11: + return "NTSC-U 1.1"; + case OOT_NTSC_US_12: + return "NTSC-U 1.2"; + case OOT_PAL_10: + return "PAL 1.0"; + case OOT_PAL_11: + return "PAL 1.1"; + case OOT_PAL_GC: + return "PAL GC"; + case OOT_PAL_MQ: + return "PAL MQ"; + case OOT_PAL_GC_DBG1: + case OOT_PAL_GC_DBG2: + return "PAL GC-D"; + case OOT_PAL_GC_MQ_DBG: + return "PAL MQ-D"; + case OOT_IQUE_CN: + return "IQUE CN"; + case OOT_IQUE_TW: + return "IQUE TW"; + default: + return "UNKNOWN"; + } +} + +void AboutWindow::DrawElement() { + // The icon is already padded - adjust for that + ImVec2 cursorPos = ImGui::GetCursorScreenPos(); + cursorPos.x -= 16 * ImGui::GetIO().FontGlobalScale; + ImGui::SetCursorScreenPos(cursorPos); + + ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("Game_Icon"), ImVec2(64.0f * ImGui::GetIO().FontGlobalScale, 64.0f * ImGui::GetIO().FontGlobalScale)); + + ImGui::SameLine(); + + ImGui::BeginGroup(); + ImGui::Text("Ship of Harkinian"); + if (mIsTaggedVersion) { + ImGui::Text("%s", gBuildVersion); + } else { + //truncate the commit to 7 characters + char gGitCommitHashTruncated[8]; + strncpy(gGitCommitHashTruncated, (char*)gGitCommitHash, 7); + gGitCommitHashTruncated[7] = 0; + ImGui::Text("%s", gGitBranch); + ImGui::Text("%s", gGitCommitHashTruncated); + } + ImGui::EndGroup(); + + ImGui::Dummy(ImVec2(0, 2 * ImGui::GetIO().FontGlobalScale)); + ImGui::Text("Game Archives:"); + for (uint32_t i = 0; i < ResourceMgr_GetNumGameVersions(); i++) { + ImGui::BulletText(GetGameVersionString(i)); + } +} diff --git a/soh/soh/AboutWindow.h b/soh/soh/AboutWindow.h new file mode 100644 index 000000000..0800558df --- /dev/null +++ b/soh/soh/AboutWindow.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +class AboutWindow : public Ship::GuiWindow { + public: + using GuiWindow::GuiWindow; + ~AboutWindow(); + + private: + void InitElement() override; + void Draw() override; + void DrawElement() override; + void UpdateElement() override {}; + + const char* GetGameVersionString(uint32_t index); + + bool mIsTaggedVersion; +}; diff --git a/soh/soh/SohGui.cpp b/soh/soh/SohGui.cpp index e28c1ff95..f91f263c9 100644 --- a/soh/soh/SohGui.cpp +++ b/soh/soh/SohGui.cpp @@ -134,6 +134,7 @@ namespace SohGui { std::shared_ptr mModalWindow; std::shared_ptr mNotificationWindow; std::shared_ptr mTimeDisplayWindow; + std::shared_ptr mAboutWindow; void SetupGuiElements() { auto gui = Ship::Context::GetInstance()->GetWindow()->GetGui(); @@ -221,6 +222,8 @@ namespace SohGui { mNotificationWindow->Show(); mTimeDisplayWindow = std::make_shared(CVAR_WINDOW("TimeDisplayEnabled"), "Additional Timers"); gui->AddGuiWindow(mTimeDisplayWindow); + mAboutWindow = std::make_shared(CVAR_WINDOW("AboutWindow"), "About"); + gui->AddGuiWindow(mAboutWindow); } void Destroy() { @@ -257,6 +260,7 @@ namespace SohGui { mTimeSplitWindow = nullptr; mPlandomizerWindow = nullptr; mTimeDisplayWindow = nullptr; + mAboutWindow = nullptr; } void RegisterPopup(std::string title, std::string message, std::string button1, std::string button2, std::function button1callback, std::function button2callback) { diff --git a/soh/soh/SohGui.hpp b/soh/soh/SohGui.hpp index 3f9d616db..526db64bf 100644 --- a/soh/soh/SohGui.hpp +++ b/soh/soh/SohGui.hpp @@ -26,6 +26,7 @@ #include "Enhancements/randomizer/randomizer_settings_window.h" #include "Enhancements/timesplits/TimeSplits.h" #include "Enhancements/randomizer/Plandomizer.h" +#include "AboutWindow.h" #include "SohModals.h" #ifdef __cplusplus diff --git a/soh/soh/SohMenuBar.cpp b/soh/soh/SohMenuBar.cpp index 3bda90038..a9cc2b171 100644 --- a/soh/soh/SohMenuBar.cpp +++ b/soh/soh/SohMenuBar.cpp @@ -44,6 +44,7 @@ #include "Enhancements/timesplits/TimeSplits.h" #include "Enhancements/randomizer/Plandomizer.h" #include "Enhancements/TimeDisplay/TimeDisplay.h" +#include "AboutWindow.h" // FA icons are kind of wonky, if they worked how I expected them to the "+ 2.0f" wouldn't be needed, but // they don't work how I expect them to so I added that because it looked good when I eyeballed it @@ -177,8 +178,18 @@ void DrawMenuBarIcon() { } } +extern std::shared_ptr mAboutWindow; + void DrawShipMenu() { if (ImGui::BeginMenu("Ship")) { + if (mAboutWindow) { + if (ImGui::MenuItem("About...")) { + mAboutWindow->Show(); + } + } + + UIWidgets::Spacer(0); + if (ImGui::MenuItem("Hide Menu Bar", #if !defined(__SWITCH__) && !defined(__WIIU__) "F1"