|
|
@@ -10819,9 +10819,9 @@ void ImGui::NextColumn()
|
|
|
else
|
|
|
{
|
|
|
window->DC.ColumnsOffsetX = 0.0f;
|
|
|
+ window->DrawList->ChannelsSetCurrent(0);
|
|
|
columns->Current = 0;
|
|
|
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.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++)
|
|
|
{
|
|
|
- // Clamp
|
|
|
+ // Clamp position
|
|
|
ImGuiColumnData* column = &columns->Columns[n];
|
|
|
float t = column->OffsetNorm;
|
|
|
if (!(columns->Flags & ImGuiColumnsFlags_NoForceWithinWindow))
|
|
|
@@ -11034,7 +11034,7 @@ void ImGui::BeginColumns(const char* str_id, int columns_count, ImGuiColumnsFlag
|
|
|
if (n == columns_count)
|
|
|
continue;
|
|
|
|
|
|
- // Compute clipping rectangles
|
|
|
+ // Compute clipping rectangle
|
|
|
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);
|
|
|
column->ClipRect = ImRect(clip_x1, -FLT_MAX, clip_x2, +FLT_MAX);
|
|
|
@@ -11087,7 +11087,7 @@ void ImGui::EndColumns()
|
|
|
g.MouseCursor = ImGuiMouseCursor_ResizeEW;
|
|
|
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().
|
|
|
- if (held)
|
|
|
+ if (held && !(columns->Columns[n].Flags & ImGuiColumnsFlags_NoResize))
|
|
|
dragging_column = n;
|
|
|
}
|
|
|
|
|
|
@@ -11226,56 +11226,73 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags, int mouse_button)
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
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;
|
|
|
- }
|
|
|
-
|
|
|
- // 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;
|
|
|
- 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)
|
|
|
{
|
|
|
- IM_ASSERT(id != 0);
|
|
|
+ IM_ASSERT(source_id != 0);
|
|
|
ClearDragDrop();
|
|
|
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.DragDropSourceFlags = flags;
|
|
|
g.DragDropMouseButton = mouse_button;
|
|
|
}
|
|
|
|
|
|
- if (!(flags & ImGuiDragDropFlags_SourceNoAutoTooltip))
|
|
|
+ if (!(flags & ImGuiDragDropFlags_SourceNoPreviewTooltip))
|
|
|
{
|
|
|
// FIXME-DRAG
|
|
|
//SetNextWindowPos(g.IO.MousePos - g.ActiveIdClickOffset - g.Style.WindowPadding);
|
|
|
@@ -11285,7 +11302,7 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags, int mouse_button)
|
|
|
BeginTooltipEx(ImGuiWindowFlags_NoInputs);
|
|
|
}
|
|
|
|
|
|
- if (!(flags & ImGuiDragDropFlags_SourceNoDisableHover))
|
|
|
+ if (!(flags & ImGuiDragDropFlags_SourceNoDisableHover) && !(flags & ImGuiDragDropFlags_SourceExtern))
|
|
|
window->DC.LastItemRectHoveredRect = false;
|
|
|
|
|
|
return true;
|
|
|
@@ -11298,7 +11315,7 @@ void ImGui::EndDragDropSource()
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
IM_ASSERT(g.DragDropActive);
|
|
|
|
|
|
- if (!(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoAutoTooltip))
|
|
|
+ if (!(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoPreviewTooltip))
|
|
|
{
|
|
|
EndTooltip();
|
|
|
PopStyleColor();
|
|
|
@@ -11428,6 +11445,7 @@ const ImGuiPayload* ImGui::AcceptDragDropPayload(const char* type, ImGuiDragDrop
|
|
|
|
|
|
// Render default drop visuals
|
|
|
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)
|
|
|
{
|
|
|
// 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;
|
|
|
- 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))
|
|
|
return NULL;
|
|
|
|