diff --git a/src/PracticeMod.cpp b/src/PracticeMod.cpp index 2004c67..65b2f34 100644 --- a/src/PracticeMod.cpp +++ b/src/PracticeMod.cpp @@ -6,6 +6,7 @@ #include "UI/QR.hpp" #include "UI/SettingsMenu.hpp" #include "UI/WarpMenu.h" +#include "UI/ImHelpers.hpp" #include "imgui.h" #include "os.h" #include "prime/CGameState.hpp" @@ -129,7 +130,7 @@ void PracticeMod::renderMenu() { GUI::drawInventoryMenu(); GUI::drawSettingsMenu(); GUI::drawWarpMenu(); - if (ImGui::TreeNode("v%s", MOD_VERSION)) { + if (ImHelpers::TreeNodeNavLeft("Version", "v%s", MOD_VERSION)) { ImGui::Text("Links (QR codes):"); if (ImGui::TreeNode("Releases")) { GUI::drawQRCode("https://github.com/MetroidPrimeModding/prime2-practice-mod/releases", 3.0f); diff --git a/src/UI/ImHelpers.cpp b/src/UI/ImHelpers.cpp index aa814b9..9a554a7 100644 --- a/src/UI/ImHelpers.cpp +++ b/src/UI/ImHelpers.cpp @@ -33,5 +33,21 @@ namespace ImHelpers { ImGui::SetWindowPos(window->Name, windowPos); } } + + static const ImGuiTreeNodeFlags NavLeftFlags = ImGuiTreeNodeFlags_OpenOnArrow + | ImGuiTreeNodeFlags_OpenOnDoubleClick + | ImGuiTreeNodeFlags_NavLeftJumpsBackHere; + + bool TreeNodeNavLeft(const char *label) { + return ImGui::TreeNodeEx(label, NavLeftFlags); + } + + bool TreeNodeNavLeft(const char *str_id, const char *fmt, ...) { + va_list args; + va_start(args, fmt); + bool is_open = ImGui::TreeNodeExV(str_id, NavLeftFlags, fmt, args); + va_end(args); + return is_open; + } } diff --git a/src/UI/ImHelpers.hpp b/src/UI/ImHelpers.hpp index 93a66b0..660ca5e 100644 --- a/src/UI/ImHelpers.hpp +++ b/src/UI/ImHelpers.hpp @@ -14,4 +14,6 @@ namespace ImHelpers { void ClampCurrentWindowToScreen(); + bool TreeNodeNavLeft(const char *label); + bool TreeNodeNavLeft(const char *str_id, const char *fmt, ...); } diff --git a/src/UI/SettingsMenu.cpp b/src/UI/SettingsMenu.cpp index 91d0f5b..b1a7053 100644 --- a/src/UI/SettingsMenu.cpp +++ b/src/UI/SettingsMenu.cpp @@ -13,7 +13,7 @@ namespace GUI { void drawHex32Editor(const char *title, s32 *value); void drawSettingsMenu() { - if (ImGui::TreeNode("Settings")) { + if (ImHelpers::TreeNodeNavLeft("Settings")) { if (ImGui::TreeNode("On-screen display")) { BITFIELD_CHECKBOX("Show", SETTINGS.OSD_show); BITFIELD_CHECKBOX("Pos", SETTINGS.OSD_showPos); diff --git a/src/UI/WarpMenu.cpp b/src/UI/WarpMenu.cpp index 87ee71e..f2b3cfc 100644 --- a/src/UI/WarpMenu.cpp +++ b/src/UI/WarpMenu.cpp @@ -1,5 +1,6 @@ #include #include "WarpMenu.h" +#include "ImHelpers.hpp" // clang-format off const WarpArea AREAS_TEMPLE_GROUNDS[] = { @@ -402,10 +403,10 @@ const WarpWorld WARP_WORLDS[] = { namespace GUI { void drawWarpMenu() { - if (ImGui::TreeNode("Warps")) { + if (ImHelpers::TreeNodeNavLeft("Warps")) { // ImGui::Text("You can also warp by pressing 'x' on the map"); for (auto world : WARP_WORLDS) { - if (ImGui::TreeNode(world.name)) { + if (ImHelpers::TreeNodeNavLeft(world.name)) { for (int i = 0; i < world.areaCount; i++) { ImGuiTreeNodeFlags node_flags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick