- Remove inactive windows/nodes. - Update visibility flag.
| 18841 | // - Remove inactive windows/nodes. |
| 18842 | // - Update visibility flag. |
| 18843 | static void ImGui::DockNodeUpdateFlagsAndCollapse(ImGuiDockNode* node) |
| 18844 | { |
| 18845 | ImGuiContext& g = *GImGui; |
| 18846 | IM_ASSERT(node->ParentNode == NULL || node->ParentNode->ChildNodes[0] == node || node->ParentNode->ChildNodes[1] == node); |
| 18847 | |
| 18848 | // Inherit most flags |
| 18849 | if (node->ParentNode) |
| 18850 | node->SharedFlags = node->ParentNode->SharedFlags & ImGuiDockNodeFlags_SharedFlagsInheritMask_; |
| 18851 | |
| 18852 | // Recurse into children |
| 18853 | // There is the possibility that one of our child becoming empty will delete itself and moving its sibling contents into 'node'. |
| 18854 | // If 'node->ChildNode[0]' delete itself, then 'node->ChildNode[1]->Windows' will be moved into 'node' |
| 18855 | // If 'node->ChildNode[1]' delete itself, then 'node->ChildNode[0]->Windows' will be moved into 'node' and the "remove inactive windows" loop will have run twice on those windows (harmless) |
| 18856 | node->HasCentralNodeChild = false; |
| 18857 | if (node->ChildNodes[0]) |
| 18858 | DockNodeUpdateFlagsAndCollapse(node->ChildNodes[0]); |
| 18859 | if (node->ChildNodes[1]) |
| 18860 | DockNodeUpdateFlagsAndCollapse(node->ChildNodes[1]); |
| 18861 | |
| 18862 | // Remove inactive windows, collapse nodes |
| 18863 | // Merge node flags overrides stored in windows |
| 18864 | node->LocalFlagsInWindows = ImGuiDockNodeFlags_None; |
| 18865 | for (int window_n = 0; window_n < node->Windows.Size; window_n++) |
| 18866 | { |
| 18867 | ImGuiWindow* window = node->Windows[window_n]; |
| 18868 | IM_ASSERT(window->DockNode == node); |
| 18869 | |
| 18870 | bool node_was_active = (node->LastFrameActive + 1 == g.FrameCount); |
| 18871 | bool remove = false; |
| 18872 | remove |= node_was_active && (window->WasActive == false); // Can't use 'window->LastFrameActive + 1 < g.FrameCount'. (see #9151) |
| 18873 | remove |= node_was_active && (node->WantCloseAll || node->WantCloseTabId == window->TabId) && window->HasCloseButton && !(window->Flags & ImGuiWindowFlags_UnsavedDocument); // Submit all _expected_ closure from last frame |
| 18874 | remove |= (window->DockTabWantClose); |
| 18875 | if (remove) |
| 18876 | { |
| 18877 | window->DockTabWantClose = false; |
| 18878 | if (node->Windows.Size == 1 && !node->IsCentralNode()) |
| 18879 | { |
| 18880 | DockNodeHideHostWindow(node); |
| 18881 | node->State = ImGuiDockNodeState_HostWindowHiddenBecauseSingleWindow; |
| 18882 | DockNodeRemoveWindow(node, window, node->ID); // Will delete the node so it'll be invalid on return |
| 18883 | return; |
| 18884 | } |
| 18885 | DockNodeRemoveWindow(node, window, node->ID); |
| 18886 | window_n--; |
| 18887 | continue; |
| 18888 | } |
| 18889 | |
| 18890 | // FIXME-DOCKING: Missing policies for conflict resolution, hence the "Experimental" tag on this. |
| 18891 | //node->LocalFlagsInWindow &= ~window->WindowClass.DockNodeFlagsOverrideClear; |
| 18892 | node->LocalFlagsInWindows |= window->WindowClass.DockNodeFlagsOverrideSet; |
| 18893 | } |
| 18894 | node->UpdateMergedFlags(); |
| 18895 | |
| 18896 | // Auto-hide tab bar option |
| 18897 | ImGuiDockNodeFlags node_flags = node->MergedFlags; |
| 18898 | if (node->WantHiddenTabBarUpdate && node->Windows.Size == 1 && (node_flags & ImGuiDockNodeFlags_AutoHideTabBar) && !node->IsHiddenTabBar()) |
| 18899 | node->WantHiddenTabBarToggle = true; |
| 18900 | node->WantHiddenTabBarUpdate = false; |
nothing calls this directly
no outgoing calls
no test coverage detected