Browse Source

InputTextMultiline: Fixed Tabbing cycle leading to a situation where Enter key wouldn't be accepted by the widget when navigation highlight is visible. (#6802, #3092, #5759, #787)

+ Added test in ImGuiTestSuite: "widgets_inputtext_multiline_enter"
ocornut 1 year ago
parent
commit
0e1ce76ea8
3 changed files with 9 additions and 2 deletions
  1. 2 0
      docs/CHANGELOG.txt
  2. 1 1
      imgui.h
  3. 6 1
      imgui_widgets.cpp

+ 2 - 0
docs/CHANGELOG.txt

@@ -58,6 +58,8 @@ Other changes:
   it does, this has been a common pitfall leading to more or less subtle issues. (#3164, #3309, #6800)
 - InputTextMultiline: Fixed a crash pressing Down on last empty line of a multiline buffer.
   (regression from 1.89.2, only happened in some states). (#6783, #6000)
+- InputTextMultiline: Fixed Tabbing cycle leading to a situation where Enter key wouldn't
+  be accepted by the widget when navigation highlight is visible. (#6802, #3092, #5759, #787)
 - BeginListBox(): Fixed not consuming SetNextWindowXXX data when returning false.
 - MenuBar: Fixed an issue where layouting an item in the menu-bar would erroneously
   register contents size in a way that would affect the scrolling layer.

+ 1 - 1
imgui.h

@@ -26,7 +26,7 @@
 // Library Version
 // (Integer encoded as XYYZZ for use in #if preprocessor conditionals, e.g. '#if IMGUI_VERSION_NUM >= 12345')
 #define IMGUI_VERSION       "1.90 WIP"
-#define IMGUI_VERSION_NUM   18991
+#define IMGUI_VERSION_NUM   18992
 #define IMGUI_HAS_TABLE
 
 /*

+ 6 - 1
imgui_widgets.cpp

@@ -4124,13 +4124,18 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
         item_data_backup = g.LastItemData;
         window->DC.CursorPos = backup_pos;
 
+        // Prevent NavActivate reactivating in BeginChild().
+        const ImGuiID backup_activate_id = g.NavActivateId;
+        if (g.ActiveId == id) // Prevent reactivation
+            g.NavActivateId = 0;
+
         // We reproduce the contents of BeginChildFrame() in order to provide 'label' so our window internal data are easier to read/debug.
-        // FIXME-NAV: Pressing NavActivate will trigger general child activation right before triggering our own below. Harmless but bizarre.
         PushStyleColor(ImGuiCol_ChildBg, style.Colors[ImGuiCol_FrameBg]);
         PushStyleVar(ImGuiStyleVar_ChildRounding, style.FrameRounding);
         PushStyleVar(ImGuiStyleVar_ChildBorderSize, style.FrameBorderSize);
         PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); // Ensure no clip rect so mouse hover can reach FramePadding edges
         bool child_visible = BeginChildEx(label, id, frame_bb.GetSize(), true, ImGuiWindowFlags_NoMove);
+        g.NavActivateId = backup_activate_id;
         PopStyleVar(3);
         PopStyleColor();
         if (!child_visible)