diff --git a/src/window/gui/Gui.cpp b/src/window/gui/Gui.cpp index aad74c3..512bb2c 100644 --- a/src/window/gui/Gui.cpp +++ b/src/window/gui/Gui.cpp @@ -641,128 +641,6 @@ void Gui::LoadGuiTexture(const std::string& name, const std::string& path, const mGuiTextures[name] = asset; } -void Gui::BeginGroupPanel(const char* name, const ImVec2& size) { - ImGui::BeginGroup(); - - // auto cursorPos = ImGui::GetCursorScreenPos(); - auto itemSpacing = ImGui::GetStyle().ItemSpacing; - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0.0f, 0.0f)); - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0.0f, 0.0f)); - - auto frameHeight = ImGui::GetFrameHeight(); - ImGui::BeginGroup(); - - ImVec2 effectiveSize = size; - if (size.x < 0.0f) { - effectiveSize.x = ImGui::GetContentRegionAvail().x; - } else { - effectiveSize.x = size.x; - } - ImGui::Dummy(ImVec2(effectiveSize.x, 0.0f)); - - ImGui::Dummy(ImVec2(frameHeight * 0.5f, 0.0f)); - ImGui::SameLine(0.0f, 0.0f); - ImGui::BeginGroup(); - ImGui::Dummy(ImVec2(frameHeight * 0.5f, 0.0f)); - ImGui::SameLine(0.0f, 0.0f); - ImGui::TextUnformatted(name); - auto labelMin = ImGui::GetItemRectMin(); - auto labelMax = ImGui::GetItemRectMax(); - ImGui::SameLine(0.0f, 0.0f); - ImGui::Dummy(ImVec2(0.0, frameHeight + itemSpacing.y)); - ImGui::BeginGroup(); - - // ImGui::GetWindowDrawList()->AddRect(labelMin, labelMax, IM_COL32(255, 0, 255, 255)); - - ImGui::PopStyleVar(2); - -#if IMGUI_VERSION_NUM >= 17301 - ImGui::GetCurrentWindow()->ContentRegionRect.Max.x -= frameHeight * 0.5f; - ImGui::GetCurrentWindow()->WorkRect.Max.x -= frameHeight * 0.5f; - ImGui::GetCurrentWindow()->InnerRect.Max.x -= frameHeight * 0.5f; -#else - ImGui::GetCurrentWindow()->ContentsRegionRect.Max.x -= frameHeight * 0.5f; -#endif - ImGui::GetCurrentWindow()->Size.x -= frameHeight; - - auto itemWidth = ImGui::CalcItemWidth(); - ImGui::PushItemWidth(ImMax(0.0f, itemWidth - frameHeight)); - mGroupPanelLabelStack.push_back(ImRect(labelMin, labelMax)); -} - -void Gui::EndGroupPanel(float minHeight) { - ImGui::PopItemWidth(); - - auto itemSpacing = ImGui::GetStyle().ItemSpacing; - - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0.0f, 0.0f)); - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0.0f, 0.0f)); - - auto frameHeight = ImGui::GetFrameHeight(); - - ImGui::EndGroup(); - - ImGui::EndGroup(); - - ImGui::SameLine(0.0f, 0.0f); - ImGui::Dummy(ImVec2(frameHeight * 0.5f, 0.0f)); - ImGui::Dummy(ImVec2(0.0, std::max(frameHeight - frameHeight * 0.5f - itemSpacing.y, minHeight))); - - ImGui::EndGroup(); - - auto itemMin = ImGui::GetItemRectMin(); - auto itemMax = ImGui::GetItemRectMax(); - // ImGui::GetWindowDrawList()->AddRectFilled(itemMin, itemMax, IM_COL32(255, 0, 0, 64), 4.0f); - - auto labelRect = mGroupPanelLabelStack.back(); - mGroupPanelLabelStack.pop_back(); - - ImVec2 halfFrame = ImVec2(frameHeight * 0.25f, frameHeight) * 0.5f; - ImRect frameRect = ImRect(itemMin + halfFrame, itemMax - ImVec2(halfFrame.x, 0.0f)); - labelRect.Min.x -= itemSpacing.x; - labelRect.Max.x += itemSpacing.x; - for (int i = 0; i < 4; ++i) { - switch (i) { - // left half-plane - case 0: - ImGui::PushClipRect(ImVec2(-FLT_MAX, -FLT_MAX), ImVec2(labelRect.Min.x, FLT_MAX), true); - break; - // right half-plane - case 1: - ImGui::PushClipRect(ImVec2(labelRect.Max.x, -FLT_MAX), ImVec2(FLT_MAX, FLT_MAX), true); - break; - // top - case 2: - ImGui::PushClipRect(ImVec2(labelRect.Min.x, -FLT_MAX), ImVec2(labelRect.Max.x, labelRect.Min.y), true); - break; - // bottom - case 3: - ImGui::PushClipRect(ImVec2(labelRect.Min.x, labelRect.Max.y), ImVec2(labelRect.Max.x, FLT_MAX), true); - break; - } - - ImGui::GetWindowDrawList()->AddRect(frameRect.Min, frameRect.Max, - ImColor(ImGui::GetStyleColorVec4(ImGuiCol_Border)), halfFrame.x); - - ImGui::PopClipRect(); - } - - ImGui::PopStyleVar(2); - -#if IMGUI_VERSION_NUM >= 17301 - ImGui::GetCurrentWindow()->ContentRegionRect.Max.x += frameHeight * 0.5f; - ImGui::GetCurrentWindow()->WorkRect.Max.x += frameHeight * 0.5f; - ImGui::GetCurrentWindow()->InnerRect.Max.x += frameHeight * 0.5f; -#else - ImGui::GetCurrentWindow()->ContentsRegionRect.Max.x += frameHeight * 0.5f; -#endif - ImGui::GetCurrentWindow()->Size.x += frameHeight; - - ImGui::Dummy(ImVec2(0.0f, 0.0f)); - - ImGui::EndGroup(); -} - std::shared_ptr Gui::GetGameOverlay() { return mGameOverlay; } diff --git a/src/window/gui/Gui.h b/src/window/gui/Gui.h index 853b8ce..2ffb6a0 100644 --- a/src/window/gui/Gui.h +++ b/src/window/gui/Gui.h @@ -1,7 +1,9 @@ #pragma once #ifdef __cplusplus +#ifndef IMGUI_DEFINE_MATH_OPERATORS #define IMGUI_DEFINE_MATH_OPERATORS +#endif #include #include #include @@ -12,6 +14,7 @@ #include "window/gui/GameOverlay.h" #include "window/gui/InputViewer.h" #include "window/gui/StatsWindow.h" +#include "window/gui/GuiWindow.h" #include "window/gui/GuiMenuBar.h" #include "libultraship/libultra/controller.h" @@ -73,8 +76,6 @@ class Gui { void LoadGuiTexture(const std::string& name, const std::string& path, const ImVec4& tint); ImTextureID GetTextureByName(const std::string& name); bool SupportsViewports(); - void BeginGroupPanel(const char* name, const ImVec2& size); - void EndGroupPanel(float minHeight); std::shared_ptr GetGuiWindow(const std::string& name); std::shared_ptr GetGameOverlay(); std::shared_ptr GetInputViewer(); @@ -105,7 +106,6 @@ class Gui { std::shared_ptr mMenuBar; std::map mGuiTextures; std::map> mGuiWindows; - ImVector mGroupPanelLabelStack; }; } // namespace LUS diff --git a/src/window/gui/GuiWindow.cpp b/src/window/gui/GuiWindow.cpp index de22a55..b5e4980 100644 --- a/src/window/gui/GuiWindow.cpp +++ b/src/window/gui/GuiWindow.cpp @@ -1,4 +1,4 @@ -#include "window/gui/GuiWindow.h" +#include "GuiWindow.h" namespace LUS { GuiWindow::GuiWindow(const std::string& consoleVariable, bool isVisible, const std::string& name) @@ -12,4 +12,126 @@ GuiWindow::GuiWindow(const std::string& consoleVariable, const std::string& name std::string GuiWindow::GetName() { return mName; } + +void GuiWindow::BeginGroupPanel(const char* name, const ImVec2& size) { + ImGui::BeginGroup(); + + // auto cursorPos = ImGui::GetCursorScreenPos(); + auto itemSpacing = ImGui::GetStyle().ItemSpacing; + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0.0f, 0.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0.0f, 0.0f)); + + auto frameHeight = ImGui::GetFrameHeight(); + ImGui::BeginGroup(); + + ImVec2 effectiveSize = size; + if (size.x < 0.0f) { + effectiveSize.x = ImGui::GetContentRegionAvail().x; + } else { + effectiveSize.x = size.x; + } + ImGui::Dummy(ImVec2(effectiveSize.x, 0.0f)); + + ImGui::Dummy(ImVec2(frameHeight * 0.5f, 0.0f)); + ImGui::SameLine(0.0f, 0.0f); + ImGui::BeginGroup(); + ImGui::Dummy(ImVec2(frameHeight * 0.5f, 0.0f)); + ImGui::SameLine(0.0f, 0.0f); + ImGui::TextUnformatted(name); + auto labelMin = ImGui::GetItemRectMin(); + auto labelMax = ImGui::GetItemRectMax(); + ImGui::SameLine(0.0f, 0.0f); + ImGui::Dummy(ImVec2(0.0, frameHeight + itemSpacing.y)); + ImGui::BeginGroup(); + + // ImGui::GetWindowDrawList()->AddRect(labelMin, labelMax, IM_COL32(255, 0, 255, 255)); + + ImGui::PopStyleVar(2); + +#if IMGUI_VERSION_NUM >= 17301 + ImGui::GetCurrentWindow()->ContentRegionRect.Max.x -= frameHeight * 0.5f; + ImGui::GetCurrentWindow()->WorkRect.Max.x -= frameHeight * 0.5f; + ImGui::GetCurrentWindow()->InnerRect.Max.x -= frameHeight * 0.5f; +#else + ImGui::GetCurrentWindow()->ContentsRegionRect.Max.x -= frameHeight * 0.5f; +#endif + ImGui::GetCurrentWindow()->Size.x -= frameHeight; + + auto itemWidth = ImGui::CalcItemWidth(); + ImGui::PushItemWidth(ImMax(0.0f, itemWidth - frameHeight)); + mGroupPanelLabelStack.push_back(ImRect(labelMin, labelMax)); +} + +void GuiWindow::EndGroupPanel(float minHeight) { + ImGui::PopItemWidth(); + + auto itemSpacing = ImGui::GetStyle().ItemSpacing; + + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0.0f, 0.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0.0f, 0.0f)); + + auto frameHeight = ImGui::GetFrameHeight(); + + ImGui::EndGroup(); + + ImGui::EndGroup(); + + ImGui::SameLine(0.0f, 0.0f); + ImGui::Dummy(ImVec2(frameHeight * 0.5f, 0.0f)); + ImGui::Dummy(ImVec2(0.0, std::max(frameHeight - frameHeight * 0.5f - itemSpacing.y, minHeight))); + + ImGui::EndGroup(); + + auto itemMin = ImGui::GetItemRectMin(); + auto itemMax = ImGui::GetItemRectMax(); + // ImGui::GetWindowDrawList()->AddRectFilled(itemMin, itemMax, IM_COL32(255, 0, 0, 64), 4.0f); + + auto labelRect = mGroupPanelLabelStack.back(); + mGroupPanelLabelStack.pop_back(); + + ImVec2 halfFrame = ImVec2(frameHeight * 0.25f, frameHeight) * 0.5f; + ImRect frameRect = ImRect(itemMin + halfFrame, itemMax - ImVec2(halfFrame.x, 0.0f)); + labelRect.Min.x -= itemSpacing.x; + labelRect.Max.x += itemSpacing.x; + for (int i = 0; i < 4; ++i) { + switch (i) { + // left half-plane + case 0: + ImGui::PushClipRect(ImVec2(-FLT_MAX, -FLT_MAX), ImVec2(labelRect.Min.x, FLT_MAX), true); + break; + // right half-plane + case 1: + ImGui::PushClipRect(ImVec2(labelRect.Max.x, -FLT_MAX), ImVec2(FLT_MAX, FLT_MAX), true); + break; + // top + case 2: + ImGui::PushClipRect(ImVec2(labelRect.Min.x, -FLT_MAX), ImVec2(labelRect.Max.x, labelRect.Min.y), true); + break; + // bottom + case 3: + ImGui::PushClipRect(ImVec2(labelRect.Min.x, labelRect.Max.y), ImVec2(labelRect.Max.x, FLT_MAX), true); + break; + } + + ImGui::GetWindowDrawList()->AddRect(frameRect.Min, frameRect.Max, + ImColor(ImGui::GetStyleColorVec4(ImGuiCol_Border)), halfFrame.x); + + ImGui::PopClipRect(); + } + + ImGui::PopStyleVar(2); + +#if IMGUI_VERSION_NUM >= 17301 + ImGui::GetCurrentWindow()->ContentRegionRect.Max.x += frameHeight * 0.5f; + ImGui::GetCurrentWindow()->WorkRect.Max.x += frameHeight * 0.5f; + ImGui::GetCurrentWindow()->InnerRect.Max.x += frameHeight * 0.5f; +#else + ImGui::GetCurrentWindow()->ContentsRegionRect.Max.x += frameHeight * 0.5f; +#endif + ImGui::GetCurrentWindow()->Size.x += frameHeight; + + ImGui::Dummy(ImVec2(0.0f, 0.0f)); + + ImGui::EndGroup(); +} } // namespace LUS diff --git a/src/window/gui/GuiWindow.h b/src/window/gui/GuiWindow.h index 2640fd7..63ff6f5 100644 --- a/src/window/gui/GuiWindow.h +++ b/src/window/gui/GuiWindow.h @@ -1,6 +1,11 @@ #pragma once #include +#ifndef IMGUI_DEFINE_MATH_OPERATORS +#define IMGUI_DEFINE_MATH_OPERATORS +#endif +#include +#include #include "window/gui/GuiElement.h" namespace LUS { @@ -12,7 +17,11 @@ class GuiWindow : public GuiElement { std::string GetName(); protected: + void BeginGroupPanel(const char* name, const ImVec2& size); + void EndGroupPanel(float minHeight); + private: std::string mName; + ImVector mGroupPanelLabelStack; }; } // namespace LUS diff --git a/src/window/gui/InputEditorWindow.cpp b/src/window/gui/InputEditorWindow.cpp index a597618..d5bf8f8 100644 --- a/src/window/gui/InputEditorWindow.cpp +++ b/src/window/gui/InputEditorWindow.cpp @@ -130,7 +130,7 @@ void InputEditorWindow::DrawControllerSchema() { DrawControllerSelect(mCurrentPort); - Context::GetInstance()->GetWindow()->GetGui()->BeginGroupPanel("Buttons", ImVec2(150, 20)); + BeginGroupPanel("Buttons", ImVec2(150, 20)); DrawButton("A", BTN_A, mCurrentPort, &mBtnReading); DrawButton("B", BTN_B, mCurrentPort, &mBtnReading); DrawButton("L", BTN_L, mCurrentPort, &mBtnReading); @@ -139,24 +139,24 @@ void InputEditorWindow::DrawControllerSchema() { DrawButton("START", BTN_START, mCurrentPort, &mBtnReading); SEPARATION(); #ifdef __SWITCH__ - Context::GetInstance()->GetWindow()->GetGui()->EndGroupPanel(isKeyboard ? 7.0f : 56.0f); + EndGroupPanel(isKeyboard ? 7.0f : 56.0f); #else - Context::GetInstance()->GetWindow()->GetGui()->EndGroupPanel(isKeyboard ? 7.0f : 48.0f); + EndGroupPanel(isKeyboard ? 7.0f : 48.0f); #endif ImGui::SameLine(); - Context::GetInstance()->GetWindow()->GetGui()->BeginGroupPanel("Digital Pad", ImVec2(150, 20)); + BeginGroupPanel("Digital Pad", ImVec2(150, 20)); DrawButton("Up", BTN_DUP, mCurrentPort, &mBtnReading); DrawButton("Down", BTN_DDOWN, mCurrentPort, &mBtnReading); DrawButton("Left", BTN_DLEFT, mCurrentPort, &mBtnReading); DrawButton("Right", BTN_DRIGHT, mCurrentPort, &mBtnReading); SEPARATION(); #ifdef __SWITCH__ - Context::GetInstance()->GetWindow()->GetGui()->EndGroupPanel(isKeyboard ? 53.0f : 122.0f); + EndGroupPanel(isKeyboard ? 53.0f : 122.0f); #else - Context::GetInstance()->GetWindow()->GetGui()->EndGroupPanel(isKeyboard ? 53.0f : 94.0f); + EndGroupPanel(isKeyboard ? 53.0f : 94.0f); #endif ImGui::SameLine(); - Context::GetInstance()->GetWindow()->GetGui()->BeginGroupPanel("Analog Stick", ImVec2(150, 20)); + BeginGroupPanel("Analog Stick", ImVec2(150, 20)); DrawButton("Up", BTN_STICKUP, mCurrentPort, &mBtnReading); DrawButton("Down", BTN_STICKDOWN, mCurrentPort, &mBtnReading); DrawButton("Left", BTN_STICKLEFT, mCurrentPort, &mBtnReading); @@ -195,15 +195,15 @@ void InputEditorWindow::DrawControllerSchema() { ImGui::Dummy(ImVec2(0, 6)); } #ifdef __SWITCH__ - Context::GetInstance()->GetWindow()->GetGui()->EndGroupPanel(isKeyboard ? 52.0f : 52.0f); + EndGroupPanel(isKeyboard ? 52.0f : 52.0f); #else - Context::GetInstance()->GetWindow()->GetGui()->EndGroupPanel(isKeyboard ? 52.0f : 24.0f); + EndGroupPanel(isKeyboard ? 52.0f : 24.0f); #endif ImGui::SameLine(); if (!isKeyboard) { ImGui::SameLine(); - Context::GetInstance()->GetWindow()->GetGui()->BeginGroupPanel("Right Stick", ImVec2(150, 20)); + BeginGroupPanel("Right Stick", ImVec2(150, 20)); DrawButton("Up", BTN_VSTICKUP, mCurrentPort, &mBtnReading); DrawButton("Down", BTN_VSTICKDOWN, mCurrentPort, &mBtnReading); DrawButton("Left", BTN_VSTICKLEFT, mCurrentPort, &mBtnReading); @@ -239,9 +239,9 @@ void InputEditorWindow::DrawControllerSchema() { ImGui::PopItemWidth(); ImGui::EndChild(); #ifdef __SWITCH__ - Context::GetInstance()->GetWindow()->GetGui()->EndGroupPanel(43.0f); + EndGroupPanel(43.0f); #else - Context::GetInstance()->GetWindow()->GetGui()->EndGroupPanel(14.0f); + EndGroupPanel(14.0f); #endif } @@ -249,7 +249,7 @@ void InputEditorWindow::DrawControllerSchema() { #ifndef __WIIU__ ImGui::SameLine(); #endif - Context::GetInstance()->GetWindow()->GetGui()->BeginGroupPanel("Gyro Options", ImVec2(175, 20)); + BeginGroupPanel("Gyro Options", ImVec2(175, 20)); float cursorX = ImGui::GetCursorPosX() + 5; ImGui::SetCursorPosX(cursorX); if (ImGui::Checkbox("Enable Gyro", &profile->UseGyro)) { @@ -307,9 +307,9 @@ void InputEditorWindow::DrawControllerSchema() { ImGui::PopItemWidth(); ImGui::EndChild(); #ifdef __SWITCH__ - Context::GetInstance()->GetWindow()->GetGui()->EndGroupPanel(46.0f); + EndGroupPanel(46.0f); #else - Context::GetInstance()->GetWindow()->GetGui()->EndGroupPanel(14.0f); + EndGroupPanel(14.0f); #endif } @@ -317,13 +317,13 @@ void InputEditorWindow::DrawControllerSchema() { const ImVec2 cursor = ImGui::GetCursorPos(); - Context::GetInstance()->GetWindow()->GetGui()->BeginGroupPanel("C-Buttons", ImVec2(158, 20)); + BeginGroupPanel("C-Buttons", ImVec2(158, 20)); DrawButton("Up", BTN_CUP, mCurrentPort, &mBtnReading); DrawButton("Down", BTN_CDOWN, mCurrentPort, &mBtnReading); DrawButton("Left", BTN_CLEFT, mCurrentPort, &mBtnReading); DrawButton("Right", BTN_CRIGHT, mCurrentPort, &mBtnReading); ImGui::Dummy(ImVec2(0, 5)); - Context::GetInstance()->GetWindow()->GetGui()->EndGroupPanel(0.0f); + EndGroupPanel(0.0f); ImGui::SetCursorPosX(cursor.x); #ifdef __SWITCH__ @@ -333,7 +333,7 @@ void InputEditorWindow::DrawControllerSchema() { #else ImGui::SetCursorPosY(cursor.y + 120); #endif - Context::GetInstance()->GetWindow()->GetGui()->BeginGroupPanel("Options", ImVec2(158, 20)); + BeginGroupPanel("Options", ImVec2(158, 20)); float cursorX = ImGui::GetCursorPosX() + 5; ImGui::SetCursorPosX(cursorX); if (ImGui::Checkbox("Rumble Enabled", &profile->UseRumble)) { @@ -376,7 +376,7 @@ void InputEditorWindow::DrawControllerSchema() { } ImGui::Dummy(ImVec2(0, 5)); - Context::GetInstance()->GetWindow()->GetGui()->EndGroupPanel(isKeyboard ? 0.0f : 2.0f); + EndGroupPanel(isKeyboard ? 0.0f : 2.0f); } void InputEditorWindow::UpdateElement() { diff --git a/src/window/gui/InputEditorWindow.h b/src/window/gui/InputEditorWindow.h index c26ed16..30536dc 100644 --- a/src/window/gui/InputEditorWindow.h +++ b/src/window/gui/InputEditorWindow.h @@ -1,7 +1,7 @@ #pragma once #include "stdint.h" -#include "GuiWindow.h" +#include "window/gui/GuiWindow.h" #include namespace LUS {