From 5ae57e75e460bc471d6ea6e16f20acc56508c977 Mon Sep 17 00:00:00 2001 From: Yimura Date: Tue, 11 Jan 2022 19:10:57 +0100 Subject: [PATCH] feat(ImGui): Renamed bitfield and added hotkey --- .../imgui_bitfield.hpp} | 6 +- BigBaseV2/src/widgets/imgui_hotkey.hpp | 297 ++++++++++++++++++ 2 files changed, 300 insertions(+), 3 deletions(-) rename BigBaseV2/src/{imguibitfield.h => widgets/imgui_bitfield.hpp} (98%) create mode 100644 BigBaseV2/src/widgets/imgui_hotkey.hpp diff --git a/BigBaseV2/src/imguibitfield.h b/BigBaseV2/src/widgets/imgui_bitfield.hpp similarity index 98% rename from BigBaseV2/src/imguibitfield.h rename to BigBaseV2/src/widgets/imgui_bitfield.hpp index 1c21b2e0..728ef893 100644 --- a/BigBaseV2/src/imguibitfield.h +++ b/BigBaseV2/src/widgets/imgui_bitfield.hpp @@ -32,7 +32,7 @@ namespace ImGui type = ImGuiDataType_U64; format = "%p"; } - + if (ImGui::InputScalar(name, type, param, NULL, NULL, format.c_str(), ImGuiInputTextFlags_CharsHexadecimal)) ret_val = true; size_t bits = (size * 8) - 1ULL; @@ -66,10 +66,10 @@ namespace ImGui ImGui::Text("%i", i); ImGui::EndGroup(); } - if(i % 16 != 0) + if (i % 16 != 0) ImGui::SameLine(); } - + return ret_val; } } \ No newline at end of file diff --git a/BigBaseV2/src/widgets/imgui_hotkey.hpp b/BigBaseV2/src/widgets/imgui_hotkey.hpp new file mode 100644 index 00000000..f8545adc --- /dev/null +++ b/BigBaseV2/src/widgets/imgui_hotkey.hpp @@ -0,0 +1,297 @@ +#pragma once +#include +#define IMGUI_DEFINE_MATH_OPERATORS +#include + +namespace ImGui +{ + const char* const key_names[] = { + "Unknown", + "VK_LBUTTON", + "VK_RBUTTON", + "VK_CANCEL", + "VK_MBUTTON", + "VK_XBUTTON1", + "VK_XBUTTON2", + "Unknown", + "VK_BACK", + "VK_TAB", + "Unknown", + "Unknown", + "VK_CLEAR", + "VK_RETURN", + "Unknown", + "Unknown", + "VK_SHIFT", + "VK_CONTROL", + "VK_MENU", + "VK_PAUSE", + "VK_CAPITAL", + "VK_KANA", + "Unknown", + "VK_JUNJA", + "VK_FINAL", + "VK_KANJI", + "Unknown", + "VK_ESCAPE", + "VK_CONVERT", + "VK_NONCONVERT", + "VK_ACCEPT", + "VK_MODECHANGE", + "VK_SPACE", + "VK_PRIOR", + "VK_NEXT", + "VK_END", + "VK_HOME", + "VK_LEFT", + "VK_UP", + "VK_RIGHT", + "VK_DOWN", + "VK_SELECT", + "VK_PRINT", + "VK_EXECUTE", + "VK_SNAPSHOT", + "VK_INSERT", + "VK_DELETE", + "VK_HELP", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "Unknown", + "Unknown", + "Unknown", + "Unknown", + "Unknown", + "Unknown", + "Unknown", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "VK_LWIN", + "VK_RWIN", + "VK_APPS", + "Unknown", + "VK_SLEEP", + "VK_NUMPAD0", + "VK_NUMPAD1", + "VK_NUMPAD2", + "VK_NUMPAD3", + "VK_NUMPAD4", + "VK_NUMPAD5", + "VK_NUMPAD6", + "VK_NUMPAD7", + "VK_NUMPAD8", + "VK_NUMPAD9", + "VK_MULTIPLY", + "VK_ADD", + "VK_SEPARATOR", + "VK_SUBTRACT", + "VK_DECIMAL", + "VK_DIVIDE", + "VK_F1", + "VK_F2", + "VK_F3", + "VK_F4", + "VK_F5", + "VK_F6", + "VK_F7", + "VK_F8", + "VK_F9", + "VK_F10", + "VK_F11", + "VK_F12", + "VK_F13", + "VK_F14", + "VK_F15", + "VK_F16", + "VK_F17", + "VK_F18", + "VK_F19", + "VK_F20", + "VK_F21", + "VK_F22", + "VK_F23", + "VK_F24", + "Unknown", + "Unknown", + "Unknown", + "Unknown", + "Unknown", + "Unknown", + "Unknown", + "Unknown", + "VK_NUMLOCK", + "VK_SCROLL", + "VK_OEM_NEC_EQUAL", + "VK_OEM_FJ_MASSHOU", + "VK_OEM_FJ_TOUROKU", + "VK_OEM_FJ_LOYA", + "VK_OEM_FJ_ROYA", + "Unknown", + "Unknown", + "Unknown", + "Unknown", + "Unknown", + "Unknown", + "Unknown", + "Unknown", + "Unknown", + "VK_LSHIFT", + "VK_RSHIFT", + "VK_LCONTROL", + "VK_RCONTROL", + "VK_LMENU", + "VK_RMENU" + }; + + bool Hotkey(const char* label, int* k, const ImVec2& size_arg = {}) + { + ImGuiWindow* window = ImGui::GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + ImGuiIO& io = g.IO; + const ImGuiStyle& style = g.Style; + + const ImGuiID id = window->GetID(label); + const ImVec2 label_size = ImGui::CalcTextSize(label, NULL, true); + ImVec2 size = ImGui::CalcItemSize(size_arg, ImGui::CalcItemWidth(), label_size.y + style.FramePadding.y * 2.0f); + const ImRect frame_bb(window->DC.CursorPos + ImVec2(label_size.x + style.ItemInnerSpacing.x, 0.0f), window->DC.CursorPos + size); + const ImRect total_bb(window->DC.CursorPos, frame_bb.Max); + + ImGui::ItemSize(total_bb, style.FramePadding.y); + if (!ImGui::ItemAdd(total_bb, id, 0, ImGuiItemFlags_Inputable)) + return false; + + const bool focus_requested = (ImGui::GetItemStatusFlags() & ImGuiItemStatusFlags_FocusedByTabbing) || g.ActiveId == id; + //const bool focus_requested = ImGui::FocusableItemRegister(window, g.ActiveId == id, false); + //const bool focus_requested_by_code = focus_requested && (window->FocusIdxAllCounter == window->FocusIdxAllRequestCurrent); + + const bool hovered = ImGui::ItemHoverable(frame_bb, id); + + if (hovered) { + ImGui::SetHoveredID(id); + g.MouseCursor = ImGuiMouseCursor_TextInput; + } + + const bool user_clicked = hovered && io.MouseClicked[0]; + + if (focus_requested || user_clicked) { + if (g.ActiveId != id) { + // Start edition + memset(io.MouseDown, 0, sizeof(io.MouseDown)); + memset(io.KeysDown, 0, sizeof(io.KeysDown)); + *k = 0; + } + ImGui::SetActiveID(id, window); + ImGui::FocusWindow(window); + } + else if (io.MouseClicked[0]) { + // Release focus when we click outside + if (g.ActiveId == id) + ImGui::ClearActiveID(); + } + + bool value_changed = false; + int key = *k; + + if (g.ActiveId == id) { + for (auto i = 0; i < 5; i++) { + if (io.MouseDown[i]) { + switch (i) { + case 0: + key = VK_LBUTTON; + break; + case 1: + key = VK_RBUTTON; + break; + case 2: + key = VK_MBUTTON; + break; + case 3: + key = VK_XBUTTON1; + break; + case 4: + key = VK_XBUTTON2; + break; + } + value_changed = true; + ImGui::ClearActiveID(); + } + } + if (!value_changed) { + for (auto i = VK_BACK; i <= VK_RMENU; i++) { + if (io.KeysDown[i]) { + key = i; + value_changed = true; + ImGui::ClearActiveID(); + } + } + } + + if (IsKeyPressedMap(ImGuiKey_Escape)) { + *k = 0; + ImGui::ClearActiveID(); + } + else { + *k = key; + } + } + + // Render + // Select which buffer we are going to display. When ImGuiInputTextFlags_NoLiveEdit is Set 'buf' might still be the old value. We Set buf to NULL to prevent accidental usage from now on. + + char buf_display[64] = "None"; + + ImGui::RenderFrame(frame_bb.Min, frame_bb.Max, ImGui::GetColorU32(ImVec4(0.20f, 0.25f, 0.30f, 1.0f)), true, style.FrameRounding); + + if (*k != 0 && g.ActiveId != id) { + strcpy_s(buf_display, key_names[*k]); + } + else if (g.ActiveId == id) { + strcpy_s(buf_display, ""); + } + + const ImRect clip_rect(frame_bb.Min.x, frame_bb.Min.y, frame_bb.Min.x + size.x, frame_bb.Min.y + size.y); // Not using frame_bb.Max because we have adjusted size + ImVec2 render_pos = frame_bb.Min + style.FramePadding; + ImGui::RenderTextClipped(frame_bb.Min + style.FramePadding, frame_bb.Max - style.FramePadding, buf_display, NULL, NULL, style.ButtonTextAlign, &clip_rect); + //RenderTextClipped(frame_bb.Min + style.FramePadding, frame_bb.Max - style.FramePadding, buf_display, NULL, NULL, GetColorU32(ImGuiCol_Text), style.ButtonTextAlign, &clip_rect); + //draw_window->DrawList->AddText(g.Font, g.FontSize, render_pos, GetColorU32(ImGuiCol_Text), buf_display, NULL, 0.0f, &clip_rect); + + if (label_size.x > 0) + ImGui::RenderText(ImVec2(total_bb.Min.x, frame_bb.Min.y + style.FramePadding.y), label); + + return value_changed; + } +} \ No newline at end of file