mirror of
https://github.com/Drezil/imgui.git
synced 2024-12-20 14:56:35 +00: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:
parent
0a8ab75e4b
commit
6136b3844b
@ -144,6 +144,9 @@ Docking+Viewports Branch:
|
|||||||
|
|
||||||
- Docking: Clicking on the right-most close button of a docking node closes all windows. (#4186)
|
- 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: 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
|
- 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.
|
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
|
- 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->ParentNode->ChildNodes[1] = node;
|
||||||
node->SelectedTabId = settings->SelectedTabId;
|
node->SelectedTabId = settings->SelectedTabId;
|
||||||
node->SplitAxis = (ImGuiAxis)settings->SplitAxis;
|
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)
|
// 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.
|
// 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;
|
new_node->HostWindow = node->HostWindow;
|
||||||
node = new_node;
|
node = new_node;
|
||||||
}
|
}
|
||||||
node->LocalFlags &= ~ImGuiDockNodeFlags_HiddenTabBar;
|
node->SetLocalFlags(node->LocalFlags & ~ImGuiDockNodeFlags_HiddenTabBar);
|
||||||
|
|
||||||
if (node != payload_node)
|
if (node != payload_node)
|
||||||
{
|
{
|
||||||
@ -12950,8 +12950,8 @@ void ImGui::DockContextProcessDock(ImGuiContext* ctx, ImGuiDockRequest* req)
|
|||||||
IM_ASSERT(last_focused_node != NULL);
|
IM_ASSERT(last_focused_node != NULL);
|
||||||
ImGuiDockNode* last_focused_root_node = DockNodeGetRootNode(last_focused_node);
|
ImGuiDockNode* last_focused_root_node = DockNodeGetRootNode(last_focused_node);
|
||||||
IM_ASSERT(last_focused_root_node == DockNodeGetRootNode(payload_node));
|
IM_ASSERT(last_focused_root_node == DockNodeGetRootNode(payload_node));
|
||||||
last_focused_node->LocalFlags |= ImGuiDockNodeFlags_CentralNode;
|
last_focused_node->SetLocalFlags(last_focused_node->LocalFlags |= ImGuiDockNodeFlags_CentralNode);
|
||||||
node->LocalFlags &= ~ImGuiDockNodeFlags_CentralNode;
|
node->SetLocalFlags(node->LocalFlags & ~ImGuiDockNodeFlags_CentralNode);
|
||||||
last_focused_root_node->CentralNode = last_focused_node;
|
last_focused_root_node->CentralNode = last_focused_node;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -13112,7 +13112,7 @@ bool ImGui::DockContextCalcDropPosForDocking(ImGuiWindow* target, ImGuiDockNode*
|
|||||||
ImGuiDockNode::ImGuiDockNode(ImGuiID id)
|
ImGuiDockNode::ImGuiDockNode(ImGuiID id)
|
||||||
{
|
{
|
||||||
ID = id;
|
ID = id;
|
||||||
SharedFlags = LocalFlags = ImGuiDockNodeFlags_None;
|
SharedFlags = LocalFlags = LocalFlagsInWindows = MergedFlags = ImGuiDockNodeFlags_None;
|
||||||
ParentNode = ChildNodes[0] = ChildNodes[1] = NULL;
|
ParentNode = ChildNodes[0] = ChildNodes[1] = NULL;
|
||||||
TabBar = NULL;
|
TabBar = NULL;
|
||||||
SplitAxis = ImGuiAxis_None;
|
SplitAxis = ImGuiAxis_None;
|
||||||
@ -13416,6 +13416,7 @@ static void ImGui::DockNodeUpdateVisibleFlagAndInactiveChilds(ImGuiDockNode* nod
|
|||||||
|
|
||||||
// Remove inactive windows
|
// Remove inactive windows
|
||||||
// Merge node flags overrides stored in windows
|
// Merge node flags overrides stored in windows
|
||||||
|
node->LocalFlagsInWindows = ImGuiDockNodeFlags_None;
|
||||||
for (int window_n = 0; window_n < node->Windows.Size; window_n++)
|
for (int window_n = 0; window_n < node->Windows.Size; window_n++)
|
||||||
{
|
{
|
||||||
ImGuiWindow* window = node->Windows[window_n];
|
ImGuiWindow* window = node->Windows[window_n];
|
||||||
@ -13442,13 +13443,14 @@ static void ImGui::DockNodeUpdateVisibleFlagAndInactiveChilds(ImGuiDockNode* nod
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// FIXME-DOCKING: Missing policies for conflict resolution, hence the "Experimental" tag on this.
|
// FIXME-DOCKING: Missing policies for conflict resolution, hence the "Experimental" tag on this.
|
||||||
//node->LocalFlags &= ~window->WindowClass.DockNodeFlagsOverrideClear;
|
//node->LocalFlagsInWindow &= ~window->WindowClass.DockNodeFlagsOverrideClear;
|
||||||
node->LocalFlags |= window->WindowClass.DockNodeFlagsOverrideSet;
|
node->LocalFlagsInWindows |= window->WindowClass.DockNodeFlagsOverrideSet;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
node->UpdateMergedFlags();
|
||||||
|
|
||||||
// Auto-hide tab bar option
|
// 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())
|
if (node->WantHiddenTabBarUpdate && node->Windows.Size == 1 && (node_flags & ImGuiDockNodeFlags_AutoHideTabBar) && !node->IsHiddenTabBar())
|
||||||
node->WantHiddenTabBarToggle = true;
|
node->WantHiddenTabBarToggle = true;
|
||||||
node->WantHiddenTabBarUpdate = false;
|
node->WantHiddenTabBarUpdate = false;
|
||||||
@ -13459,9 +13461,9 @@ static void ImGui::DockNodeUpdateVisibleFlagAndInactiveChilds(ImGuiDockNode* nod
|
|||||||
|
|
||||||
// Apply toggles at a single point of the frame (here!)
|
// Apply toggles at a single point of the frame (here!)
|
||||||
if (node->Windows.Size > 1)
|
if (node->Windows.Size > 1)
|
||||||
node->LocalFlags &= ~ImGuiDockNodeFlags_HiddenTabBar;
|
node->SetLocalFlags(node->LocalFlags & ~ImGuiDockNodeFlags_HiddenTabBar);
|
||||||
else if (node->WantHiddenTabBarToggle)
|
else if (node->WantHiddenTabBarToggle)
|
||||||
node->LocalFlags ^= ImGuiDockNodeFlags_HiddenTabBar;
|
node->SetLocalFlags(node->LocalFlags ^ ImGuiDockNodeFlags_HiddenTabBar);
|
||||||
node->WantHiddenTabBarToggle = false;
|
node->WantHiddenTabBarToggle = false;
|
||||||
|
|
||||||
DockNodeUpdateVisibleFlag(node);
|
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
|
// 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;
|
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)
|
if (node->TabBar == NULL || node->HostWindow == NULL)
|
||||||
return false;
|
return false;
|
||||||
if (node->SharedFlags & ImGuiDockNodeFlags_KeepAliveOnly)
|
if (node->MergedFlags & ImGuiDockNodeFlags_KeepAliveOnly)
|
||||||
return false;
|
return false;
|
||||||
Begin(node->HostWindow->Name);
|
Begin(node->HostWindow->Name);
|
||||||
PushOverrideID(node->ID);
|
PushOverrideID(node->ID);
|
||||||
@ -13929,7 +13931,7 @@ static void ImGui::DockNodeUpdateTabBar(ImGuiDockNode* node, ImGuiWindow* host_w
|
|||||||
ImGuiID focus_tab_id = 0;
|
ImGuiID focus_tab_id = 0;
|
||||||
node->IsFocused = is_focused;
|
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);
|
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.
|
// 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);
|
IM_ASSERT(ref_node_for_rect->IsVisible);
|
||||||
|
|
||||||
// Filter, figure out where we are allowed to dock
|
// 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 src_node_flags = root_payload_as_host ? root_payload_as_host->MergedFlags : root_payload->WindowClass.DockNodeFlagsOverrideSet;
|
||||||
ImGuiDockNodeFlags dst_node_flags = host_node ? host_node->GetMergedFlags() : host_window->WindowClass.DockNodeFlagsOverrideSet;
|
ImGuiDockNodeFlags dst_node_flags = host_node ? host_node->MergedFlags : host_window->WindowClass.DockNodeFlagsOverrideSet;
|
||||||
data->IsCenterAvailable = true;
|
data->IsCenterAvailable = true;
|
||||||
if (is_outer_docking)
|
if (is_outer_docking)
|
||||||
data->IsCenterAvailable = false;
|
data->IsCenterAvailable = false;
|
||||||
@ -14504,7 +14506,7 @@ static void ImGui::DockNodePreviewDockRender(ImGuiWindow* host_window, ImGuiDock
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Stop after ImGuiDir_None
|
// 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;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -14557,6 +14559,9 @@ void ImGui::DockNodeTreeSplit(ImGuiContext* ctx, ImGuiDockNode* parent_node, ImG
|
|||||||
child_1->SharedFlags = parent_node->SharedFlags & ImGuiDockNodeFlags_SharedFlagsInheritMask_;
|
child_1->SharedFlags = parent_node->SharedFlags & ImGuiDockNodeFlags_SharedFlagsInheritMask_;
|
||||||
child_inheritor->LocalFlags = parent_node->LocalFlags & ImGuiDockNodeFlags_LocalFlagsTransferMask_;
|
child_inheritor->LocalFlags = parent_node->LocalFlags & ImGuiDockNodeFlags_LocalFlagsTransferMask_;
|
||||||
parent_node->LocalFlags &= ~ImGuiDockNodeFlags_LocalFlagsTransferMask_;
|
parent_node->LocalFlags &= ~ImGuiDockNodeFlags_LocalFlagsTransferMask_;
|
||||||
|
child_0->UpdateMergedFlags();
|
||||||
|
child_1->UpdateMergedFlags();
|
||||||
|
parent_node->UpdateMergedFlags();
|
||||||
if (child_inheritor->IsCentralNode())
|
if (child_inheritor->IsCentralNode())
|
||||||
DockNodeGetRootNode(parent_node)->CentralNode = child_inheritor;
|
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 &= ~ImGuiDockNodeFlags_LocalFlagsTransferMask_; // Preserve Dockspace flag
|
||||||
parent_node->LocalFlags |= (child_0 ? child_0->LocalFlags : 0) & ImGuiDockNodeFlags_LocalFlagsTransferMask_;
|
parent_node->LocalFlags |= (child_0 ? child_0->LocalFlags : 0) & ImGuiDockNodeFlags_LocalFlagsTransferMask_;
|
||||||
parent_node->LocalFlags |= (child_1 ? child_1->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)
|
if (child_0)
|
||||||
{
|
{
|
||||||
@ -14727,7 +14734,7 @@ void ImGui::DockNodeTreeUpdateSplitter(ImGuiDockNode* node)
|
|||||||
bb.Max[axis ^ 1] += child_1->Size[axis ^ 1];
|
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));
|
//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;
|
const ImGuiDockNodeFlags no_resize_axis_flag = (axis == ImGuiAxis_X) ? ImGuiDockNodeFlags_NoResizeX : ImGuiDockNodeFlags_NoResizeY;
|
||||||
if ((merged_flags & ImGuiDockNodeFlags_NoResize) || (merged_flags & no_resize_axis_flag))
|
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);
|
IMGUI_DEBUG_LOG_DOCKING("DockSpace: dockspace node 0x%08X created\n", id);
|
||||||
node = DockContextAddNode(ctx, id);
|
node = DockContextAddNode(ctx, id);
|
||||||
node->LocalFlags |= ImGuiDockNodeFlags_CentralNode;
|
node->SetLocalFlags(ImGuiDockNodeFlags_CentralNode);
|
||||||
}
|
}
|
||||||
if (window_class && window_class->ClassId != node->WindowClass.ClassId)
|
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);
|
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))
|
if (node->LastFrameActive == g.FrameCount && !(flags & ImGuiDockNodeFlags_KeepAliveOnly))
|
||||||
{
|
{
|
||||||
IM_ASSERT(node->IsDockSpace() == false && "Cannot call DockSpace() twice a frame with the same ID");
|
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;
|
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
|
// Keep alive mode, this is allow windows docked into this node so stay docked even if they are not visible
|
||||||
if (flags & ImGuiDockNodeFlags_KeepAliveOnly)
|
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,
|
// 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.
|
// as it doesn't make sense for an empty dockspace to not have this property.
|
||||||
if (node->IsLeafNode() && !node->IsCentralNode())
|
if (node->IsLeafNode() && !node->IsCentralNode())
|
||||||
node->LocalFlags |= ImGuiDockNodeFlags_CentralNode;
|
node->SetLocalFlags(node->LocalFlags | ImGuiDockNodeFlags_CentralNode);
|
||||||
|
|
||||||
// Update the node
|
// Update the node
|
||||||
DockNodeUpdate(node);
|
DockNodeUpdate(node);
|
||||||
@ -15127,7 +15134,7 @@ ImGuiID ImGui::DockBuilderAddNode(ImGuiID id, ImGuiDockNodeFlags flags)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
node = DockContextAddNode(ctx, id);
|
node = DockContextAddNode(ctx, id);
|
||||||
node->LocalFlags = flags;
|
node->SetLocalFlags(flags);
|
||||||
}
|
}
|
||||||
node->LastFrameAlive = ctx->FrameCount; // Set this otherwise BeginDocked will undock during the same frame.
|
node->LastFrameAlive = ctx->FrameCount; // Set this otherwise BeginDocked will undock during the same frame.
|
||||||
return node->ID;
|
return node->ID;
|
||||||
@ -15142,7 +15149,7 @@ void ImGui::DockBuilderRemoveNode(ImGuiID node_id)
|
|||||||
DockBuilderRemoveNodeDockedWindows(node_id, true);
|
DockBuilderRemoveNodeDockedWindows(node_id, true);
|
||||||
DockBuilderRemoveNodeChildNodes(node_id);
|
DockBuilderRemoveNodeChildNodes(node_id);
|
||||||
if (node->IsCentralNode() && node->ParentNode)
|
if (node->IsCentralNode() && node->ParentNode)
|
||||||
node->ParentNode->LocalFlags |= ImGuiDockNodeFlags_CentralNode;
|
node->ParentNode->SetLocalFlags(node->ParentNode->LocalFlags | ImGuiDockNodeFlags_CentralNode);
|
||||||
DockContextRemoveNode(ctx, node, true);
|
DockContextRemoveNode(ctx, node, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -15212,8 +15219,8 @@ void ImGui::DockBuilderRemoveNodeChildNodes(ImGuiID root_id)
|
|||||||
}
|
}
|
||||||
else if (has_central_node)
|
else if (has_central_node)
|
||||||
{
|
{
|
||||||
root_node->LocalFlags |= ImGuiDockNodeFlags_CentralNode;
|
|
||||||
root_node->CentralNode = root_node;
|
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);
|
ImGuiDockNode* dst_node = ImGui::DockContextAddNode(ctx, dst_node_id_if_known);
|
||||||
dst_node->SharedFlags = src_node->SharedFlags;
|
dst_node->SharedFlags = src_node->SharedFlags;
|
||||||
dst_node->LocalFlags = src_node->LocalFlags;
|
dst_node->LocalFlags = src_node->LocalFlags;
|
||||||
|
dst_node->LocalFlagsInWindows = ImGuiDockNodeFlags_None;
|
||||||
dst_node->Pos = src_node->Pos;
|
dst_node->Pos = src_node->Pos;
|
||||||
dst_node->Size = src_node->Size;
|
dst_node->Size = src_node->Size;
|
||||||
dst_node->SizeRef = src_node->SizeRef;
|
dst_node->SizeRef = src_node->SizeRef;
|
||||||
dst_node->SplitAxis = src_node->SplitAxis;
|
dst_node->SplitAxis = src_node->SplitAxis;
|
||||||
|
dst_node->UpdateMergedFlags();
|
||||||
|
|
||||||
out_node_remap_pairs->push_back(src_node->ID);
|
out_node_remap_pairs->push_back(src_node->ID);
|
||||||
out_node_remap_pairs->push_back(dst_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->DockIsActive = true;
|
||||||
window->DockNodeIsVisible = true;
|
window->DockNodeIsVisible = true;
|
||||||
window->DockTabIsVisible = false;
|
window->DockTabIsVisible = false;
|
||||||
if (node->SharedFlags & ImGuiDockNodeFlags_KeepAliveOnly)
|
if (node->MergedFlags & ImGuiDockNodeFlags_KeepAliveOnly)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// When the window is selected we mark it as visible.
|
// 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" : "",
|
node->IsCentralNode() ? " IsCentralNode" : "",
|
||||||
is_alive ? " IsAlive" : "", is_active ? " IsActive" : "",
|
is_alive ? " IsAlive" : "", is_active ? " IsActive" : "",
|
||||||
node->WantLockSizeOnce ? " WantLockSizeOnce" : "");
|
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();
|
TreePop();
|
||||||
}
|
}
|
||||||
if (node->ParentNode)
|
if (node->ParentNode)
|
||||||
|
@ -1312,12 +1312,14 @@ enum ImGuiDockNodeState
|
|||||||
ImGuiDockNodeState_HostWindowVisible
|
ImGuiDockNodeState_HostWindowVisible
|
||||||
};
|
};
|
||||||
|
|
||||||
// sizeof() 116~160
|
// sizeof() 156~192
|
||||||
struct IMGUI_API ImGuiDockNode
|
struct IMGUI_API ImGuiDockNode
|
||||||
{
|
{
|
||||||
ImGuiID ID;
|
ImGuiID ID;
|
||||||
ImGuiDockNodeFlags SharedFlags; // Flags shared by all nodes of a same dockspace hierarchy (inherited from the root node)
|
ImGuiDockNodeFlags SharedFlags; // (Write) Flags shared by all nodes of a same dockspace hierarchy (inherited from the root node)
|
||||||
ImGuiDockNodeFlags LocalFlags; // Flags specific to this 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;
|
ImGuiDockNodeState State;
|
||||||
ImGuiDockNode* ParentNode;
|
ImGuiDockNode* ParentNode;
|
||||||
ImGuiDockNode* ChildNodes[2]; // [Split node only] Child nodes (left/right or top/bottom). Consider switching to an array.
|
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(ImGuiID id);
|
||||||
~ImGuiDockNode();
|
~ImGuiDockNode();
|
||||||
bool IsRootNode() const { return ParentNode == NULL; }
|
bool IsRootNode() const { return ParentNode == NULL; }
|
||||||
bool IsDockSpace() const { return (LocalFlags & ImGuiDockNodeFlags_DockSpace) != 0; }
|
bool IsDockSpace() const { return (MergedFlags & ImGuiDockNodeFlags_DockSpace) != 0; }
|
||||||
bool IsFloatingNode() const { return ParentNode == NULL && (LocalFlags & ImGuiDockNodeFlags_DockSpace) == 0; }
|
bool IsFloatingNode() const { return ParentNode == NULL && (MergedFlags & ImGuiDockNodeFlags_DockSpace) == 0; }
|
||||||
bool IsCentralNode() const { return (LocalFlags & ImGuiDockNodeFlags_CentralNode) != 0; }
|
bool IsCentralNode() const { return (MergedFlags & ImGuiDockNodeFlags_CentralNode) != 0; }
|
||||||
bool IsHiddenTabBar() const { return (LocalFlags & ImGuiDockNodeFlags_HiddenTabBar) != 0; } // Hidden tab bar can be shown back by clicking the small triangle
|
bool IsHiddenTabBar() const { return (MergedFlags & 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 IsNoTabBar() const { return (MergedFlags & ImGuiDockNodeFlags_NoTabBar) != 0; } // Never show a tab bar
|
||||||
bool IsSplitNode() const { return ChildNodes[0] != NULL; }
|
bool IsSplitNode() const { return ChildNodes[0] != NULL; }
|
||||||
bool IsLeafNode() const { return ChildNodes[0] == NULL; }
|
bool IsLeafNode() const { return ChildNodes[0] == NULL; }
|
||||||
bool IsEmpty() const { return ChildNodes[0] == NULL && Windows.Size == 0; }
|
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); }
|
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.
|
// List of colors that are stored at the time of Begin() into Docked Windows.
|
||||||
|
Loading…
Reference in New Issue
Block a user