Docking: Fix for IMGUI_DEBUG_INI_SETTINGS=1, comments

This commit is contained in:
omar 2020-01-02 21:54:23 +01:00
parent 07eb7adbb4
commit c163b856d7

View File

@ -6761,7 +6761,7 @@ void ImGui::FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWind
if (window != ignore_window && window->WasActive && !(window->Flags & ImGuiWindowFlags_ChildWindow)) if (window != ignore_window && window->WasActive && !(window->Flags & ImGuiWindowFlags_ChildWindow))
if ((window->Flags & (ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs)) != (ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs)) if ((window->Flags & (ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs)) != (ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs))
{ {
// FIXME-DOCKING: This is failing (lagging by one frame) for docked windows. // FIXME-DOCK: This is failing (lagging by one frame) for docked windows.
// If A and B are docked into window and B disappear, at the NewFrame() call site window->NavLastChildNavWindow will still point to B. // If A and B are docked into window and B disappear, at the NewFrame() call site window->NavLastChildNavWindow will still point to B.
// We might leverage the tab order implicitly stored in window->DockNodeAsHost->TabBar (essentially the 'most_recently_selected_tab' code in tab bar will do that but on next update) // We might leverage the tab order implicitly stored in window->DockNodeAsHost->TabBar (essentially the 'most_recently_selected_tab' code in tab bar will do that but on next update)
// to tell which is the "previous" window. Or we may leverage 'LastFrameFocused/LastFrameJustFocused' and have this function handle child window itself? // to tell which is the "previous" window. Or we may leverage 'LastFrameFocused/LastFrameJustFocused' and have this function handle child window itself?
@ -11534,7 +11534,7 @@ static ImGuiDockNode* ImGui::DockContextFindNodeByID(ImGuiContext* ctx, ImGuiID
ImGuiID ImGui::DockContextGenNodeID(ImGuiContext* ctx) ImGuiID ImGui::DockContextGenNodeID(ImGuiContext* ctx)
{ {
// Generate an ID for new node (the exact ID value doesn't matter as long as it is not already used) // Generate an ID for new node (the exact ID value doesn't matter as long as it is not already used)
// FIXME-OPT FIXME-DOCKING: This is suboptimal, even if the node count is small enough not to be a worry. We should poke in ctx->Nodes to find a suitable ID faster. // FIXME-OPT FIXME-DOCK: This is suboptimal, even if the node count is small enough not to be a worry. We should poke in ctx->Nodes to find a suitable ID faster.
ImGuiID id = 0x0001; ImGuiID id = 0x0001;
while (DockContextFindNodeByID(ctx, id) != NULL) while (DockContextFindNodeByID(ctx, id) != NULL)
id++; id++;
@ -11862,7 +11862,7 @@ void ImGui::DockContextProcessDock(ImGuiContext* ctx, ImGuiDockRequest* req)
if (node->IsCentralNode()) if (node->IsCentralNode())
{ {
// Central node property needs to be moved to a leaf node, pick the last focused one. // Central node property needs to be moved to a leaf node, pick the last focused one.
// FIXME-DOCKING: If we had to transfer other flags here, what would the policy be? // FIXME-DOCK: If we had to transfer other flags here, what would the policy be?
ImGuiDockNode* last_focused_node = DockContextFindNodeByID(ctx, payload_node->LastFocusedNodeID); ImGuiDockNode* last_focused_node = DockContextFindNodeByID(ctx, payload_node->LastFocusedNodeID);
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);
@ -12775,7 +12775,7 @@ static void ImGui::DockNodeUpdateTabBar(ImGuiDockNode* node, ImGuiWindow* host_w
const bool has_close_button = (node_flags & ImGuiDockNodeFlags_NoCloseButton) == 0; const bool has_close_button = (node_flags & ImGuiDockNodeFlags_NoCloseButton) == 0;
// 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.
// FIXME-DOCK FIXME-OPT: Could we recycle popups id accross multiple dock nodes? // FIXME-DOCK FIXME-OPT: Could we recycle popups id across multiple dock nodes?
if (has_window_menu_button && IsPopupOpen("#WindowMenu")) if (has_window_menu_button && IsPopupOpen("#WindowMenu"))
{ {
if (ImGuiID tab_id = DockNodeUpdateWindowMenu(node, tab_bar)) if (ImGuiID tab_id = DockNodeUpdateWindowMenu(node, tab_bar))
@ -12818,7 +12818,7 @@ static void ImGui::DockNodeUpdateTabBar(ImGuiDockNode* node, ImGuiWindow* host_w
int tabs_unsorted_start = tab_bar->Tabs.Size; int tabs_unsorted_start = tab_bar->Tabs.Size;
for (int tab_n = tab_bar->Tabs.Size - 1; tab_n >= 0 && (tab_bar->Tabs[tab_n].Flags & ImGuiTabItemFlags_Unsorted); tab_n--) for (int tab_n = tab_bar->Tabs.Size - 1; tab_n >= 0 && (tab_bar->Tabs[tab_n].Flags & ImGuiTabItemFlags_Unsorted); tab_n--)
{ {
// FIXME-DOCKING: Consider only clearing the flag after the tab has been alive for a few consecutive frames, allowing late comers to not break sorting? // FIXME-DOCK: Consider only clearing the flag after the tab has been alive for a few consecutive frames, allowing late comers to not break sorting?
tab_bar->Tabs[tab_n].Flags &= ~ImGuiTabItemFlags_Unsorted; tab_bar->Tabs[tab_n].Flags &= ~ImGuiTabItemFlags_Unsorted;
tabs_unsorted_start = tab_n; tabs_unsorted_start = tab_n;
} }
@ -13747,7 +13747,7 @@ void ImGui::DockSpace(ImGuiID id, const ImVec2& size_arg, ImGuiDockNodeFlags fla
SetNextWindowSize(node->Size); SetNextWindowSize(node->Size);
g.NextWindowData.PosUndock = false; g.NextWindowData.PosUndock = false;
// FIXME-DOCKING: Why do we need a child window to host a dockspace, could we host it in the existing window? // FIXME-DOCK Why do we need a child window to host a dockspace, could we host it in the existing window?
ImGuiWindowFlags window_flags = ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_DockNodeHost; ImGuiWindowFlags window_flags = ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_DockNodeHost;
window_flags |= ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar; window_flags |= ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar;
window_flags |= ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse; window_flags |= ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse;
@ -14674,13 +14674,14 @@ static void ImGui::DockSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettings
buf->appendf("%*s", ImMax(2, (line_start_pos + 92) - buf->size()), ""); // Align everything buf->appendf("%*s", ImMax(2, (line_start_pos + 92) - buf->size()), ""); // Align everything
if (node->IsDockSpace() && node->HostWindow && node->HostWindow->ParentWindow) if (node->IsDockSpace() && node->HostWindow && node->HostWindow->ParentWindow)
buf->appendf(" ; in '%s'", node->HostWindow->ParentWindow->Name); buf->appendf(" ; in '%s'", node->HostWindow->ParentWindow->Name);
// Iterate settings so we can give info about windows that didn't exist during the session.
int contains_window = 0; int contains_window = 0;
for (int window_n = 0; window_n < ctx->SettingsWindows.Size; window_n++) // Iterate settings so we can give info about windows that didn't exist during the session. for (ImGuiWindowSettings* settings = g.SettingsWindows.begin(); settings != NULL; settings = g.SettingsWindows.next_chunk(settings))
if (ctx->SettingsWindows[window_n].DockId == node_settings->ID) if (settings->DockId == node_settings->ID)
{ {
if (contains_window++ == 0) if (contains_window++ == 0)
buf->appendf(" ; contains "); buf->appendf(" ; contains ");
buf->appendf("'%s' ", ctx->SettingsWindows[window_n].Name); buf->appendf("'%s' ", settings->GetName());
} }
} }
#endif #endif