From 3f7f256752a63148d83340b3a3c6555a1a06428a Mon Sep 17 00:00:00 2001 From: ocornut Date: Sat, 2 May 2015 10:32:32 +0100 Subject: [PATCH] Tidying up. Re-arranged the (first_begin_of_the_frame) blocks in Begin() for further changes. Being cautious. --- imgui.cpp | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/imgui.cpp b/imgui.cpp index 2ddc52cb..46497215 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -2215,12 +2215,12 @@ void ImGui::Render() for (size_t i = 0; i != g.Windows.size(); i++) { ImGuiWindow* window = g.Windows[i]; - if (window->Flags & ImGuiWindowFlags_ChildWindow) // if a child is visible its parent will add it + if (window->Flags & ImGuiWindowFlags_ChildWindow) // if a child is visible its parent will add it if (window->Visible) continue; AddWindowToSortedBuffer(g.WindowsSortBuffer, window); } - IM_ASSERT(g.Windows.size() == g.WindowsSortBuffer.size()); // we done something wrong + IM_ASSERT(g.Windows.size() == g.WindowsSortBuffer.size()); // we done something wrong g.Windows.swap(g.WindowsSortBuffer); // Clear data for next frame @@ -2975,14 +2975,13 @@ void ImGui::EndChildFrame() ImGui::PopStyleColor(); } -static ImVec2 FindTooltipPos(const ImVec2& mouse_pos, const ImVec2& size) +static ImVec2 FindBestWindowPos(const ImVec2& mouse_pos, const ImVec2& size, const ImRect& r_inner) { const ImGuiStyle& style = GImGui->Style; // Clamp into visible area while not overlapping the cursor ImRect r_outer(GetVisibleRect()); r_outer.Reduce(style.DisplaySafeAreaPadding); - ImRect r_inner(mouse_pos.x - 16, mouse_pos.y - 8, mouse_pos.x + 28, mouse_pos.y + 24); // FIXME: Completely hard-coded. Perhaps center on cursor hit-point instead? ImVec2 mouse_pos_clamped = ImClamp(mouse_pos, r_outer.Min, r_outer.Max - size); for (int dir = 0; dir < 4; dir++) // right, down, up, left @@ -3152,6 +3151,20 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_ if (first_begin_of_the_frame) { window->DrawList->Clear(); + window->ClipRectStack.resize(0); + } + + // Setup texture + window->DrawList->PushTextureID(g.Font->ContainerAtlas->TexID); + + // Setup outer clipping rectangle + if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_ComboBox)) + PushClipRect(parent_window->ClipRectStack.back()); + else + PushClipRect(GetVisibleRect()); + + if (first_begin_of_the_frame) + { window->Visible = true; // New windows appears in front @@ -3171,7 +3184,6 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_ } window->LastFrameDrawn = current_frame; - window->ClipRectStack.resize(0); // Reset contents size for auto-fitting window->SizeContents = window_is_new ? ImVec2(0.0f, 0.0f) : window->DC.CursorMaxPos - window->Pos; @@ -3183,20 +3195,7 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_ window->Pos = window->PosFloat = parent_window->DC.CursorPos; window->SizeFull = size_on_first_use; } - } - // Setup texture - window->DrawList->PushTextureID(g.Font->ContainerAtlas->TexID); - - // Setup outer clipping rectangle - if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_ComboBox)) - PushClipRect(parent_window->ClipRectStack.back()); - else - PushClipRect(GetVisibleRect()); - - // Setup and draw window - if (first_begin_of_the_frame) - { // Reset ID stack window->IDStack.resize(1); @@ -3225,7 +3224,8 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_ // Tooltips always follows mouse if (!window_pos_set_by_api && (window->Flags & ImGuiWindowFlags_Tooltip) != 0) { - window->PosFloat = FindTooltipPos(g.IO.MousePos, window->Size); + ImRect rect_to_avoid(g.IO.MousePos.x - 16, g.IO.MousePos.y - 8, g.IO.MousePos.x + 28, g.IO.MousePos.y + 24); // FIXME: Completely hard-coded. Perhaps center on cursor hit-point instead? + window->PosFloat = FindBestWindowPos(g.IO.MousePos, window->Size, rect_to_avoid); } // Clamp into display