Docking: Made close button enable logic consistent on dockspace. When no docked window have a close button or it is disabled on the node, the space is given to tabs.

Clarified close_button_is_visible vs close_button_is_enabled behavior in DockNodeUpdateTabBar().. (#3633, #3521)
Reduced alpha of disabled close button a little bit further.
Removed 'EnableCloseButton' which was actually unused (can't be infered early, need ->VisibleWindow anyway, which is not == ->ActiveWindow)
docking
ocornut 4 years ago
parent 7180e9ac66
commit 3d75f438bc

@ -12838,7 +12838,7 @@ ImGuiDockNode::ImGuiDockNode(ImGuiID id)
AuthorityForPos = AuthorityForSize = ImGuiDataAuthority_DockNode; AuthorityForPos = AuthorityForSize = ImGuiDataAuthority_DockNode;
AuthorityForViewport = ImGuiDataAuthority_Auto; AuthorityForViewport = ImGuiDataAuthority_Auto;
IsVisible = true; IsVisible = true;
IsFocused = HasCloseButton = HasWindowMenuButton = EnableCloseButton = false; IsFocused = HasCloseButton = HasWindowMenuButton = false;
WantCloseAll = WantLockSizeOnce = WantMouseMove = WantHiddenTabBarUpdate = WantHiddenTabBarToggle = false; WantCloseAll = WantLockSizeOnce = WantMouseMove = WantHiddenTabBarUpdate = WantHiddenTabBarToggle = false;
MarkedForPosSizeWrite = false; MarkedForPosSizeWrite = false;
} }
@ -13148,6 +13148,7 @@ static void ImGui::DockNodeUpdateVisibleFlagAndInactiveChilds(ImGuiDockNode* nod
} }
else else
{ {
// FIXME-DOCKING: Missing policies for conflict resolution, hence the "Experimental" tag on this.
node->LocalFlags &= ~window->WindowClass.DockNodeFlagsOverrideClear; node->LocalFlags &= ~window->WindowClass.DockNodeFlagsOverrideClear;
node->LocalFlags |= window->WindowClass.DockNodeFlagsOverrideSet; node->LocalFlags |= window->WindowClass.DockNodeFlagsOverrideSet;
} }
@ -13272,7 +13273,7 @@ static void ImGui::DockNodeUpdate(ImGuiDockNode* node)
node->State = ImGuiDockNodeState_HostWindowHiddenBecauseSingleWindow; node->State = ImGuiDockNodeState_HostWindowHiddenBecauseSingleWindow;
node->WantCloseAll = false; node->WantCloseAll = false;
node->WantCloseTabId = 0; node->WantCloseTabId = 0;
node->HasCloseButton = node->HasWindowMenuButton = node->EnableCloseButton = false; node->HasCloseButton = node->HasWindowMenuButton = false;
node->LastFrameActive = g.FrameCount; node->LastFrameActive = g.FrameCount;
if (node->WantMouseMove && node->Windows.Size == 1) if (node->WantMouseMove && node->Windows.Size == 1)
@ -13307,6 +13308,19 @@ static void ImGui::DockNodeUpdate(ImGuiDockNode* node)
const ImGuiDockNodeFlags node_flags = node->GetMergedFlags(); const ImGuiDockNodeFlags node_flags = node->GetMergedFlags();
// 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->HasCloseButton = false;
for (int window_n = 0; window_n < node->Windows.Size; window_n++)
{
// FIXME-DOCK: Setting DockIsActive here means that for single active window in a leaf node, DockIsActive will be cleared until the next Begin() call.
ImGuiWindow* window = node->Windows[window_n];
node->HasCloseButton |= window->HasCloseButton;
window->DockIsActive = (node->Windows.Size > 1);
}
if (node_flags & ImGuiDockNodeFlags_NoCloseButton)
node->HasCloseButton = false;
// Bind or create host window // Bind or create host window
ImGuiWindow* host_window = NULL; ImGuiWindow* host_window = NULL;
bool beginned_into_host_window = false; bool beginned_into_host_window = false;
@ -13314,25 +13328,11 @@ static void ImGui::DockNodeUpdate(ImGuiDockNode* node)
{ {
// [Explicit root dockspace node] // [Explicit root dockspace node]
IM_ASSERT(node->HostWindow); IM_ASSERT(node->HostWindow);
node->EnableCloseButton = false;
node->HasCloseButton = (node_flags & ImGuiDockNodeFlags_NoCloseButton) == 0;
node->HasWindowMenuButton = (node_flags & ImGuiDockNodeFlags_NoWindowMenuButton) == 0;
host_window = node->HostWindow; host_window = node->HostWindow;
} }
else else
{ {
// [Automatic root or child nodes] // [Automatic root or child nodes]
node->EnableCloseButton = false;
node->HasCloseButton = (node->Windows.Size > 0) && (node_flags & ImGuiDockNodeFlags_NoCloseButton) == 0;
node->HasWindowMenuButton = (node->Windows.Size > 0) && (node_flags & ImGuiDockNodeFlags_NoWindowMenuButton) == 0;
for (int window_n = 0; window_n < node->Windows.Size; window_n++)
{
// FIXME-DOCK: Setting DockIsActive here means that for single active window in a leaf node, DockIsActive will be cleared until the next Begin() call.
ImGuiWindow* window = node->Windows[window_n];
window->DockIsActive = (node->Windows.Size > 1);
node->EnableCloseButton |= window->HasCloseButton;
}
if (node->IsRootNode() && node->IsVisible) if (node->IsRootNode() && node->IsVisible)
{ {
ImGuiWindow* ref_window = (node->Windows.Size > 0) ? node->Windows[0] : NULL; ImGuiWindow* ref_window = (node->Windows.Size > 0) ? node->Windows[0] : NULL;
@ -13638,7 +13638,6 @@ static void ImGui::DockNodeUpdateTabBar(ImGuiDockNode* node, ImGuiWindow* host_w
const ImGuiDockNodeFlags node_flags = node->GetMergedFlags(); const ImGuiDockNodeFlags node_flags = node->GetMergedFlags();
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);
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 across multiple dock nodes? // FIXME-DOCK FIXME-OPT: Could we recycle popups id across multiple dock nodes?
@ -13764,12 +13763,15 @@ static void ImGui::DockNodeUpdateTabBar(ImGuiDockNode* node, ImGuiWindow* host_w
// Close button (after VisibleWindow was updated) // Close button (after VisibleWindow was updated)
// Note that VisibleWindow may have been overrided by CTRL+Tabbing, so VisibleWindow->ID may be != from tab_bar->SelectedTabId // Note that VisibleWindow may have been overrided by CTRL+Tabbing, so VisibleWindow->ID may be != from tab_bar->SelectedTabId
if (has_close_button && node->VisibleWindow) const bool close_button_is_enabled = node->HasCloseButton && node->VisibleWindow && node->VisibleWindow->HasCloseButton;
const bool close_button_is_visible = node->HasCloseButton;
//const bool close_button_is_visible = close_button_is_enabled; // Most people would expect this behavior of not even showing the button (leaving a hole since we can't claim that space as other windows in the tba bar have one)
if (close_button_is_visible)
{ {
if (!node->VisibleWindow->HasCloseButton) if (!close_button_is_enabled)
{ {
PushItemFlag(ImGuiItemFlags_Disabled, true); PushItemFlag(ImGuiItemFlags_Disabled, true);
PushStyleColor(ImGuiCol_Text, style.Colors[ImGuiCol_Text] * ImVec4(1.0f,1.0f,1.0f,0.5f)); PushStyleColor(ImGuiCol_Text, style.Colors[ImGuiCol_Text] * ImVec4(1.0f,1.0f,1.0f,0.4f));
} }
const float button_sz = g.FontSize; const float button_sz = g.FontSize;
if (CloseButton(host_window->GetID("#CLOSE"), title_bar_rect.GetTR() + ImVec2(-style.FramePadding.x * 2.0f - button_sz, 0.0f))) if (CloseButton(host_window->GetID("#CLOSE"), title_bar_rect.GetTR() + ImVec2(-style.FramePadding.x * 2.0f - button_sz, 0.0f)))
@ -13780,7 +13782,7 @@ static void ImGui::DockNodeUpdateTabBar(ImGuiDockNode* node, ImGuiWindow* host_w
} }
//if (IsItemActive()) //if (IsItemActive())
// focus_tab_id = tab_bar->SelectedTabId; // focus_tab_id = tab_bar->SelectedTabId;
if (!node->VisibleWindow->HasCloseButton) if (!close_button_is_enabled)
{ {
PopStyleColor(); PopStyleColor();
PopItemFlag(); PopItemFlag();

@ -1233,9 +1233,8 @@ struct ImGuiDockNode
ImGuiDataAuthority AuthorityForViewport :3; ImGuiDataAuthority AuthorityForViewport :3;
bool IsVisible :1; // Set to false when the node is hidden (usually disabled as it has no active window) bool IsVisible :1; // Set to false when the node is hidden (usually disabled as it has no active window)
bool IsFocused :1; bool IsFocused :1;
bool HasCloseButton :1; bool HasCloseButton :1; // Provide space for a close button (if any of the docked window has one). Note that button may be hidden on window without one.
bool HasWindowMenuButton :1; bool HasWindowMenuButton :1;
bool EnableCloseButton :1;
bool WantCloseAll :1; // Set when closing all tabs at once. bool WantCloseAll :1; // Set when closing all tabs at once.
bool WantLockSizeOnce :1; bool WantLockSizeOnce :1;
bool WantMouseMove :1; // After a node extraction we need to transition toward moving the newly created host window bool WantMouseMove :1; // After a node extraction we need to transition toward moving the newly created host window

Loading…
Cancel
Save