소스 검색

Fixed ImGuiTreeNodeFlags_AllowOverlapMode to behave better on touch-style inputs (#600)

ocornut 9 년 전
부모
커밋
ab6bc05fc3
2개의 변경된 파일13개의 추가작업 그리고 16개의 파일을 삭제
  1. 6 9
      imgui.cpp
  2. 7 7
      imgui.h

+ 6 - 9
imgui.cpp

@@ -5262,14 +5262,6 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool
 
     bool pressed = false;
     bool hovered = IsHovered(bb, id, (flags & ImGuiButtonFlags_FlattenChilds) != 0);
-
-    // AllowOverlap mode (rarely used) requires previous frame HoveredId to be null or to match. This allows using patterns where a later submitted widget overlaps a previous one.
-    if (hovered && (flags & ImGuiButtonFlags_AllowOverlapMode) && (g.HoveredIdPreviousFrame != id && g.HoveredIdPreviousFrame != 0))
-    {
-        SetHoveredID(id);
-        hovered = false;
-    }
-
     if (hovered)
     {
         SetHoveredID(id);
@@ -5319,6 +5311,10 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool
         }
     }
 
+    // AllowOverlap mode (rarely used) requires previous frame HoveredId to be null or to match. This allows using patterns where a later submitted widget overlaps a previous one.
+    if (hovered && (flags & ImGuiButtonFlags_AllowOverlapMode) && (g.HoveredIdPreviousFrame != id && g.HoveredIdPreviousFrame != 0))
+        hovered = pressed = held = false;
+
     if (out_hovered) *out_hovered = hovered;
     if (out_held) *out_held = held;
 
@@ -5688,6 +5684,8 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l
         opened = !opened;
         window->DC.StateStorage->SetInt(id, opened);
     }
+    if (flags & ImGuiTreeNodeFlags_AllowOverlapMode)
+        SetItemAllowOverlap();
 
     // Render
     const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header);
@@ -5752,7 +5750,6 @@ bool ImGui::CollapsingHeader(const char* label, bool* p_open, ImGuiTreeNodeFlags
     {
         // Create a small overlapping close button // FIXME: We can evolve this into user accessible helpers to add extra buttons on title bars, headers, etc.
         ImGuiState& g = *GImGui;
-        SetItemAllowOverlap();
         float button_sz = g.FontSize * 0.5f;
         if (CloseButton(window->GetID((void*)(intptr_t)(id+1)), ImVec2(window->DC.LastItemRect.Max.x - g.Style.FramePadding.x - button_sz, window->DC.LastItemRect.Min.y + g.Style.FramePadding.y + button_sz), button_sz))
             *p_open = false;

+ 7 - 7
imgui.h

@@ -518,13 +518,13 @@ enum ImGuiInputTextFlags_
 // Flags for ImGui::TreeNode*(), ImGui::CollapsingHeader*()
 enum ImGuiTreeNodeFlags_
 {
-    ImGuiTreeNodeFlags_Selected             = 1 << 0,
-    ImGuiTreeNodeFlags_Framed               = 1 << 1,
-    ImGuiTreeNodeFlags_AllowOverlapMode     = 1 << 2,
-    ImGuiTreeNodeFlags_NoTreePushOnOpen     = 1 << 3,
-    ImGuiTreeNodeFlags_NoAutoOpenOnLog      = 1 << 4,
-    ImGuiTreeNodeFlags_DefaultOpen          = 1 << 5,
-    ImGuiTreeNodeFlags_CollapsingHeader     = ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_NoAutoOpenOnLog,
+    ImGuiTreeNodeFlags_Selected             = 1 << 0,   // FIXME: TODO
+    ImGuiTreeNodeFlags_Framed               = 1 << 1,   // Full colored frame (e.g. for CollapsingHeader)
+    ImGuiTreeNodeFlags_AllowOverlapMode     = 1 << 2,   // Hit testing to allow subsequent widgets to overlap this one
+    ImGuiTreeNodeFlags_NoTreePushOnOpen     = 1 << 3,   // Don't do a TreePush() when opened (e.g. for CollapsingHeader) = no extra indent nor pushing on ID stack
+    ImGuiTreeNodeFlags_NoAutoOpenOnLog      = 1 << 4,   // Don't automatically and temporarily open node when Logging is active (by default logging will automatically open tree nodes).
+    ImGuiTreeNodeFlags_DefaultOpen          = 1 << 5,   // Default node to be opened
+    ImGuiTreeNodeFlags_CollapsingHeader     = ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_NoAutoOpenOnLog
 };
 
 // Flags for ImGui::Selectable()