ppsspp/ext/imgui/imgui_impl_platform.cpp
Henrik Rydgård 2d69d78e71 Console wip
2025-03-27 08:59:38 +01:00

254 lines
7.8 KiB
C++

#include "ext/imgui/imgui.h"
#include "Common/File/Path.h"
#include "Common/Input/KeyCodes.h"
#include "Common/Data/Encoding/Utf8.h"
#include "Common/System/Display.h"
#include "Common/TimeUtil.h"
#include "Common/StringUtils.h"
#include "Common/Log.h"
#include "imgui_impl_platform.h"
static ImGuiMouseCursor g_cursor = ImGuiMouseCursor_Arrow;
Bounds g_imguiCentralNodeBounds;
void ImGui_ImplPlatform_KeyEvent(const KeyInput &key) {
ImGuiIO &io = ImGui::GetIO();
if (key.flags & KEY_DOWN) {
// Specially handle scroll events and any other special keys.
switch (key.keyCode) {
case NKCODE_EXT_MOUSEWHEEL_UP:
io.AddMouseWheelEvent(0, key.Delta() * 0.010f);
break;
case NKCODE_EXT_MOUSEWHEEL_DOWN:
io.AddMouseWheelEvent(0, -key.Delta() * 0.010f);
break;
default:
{
ImGuiKey keyCode = KeyCodeToImGui(key.keyCode);
if (keyCode != ImGuiKey_None) {
io.AddKeyEvent(keyCode, true);
}
break;
}
}
}
if (key.flags & KEY_UP) {
ImGuiKey keyCode = KeyCodeToImGui(key.keyCode);
if (keyCode != ImGuiKey_None) {
io.AddKeyEvent(keyCode, false);
}
}
if (key.flags & KEY_CHAR) {
const int unichar = key.unicodeChar;
if (unichar >= 0x20) {
// Insert it! (todo: do it with a string insert)
char buf[16];
buf[u8_wc_toutf8(buf, unichar)] = '\0';
io.AddInputCharactersUTF8(buf);
}
}
}
void ImGui_ImplPlatform_TouchEvent(const TouchInput &touch) {
ImGuiIO& io = ImGui::GetIO();
// We use real pixels in the imgui, no DPI adjustment yet.
float x = touch.x / g_display.dpi_scale;
float y = touch.y / g_display.dpi_scale;
if (touch.flags & TOUCH_MOVE) {
io.AddMousePosEvent(x, y);
}
if (touch.flags & TOUCH_DOWN) {
io.AddMousePosEvent(x, y);
if (touch.flags & TOUCH_MOUSE) {
if (touch.buttons & 1)
io.AddMouseButtonEvent(0, true);
if (touch.buttons & 2)
io.AddMouseButtonEvent(1, true);
} else {
io.AddMouseButtonEvent(0, true);
}
}
if (touch.flags & TOUCH_UP) {
io.AddMousePosEvent(x, y);
if (touch.flags & TOUCH_MOUSE) {
if (touch.buttons & 1)
io.AddMouseButtonEvent(0, false);
if (touch.buttons & 2)
io.AddMouseButtonEvent(1, false);
} else {
io.AddMouseButtonEvent(0, false);
}
}
}
void ImGui_ImplPlatform_Init(const Path &configPath) {
static char path[1024];
truncate_cpy(path, configPath.ToString());
ImGui::GetIO().IniFilename = path;
ImGui::GetIO().ConfigFlags |= ImGuiConfigFlags_DockingEnable;
}
void ImGui_ImplPlatform_AxisEvent(const AxisInput &axis) {
// Ignore for now.
}
void ImGui_ImplPlatform_NewFrame() {
static double lastTime = 0.0;
if (lastTime == 0.0) {
lastTime = time_now_d();
}
double now = time_now_d();
g_cursor = ImGui::GetMouseCursor();
ImGuiIO &io = ImGui::GetIO();
io.DisplaySize = ImVec2(g_display.pixel_xres, g_display.pixel_yres);
io.DisplayFramebufferScale = ImVec2(1.0f, 1.0f);
io.DeltaTime = now - lastTime;
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
lastTime = now;
}
ImGuiMouseCursor ImGui_ImplPlatform_GetCursor() {
return g_cursor;
}
// Written by chatgpt
ImGuiKey KeyCodeToImGui(InputKeyCode keyCode) {
switch (keyCode) {
case NKCODE_DPAD_UP: return ImGuiKey_UpArrow;
case NKCODE_DPAD_DOWN: return ImGuiKey_DownArrow;
case NKCODE_DPAD_LEFT: return ImGuiKey_LeftArrow;
case NKCODE_DPAD_RIGHT: return ImGuiKey_RightArrow;
case NKCODE_ENTER: return ImGuiKey_Enter;
case NKCODE_ESCAPE: return ImGuiKey_Escape;
case NKCODE_SHIFT_LEFT: return ImGuiKey_LeftShift;
case NKCODE_SHIFT_RIGHT: return ImGuiKey_RightShift;
case NKCODE_ALT_LEFT: return ImGuiKey_LeftAlt;
case NKCODE_ALT_RIGHT: return ImGuiKey_RightAlt;
case NKCODE_CTRL_LEFT: return ImGuiKey_LeftCtrl;
case NKCODE_CTRL_RIGHT: return ImGuiKey_RightCtrl;
case NKCODE_TAB: return ImGuiKey_Tab;
case NKCODE_MENU: return ImGuiKey_Menu;
case NKCODE_DEL: return ImGuiKey_Backspace;
case NKCODE_FORWARD_DEL: return ImGuiKey_Delete;
case NKCODE_CAPS_LOCK: return ImGuiKey_CapsLock;
case NKCODE_SPACE: return ImGuiKey_Space;
case NKCODE_PAGE_UP: return ImGuiKey_PageUp;
case NKCODE_PAGE_DOWN: return ImGuiKey_PageDown;
case NKCODE_MOVE_HOME: return ImGuiKey_Home;
case NKCODE_MOVE_END: return ImGuiKey_End;
case NKCODE_INSERT: return ImGuiKey_Insert;
// Numeric keys
case NKCODE_0: return ImGuiKey_0;
case NKCODE_1: return ImGuiKey_1;
case NKCODE_2: return ImGuiKey_2;
case NKCODE_3: return ImGuiKey_3;
case NKCODE_4: return ImGuiKey_4;
case NKCODE_5: return ImGuiKey_5;
case NKCODE_6: return ImGuiKey_6;
case NKCODE_7: return ImGuiKey_7;
case NKCODE_8: return ImGuiKey_8;
case NKCODE_9: return ImGuiKey_9;
// Letter keys
case NKCODE_A: return ImGuiKey_A;
case NKCODE_B: return ImGuiKey_B;
case NKCODE_C: return ImGuiKey_C;
case NKCODE_D: return ImGuiKey_D;
case NKCODE_E: return ImGuiKey_E;
case NKCODE_F: return ImGuiKey_F;
case NKCODE_G: return ImGuiKey_G;
case NKCODE_H: return ImGuiKey_H;
case NKCODE_I: return ImGuiKey_I;
case NKCODE_J: return ImGuiKey_J;
case NKCODE_K: return ImGuiKey_K;
case NKCODE_L: return ImGuiKey_L;
case NKCODE_M: return ImGuiKey_M;
case NKCODE_N: return ImGuiKey_N;
case NKCODE_O: return ImGuiKey_O;
case NKCODE_P: return ImGuiKey_P;
case NKCODE_Q: return ImGuiKey_Q;
case NKCODE_R: return ImGuiKey_R;
case NKCODE_S: return ImGuiKey_S;
case NKCODE_T: return ImGuiKey_T;
case NKCODE_U: return ImGuiKey_U;
case NKCODE_V: return ImGuiKey_V;
case NKCODE_W: return ImGuiKey_W;
case NKCODE_X: return ImGuiKey_X;
case NKCODE_Y: return ImGuiKey_Y;
case NKCODE_Z: return ImGuiKey_Z;
// Symbols
case NKCODE_COMMA: return ImGuiKey_Comma;
case NKCODE_PERIOD: return ImGuiKey_Period;
case NKCODE_MINUS: return ImGuiKey_Minus;
case NKCODE_PLUS: return ImGuiKey_Equal; // Hmm
case NKCODE_EQUALS: return ImGuiKey_Equal;
case NKCODE_LEFT_BRACKET: return ImGuiKey_LeftBracket;
case NKCODE_RIGHT_BRACKET: return ImGuiKey_RightBracket;
case NKCODE_BACKSLASH: return ImGuiKey_Backslash;
case NKCODE_SEMICOLON: return ImGuiKey_Semicolon;
case NKCODE_APOSTROPHE: return ImGuiKey_Apostrophe;
case NKCODE_SLASH: return ImGuiKey_Slash;
case NKCODE_GRAVE: return ImGuiKey_GraveAccent;
// Function keys
case NKCODE_F1: return ImGuiKey_F1;
case NKCODE_F2: return ImGuiKey_F2;
case NKCODE_F3: return ImGuiKey_F3;
case NKCODE_F4: return ImGuiKey_F4;
case NKCODE_F5: return ImGuiKey_F5;
case NKCODE_F6: return ImGuiKey_F6;
case NKCODE_F7: return ImGuiKey_F7;
case NKCODE_F8: return ImGuiKey_F8;
case NKCODE_F9: return ImGuiKey_F9;
case NKCODE_F10: return ImGuiKey_F10;
case NKCODE_F11: return ImGuiKey_F11;
case NKCODE_F12: return ImGuiKey_F12;
// Keypad
case NKCODE_NUMPAD_0: return ImGuiKey_Keypad0;
case NKCODE_NUMPAD_1: return ImGuiKey_Keypad1;
case NKCODE_NUMPAD_2: return ImGuiKey_Keypad2;
case NKCODE_NUMPAD_3: return ImGuiKey_Keypad3;
case NKCODE_NUMPAD_4: return ImGuiKey_Keypad4;
case NKCODE_NUMPAD_5: return ImGuiKey_Keypad5;
case NKCODE_NUMPAD_6: return ImGuiKey_Keypad6;
case NKCODE_NUMPAD_7: return ImGuiKey_Keypad7;
case NKCODE_NUMPAD_8: return ImGuiKey_Keypad8;
case NKCODE_NUMPAD_9: return ImGuiKey_Keypad9;
case NKCODE_NUMPAD_DIVIDE: return ImGuiKey_KeypadDivide;
case NKCODE_NUMPAD_MULTIPLY: return ImGuiKey_KeypadMultiply;
case NKCODE_NUMPAD_SUBTRACT: return ImGuiKey_KeypadSubtract;
case NKCODE_NUMPAD_ADD: return ImGuiKey_KeypadAdd;
case NKCODE_NUMPAD_ENTER: return ImGuiKey_KeypadEnter;
case NKCODE_NUMPAD_EQUALS: return ImGuiKey_KeypadEqual;
// Lock keys
case NKCODE_NUM_LOCK: return ImGuiKey_NumLock;
case NKCODE_SCROLL_LOCK: return ImGuiKey_ScrollLock;
case NKCODE_EXT_MOUSEBUTTON_1:
case NKCODE_EXT_MOUSEBUTTON_2:
case NKCODE_EXT_MOUSEBUTTON_3:
case NKCODE_EXT_MOUSEBUTTON_4:
case NKCODE_EXT_MOUSEBUTTON_5:
case NKCODE_EXT_MOUSEWHEEL_DOWN:
case NKCODE_EXT_MOUSEWHEEL_UP:
// Keys ignored for imgui
return ImGuiKey_None;
case NKCODE_EXT_PRINTSCREEN:
return ImGuiKey_PrintScreen;
default:
WARN_LOG(Log::System, "Unmapped ImGui keycode conversion from %d", keyCode);
return ImGuiKey_None;
}
}