mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
254 lines
7.8 KiB
C++
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;
|
|
}
|
|
}
|