From ed4bbc4fd4c7041f98f204ee695cfe441032a9f7 Mon Sep 17 00:00:00 2001 From: omar Date: Tue, 6 Feb 2018 18:26:42 +0100 Subject: [PATCH] Nav: Comments, guides. --- TODO.txt | 1 + imgui.cpp | 18 +++++++++--------- imgui.h | 36 ++++++++++++++++++------------------ 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/TODO.txt b/TODO.txt index fe9b6ccec..939393ba6 100644 --- a/TODO.txt +++ b/TODO.txt @@ -238,6 +238,7 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i - nav: integrate/design keyboard controls. - nav: simulate right-click or context activation? (SHIFT+F10) - nav: tabs should go through most/all widgets (in submission order?). + - nav: when CTRL-Tab/windowing is active, the HoveredWindow detection doesn't take account of the window display re-ordering. - nav: cannot access menubar of a flattened child window with Alt/menu key (not a very common use case..). - nav: esc/enter default behavior for popups, e.g. be able to mark an "ok" or "cancel" button that would get triggered by those keys. - nav: when activating a button that changes label (without a static ID) or disappear, can we somehow automatically recover into a nearest highlight item? diff --git a/imgui.cpp b/imgui.cpp index c2e96ea28..6d485418d 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -80,7 +80,8 @@ - ESCAPE to revert text to its original value. - You can apply arithmetic operators +,*,/ on numerical values. Use +- to subtract (because - would set a negative value!) - Controls are automatically adjusted for OSX to match standard OSX text editing operations. - - Gamepad/keyboard navigation are in beta-phase, see Programmer Guide below. + - Gamepad navigation: see suggested mappings in imgui.h ImGuiNavInput_ + - Keyboard navigation: see suggested mappings in imgui.h ImGuiNavInput_ PROGRAMMER GUIDE @@ -211,8 +212,7 @@ USING GAMEPAD/KEYBOARD NAVIGATION [BETA] - - Gamepad/keyboard navigation support is now available. Your feedback and bug reports are greatly welcome! - - See https://github.com/ocornut/imgui/issues/787 discussion thread and ask questions there. + - Ask questions and report issues at https://github.com/ocornut/imgui/issues/787. - The initial focus was to support game controllers, but keyboard is becoming increasingly and decently usable. - Your inputs are passed to imgui by filling the io.NavInputs[] array. See 'enum ImGuiNavInput_' in imgui.h for a description of available inputs. - Please refer to the examples/ application for suggested keyboard and gamepad mapping. @@ -221,12 +221,12 @@ - The ImGuiNavFlags_EnableGamepad and ImGuiNavFlags_EnableKeyboard flags of io.NavFlags are only here to instruct your binding whether to find inputs. - For gamepad use, the easiest approach is to go all-or-nothing, with a buttons combo that toggle your inputs between imgui and your game/application. Sharing inputs in a more advanced or granular way between imgui and your game/application may be tricky and requires further work on imgui. + When keyboard navigation is active (io.NavActive + NavFlags_EnableKeyboard), the io.WantCaptureKeyboard is set. For more advanced uses, you may want to use: - io.NavActive: true when a window is focused and it doesn't have the ImGuiWindowFlags_NoNavInputs flag set. - io.NavVisible: true when the navigation cursor is visible (and usually goes false when mouse is used). - query focus information with e.g. IsWindowFocused(), IsItemFocused() etc. functions. - The reality is more complex than what those flags can express. Please discuss your issues and usage scenario in the thread above! - As we head toward more keyboard-oriented development this aspect will need to be improved. + Please reach out if you think the game vs navigation input sharing could be improved. - On a TV/console system where readability may be lower or mouse inputs may be awkward, you may want to set the ImGuiNavFlags_MoveMouse flag in io.NavFlags. Enabling ImGuiNavFlags_MoveMouse instructs dear imgui to move your mouse cursor along with navigation movement. When enabled, the NewFrame() functions may alter 'io.MousePos' and set 'io.WantMoveMouse' to notify you that it did so. @@ -2675,7 +2675,7 @@ static ImVec2 NavCalcPreferredMousePos() const ImRect& rect_rel = window->NavRectRel[g.NavLayer]; ImVec2 pos = g.NavWindow->Pos + ImVec2(rect_rel.Min.x + ImMin(g.Style.FramePadding.x*4, rect_rel.GetWidth()), rect_rel.Max.y - ImMin(g.Style.FramePadding.y, rect_rel.GetHeight())); ImRect visible_rect = GetViewportRect(); - return ImFloor(ImClamp(pos, visible_rect.Min, visible_rect.Max)); // ImFloor() is important because non-integer mouse position application in backend might be lossy and result in undesirable non-zero delta. + return ImFloor(ImClamp(pos, visible_rect.Min, visible_rect.Max)); // ImFloor() is important because non-integer mouse position application in back-end might be lossy and result in undesirable non-zero delta. } static int FindWindowIndex(ImGuiWindow* window) // FIXME-OPT O(N) @@ -2823,7 +2823,7 @@ static void ImGui::NavUpdateWindowing() } // Keyboard: Press and Release ALT to toggle menu layer - // FIXME: We lack an explicit IO variable for "is the imgui window focused", so compare mouse validity to detect the common case of backend clearing releases all keys on ALT-TAB + // FIXME: We lack an explicit IO variable for "is the imgui window focused", so compare mouse validity to detect the common case of back-end clearing releases all keys on ALT-TAB if ((g.ActiveId == 0 || g.ActiveIdAllowOverlap) && IsNavInputPressed(ImGuiNavInput_KeyMenu, ImGuiInputReadMode_Released)) if (IsMousePosValid(&g.IO.MousePos) == IsMousePosValid(&g.IO.MousePosPrev)) apply_toggle_layer = true; @@ -4415,7 +4415,7 @@ int ImGui::GetKeyIndex(ImGuiKey imgui_key) return GImGui->IO.KeyMap[imgui_key]; } -// Note that imgui doesn't know the semantic of each entry of io.KeyDown[]. Use your own indices/enums according to how your backend/engine stored them into KeyDown[]! +// Note that imgui doesn't know the semantic of each entry of io.KeyDown[]. Use your own indices/enums according to how your back-end/engine stored them into KeyDown[]! bool ImGui::IsKeyDown(int user_key_index) { if (user_key_index < 0) return false; @@ -4536,7 +4536,7 @@ bool ImGui::IsMousePosValid(const ImVec2* mouse_pos) return mouse_pos->x >= MOUSE_INVALID && mouse_pos->y >= MOUSE_INVALID; } -// NB: This is only valid if IsMousePosValid(). Backends in theory should always keep mouse position valid when dragging even outside the client window. +// NB: This is only valid if IsMousePosValid(). Back-ends in theory should always keep mouse position valid when dragging even outside the client window. ImVec2 ImGui::GetMouseDragDelta(int button, float lock_threshold) { ImGuiContext& g = *GImGui; diff --git a/imgui.h b/imgui.h index 4644a8adf..136f296e6 100644 --- a/imgui.h +++ b/imgui.h @@ -710,27 +710,27 @@ enum ImGuiKey_ enum ImGuiNavInput_ { // Gamepad Mapping - ImGuiNavInput_PadActivate, // press button, tweak value // e.g. Circle button - ImGuiNavInput_PadCancel, // close menu/popup/child, lose selection // e.g. Cross button - ImGuiNavInput_PadInput, // text input // e.g. Triangle button - ImGuiNavInput_PadMenu, // toggle menu, hold to: focus, move, resize // e.g. Square button - ImGuiNavInput_PadDpadLeft, // move left, resize window (with PadMenu) // e.g. D-pad directions - ImGuiNavInput_PadDpadRight, // move right - ImGuiNavInput_PadDpadUp, // move up - ImGuiNavInput_PadDpadDown, // move down - ImGuiNavInput_PadLStickLeft, // scroll up, move window (with PadMenu) // e.g. left stick directions (analog) - ImGuiNavInput_PadLStickRight, // scroll right - ImGuiNavInput_PadLStickUp, // scroll up - ImGuiNavInput_PadLStickDown, // scroll down - ImGuiNavInput_PadFocusPrev, // next window (with PadMenu) // e.g. L-trigger - ImGuiNavInput_PadFocusNext, // prev window (with PadMenu) // e.g. R-trigger - ImGuiNavInput_PadTweakSlow, // slower tweaks // e.g. L-trigger, analog - ImGuiNavInput_PadTweakFast, // faster tweaks // e.g. R-trigger, analog + ImGuiNavInput_PadActivate, // activate / open / toggle / tweak value // e.g. Circle (PS4), A (Xbox), B (Switch) + ImGuiNavInput_PadCancel, // cancel / close / exit // e.g. Cross (PS4), B (Xbox), A (Switch) + ImGuiNavInput_PadInput, // text input / on-screen keyboard // e.g. Triang.(PS4), Y (Xbox), X (Switch) + ImGuiNavInput_PadMenu, // tap: toggle menu / hold: focus, move, resize // e.g. Square (PS4), X (Xbox), Y (Switch) + ImGuiNavInput_PadDpadLeft, // move / tweak / resize window (w/ PadMenu) // e.g. D-pad Left/Right/Up/Down + ImGuiNavInput_PadDpadRight, // + ImGuiNavInput_PadDpadUp, // + ImGuiNavInput_PadDpadDown, // + ImGuiNavInput_PadLStickLeft, // scroll / move window (w/ PadMenu) // e.g. Left Analog Stick Left/Right/Up/Down + ImGuiNavInput_PadLStickRight, // + ImGuiNavInput_PadLStickUp, // + ImGuiNavInput_PadLStickDown, // + ImGuiNavInput_PadFocusPrev, // next window (w/ PadMenu) // e.g. L1 (PS4), LB (Xbox), L (Switch) + ImGuiNavInput_PadFocusNext, // prev window (w/ PadMenu) // e.g. R1 (PS4), RB (Xbox), R (Switch) + ImGuiNavInput_PadTweakSlow, // slower tweaks // e.g. L2 (PS4), LT (Xbox), ZL (Switch), Analog + ImGuiNavInput_PadTweakFast, // faster tweaks // e.g. R2 (PS4), RT (Xbox), ZR (Switch), Analog // Keyboard Mapping // [BETA] To use keyboard control you currently need to map keys to those gamepad inputs: PadActivate (Enter), PadCancel (Escape), PadInput (Enter). // Will add specialized keyboard mappings as we add features and clarify the input interface. - ImGuiNavInput_KeyMenu, // toggle menu // e.g. ALT - ImGuiNavInput_KeyLeft, // move left // e.g. Arrow keys + ImGuiNavInput_KeyMenu, // toggle menu // e.g. Alt + ImGuiNavInput_KeyLeft, // move left // e.g. Arrow keys ImGuiNavInput_KeyRight, // move right ImGuiNavInput_KeyUp, // move up ImGuiNavInput_KeyDown, // move down