Active column (when dragged) not clipped so it can release its active state (extends 16ddd796f3)

This commit is contained in:
ocornut 2015-04-18 12:11:59 +01:00
parent 26e469af22
commit c82f909be1

View File

@ -502,7 +502,7 @@ static bool ItemAdd(const ImRect& bb, const ImGuiID* id);
static void ItemSize(ImVec2 size, float text_offset_y = 0.0f); static void ItemSize(ImVec2 size, float text_offset_y = 0.0f);
static void ItemSize(const ImRect& bb, float text_offset_y = 0.0f); static void ItemSize(const ImRect& bb, float text_offset_y = 0.0f);
static void PushColumnClipRect(int column_index = -1); static void PushColumnClipRect(int column_index = -1);
static bool IsClippedEx(const ImRect& bb, bool clip_even_when_logged); static bool IsClippedEx(const ImRect& bb, const ImGuiID* id, bool clip_even_when_logged);
static bool IsMouseHoveringRect(const ImRect& bb); static bool IsMouseHoveringRect(const ImRect& bb);
static bool IsKeyPressedMap(ImGuiKey key, bool repeat = true); static bool IsKeyPressedMap(ImGuiKey key, bool repeat = true);
@ -4265,7 +4265,7 @@ void ImGui::TextUnformatted(const char* text, const char* text_end)
while (line < text_end) while (line < text_end)
{ {
const char* line_end = strchr(line, '\n'); const char* line_end = strchr(line, '\n');
if (IsClippedEx(line_rect, false)) if (IsClippedEx(line_rect, NULL, false))
break; break;
const ImVec2 line_size = CalcTextSize(line, line_end, false); const ImVec2 line_size = CalcTextSize(line, line_end, false);
@ -7266,15 +7266,16 @@ static inline void ItemSize(const ImRect& bb, float text_offset_y)
ItemSize(bb.GetSize(), text_offset_y); ItemSize(bb.GetSize(), text_offset_y);
} }
static bool IsClippedEx(const ImRect& bb, bool clip_even_when_logged) static bool IsClippedEx(const ImRect& bb, const ImGuiID* id, bool clip_even_when_logged)
{ {
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindow();
if (!bb.Overlaps(ImRect(window->ClipRectStack.back()))) if (!bb.Overlaps(ImRect(window->ClipRectStack.back())))
{ {
if (clip_even_when_logged || !g.LogEnabled) if (!id || *id != GImGui->ActiveId)
return true; if (clip_even_when_logged || !g.LogEnabled)
return true;
} }
return false; return false;
} }
@ -7282,7 +7283,7 @@ static bool IsClippedEx(const ImRect& bb, bool clip_even_when_logged)
bool ImGui::IsRectClipped(const ImVec2& size) bool ImGui::IsRectClipped(const ImVec2& size)
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindow();
return IsClippedEx(ImRect(window->DC.CursorPos, window->DC.CursorPos + size), true); return IsClippedEx(ImRect(window->DC.CursorPos, window->DC.CursorPos + size), NULL, true);
} }
static bool ItemAdd(const ImRect& bb, const ImGuiID* id) static bool ItemAdd(const ImRect& bb, const ImGuiID* id)
@ -7290,13 +7291,10 @@ static bool ItemAdd(const ImRect& bb, const ImGuiID* id)
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindow();
window->DC.LastItemID = id ? *id : 0; window->DC.LastItemID = id ? *id : 0;
window->DC.LastItemRect = bb; window->DC.LastItemRect = bb;
if (IsClippedEx(bb, false)) if (IsClippedEx(bb, id, false))
{ {
if (!id || *id != GImGui->ActiveId) window->DC.LastItemHoveredAndUsable = window->DC.LastItemHoveredRect = false;
{ return false;
window->DC.LastItemHoveredAndUsable = window->DC.LastItemHoveredRect = false;
return false;
}
} }
// This is a sensible default, but widgets are free to override it after calling ItemAdd() // This is a sensible default, but widgets are free to override it after calling ItemAdd()
@ -7525,7 +7523,7 @@ void ImGui::Columns(int columns_count, const char* id, bool border)
const ImGuiID column_id = window->DC.ColumnsSetID + ImGuiID(i); const ImGuiID column_id = window->DC.ColumnsSetID + ImGuiID(i);
const ImRect column_rect(ImVec2(x-4,y1),ImVec2(x+4,y2)); const ImRect column_rect(ImVec2(x-4,y1),ImVec2(x+4,y2));
if (IsClippedEx(column_rect, false)) if (IsClippedEx(column_rect, &column_id, false))
continue; continue;
bool hovered, held; bool hovered, held;