| 18653 | } |
| 18654 | |
| 18655 | static void ImGui::DockNodeRemoveWindow(ImGuiDockNode* node, ImGuiWindow* window, ImGuiID save_dock_id) |
| 18656 | { |
| 18657 | ImGuiContext& g = *GImGui; |
| 18658 | IM_ASSERT(window->DockNode == node); |
| 18659 | //IM_ASSERT(window->RootWindowDockTree == node->HostWindow); |
| 18660 | //IM_ASSERT(window->LastFrameActive < g.FrameCount); // We may call this from Begin() |
| 18661 | IM_ASSERT(save_dock_id == 0 || save_dock_id == node->ID); |
| 18662 | IMGUI_DEBUG_LOG_DOCKING("[docking] DockNodeRemoveWindow node 0x%08X window '%s'\n", node->ID, window->Name); |
| 18663 | |
| 18664 | window->DockNode = NULL; |
| 18665 | window->DockIsActive = window->DockTabWantClose = false; |
| 18666 | window->DockId = save_dock_id; |
| 18667 | window->Flags &= ~ImGuiWindowFlags_ChildWindow; |
| 18668 | if (window->ParentWindow) |
| 18669 | window->ParentWindow->DC.ChildWindows.find_erase(window); |
| 18670 | UpdateWindowParentAndRootLinks(window, window->Flags, NULL); // Update immediately |
| 18671 | |
| 18672 | if (node->HostWindow && node->HostWindow->ViewportOwned) |
| 18673 | { |
| 18674 | // When undocking from a user interaction this will always run in NewFrame() and have not much effect. |
| 18675 | // But mid-frame, if we clear viewport we need to mark window as hidden as well. |
| 18676 | window->Viewport = NULL; |
| 18677 | window->ViewportId = 0; |
| 18678 | window->ViewportOwned = false; |
| 18679 | window->Hidden = true; |
| 18680 | } |
| 18681 | |
| 18682 | // Remove window |
| 18683 | bool erased = false; |
| 18684 | for (int n = 0; n < node->Windows.Size; n++) |
| 18685 | if (node->Windows[n] == window) |
| 18686 | { |
| 18687 | node->Windows.erase(node->Windows.Data + n); |
| 18688 | erased = true; |
| 18689 | break; |
| 18690 | } |
| 18691 | if (!erased) |
| 18692 | IM_ASSERT(erased); |
| 18693 | if (node->VisibleWindow == window) |
| 18694 | node->VisibleWindow = NULL; |
| 18695 | |
| 18696 | // Remove tab and possibly tab bar |
| 18697 | node->WantHiddenTabBarUpdate = true; |
| 18698 | if (node->TabBar) |
| 18699 | { |
| 18700 | TabBarRemoveTab(node->TabBar, window->TabId); |
| 18701 | const int tab_count_threshold_for_tab_bar = node->IsCentralNode() ? 1 : 2; |
| 18702 | if (node->Windows.Size < tab_count_threshold_for_tab_bar) |
| 18703 | DockNodeRemoveTabBar(node); |
| 18704 | } |
| 18705 | |
| 18706 | if (node->Windows.Size == 0 && !node->IsCentralNode() && !node->IsDockSpace() && window->DockId != node->ID) |
| 18707 | { |
| 18708 | // Automatic dock node delete themselves if they are not holding at least one tab |
| 18709 | DockContextRemoveNode(&g, node, true); |
| 18710 | return; |
| 18711 | } |
| 18712 | |