@@ -11065,18 +11065,16 @@ struct ImGuiDockPreviewData
11065
11065
// Persistent Settings data, stored contiguously in SettingsNodes (sizeof() ~32 bytes)
11066
11066
struct ImGuiDockNodeSettings
11067
11067
{
11068
- ImGuiID ID;
11069
- ImGuiID ParentID;
11070
- ImGuiID SelectedTabID;
11071
- signed char SplitAxis;
11072
- char Depth;
11073
- char IsDockSpace;
11074
- char IsCentralNode;
11075
- char IsHiddenTabBar;
11076
- ImVec2ih Pos;
11077
- ImVec2ih Size;
11078
- ImVec2ih SizeRef;
11079
- ImGuiDockNodeSettings() { ID = ParentID = SelectedTabID = 0; SplitAxis = ImGuiAxis_None; Depth = 0; IsDockSpace = IsCentralNode = IsHiddenTabBar = 0; }
11068
+ ImGuiID ID;
11069
+ ImGuiID ParentID;
11070
+ ImGuiID SelectedTabID;
11071
+ signed char SplitAxis;
11072
+ char Depth;
11073
+ ImGuiDockNodeFlags Flags; // NB: We save individual flags one by one in ascii format (ImGuiDockNodeFlags_SavedFlagsMask_)
11074
+ ImVec2ih Pos;
11075
+ ImVec2ih Size;
11076
+ ImVec2ih SizeRef;
11077
+ ImGuiDockNodeSettings() { ID = ParentID = SelectedTabID = 0; SplitAxis = ImGuiAxis_None; Depth = 0; Flags = ImGuiDockNodeFlags_None; }
11080
11078
};
11081
11079
11082
11080
struct ImGuiDockContext
@@ -11394,7 +11392,7 @@ static void ImGui::DockContextPruneUnusedSettingsNodes(ImGuiContext* ctx)
11394
11392
ImGuiDockContextPruneNodeData* data_root = (data->RootID == settings->ID) ? data : pool.GetByKey(data->RootID);
11395
11393
11396
11394
bool remove = false;
11397
- remove |= (data->CountWindows == 1 && settings->ParentID == 0 && data->CountChildNodes == 0 && !settings->IsCentralNode ); // Floating root node with only 1 window
11395
+ remove |= (data->CountWindows == 1 && settings->ParentID == 0 && data->CountChildNodes == 0 && !( settings->Flags & ImGuiDockNodeFlags_CentralNode) ); // Floating root node with only 1 window
11398
11396
remove |= (data->CountWindows == 0 && settings->ParentID == 0 && data->CountChildNodes == 0); // Leaf nodes with 0 window
11399
11397
remove |= (data_root->CountChildWindows == 0);
11400
11398
if (remove)
@@ -11425,12 +11423,7 @@ static void ImGui::DockContextBuildNodesFromSettings(ImGuiContext* ctx, ImGuiDoc
11425
11423
node->ParentNode->ChildNodes[1] = node;
11426
11424
node->SelectedTabID = settings->SelectedTabID;
11427
11425
node->SplitAxis = settings->SplitAxis;
11428
- if (settings->IsDockSpace)
11429
- node->LocalFlags |= ImGuiDockNodeFlags_DockSpace;
11430
- if (settings->IsCentralNode)
11431
- node->LocalFlags |= ImGuiDockNodeFlags_CentralNode;
11432
- if (settings->IsHiddenTabBar)
11433
- node->LocalFlags |= ImGuiDockNodeFlags_HiddenTabBar;
11426
+ node->LocalFlags |= (settings->Flags & ImGuiDockNodeFlags_SavedFlagsMask_);
11434
11427
11435
11428
// Bind host window immediately if it already exist (in case of a rebuild)
11436
11429
// This is useful as the RootWindowForTitleBarHighlight links necessary to highlight the currently focused node requires node->HostWindow to be set.
@@ -14076,10 +14069,11 @@ static void ImGui::DockSettingsHandler_ReadLine(ImGuiContext* ctx, ImGuiSettings
14076
14069
// Parsing, e.g.
14077
14070
// " DockNode ID=0x00000001 Pos=383,193 Size=201,322 Split=Y,0.506 "
14078
14071
// " DockNode ID=0x00000002 Parent=0x00000001 "
14072
+ // Important: this code expect currently fields in a fixed order.
14079
14073
ImGuiDockNodeSettings node;
14080
14074
line = ImStrSkipBlank(line);
14081
14075
if (strncmp(line, "DockNode", 8) == 0) { line = ImStrSkipBlank(line + strlen("DockNode")); }
14082
- else if (strncmp(line, "DockSpace", 9) == 0) { line = ImStrSkipBlank(line + strlen("DockSpace")); node.IsDockSpace = true ; }
14076
+ else if (strncmp(line, "DockSpace", 9) == 0) { line = ImStrSkipBlank(line + strlen("DockSpace")); node.Flags |= ImGuiDockNodeFlags_DockSpace ; }
14083
14077
else return;
14084
14078
if (sscanf(line, "ID=0x%08X%n", &node.ID, &r) == 1) { line += r; } else return;
14085
14079
if (sscanf(line, " Parent=0x%08X%n", &node.ParentID, &r) == 1) { line += r; if (node.ParentID == 0) return; }
@@ -14093,8 +14087,11 @@ static void ImGui::DockSettingsHandler_ReadLine(ImGuiContext* ctx, ImGuiSettings
14093
14087
if (sscanf(line, " SizeRef=%i,%i%n", &x, &y, &r) == 2) { line += r; node.SizeRef = ImVec2ih((short)x, (short)y); }
14094
14088
}
14095
14089
if (sscanf(line, " Split=%c%n", &c, &r) == 1) { line += r; if (c == 'X') node.SplitAxis = ImGuiAxis_X; else if (c == 'Y') node.SplitAxis = ImGuiAxis_Y; }
14096
- if (sscanf(line, " CentralNode=%d%n", &x, &r) == 1) { line += r; node.IsCentralNode = (x != 0); }
14097
- if (sscanf(line, " HiddenTabBar=%d%n", &x, &r) == 1) { line += r; node.IsHiddenTabBar = (x != 0); }
14090
+ if (sscanf(line, " CentralNode=%d%n", &x, &r) == 1) { line += r; if (x != 0) node.Flags |= ImGuiDockNodeFlags_CentralNode; }
14091
+ if (sscanf(line, " NoTabBar=%d%n", &x, &r) == 1) { line += r; if (x != 0) node.Flags |= ImGuiDockNodeFlags_NoTabBar; }
14092
+ if (sscanf(line, " HiddenTabBar=%d%n", &x, &r) == 1) { line += r; if (x != 0) node.Flags |= ImGuiDockNodeFlags_HiddenTabBar; }
14093
+ if (sscanf(line, " NoWindowMenuButton=%d%n", &x, &r) == 1) { line += r; if (x != 0) node.Flags |= ImGuiDockNodeFlags_NoWindowMenuButton; }
14094
+ if (sscanf(line, " NoCloseButton=%d%n", &x, &r) == 1) { line += r; if (x != 0) node.Flags |= ImGuiDockNodeFlags_NoCloseButton; }
14098
14095
if (sscanf(line, " SelectedTab=0x%08X%n", &node.SelectedTabID,&r) == 1) { line += r; }
14099
14096
ImGuiDockContext* dc = ctx->DockContext;
14100
14097
if (node.ParentID != 0)
@@ -14112,9 +14109,7 @@ static void DockSettingsHandler_DockNodeToSettings(ImGuiDockContext* dc, ImGuiDo
14112
14109
node_settings.SelectedTabID = node->SelectedTabID;
14113
14110
node_settings.SplitAxis = node->IsSplitNode() ? (char)node->SplitAxis : ImGuiAxis_None;
14114
14111
node_settings.Depth = (char)depth;
14115
- node_settings.IsDockSpace = (char)node->IsDockSpace();
14116
- node_settings.IsCentralNode = (char)node->IsCentralNode();
14117
- node_settings.IsHiddenTabBar = (char)node->IsHiddenTabBar();
14112
+ node_settings.Flags = node->GetMergedFlags() & ImGuiDockNodeFlags_SavedFlagsMask_;
14118
14113
node_settings.Pos = ImVec2ih((short)node->Pos.x, (short)node->Pos.y);
14119
14114
node_settings.Size = ImVec2ih((short)node->Size.x, (short)node->Size.y);
14120
14115
node_settings.SizeRef = ImVec2ih((short)node->SizeRef.x, (short)node->SizeRef.y);
@@ -14151,18 +14146,24 @@ static void ImGui::DockSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettings
14151
14146
{
14152
14147
const int line_start_pos = buf->size(); (void)line_start_pos;
14153
14148
const ImGuiDockNodeSettings* node_settings = &dc->SettingsNodes[node_n];
14154
- buf->appendf("%*s%s%*s", node_settings->Depth * 2, "", node_settings->IsDockSpace ? "DockSpace" : "DockNode ", (max_depth - node_settings->Depth) * 2, ""); // Text align nodes to facilitate looking at .ini file
14149
+ buf->appendf("%*s%s%*s", node_settings->Depth * 2, "", ( node_settings->Flags & ImGuiDockNodeFlags_DockSpace) ? "DockSpace" : "DockNode ", (max_depth - node_settings->Depth) * 2, ""); // Text align nodes to facilitate looking at .ini file
14155
14150
buf->appendf(" ID=0x%08X", node_settings->ID);
14156
14151
if (node_settings->ParentID)
14157
14152
buf->appendf(" Parent=0x%08X SizeRef=%d,%d", node_settings->ParentID, node_settings->SizeRef.x, node_settings->SizeRef.y);
14158
14153
else
14159
14154
buf->appendf(" Pos=%d,%d Size=%d,%d", node_settings->Pos.x, node_settings->Pos.y, node_settings->Size.x, node_settings->Size.y);
14160
14155
if (node_settings->SplitAxis != ImGuiAxis_None)
14161
14156
buf->appendf(" Split=%c", (node_settings->SplitAxis == ImGuiAxis_X) ? 'X' : 'Y');
14162
- if (node_settings->IsCentralNode )
14157
+ if (node_settings->Flags & ImGuiDockNodeFlags_CentralNode )
14163
14158
buf->appendf(" CentralNode=1");
14164
- if (node_settings->IsHiddenTabBar)
14159
+ if (node_settings->Flags & ImGuiDockNodeFlags_NoTabBar)
14160
+ buf->appendf(" NoTabBar=1");
14161
+ if (node_settings->Flags & ImGuiDockNodeFlags_HiddenTabBar)
14165
14162
buf->appendf(" HiddenTabBar=1");
14163
+ if (node_settings->Flags & ImGuiDockNodeFlags_NoWindowMenuButton)
14164
+ buf->appendf(" NoWindowMenuButton=1");
14165
+ if (node_settings->Flags & ImGuiDockNodeFlags_NoCloseButton)
14166
+ buf->appendf(" NoCloseButton=1");
14166
14167
if (node_settings->SelectedTabID)
14167
14168
buf->appendf(" SelectedTab=0x%08X", node_settings->SelectedTabID);
14168
14169
@@ -14700,10 +14701,12 @@ void ImGui::ShowDockingDebug()
14700
14701
ImGui::BulletText("Misc:%s%s%s%s", node->IsDockSpace() ? " IsDockSpace" : "", node->IsCentralNode() ? " IsCentralNode" : "", (g.FrameCount - node->LastFrameAlive < 2) ? " IsAlive" : "", (g.FrameCount - node->LastFrameActive < 2) ? " IsActive" : "");
14701
14702
if (ImGui::TreeNode("flags", "LocalFlags: 0x%04X SharedFlags: 0x%04X", node->LocalFlags, node->SharedFlags))
14702
14703
{
14703
- ImGui::CheckboxFlags("LocalFlags: NoSplit", (unsigned int*)&node->LocalFlags, ImGuiDockNodeFlags_NoSplit);
14704
- ImGui::CheckboxFlags("LocalFlags: NoResize", (unsigned int*)&node->LocalFlags, ImGuiDockNodeFlags_NoResize);
14705
- ImGui::CheckboxFlags("LocalFlags: NoTabBar", (unsigned int*)&node->LocalFlags, ImGuiDockNodeFlags_NoTabBar);
14706
- ImGui::CheckboxFlags("LocalFlags: HiddenTabBar",(unsigned int*)&node->LocalFlags, ImGuiDockNodeFlags_HiddenTabBar);
14704
+ ImGui::CheckboxFlags("LocalFlags: NoSplit", (ImU32*)&node->LocalFlags, ImGuiDockNodeFlags_NoSplit);
14705
+ ImGui::CheckboxFlags("LocalFlags: NoResize", (ImU32*)&node->LocalFlags, ImGuiDockNodeFlags_NoResize);
14706
+ ImGui::CheckboxFlags("LocalFlags: NoTabBar", (ImU32*)&node->LocalFlags, ImGuiDockNodeFlags_NoTabBar);
14707
+ ImGui::CheckboxFlags("LocalFlags: HiddenTabBar", (ImU32*)&node->LocalFlags, ImGuiDockNodeFlags_HiddenTabBar);
14708
+ ImGui::CheckboxFlags("LocalFlags: NoWindowMenuButton", (ImU32*)&node->LocalFlags, ImGuiDockNodeFlags_NoWindowMenuButton);
14709
+ ImGui::CheckboxFlags("LocalFlags: NoCloseButton", (ImU32*)&node->LocalFlags, ImGuiDockNodeFlags_NoCloseButton);
14707
14710
ImGui::TreePop();
14708
14711
}
14709
14712
if (node->ChildNodes[0])
0 commit comments