MCPcopy Create free account
hub / github.com/Aegel5/SimpleSwitcher / DockNodeUpdateFlagsAndCollapse

Method DockNodeUpdateFlagsAndCollapse

imgui_tiny_app/imgui/imgui.cpp:18843–18914  ·  view source on GitHub ↗

- Remove inactive windows/nodes. - Update visibility flag.

Source from the content-addressed store, hash-verified

18841// - Remove inactive windows/nodes.
18842// - Update visibility flag.
18843static 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;

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected