@ -3657,7 +3657,8 @@ static const ImGuiLocEntry GLocalizationEntriesEnUS[] =
{ ImGuiLocKey_WindowingPopup , " (Popup) " } ,
{ ImGuiLocKey_WindowingUntitled , " (Untitled) " } ,
{ ImGuiLocKey_DockingHideTabBar , " Hide tab bar###HideTabBar " } ,
{ ImGuiLocKey_DockingHoldShiftToDock , " Hold SHIFT to enable Docking window. " } ,
{ ImGuiLocKey_DockingHoldShiftToDock , " Hold SHIFT to enable Docking window. " } ,
{ ImGuiLocKey_DockingDragToUndockOrMoveNode , " Click and drag to move or undock whole node. " } ,
} ;
void ImGui : : Initialize ( )
@ -4489,26 +4490,23 @@ void ImGui::StartMouseMovingWindow(ImGuiWindow* window)
g . MovingWindow = window ;
}
// We use 'undock_floating_node == false' when dragging from title bar to allow moving groups of floating nodes without undocking them.
// - undock_floating_node == true: when dragging from a floating node within a hierarchy, always undock the node.
// - undock_floating_node == false: when dragging from a floating node within a hierarchy, move root window.
void ImGui : : StartMouseMovingWindowOrNode ( ImGuiWindow * window , ImGuiDockNode * node , bool undock_floating_node )
// We use 'undock == false' when dragging from title bar to allow moving groups of floating nodes without undocking them.
void ImGui : : StartMouseMovingWindowOrNode ( ImGuiWindow * window , ImGuiDockNode * node , bool undock )
{
ImGuiContext & g = * GImGui ;
bool can_undock_node = false ;
if ( node ! = NULL & & node - > VisibleWindow & & ( node - > VisibleWindow - > Flags & ImGuiWindowFlags_NoMove ) = = 0 & & ( node - > MergedFlags & ImGuiDockNodeFlags_NoUndocking ) = = 0 )
if ( undock & & node ! = NULL & & node - > VisibleWindow & & ( node - > VisibleWindow - > Flags & ImGuiWindowFlags_NoMove ) = = 0 & & ( node - > MergedFlags & ImGuiDockNodeFlags_NoUndocking ) = = 0 )
{
// Can undock if:
// - part of a floating node hierarchy with more than one visible node (if only one is visible, we'll just move the whole hierarchy )
// - part of a dockspace node hierarchy (trivia: undocking from a fixed/central node will create a new node and copy windows)
// - part of a hierarchy with more than one visible node (if only one is visible, we'll just move the root window )
// - part of a dockspace node hierarchy: so we can undock the last single visible node too (trivia: undocking from a fixed/central node will create a new node and copy windows)
ImGuiDockNode * root_node = DockNodeGetRootNode ( node ) ;
if ( root_node - > OnlyNodeWithWindows ! = node | | root_node - > CentralNode ! = NULL ) // -V1051 PVS-Studio thinks node should be root_node and is wrong about that.
if ( undock_floating_node | | root_node - > IsDockSpace ( ) )
can_undock_node = true ;
can_undock_node = true ;
}
const bool clicked = IsMouseClicked ( 0 ) ;
const bool dragging = IsMouseDragging ( 0 , g . IO . MouseDragThreshold * 1.70f ) ;
const bool dragging = IsMouseDragging ( 0 ) ;
if ( can_undock_node & & dragging )
DockContextQueueUndockNode ( & g , node ) ; // Will lead to DockNodeStartMouseMovingWindow() -> StartMouseMovingWindow() being called next frame
else if ( ! can_undock_node & & ( clicked | | dragging ) & & g . MovingWindow ! = window )
@ -6445,7 +6443,7 @@ void ImGui::RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar
if ( ButtonBehavior ( r , unhide_id , & hovered , & held , ImGuiButtonFlags_FlattenChildren ) )
node - > WantHiddenTabBarToggle = true ;
else if ( held & & IsMouseDragging ( 0 ) )
StartMouseMovingWindowOrNode ( window , node , true ) ;
StartMouseMovingWindowOrNode ( window , node , true ) ; // Undock from tab-bar triangle = same as window/collapse menu button
// FIXME-DOCK: Ideally we'd use ImGuiCol_TitleBgActive/ImGuiCol_TitleBg here, but neither is guaranteed to be visible enough at this sort of size..
ImU32 col = GetColorU32 ( ( ( held & & hovered ) | | ( node - > IsFocused & & ! hovered ) ) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button ) ;
@ -16887,6 +16885,8 @@ static void ImGui::DockNodeUpdateTabBar(ImGuiDockNode* node, ImGuiWindow* host_w
OpenPopup ( " #WindowMenu " ) ;
if ( IsItemActive ( ) )
focus_tab_id = tab_bar - > SelectedTabId ;
if ( IsItemHovered ( ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_DelayNormal ) & & g . HoveredIdTimer > 0.5f )
SetTooltip ( " %s " , LocalizeGetMsg ( ImGuiLocKey_DockingDragToUndockOrMoveNode ) ) ;
}
// If multiple tabs are appearing on the same frame, sort them based on their persistent DockOrder value
@ -17015,7 +17015,7 @@ static void ImGui::DockNodeUpdateTabBar(ImGuiDockNode* node, ImGuiWindow* host_w
ImGuiID title_bar_id = host_window - > GetID ( " #TITLEBAR " ) ;
if ( g . HoveredId = = 0 | | g . HoveredId = = title_bar_id | | g . ActiveId = = title_bar_id )
{
// AllowItem mode required for appending into dock node tab bar,
// AllowOverlap mode required for appending into dock node tab bar,
// otherwise dragging window will steal HoveredId and amended tabs cannot get them.
bool held ;
KeepAliveID ( title_bar_id ) ;
@ -17031,7 +17031,7 @@ static void ImGui::DockNodeUpdateTabBar(ImGuiDockNode* node, ImGuiWindow* host_w
// Forward moving request to selected window
if ( ImGuiTabItem * tab = TabBarFindTabByID ( tab_bar , tab_bar - > SelectedTabId ) )
StartMouseMovingWindowOrNode ( tab - > Window ? tab - > Window : node - > HostWindow , node , false ) ;
StartMouseMovingWindowOrNode ( tab - > Window ? tab - > Window : node - > HostWindow , node , false ) ; // Undock from tab bar empty space
}
}