浏览代码

Updated ImGui.

Branimir Karadžić 8 年之前
父节点
当前提交
07a173e248
共有 3 个文件被更改,包括 61 次插入41 次删除
  1. 57 39
      3rdparty/ocornut-imgui/imgui.cpp
  2. 2 1
      3rdparty/ocornut-imgui/imgui.h
  3. 2 1
      3rdparty/ocornut-imgui/imgui_internal.h

+ 57 - 39
3rdparty/ocornut-imgui/imgui.cpp

@@ -10819,9 +10819,9 @@ void ImGui::NextColumn()
     else
     else
     {
     {
         window->DC.ColumnsOffsetX = 0.0f;
         window->DC.ColumnsOffsetX = 0.0f;
+        window->DrawList->ChannelsSetCurrent(0);
         columns->Current = 0;
         columns->Current = 0;
         columns->CellMinY = columns->CellMaxY;
         columns->CellMinY = columns->CellMaxY;
-        window->DrawList->ChannelsSetCurrent(0);
     }
     }
     window->DC.CursorPos.x = (float)(int)(window->Pos.x + window->DC.IndentX + window->DC.ColumnsOffsetX);
     window->DC.CursorPos.x = (float)(int)(window->Pos.x + window->DC.IndentX + window->DC.ColumnsOffsetX);
     window->DC.CursorPos.y = columns->CellMinY;
     window->DC.CursorPos.y = columns->CellMinY;
@@ -11024,7 +11024,7 @@ void ImGui::BeginColumns(const char* str_id, int columns_count, ImGuiColumnsFlag
 
 
     for (int n = 0; n < columns_count + 1; n++)
     for (int n = 0; n < columns_count + 1; n++)
     {
     {
-        // Clamp
+        // Clamp position
         ImGuiColumnData* column = &columns->Columns[n];
         ImGuiColumnData* column = &columns->Columns[n];
         float t = column->OffsetNorm;
         float t = column->OffsetNorm;
         if (!(columns->Flags & ImGuiColumnsFlags_NoForceWithinWindow))
         if (!(columns->Flags & ImGuiColumnsFlags_NoForceWithinWindow))
@@ -11034,7 +11034,7 @@ void ImGui::BeginColumns(const char* str_id, int columns_count, ImGuiColumnsFlag
         if (n == columns_count)
         if (n == columns_count)
             continue;
             continue;
 
 
-        // Compute clipping rectangles
+        // Compute clipping rectangle
         float clip_x1 = ImFloor(0.5f + window->Pos.x + GetColumnOffset(n) - 1.0f);
         float clip_x1 = ImFloor(0.5f + window->Pos.x + GetColumnOffset(n) - 1.0f);
         float clip_x2 = ImFloor(0.5f + window->Pos.x + GetColumnOffset(n + 1) - 1.0f);
         float clip_x2 = ImFloor(0.5f + window->Pos.x + GetColumnOffset(n + 1) - 1.0f);
         column->ClipRect = ImRect(clip_x1, -FLT_MAX, clip_x2, +FLT_MAX);
         column->ClipRect = ImRect(clip_x1, -FLT_MAX, clip_x2, +FLT_MAX);
@@ -11087,7 +11087,7 @@ void ImGui::EndColumns()
                     g.MouseCursor = ImGuiMouseCursor_ResizeEW;
                     g.MouseCursor = ImGuiMouseCursor_ResizeEW;
                 if (held && g.ActiveIdIsJustActivated)
                 if (held && g.ActiveIdIsJustActivated)
                     g.ActiveIdClickOffset.x -= column_hw; // Store from center of column line (we used a 8 wide rect for columns clicking). This is used by GetDraggedColumnOffset().
                     g.ActiveIdClickOffset.x -= column_hw; // Store from center of column line (we used a 8 wide rect for columns clicking). This is used by GetDraggedColumnOffset().
-                if (held)
+                if (held && !(columns->Columns[n].Flags & ImGuiColumnsFlags_NoResize))
                     dragging_column = n;
                     dragging_column = n;
             }
             }
 
 
@@ -11226,56 +11226,73 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags, int mouse_button)
 {
 {
     ImGuiContext& g = *GImGui;
     ImGuiContext& g = *GImGui;
     ImGuiWindow* window = g.CurrentWindow;
     ImGuiWindow* window = g.CurrentWindow;
-    if (g.IO.MouseDown[mouse_button] == false)
-        return false;
 
 
-    ImGuiID id = window->DC.LastItemId;
-    if (id == 0)
+    bool source_drag_active = false;
+    ImGuiID source_id = 0;
+    ImGuiID source_parent_id = 0;
+    if (!(flags & ImGuiDragDropFlags_SourceExtern))
     {
     {
-        // If you want to use BeginDragDropSource() on an item with no unique identifier for interaction, such as Text() or Image(), you need to:
-        // A) Read the explanation below, B) Use the ImGuiDragDropFlags_SourceAllowNullID flag, C) Swallow your programmer pride.
-        if (!(flags & ImGuiDragDropFlags_SourceAllowNullID))
-        {
-            IM_ASSERT(0);
+        source_id = window->DC.LastItemId;
+        if (source_id != 0 && g.ActiveId != source_id) // Early out for most common case
             return false;
             return false;
-        }
-
-        // Magic fallback (=somehow reprehensible) to handle items with no assigned ID, e.g. Text(), Image()
-        // We build a throwaway ID based on current ID stack + relative AABB of items in window. 
-        // THE IDENTIFIER WON'T SURVIVE ANY REPOSITIONING OF THE WIDGET, so if your widget moves your dragging operation will be canceled. 
-        // We don't need to maintain/call ClearActiveID() as releasing the button will early out this function and trigger !ActiveIdIsAlive.
-        bool is_hovered = window->DC.LastItemRectHoveredRect;
-        if (!is_hovered && (g.ActiveId == 0 || g.ActiveIdWindow != window))
+        if (g.IO.MouseDown[mouse_button] == false)
             return false;
             return false;
-        id = window->DC.LastItemId = window->GetIDFromRectangle(window->DC.LastItemRect);
-        if (is_hovered)
-            SetHoveredID(id);
-        if (is_hovered && g.IO.MouseClicked[mouse_button])
+
+        if (source_id == 0)
         {
         {
-            SetActiveID(id, window);
-            FocusWindow(window);
+            // If you want to use BeginDragDropSource() on an item with no unique identifier for interaction, such as Text() or Image(), you need to:
+            // A) Read the explanation below, B) Use the ImGuiDragDropFlags_SourceAllowNullID flag, C) Swallow your programmer pride.
+            if (!(flags & ImGuiDragDropFlags_SourceAllowNullID))
+            {
+                IM_ASSERT(0);
+                return false;
+            }
+
+            // Magic fallback (=somehow reprehensible) to handle items with no assigned ID, e.g. Text(), Image()
+            // We build a throwaway ID based on current ID stack + relative AABB of items in window. 
+            // THE IDENTIFIER WON'T SURVIVE ANY REPOSITIONING OF THE WIDGET, so if your widget moves your dragging operation will be canceled. 
+            // We don't need to maintain/call ClearActiveID() as releasing the button will early out this function and trigger !ActiveIdIsAlive.
+            bool is_hovered = window->DC.LastItemRectHoveredRect;
+            if (!is_hovered && (g.ActiveId == 0 || g.ActiveIdWindow != window))
+                return false;
+            source_id = window->DC.LastItemId = window->GetIDFromRectangle(window->DC.LastItemRect);
+            if (is_hovered)
+                SetHoveredID(source_id);
+            if (is_hovered && g.IO.MouseClicked[mouse_button])
+            {
+                SetActiveID(source_id, window);
+                FocusWindow(window);
+            }
+            if (g.ActiveId == source_id) // Allow the underlying widget to display/return hovered during the mouse release frame, else we would get a flicker.
+                g.ActiveIdAllowOverlap = is_hovered;
         }
         }
-        if (g.ActiveId == id) // Allow the underlying widget to display/return hovered during the mouse release frame, else we would get a flicker.
-            g.ActiveIdAllowOverlap = is_hovered;
+        if (g.ActiveId != source_id)
+            return false;
+        source_parent_id = window->IDStack.back();
+        source_drag_active = IsMouseDragging(mouse_button);
+    }
+    else
+    {
+        window = NULL;
+        source_id = ImHash("#SourceExtern", 0);
+        source_drag_active = true;
     }
     }
-    if (g.ActiveId != id)
-        return false;
 
 
-    if (IsMouseDragging(mouse_button))
+    if (source_drag_active)
     {
     {
         if (!g.DragDropActive)
         if (!g.DragDropActive)
         {
         {
-            IM_ASSERT(id != 0);
+            IM_ASSERT(source_id != 0);
             ClearDragDrop();
             ClearDragDrop();
             ImGuiPayload& payload = g.DragDropPayload;
             ImGuiPayload& payload = g.DragDropPayload;
-            payload.SourceId = id;
-            payload.SourceParentId = window->IDStack.back();
+            payload.SourceId = source_id;
+            payload.SourceParentId = source_parent_id;
             g.DragDropActive = true;
             g.DragDropActive = true;
             g.DragDropSourceFlags = flags;
             g.DragDropSourceFlags = flags;
             g.DragDropMouseButton = mouse_button;
             g.DragDropMouseButton = mouse_button;
         }
         }
 
 
-        if (!(flags & ImGuiDragDropFlags_SourceNoAutoTooltip))
+        if (!(flags & ImGuiDragDropFlags_SourceNoPreviewTooltip))
         {
         {
             // FIXME-DRAG
             // FIXME-DRAG
             //SetNextWindowPos(g.IO.MousePos - g.ActiveIdClickOffset - g.Style.WindowPadding);
             //SetNextWindowPos(g.IO.MousePos - g.ActiveIdClickOffset - g.Style.WindowPadding);
@@ -11285,7 +11302,7 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags, int mouse_button)
             BeginTooltipEx(ImGuiWindowFlags_NoInputs);
             BeginTooltipEx(ImGuiWindowFlags_NoInputs);
         }
         }
 
 
-        if (!(flags & ImGuiDragDropFlags_SourceNoDisableHover))
+        if (!(flags & ImGuiDragDropFlags_SourceNoDisableHover) && !(flags & ImGuiDragDropFlags_SourceExtern))
             window->DC.LastItemRectHoveredRect = false;
             window->DC.LastItemRectHoveredRect = false;
 
 
         return true;
         return true;
@@ -11298,7 +11315,7 @@ void ImGui::EndDragDropSource()
     ImGuiContext& g = *GImGui;
     ImGuiContext& g = *GImGui;
     IM_ASSERT(g.DragDropActive);
     IM_ASSERT(g.DragDropActive);
 
 
-    if (!(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoAutoTooltip))
+    if (!(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoPreviewTooltip))
     {
     {
         EndTooltip();
         EndTooltip();
         PopStyleColor();
         PopStyleColor();
@@ -11428,6 +11445,7 @@ const ImGuiPayload* ImGui::AcceptDragDropPayload(const char* type, ImGuiDragDrop
 
 
     // Render default drop visuals
     // Render default drop visuals
     payload.Preview = was_accepted_previously;
     payload.Preview = was_accepted_previously;
+    flags |= (g.DragDropSourceFlags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect); // Source can also inhibit the preview (useful for external sources that lives for 1 frame)
     if (!(flags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect) && payload.Preview)
     if (!(flags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect) && payload.Preview)
     {
     {
         // FIXME-DRAG: Settle on a proper default visuals for drop target.
         // FIXME-DRAG: Settle on a proper default visuals for drop target.
@@ -11439,7 +11457,7 @@ const ImGuiPayload* ImGui::AcceptDragDropPayload(const char* type, ImGuiDragDrop
     }
     }
 
 
     g.DragDropAcceptFrameCount = g.FrameCount;
     g.DragDropAcceptFrameCount = g.FrameCount;
-    payload.Delivery = was_accepted_previously && IsMouseReleased(g.DragDropMouseButton);
+    payload.Delivery = was_accepted_previously && !IsMouseDown(g.DragDropMouseButton); // For extern drag sources affecting os window focus, it's easier to just test !IsMouseDown() instead of IsMouseReleased()
     if (!payload.Delivery && !(flags & ImGuiDragDropFlags_AcceptBeforeDelivery))
     if (!payload.Delivery && !(flags & ImGuiDragDropFlags_AcceptBeforeDelivery))
         return NULL;
         return NULL;
 
 

+ 2 - 1
3rdparty/ocornut-imgui/imgui.h

@@ -639,10 +639,11 @@ enum ImGuiHoveredFlags_
 enum ImGuiDragDropFlags_
 enum ImGuiDragDropFlags_
 {
 {
     // BeginDragDropSource() flags
     // BeginDragDropSource() flags
-    ImGuiDragDropFlags_SourceNoAutoTooltip          = 1 << 0,       // By default, a successful call to BeginDragDropSource opens a tooltip so you can display a preview or description of the dragged contents. This flag disable this behavior.
+    ImGuiDragDropFlags_SourceNoPreviewTooltip       = 1 << 0,       // By default, a successful call to BeginDragDropSource opens a tooltip so you can display a preview or description of the source contents. This flag disable this behavior.
     ImGuiDragDropFlags_SourceNoDisableHover         = 1 << 1,       // By default, when dragging we clear data so that IsItemHovered() will return true, to avoid subsequent user code submitting tooltips. This flag disable this behavior so you can still call IsItemHovered() on the source item.
     ImGuiDragDropFlags_SourceNoDisableHover         = 1 << 1,       // By default, when dragging we clear data so that IsItemHovered() will return true, to avoid subsequent user code submitting tooltips. This flag disable this behavior so you can still call IsItemHovered() on the source item.
     ImGuiDragDropFlags_SourceNoHoldToOpenOthers     = 1 << 2,       // Disable the behavior that allows to open tree nodes and collapsing header by holding over them while dragging a source item.
     ImGuiDragDropFlags_SourceNoHoldToOpenOthers     = 1 << 2,       // Disable the behavior that allows to open tree nodes and collapsing header by holding over them while dragging a source item.
     ImGuiDragDropFlags_SourceAllowNullID            = 1 << 3,       // Allow items such as Text(), Image() that have no unique identifier to be used as drag source, by manufacturing a temporary identifier based on their window-relative position. This is extremely unusual within the dear imgui ecosystem and so we made it explicit.
     ImGuiDragDropFlags_SourceAllowNullID            = 1 << 3,       // Allow items such as Text(), Image() that have no unique identifier to be used as drag source, by manufacturing a temporary identifier based on their window-relative position. This is extremely unusual within the dear imgui ecosystem and so we made it explicit.
+    ImGuiDragDropFlags_SourceExtern                 = 1 << 4,       // External source (from outside of imgui), won't attempt to read current item/window info. Will always return true. Only one Extern source can be active simultaneously.
     // AcceptDragDropPayload() flags
     // AcceptDragDropPayload() flags
     ImGuiDragDropFlags_AcceptBeforeDelivery         = 1 << 10,      // AcceptDragDropPayload() will returns true even before the mouse button is released. You can then call IsDelivery() to test if the payload needs to be delivered.
     ImGuiDragDropFlags_AcceptBeforeDelivery         = 1 << 10,      // AcceptDragDropPayload() will returns true even before the mouse button is released. You can then call IsDelivery() to test if the payload needs to be delivered.
     ImGuiDragDropFlags_AcceptNoDrawDefaultRect      = 1 << 11,      // Do not draw the default highlight rectangle when hovering over target.
     ImGuiDragDropFlags_AcceptNoDrawDefaultRect      = 1 << 11,      // Do not draw the default highlight rectangle when hovering over target.

+ 2 - 1
3rdparty/ocornut-imgui/imgui_internal.h

@@ -416,9 +416,10 @@ struct ImGuiColumnData
 {
 {
     float               OffsetNorm;         // Column start offset, normalized 0.0 (far left) -> 1.0 (far right)
     float               OffsetNorm;         // Column start offset, normalized 0.0 (far left) -> 1.0 (far right)
     float               OffsetNormBeforeResize;
     float               OffsetNormBeforeResize;
+    ImGuiColumnsFlags   Flags;              // Not exposed
     ImRect              ClipRect;
     ImRect              ClipRect;
 
 
-    ImGuiColumnData()   { OffsetNorm = OffsetNormBeforeResize = 0.0f; }
+    ImGuiColumnData()   { OffsetNorm = OffsetNormBeforeResize = 0.0f; Flags = 0; }
 };
 };
 
 
 struct ImGuiColumnsSet
 struct ImGuiColumnsSet