From 54052ac7eca4bc3f4323bff9dc086214be2fae6f Mon Sep 17 00:00:00 2001 From: Grinch_ Date: Fri, 17 Dec 2021 02:17:49 +0600 Subject: [PATCH] Fix rounding gaps in header menus --- src/cheatmenu.cpp | 26 +++++++++++++++---------- src/cheatmenu.h | 3 +++ src/menu.cpp | 15 +++++++++++++++ src/ui.cpp | 49 +++++++++++++++++++++++++++++++++++------------ src/ui.h | 27 ++++++++++++++++++++++++-- 5 files changed, 96 insertions(+), 24 deletions(-) diff --git a/src/cheatmenu.cpp b/src/cheatmenu.cpp index 37debf0..f68feb1 100644 --- a/src/cheatmenu.cpp +++ b/src/cheatmenu.cpp @@ -25,14 +25,6 @@ void CheatMenu::DrawWindow() { if (m_bShowMenu) { - static ImVec2 fScreenSize = ImVec2(-1, -1); - ImVec2 size(screen::GetScreenWidth(), screen::GetScreenHeight()); - - if (fScreenSize.x != -1 && fScreenSize.y != -1) - { - m_fMenuSize.x += (size.x - fScreenSize.x) / 4.0f; - m_fMenuSize.y += (size.y - fScreenSize.y) / 1.2f; - } ImGui::SetNextWindowSize(m_fMenuSize); if (ImGui::Begin(MENU_TITLE, NULL, ImGuiWindowFlags_NoCollapse || ImGuiWindowFlags_NoTitleBar)) @@ -51,7 +43,14 @@ void CheatMenu::DrawWindow() Ui::DrawHeaders(header); } - m_fMenuSize = ImGui::GetWindowSize(); + if (m_bSizeChangedExternal) + { + m_bSizeChangedExternal = false; + } + else + { + m_fMenuSize = ImGui::GetWindowSize(); + } gConfig.SetValue("window.sizeX", m_fMenuSize.x); gConfig.SetValue("window.sizeY", m_fMenuSize.y); @@ -77,7 +76,7 @@ CheatMenu::CheatMenu() pCallbackFunc = std::bind(&DrawWindow); // Load menu settings - Ui::m_HeaderId = gConfig.GetValue("window.id", std::string("")); + Ui::m_HeaderId = gConfig.GetValue("window.idnum", -1); m_fMenuSize.x = gConfig.GetValue("window.sizeX", screen::GetScreenWidth() / 4.0f); m_fMenuSize.y = gConfig.GetValue("window.sizeY", screen::GetScreenHeight() / 1.2f); srand(CTimer::m_snTimeInMilliseconds); @@ -179,3 +178,10 @@ void CheatMenu::ApplyStyle() style->Colors[ImGuiCol_TextSelectedBg] = ImVec4(0.06f, 0.05f, 0.06f, 0.95f); style->Colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.20f, 0.20f, 0.20f, 0.6f); } + +void CheatMenu::ResetMenuSize() +{ + m_fMenuSize.x = screen::GetScreenWidth() / 4.0f; + m_fMenuSize.y = screen::GetScreenHeight() / 1.2f; + m_bSizeChangedExternal = true; +} diff --git a/src/cheatmenu.h b/src/cheatmenu.h index 97cf15d..b7a85b5 100644 --- a/src/cheatmenu.h +++ b/src/cheatmenu.h @@ -25,6 +25,7 @@ class CheatMenu : Hook, Animation, Game, Menu, Ped, Player, Teleport, Vehicle, V private: static inline bool m_bShowMenu = false; static inline ImVec2 m_fMenuSize = ImVec2(screen::GetScreenWidth() / 4, screen::GetScreenHeight() / 1.2); + static inline bool m_bSizeChangedExternal = false; static inline CallbackTable header{ {"Teleport", &Teleport::Draw}, {"Player", &Player::Draw}, {"Ped", &Ped::Draw}, @@ -42,4 +43,6 @@ private: public: CheatMenu(); + + static void ResetMenuSize(); }; diff --git a/src/menu.cpp b/src/menu.cpp index 2f17cf7..dfc6c8d 100644 --- a/src/menu.cpp +++ b/src/menu.cpp @@ -4,6 +4,7 @@ #include "ui.h" #include "util.h" #include "updater.h" +#include "cheatmenu.h" #ifdef GTASA #include "teleport.h" @@ -343,6 +344,20 @@ void Menu::ProcessCommands() void Menu::Draw() { + ImGui::Spacing(); + if (ImGui::Button("Reset config", ImVec2(Ui::GetSize(2)))) + { + gConfig.m_Data.clear(); + SetHelpMessage("Config reset", false, false, false); + } + ImGui::SameLine(); + if (ImGui::Button("Reset size", ImVec2(Ui::GetSize(2)))) + { + CheatMenu::ResetMenuSize(); + SetHelpMessage("Menu size reset", false, false, false); + } + + ImGui::Spacing(); if (ImGui::BeginTabBar("Menu", ImGuiTabBarFlags_NoTooltip + ImGuiTabBarFlags_FittingPolicyScroll)) { if (ImGui::BeginTabItem("Overlay")) diff --git a/src/ui.cpp b/src/ui.cpp index 8a6f68c..bc58538 100644 --- a/src/ui.cpp +++ b/src/ui.cpp @@ -227,29 +227,52 @@ void Ui::CenterdText(const std::string& text) void Ui::DrawHeaders(CallbackTable& data) { static void* pCallback; - static int buttonInRow = 3; - ImVec2 size = GetSize(buttonInRow, false); + ImVec2 size = GetSize(3, false); ImGuiStyle &style = ImGui::GetStyle(); - ImVec4 buttonCol = style.Colors[ImGuiCol_Button]; ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); ImGui::PushFont(FontMgr::GetFont("header")); + + ImDrawList *pDrawList = ImGui::GetWindowDrawList(); for (int i = 0; i < data.size(); ++i) { const char* btn_text = data[i].first.c_str(); - if (btn_text == m_HeaderId) + ImVec4 color; + if (i == m_HeaderId) { - style.Colors[ImGuiCol_Button] = style.Colors[ImGuiCol_ButtonActive]; + color = style.Colors[ImGuiCol_ButtonActive]; pCallback = data[i].second; } - if (ImGui::Button(btn_text, size)) + else { - m_HeaderId = btn_text; - gConfig.SetValue("window.id", m_HeaderId); + color = style.Colors[ImGuiCol_Button]; + } + + if (ImGui::InvisibleButton(btn_text, size)) + { + m_HeaderId = i; + gConfig.SetValue("window.idnum", m_HeaderId); pCallback = data[i].second; } - style.Colors[ImGuiCol_Button] = buttonCol; + + if (ImGui::IsItemHovered()) + { + color = style.Colors[ImGuiCol_ButtonHovered]; + } + + // hardcoded + ImDrawFlags flags = ImDrawFlags_RoundCornersNone; + if (i == 0) flags = ImDrawFlags_RoundCornersTopLeft; + if (i == 2) flags = ImDrawFlags_RoundCornersTopRight; + if (i == 6) flags = ImDrawFlags_RoundCornersBottomLeft; + if (i == 8) flags = ImDrawFlags_RoundCornersBottomRight; + + ImVec2 min = ImGui::GetItemRectMin(); + ImVec2 max = ImGui::GetItemRectMax(); + ImVec2 size = ImGui::CalcTextSize(btn_text); + pDrawList->AddRectFilled(min, max, ImGui::GetColorU32(color), style.FrameRounding, flags); + ImGui::RenderTextClipped(min + style.FramePadding, max - style.FramePadding, btn_text, NULL, &size, style.ButtonTextAlign); if (i % 3 != 2) { @@ -260,7 +283,7 @@ void Ui::DrawHeaders(CallbackTable& data) ImGui::PopStyleVar(); ImGui::Dummy(ImVec2(0, 10)); - if (m_HeaderId == "") + if (m_HeaderId == -1) { // Show Welcome page ImGui::NewLine(); @@ -530,7 +553,7 @@ void Ui::DrawJSON(ResourceStore& data, if (ImGui::IsItemClicked(1) && func_right_click != nullptr) { jsonPopup.function = func_right_click; - jsonPopup.rootKey = root.key(); + jsonPopup.root = root.key(); jsonPopup.key = name; jsonPopup.value = _data.value(); } @@ -546,7 +569,7 @@ void Ui::DrawJSON(ResourceStore& data, ImGui::Text(jsonPopup.key.c_str()); ImGui::Separator(); if (ImGui::MenuItem("Remove")) - jsonPopup.function(jsonPopup.rootKey, jsonPopup.key, jsonPopup.value); + jsonPopup.function(jsonPopup.root, jsonPopup.key, jsonPopup.value); if (ImGui::MenuItem("Close")) @@ -966,7 +989,9 @@ bool Ui::ColorButton(int color_id, std::vector& color, ImVec2 size) std::string label = "Color " + std::to_string(color_id); if (ImGui::ColorButton(label.c_str(), ImVec4(color[0], color[1], color[2], 1), 0, size)) + { rtn = true; + } if (ImGui::IsItemHovered()) { diff --git a/src/ui.h b/src/ui.h index 58a798e..9a0c84d 100644 --- a/src/ui.h +++ b/src/ui.h @@ -1,6 +1,7 @@ #pragma once #include "pch.h" +// TODO: Fix this messy code class Ui { public: @@ -20,7 +21,7 @@ public: { std::function function; std::string key; - std::string rootKey; + std::string root; std::string value; }; @@ -29,7 +30,7 @@ public: std::function function; std::string value; }; - static inline std::string m_HeaderId; + static inline int m_HeaderId; static inline JsonPopUpData jsonPopup; static inline ImgPopUpData imgPopup; @@ -96,7 +97,9 @@ void Ui::EditAddress(const char* label, const int address, const int min, const int items = 3; if (min == def) + { items = 2; + } ImGui::Columns(items, nullptr, false); ImGui::Text(("Min: " + std::to_string(min)).c_str()); @@ -114,31 +117,43 @@ void Ui::EditAddress(const char* label, const int address, const int min, const ImGui::Spacing(); if (ImGui::InputInt(("Set value##" + std::string(label)).c_str(), &val)) + { patch::Set(address, val, false); + } ImGui::Spacing(); if (val < min) + { val = min; + } if (val > max) + { val = max; + } if (ImGui::Button(("Minimum##" + std::string(label)).c_str(), GetSize(items))) + { patch::Set(address, min, false); + } if (items == 3) { ImGui::SameLine(); if (ImGui::Button(("Default##" + std::string(label)).c_str(), GetSize(3))) + { patch::Set(address, def, false); + } } ImGui::SameLine(); if (ImGui::Button(("Maximum##" + std::string(label)).c_str(), GetSize(items))) + { patch::Set(address, max, false); + } ImGui::Spacing(); ImGui::Separator(); @@ -163,22 +178,30 @@ void Ui::EditReference(const char* label, T& address, const int min, const int d ImGui::Spacing(); if (ImGui::InputInt(("Set value##" + std::string(label)).c_str(), &val)) + { address = static_cast(val); + } ImGui::Spacing(); if (ImGui::Button(("Minimum##" + std::string(label)).c_str(), GetSize(3))) + { address = static_cast(min); + } ImGui::SameLine(); if (ImGui::Button(("Default##" + std::string(label)).c_str(), GetSize(3))) + { address = static_cast(def); + } ImGui::SameLine(); if (ImGui::Button(("Maximum##" + std::string(label)).c_str(), GetSize(3))) + { address = static_cast(max); + } ImGui::Spacing(); ImGui::Separator();