mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 21:21:06 +01:00 
			
		
		
		
	Docking: Reworked node flags saving/inheritance... (#4292, #3834, #3633, #3521, #3492, #3335, #2999, #2648)
..so that flags enforced by docked windows via the DockNodeFlagsOverrideSet mechanism are are not left in empty dockspace nodes once the windows gets undocked.
This commit is contained in:
		| @@ -144,6 +144,9 @@ Docking+Viewports Branch: | ||||
|  | ||||
| - Docking: Clicking on the right-most close button of a docking node closes all windows. (#4186) | ||||
| - Docking: Fix IsWindowAppearing() and ImGuiCond_Appearing on docked windows. (#4177, #3982, #1497, #1061) | ||||
| - Docking: Reworked node flags saving/inheritance so that flags enforced by docked windows via the | ||||
|   DockNodeFlagsOverrideSet mechanism are are not left in empty dockspace nodes once the windows gets undocked. | ||||
|   (#4292, #3834, #3633, #3521, #3492, #3335, #2999, #2648) | ||||
| - Docking: (Internal/Experimental) Removed DockNodeFlagsOverrideClear flags from ImGuiWindowClass as | ||||
|   it is ambiguous how to apply them and we haven't got a use out of them yet. | ||||
| - Viewports: Fix popup/tooltip created without a parent window from being given a ParentViewportId value | ||||
|   | ||||
							
								
								
									
										70
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										70
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -12770,7 +12770,7 @@ static void ImGui::DockContextBuildNodesFromSettings(ImGuiContext* ctx, ImGuiDoc | ||||
|             node->ParentNode->ChildNodes[1] = node; | ||||
|         node->SelectedTabId = settings->SelectedTabId; | ||||
|         node->SplitAxis = (ImGuiAxis)settings->SplitAxis; | ||||
|         node->LocalFlags |= (settings->Flags & ImGuiDockNodeFlags_SavedFlagsMask_); | ||||
|         node->SetLocalFlags(settings->Flags & ImGuiDockNodeFlags_SavedFlagsMask_); | ||||
|  | ||||
|         // 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. | ||||
| @@ -12912,7 +12912,7 @@ void ImGui::DockContextProcessDock(ImGuiContext* ctx, ImGuiDockRequest* req) | ||||
|         new_node->HostWindow = node->HostWindow; | ||||
|         node = new_node; | ||||
|     } | ||||
|     node->LocalFlags &= ~ImGuiDockNodeFlags_HiddenTabBar; | ||||
|     node->SetLocalFlags(node->LocalFlags & ~ImGuiDockNodeFlags_HiddenTabBar); | ||||
|  | ||||
|     if (node != payload_node) | ||||
|     { | ||||
| @@ -12950,8 +12950,8 @@ void ImGui::DockContextProcessDock(ImGuiContext* ctx, ImGuiDockRequest* req) | ||||
|                     IM_ASSERT(last_focused_node != NULL); | ||||
|                     ImGuiDockNode* last_focused_root_node = DockNodeGetRootNode(last_focused_node); | ||||
|                     IM_ASSERT(last_focused_root_node == DockNodeGetRootNode(payload_node)); | ||||
|                     last_focused_node->LocalFlags |= ImGuiDockNodeFlags_CentralNode; | ||||
|                     node->LocalFlags &= ~ImGuiDockNodeFlags_CentralNode; | ||||
|                     last_focused_node->SetLocalFlags(last_focused_node->LocalFlags |= ImGuiDockNodeFlags_CentralNode); | ||||
|                     node->SetLocalFlags(node->LocalFlags & ~ImGuiDockNodeFlags_CentralNode); | ||||
|                     last_focused_root_node->CentralNode = last_focused_node; | ||||
|                 } | ||||
|  | ||||
| @@ -13112,7 +13112,7 @@ bool ImGui::DockContextCalcDropPosForDocking(ImGuiWindow* target, ImGuiDockNode* | ||||
| ImGuiDockNode::ImGuiDockNode(ImGuiID id) | ||||
| { | ||||
|     ID = id; | ||||
|     SharedFlags = LocalFlags = ImGuiDockNodeFlags_None; | ||||
|     SharedFlags = LocalFlags = LocalFlagsInWindows = MergedFlags = ImGuiDockNodeFlags_None; | ||||
|     ParentNode = ChildNodes[0] = ChildNodes[1] = NULL; | ||||
|     TabBar = NULL; | ||||
|     SplitAxis = ImGuiAxis_None; | ||||
| @@ -13416,6 +13416,7 @@ static void ImGui::DockNodeUpdateVisibleFlagAndInactiveChilds(ImGuiDockNode* nod | ||||
|  | ||||
|     // Remove inactive windows | ||||
|     // Merge node flags overrides stored in windows | ||||
|     node->LocalFlagsInWindows = ImGuiDockNodeFlags_None; | ||||
|     for (int window_n = 0; window_n < node->Windows.Size; window_n++) | ||||
|     { | ||||
|         ImGuiWindow* window = node->Windows[window_n]; | ||||
| @@ -13442,13 +13443,14 @@ static void ImGui::DockNodeUpdateVisibleFlagAndInactiveChilds(ImGuiDockNode* nod | ||||
|         else | ||||
|         { | ||||
|             // FIXME-DOCKING: Missing policies for conflict resolution, hence the "Experimental" tag on this. | ||||
|             //node->LocalFlags &= ~window->WindowClass.DockNodeFlagsOverrideClear; | ||||
|             node->LocalFlags |= window->WindowClass.DockNodeFlagsOverrideSet; | ||||
|             //node->LocalFlagsInWindow &= ~window->WindowClass.DockNodeFlagsOverrideClear; | ||||
|             node->LocalFlagsInWindows |= window->WindowClass.DockNodeFlagsOverrideSet; | ||||
|         } | ||||
|     } | ||||
|     node->UpdateMergedFlags(); | ||||
|  | ||||
|     // Auto-hide tab bar option | ||||
|     ImGuiDockNodeFlags node_flags = node->GetMergedFlags(); | ||||
|     ImGuiDockNodeFlags node_flags = node->MergedFlags; | ||||
|     if (node->WantHiddenTabBarUpdate && node->Windows.Size == 1 && (node_flags & ImGuiDockNodeFlags_AutoHideTabBar) && !node->IsHiddenTabBar()) | ||||
|         node->WantHiddenTabBarToggle = true; | ||||
|     node->WantHiddenTabBarUpdate = false; | ||||
| @@ -13459,9 +13461,9 @@ static void ImGui::DockNodeUpdateVisibleFlagAndInactiveChilds(ImGuiDockNode* nod | ||||
|  | ||||
|     // Apply toggles at a single point of the frame (here!) | ||||
|     if (node->Windows.Size > 1) | ||||
|         node->LocalFlags &= ~ImGuiDockNodeFlags_HiddenTabBar; | ||||
|         node->SetLocalFlags(node->LocalFlags & ~ImGuiDockNodeFlags_HiddenTabBar); | ||||
|     else if (node->WantHiddenTabBarToggle) | ||||
|         node->LocalFlags ^= ImGuiDockNodeFlags_HiddenTabBar; | ||||
|         node->SetLocalFlags(node->LocalFlags ^ ImGuiDockNodeFlags_HiddenTabBar); | ||||
|     node->WantHiddenTabBarToggle = false; | ||||
|  | ||||
|     DockNodeUpdateVisibleFlag(node); | ||||
| @@ -13599,7 +13601,7 @@ static void ImGui::DockNodeUpdate(ImGuiDockNode* node) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     const ImGuiDockNodeFlags node_flags = node->GetMergedFlags(); | ||||
|     const ImGuiDockNodeFlags node_flags = node->MergedFlags; | ||||
|  | ||||
|     // Decide if the node will have a close button and a window menu button | ||||
|     node->HasWindowMenuButton = (node->Windows.Size > 0) && (node_flags & ImGuiDockNodeFlags_NoWindowMenuButton) == 0; | ||||
| @@ -13851,7 +13853,7 @@ bool ImGui::DockNodeBeginAmendTabBar(ImGuiDockNode* node) | ||||
| { | ||||
|     if (node->TabBar == NULL || node->HostWindow == NULL) | ||||
|         return false; | ||||
|     if (node->SharedFlags & ImGuiDockNodeFlags_KeepAliveOnly) | ||||
|     if (node->MergedFlags & ImGuiDockNodeFlags_KeepAliveOnly) | ||||
|         return false; | ||||
|     Begin(node->HostWindow->Name); | ||||
|     PushOverrideID(node->ID); | ||||
| @@ -13929,7 +13931,7 @@ static void ImGui::DockNodeUpdateTabBar(ImGuiDockNode* node, ImGuiWindow* host_w | ||||
|     ImGuiID focus_tab_id = 0; | ||||
|     node->IsFocused = is_focused; | ||||
|  | ||||
|     const ImGuiDockNodeFlags node_flags = node->GetMergedFlags(); | ||||
|     const ImGuiDockNodeFlags node_flags = node->MergedFlags; | ||||
|     const bool has_window_menu_button = (node_flags & ImGuiDockNodeFlags_NoWindowMenuButton) == 0 && (style.WindowMenuButtonPosition != ImGuiDir_None); | ||||
|  | ||||
|     // In a dock node, the Collapse Button turns into the Window Menu button. | ||||
| @@ -14323,8 +14325,8 @@ static void ImGui::DockNodePreviewDockSetup(ImGuiWindow* host_window, ImGuiDockN | ||||
|         IM_ASSERT(ref_node_for_rect->IsVisible); | ||||
|  | ||||
|     // Filter, figure out where we are allowed to dock | ||||
|     ImGuiDockNodeFlags src_node_flags = root_payload_as_host ? root_payload_as_host->GetMergedFlags() : root_payload->WindowClass.DockNodeFlagsOverrideSet; | ||||
|     ImGuiDockNodeFlags dst_node_flags = host_node ? host_node->GetMergedFlags() : host_window->WindowClass.DockNodeFlagsOverrideSet; | ||||
|     ImGuiDockNodeFlags src_node_flags = root_payload_as_host ? root_payload_as_host->MergedFlags : root_payload->WindowClass.DockNodeFlagsOverrideSet; | ||||
|     ImGuiDockNodeFlags dst_node_flags = host_node ? host_node->MergedFlags : host_window->WindowClass.DockNodeFlagsOverrideSet; | ||||
|     data->IsCenterAvailable = true; | ||||
|     if (is_outer_docking) | ||||
|         data->IsCenterAvailable = false; | ||||
| @@ -14504,7 +14506,7 @@ static void ImGui::DockNodePreviewDockRender(ImGuiWindow* host_window, ImGuiDock | ||||
|         } | ||||
|  | ||||
|         // Stop after ImGuiDir_None | ||||
|         if ((host_node && (host_node->GetMergedFlags() & ImGuiDockNodeFlags_NoSplit)) || g.IO.ConfigDockingNoSplit) | ||||
|         if ((host_node && (host_node->MergedFlags & ImGuiDockNodeFlags_NoSplit)) || g.IO.ConfigDockingNoSplit) | ||||
|             return; | ||||
|     } | ||||
| } | ||||
| @@ -14557,6 +14559,9 @@ void ImGui::DockNodeTreeSplit(ImGuiContext* ctx, ImGuiDockNode* parent_node, ImG | ||||
|     child_1->SharedFlags = parent_node->SharedFlags & ImGuiDockNodeFlags_SharedFlagsInheritMask_; | ||||
|     child_inheritor->LocalFlags = parent_node->LocalFlags & ImGuiDockNodeFlags_LocalFlagsTransferMask_; | ||||
|     parent_node->LocalFlags &= ~ImGuiDockNodeFlags_LocalFlagsTransferMask_; | ||||
|     child_0->UpdateMergedFlags(); | ||||
|     child_1->UpdateMergedFlags(); | ||||
|     parent_node->UpdateMergedFlags(); | ||||
|     if (child_inheritor->IsCentralNode()) | ||||
|         DockNodeGetRootNode(parent_node)->CentralNode = child_inheritor; | ||||
| } | ||||
| @@ -14596,6 +14601,8 @@ void ImGui::DockNodeTreeMerge(ImGuiContext* ctx, ImGuiDockNode* parent_node, ImG | ||||
|     parent_node->LocalFlags &= ~ImGuiDockNodeFlags_LocalFlagsTransferMask_; // Preserve Dockspace flag | ||||
|     parent_node->LocalFlags |= (child_0 ? child_0->LocalFlags : 0) & ImGuiDockNodeFlags_LocalFlagsTransferMask_; | ||||
|     parent_node->LocalFlags |= (child_1 ? child_1->LocalFlags : 0) & ImGuiDockNodeFlags_LocalFlagsTransferMask_; | ||||
|     parent_node->LocalFlagsInWindows = (child_0 ? child_0->LocalFlagsInWindows : 0) | (child_1 ? child_1->LocalFlagsInWindows : 0); // FIXME: Would be more consistent to update from actual windows | ||||
|     parent_node->UpdateMergedFlags(); | ||||
|  | ||||
|     if (child_0) | ||||
|     { | ||||
| @@ -14727,7 +14734,7 @@ void ImGui::DockNodeTreeUpdateSplitter(ImGuiDockNode* node) | ||||
|         bb.Max[axis ^ 1] += child_1->Size[axis ^ 1]; | ||||
|         //if (g.IO.KeyCtrl) GetForegroundDrawList(g.CurrentWindow->Viewport)->AddRect(bb.Min, bb.Max, IM_COL32(255,0,255,255)); | ||||
|  | ||||
|         const ImGuiDockNodeFlags merged_flags = child_0->GetMergedFlags() | child_1->GetMergedFlags(); | ||||
|         const ImGuiDockNodeFlags merged_flags = child_0->MergedFlags | child_1->MergedFlags; // Merged flags for BOTH childs | ||||
|         const ImGuiDockNodeFlags no_resize_axis_flag = (axis == ImGuiAxis_X) ? ImGuiDockNodeFlags_NoResizeX : ImGuiDockNodeFlags_NoResizeY; | ||||
|         if ((merged_flags & ImGuiDockNodeFlags_NoResize) || (merged_flags & no_resize_axis_flag)) | ||||
|         { | ||||
| @@ -14921,7 +14928,7 @@ ImGuiID ImGui::DockSpace(ImGuiID id, const ImVec2& size_arg, ImGuiDockNodeFlags | ||||
|     { | ||||
|         IMGUI_DEBUG_LOG_DOCKING("DockSpace: dockspace node 0x%08X created\n", id); | ||||
|         node = DockContextAddNode(ctx, id); | ||||
|         node->LocalFlags |= ImGuiDockNodeFlags_CentralNode; | ||||
|         node->SetLocalFlags(ImGuiDockNodeFlags_CentralNode); | ||||
|     } | ||||
|     if (window_class && window_class->ClassId != node->WindowClass.ClassId) | ||||
|         IMGUI_DEBUG_LOG_DOCKING("DockSpace: dockspace node 0x%08X: setup WindowClass 0x%08X -> 0x%08X\n", id, node->WindowClass.ClassId, window_class->ClassId); | ||||
| @@ -14933,10 +14940,10 @@ ImGuiID ImGui::DockSpace(ImGuiID id, const ImVec2& size_arg, ImGuiDockNodeFlags | ||||
|     if (node->LastFrameActive == g.FrameCount && !(flags & ImGuiDockNodeFlags_KeepAliveOnly)) | ||||
|     { | ||||
|         IM_ASSERT(node->IsDockSpace() == false && "Cannot call DockSpace() twice a frame with the same ID"); | ||||
|         node->LocalFlags |= ImGuiDockNodeFlags_DockSpace; | ||||
|         node->SetLocalFlags(node->LocalFlags | ImGuiDockNodeFlags_DockSpace); | ||||
|         return id; | ||||
|     } | ||||
|     node->LocalFlags |= ImGuiDockNodeFlags_DockSpace; | ||||
|     node->SetLocalFlags(node->LocalFlags | ImGuiDockNodeFlags_DockSpace); | ||||
|  | ||||
|     // Keep alive mode, this is allow windows docked into this node so stay docked even if they are not visible | ||||
|     if (flags & ImGuiDockNodeFlags_KeepAliveOnly) | ||||
| @@ -14988,7 +14995,7 @@ ImGuiID ImGui::DockSpace(ImGuiID id, const ImVec2& size_arg, ImGuiDockNodeFlags | ||||
|     // The specific sub-property of _CentralNode we are interested in recovering here is the "Don't delete when empty" property, | ||||
|     // as it doesn't make sense for an empty dockspace to not have this property. | ||||
|     if (node->IsLeafNode() && !node->IsCentralNode()) | ||||
|         node->LocalFlags |= ImGuiDockNodeFlags_CentralNode; | ||||
|         node->SetLocalFlags(node->LocalFlags | ImGuiDockNodeFlags_CentralNode); | ||||
|  | ||||
|     // Update the node | ||||
|     DockNodeUpdate(node); | ||||
| @@ -15127,7 +15134,7 @@ ImGuiID ImGui::DockBuilderAddNode(ImGuiID id, ImGuiDockNodeFlags flags) | ||||
|     else | ||||
|     { | ||||
|         node = DockContextAddNode(ctx, id); | ||||
|         node->LocalFlags = flags; | ||||
|         node->SetLocalFlags(flags); | ||||
|     } | ||||
|     node->LastFrameAlive = ctx->FrameCount;   // Set this otherwise BeginDocked will undock during the same frame. | ||||
|     return node->ID; | ||||
| @@ -15142,7 +15149,7 @@ void ImGui::DockBuilderRemoveNode(ImGuiID node_id) | ||||
|     DockBuilderRemoveNodeDockedWindows(node_id, true); | ||||
|     DockBuilderRemoveNodeChildNodes(node_id); | ||||
|     if (node->IsCentralNode() && node->ParentNode) | ||||
|         node->ParentNode->LocalFlags |= ImGuiDockNodeFlags_CentralNode; | ||||
|         node->ParentNode->SetLocalFlags(node->ParentNode->LocalFlags | ImGuiDockNodeFlags_CentralNode); | ||||
|     DockContextRemoveNode(ctx, node, true); | ||||
| } | ||||
|  | ||||
| @@ -15212,8 +15219,8 @@ void ImGui::DockBuilderRemoveNodeChildNodes(ImGuiID root_id) | ||||
|     } | ||||
|     else if (has_central_node) | ||||
|     { | ||||
|         root_node->LocalFlags |= ImGuiDockNodeFlags_CentralNode; | ||||
|         root_node->CentralNode = root_node; | ||||
|         root_node->SetLocalFlags(root_node->LocalFlags | ImGuiDockNodeFlags_CentralNode); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -15295,10 +15302,12 @@ static ImGuiDockNode* DockBuilderCopyNodeRec(ImGuiDockNode* src_node, ImGuiID ds | ||||
|     ImGuiDockNode* dst_node = ImGui::DockContextAddNode(ctx, dst_node_id_if_known); | ||||
|     dst_node->SharedFlags = src_node->SharedFlags; | ||||
|     dst_node->LocalFlags = src_node->LocalFlags; | ||||
|     dst_node->LocalFlagsInWindows = ImGuiDockNodeFlags_None; | ||||
|     dst_node->Pos = src_node->Pos; | ||||
|     dst_node->Size = src_node->Size; | ||||
|     dst_node->SizeRef = src_node->SizeRef; | ||||
|     dst_node->SplitAxis = src_node->SplitAxis; | ||||
|     dst_node->UpdateMergedFlags(); | ||||
|  | ||||
|     out_node_remap_pairs->push_back(src_node->ID); | ||||
|     out_node_remap_pairs->push_back(dst_node->ID); | ||||
| @@ -15606,7 +15615,7 @@ void ImGui::BeginDocked(ImGuiWindow* window, bool* p_open) | ||||
|     window->DockIsActive = true; | ||||
|     window->DockNodeIsVisible = true; | ||||
|     window->DockTabIsVisible = false; | ||||
|     if (node->SharedFlags & ImGuiDockNodeFlags_KeepAliveOnly) | ||||
|     if (node->MergedFlags & ImGuiDockNodeFlags_KeepAliveOnly) | ||||
|         return; | ||||
|  | ||||
|     // When the window is selected we mark it as visible. | ||||
| @@ -16734,9 +16743,16 @@ void ImGui::DebugNodeDockNode(ImGuiDockNode* node, const char* label) | ||||
|             node->IsCentralNode() ? " IsCentralNode" : "", | ||||
|             is_alive ? " IsAlive" : "", is_active ? " IsActive" : "", | ||||
|             node->WantLockSizeOnce ? " WantLockSizeOnce" : ""); | ||||
|         if (TreeNode("flags", "LocalFlags: 0x%04X SharedFlags: 0x%04X", node->LocalFlags, node->SharedFlags)) | ||||
|         if (TreeNode("flags", "Flags Merged: 0x%04X, Local: 0x%04X, InWindows: 0x%04X, Shared: 0x%04X", node->MergedFlags, node->LocalFlags, node->LocalFlagsInWindows, node->SharedFlags)) | ||||
|         { | ||||
|             DebugNodeDockNodeFlags(&node->LocalFlags, "LocalFlags", true); | ||||
|             if (BeginTable("flags", 4)) | ||||
|             { | ||||
|                 TableNextColumn(); DebugNodeDockNodeFlags(&node->MergedFlags, "MergedFlags", false); | ||||
|                 TableNextColumn(); DebugNodeDockNodeFlags(&node->LocalFlags, "LocalFlags", true); | ||||
|                 TableNextColumn(); DebugNodeDockNodeFlags(&node->LocalFlagsInWindows, "LocalFlagsInWindows", false); | ||||
|                 TableNextColumn(); DebugNodeDockNodeFlags(&node->SharedFlags, "SharedFlags", true); | ||||
|                 EndTable(); | ||||
|             } | ||||
|             TreePop(); | ||||
|         } | ||||
|         if (node->ParentNode) | ||||
|   | ||||
| @@ -1312,12 +1312,14 @@ enum ImGuiDockNodeState | ||||
|     ImGuiDockNodeState_HostWindowVisible | ||||
| }; | ||||
|  | ||||
| // sizeof() 116~160 | ||||
| // sizeof() 156~192 | ||||
| struct IMGUI_API ImGuiDockNode | ||||
| { | ||||
|     ImGuiID                 ID; | ||||
|     ImGuiDockNodeFlags      SharedFlags;                // Flags shared by all nodes of a same dockspace hierarchy (inherited from the root node) | ||||
|     ImGuiDockNodeFlags      LocalFlags;                 // Flags specific to this node | ||||
|     ImGuiDockNodeFlags      SharedFlags;                // (Write) Flags shared by all nodes of a same dockspace hierarchy (inherited from the root node) | ||||
|     ImGuiDockNodeFlags      LocalFlags;                 // (Write) Flags specific to this node | ||||
|     ImGuiDockNodeFlags      LocalFlagsInWindows;        // (Write) Flags specific to this node, applied from windows | ||||
|     ImGuiDockNodeFlags      MergedFlags;                // (Read)  Effective flags (== SharedFlags | LocalFlagsInNode | LocalFlagsInWindows) | ||||
|     ImGuiDockNodeState      State; | ||||
|     ImGuiDockNode*          ParentNode; | ||||
|     ImGuiDockNode*          ChildNodes[2];              // [Split node only] Child nodes (left/right or top/bottom). Consider switching to an array. | ||||
| @@ -1356,16 +1358,18 @@ struct IMGUI_API ImGuiDockNode | ||||
|     ImGuiDockNode(ImGuiID id); | ||||
|     ~ImGuiDockNode(); | ||||
|     bool                    IsRootNode() const      { return ParentNode == NULL; } | ||||
|     bool                    IsDockSpace() const     { return (LocalFlags & ImGuiDockNodeFlags_DockSpace) != 0; } | ||||
|     bool                    IsFloatingNode() const  { return ParentNode == NULL && (LocalFlags & ImGuiDockNodeFlags_DockSpace) == 0; } | ||||
|     bool                    IsCentralNode() const   { return (LocalFlags & ImGuiDockNodeFlags_CentralNode) != 0; } | ||||
|     bool                    IsHiddenTabBar() const  { return (LocalFlags & ImGuiDockNodeFlags_HiddenTabBar) != 0; } // Hidden tab bar can be shown back by clicking the small triangle | ||||
|     bool                    IsNoTabBar() const      { return (LocalFlags & ImGuiDockNodeFlags_NoTabBar) != 0; }     // Never show a tab bar | ||||
|     bool                    IsDockSpace() const     { return (MergedFlags & ImGuiDockNodeFlags_DockSpace) != 0; } | ||||
|     bool                    IsFloatingNode() const  { return ParentNode == NULL && (MergedFlags & ImGuiDockNodeFlags_DockSpace) == 0; } | ||||
|     bool                    IsCentralNode() const   { return (MergedFlags & ImGuiDockNodeFlags_CentralNode) != 0; } | ||||
|     bool                    IsHiddenTabBar() const  { return (MergedFlags & ImGuiDockNodeFlags_HiddenTabBar) != 0; } // Hidden tab bar can be shown back by clicking the small triangle | ||||
|     bool                    IsNoTabBar() const      { return (MergedFlags & ImGuiDockNodeFlags_NoTabBar) != 0; }     // Never show a tab bar | ||||
|     bool                    IsSplitNode() const     { return ChildNodes[0] != NULL; } | ||||
|     bool                    IsLeafNode() const      { return ChildNodes[0] == NULL; } | ||||
|     bool                    IsEmpty() const         { return ChildNodes[0] == NULL && Windows.Size == 0; } | ||||
|     ImGuiDockNodeFlags      GetMergedFlags() const  { return SharedFlags | LocalFlags; } | ||||
|     ImRect                  Rect() const            { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); } | ||||
|  | ||||
|     void                    SetLocalFlags(ImGuiDockNodeFlags flags) { LocalFlags = flags; UpdateMergedFlags(); } | ||||
|     void                    UpdateMergedFlags()     { MergedFlags = SharedFlags | LocalFlags | LocalFlagsInWindows; } | ||||
| }; | ||||
|  | ||||
| // List of colors that are stored at the time of Begin() into Docked Windows. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user