From 82978fc88fe675c3504f731c86b801e43ef735f5 Mon Sep 17 00:00:00 2001 From: omar Date: Wed, 19 Sep 2018 18:45:18 +0200 Subject: [PATCH] Docking: Fix of title bar flicker during rebuild. Fixed dragging of DockNode always triggering BeginAsDockableDragDropSource() when io.ConfigDockingWithKeyMod is false. --- imgui.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/imgui.cpp b/imgui.cpp index 936b5653..75469f7a 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -9526,7 +9526,6 @@ void ImGui::EndDragDropTarget() // A~ document root node resizing behavior incorrect // A~ document root node retrieval of ID ? // A- fix when SelectedTab doesn't exist (easy to repro/fix with .ini mod, but would be nice to also find real repro) -// B- full rebuild make currently highlight title bar flicker (didn't use to) // B- full rebuild loses viewport of floating dock nodes // B- dock node inside its own viewports creates 1 temporary viewport per window on startup before ditching them // A~ Unreal style document system (requires low-level controls of dockspace serialization fork/copy/delete) @@ -9539,7 +9538,7 @@ void ImGui::EndDragDropTarget() // B- fix/disable auto-resize grip on split host nodes (~#2) // B- SetNextWindowFocus() doesn't seem to apply if the window is hidden this frame, need repro (#4) // B- drag from collapse button should drag entire dock node -// B- implicit per-viewport dockspace to dock to +// B- implicit, invisible per-viewport dockspace to dock to // B- resizing a dock tree small currently has glitches (overlapping collapse and close button, etc.) // B- tab bar: appearing on first frame with a dumb layout would do less harm that not appearing? (when behind dynamic branch) or store titles + render in EndTabBar() // B- tab bar: make selected tab always shows its full title? @@ -9661,6 +9660,7 @@ namespace ImGui static void DockNodeCalcSplitRects(ImVec2& pos_old, ImVec2& size_old, ImVec2& pos_new, ImVec2& size_new, ImGuiDir dir, ImVec2 size_new_desired); static bool DockNodeCalcDropRects(const ImRect& parent, ImGuiDir dir, ImRect& out_draw, bool outer_docking); static ImGuiDockNode* DockNodeGetRootNode(ImGuiDockNode* node) { while (node->ParentNode) node = node->ParentNode; return node; } + static const char* DockNodeGetHostWindowTitle(ImGuiDockNode* node, char* buf, int buf_size) { ImFormatString(buf, buf_size, "##DockNode_%02X", node->ID); return buf; } static int DockNodeGetDepth(const ImGuiDockNode* node) { int depth = 0; while (node->ParentNode) { node = node->ParentNode; depth++; } return depth; } static int DockNodeGetTabOrder(ImGuiWindow* window); @@ -9979,6 +9979,11 @@ static void ImGui::DockContextBuildNodesFromSettings(ImGuiContext* ctx, ImGuiDoc node->SplitAxis = node_settings->SplitAxis; node->IsExplicitRoot = node_settings->IsExplicitRoot != 0; node->IsDocumentRoot = node_settings->IsDocumentRoot != 0; + + // Bind host window immediately if it already exist (in case of a rebuild) + // This is useful as the RootWindowForTitleBarHighlight links necessary to highlight the currently focused node requires node->HostWindow to be set. + char host_window_title[32]; + node->HostWindow = FindWindowByName(DockNodeGetHostWindowTitle(node, host_window_title, IM_ARRAYSIZE(host_window_title))); } } @@ -10527,7 +10532,7 @@ static void ImGui::DockNodeUpdate(ImGuiDockNode* node) // Begin into the host window char window_label[20]; - ImFormatString(window_label, IM_ARRAYSIZE(window_label), "##DockNode_%02X", node->ID); + DockNodeGetHostWindowTitle(node, window_label, IM_ARRAYSIZE(window_label)); ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_DockNodeHost; window_flags |= ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoNavFocus; window_flags |= ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse; @@ -10639,7 +10644,7 @@ static void ImGui::DockNodeUpdateTabBar(ImGuiDockNode* node, ImGuiWindow* host_w if (tab_bar == NULL) tab_bar = node->TabBar = IM_NEW(ImGuiTabBar)(); - // Decide if we should use focused color + // Decide if we should use a focused title bar color bool is_focused = false; ImGuiDockNode* root_node = DockNodeGetRootNode(node); if (g.NavWindowingTarget) @@ -11628,7 +11633,7 @@ void ImGui::BeginAsDockableDragDropSource(ImGuiWindow* window) window->DC.LastItemId = window->MoveId; window = window->RootWindow; IM_ASSERT((window->Flags & ImGuiWindowFlags_NoDocking) == 0); - bool is_drag_docking = (g.IO.ConfigDockingWithKeyMod) || (window->Flags & ImGuiWindowFlags_NoTitleBar) || ImRect(0, 0, window->SizeFull.x, window->TitleBarHeight()).Contains(g.ActiveIdClickOffset); + bool is_drag_docking = (g.IO.ConfigDockingWithKeyMod) || ImRect(0, 0, window->SizeFull.x, GetFrameHeight()).Contains(g.ActiveIdClickOffset); if (is_drag_docking && BeginDragDropSource(ImGuiDragDropFlags_SourceNoPreviewTooltip | ImGuiDragDropFlags_SourceNoHoldToOpenOthers | ImGuiDragDropFlags_SourceAutoExpirePayload)) { SetDragDropPayload(IMGUI_PAYLOAD_TYPE_WINDOW, &window, sizeof(window));