@ -9832,7 +9832,7 @@ static ImGuiDockNode* ImGui::DockContextAddNode(ImGuiContext* ctx, ImGuiID id)
}
IM_ASSERT ( DockContextFindNodeByID ( ctx , id ) = = NULL ) ;
ImGuiDockNode * node = IM_NEW ( ImGuiDockNode ) ( id ) ;
node - > InitFromFirstWindow = true ;
node - > InitFromFirstWindow PosSize = node - > InitFromFirstWindowViewport = true ;
ctx - > DockContext - > Nodes . SetVoidPtr ( node - > ID , node ) ;
return node ;
}
@ -10220,8 +10220,9 @@ void ImGui::DockContextProcessUndockNode(ImGuiContext* ctx, ImGuiDockNode* node)
int index_in_parent = ( node - > ParentNode - > ChildNodes [ 0 ] = = node ) ? 0 : 1 ;
node - > ParentNode - > ChildNodes [ index_in_parent ] = NULL ;
DockNodeTreeMerge ( ctx , node - > ParentNode , node - > ParentNode - > ChildNodes [ index_in_parent ^ 1 ] ) ;
node - > ParentNode - > InitFromFirstWindowViewport = true ; // The node that stays in place keeps the viewport, so our newly dragged out node will create a new viewport
node - > ParentNode = NULL ;
node - > InitFromFirstWindow = true ;
node - > InitFromFirstWindow PosSize = true ;
node - > WantMouseMove = true ;
}
MarkIniSettingsDirty ( ) ;
@ -10246,7 +10247,8 @@ ImGuiDockNode::ImGuiDockNode(ImGuiID id)
SelectedTabID = 0 ;
WantCloseTabID = 0 ;
IsVisible = true ;
InitFromFirstWindow = IsDockSpace = IsDocumentRoot = HasCloseButton = HasCollapseButton = WantCloseAll = WantLockSizeOnce = WantMouseMove = false ;
InitFromFirstWindowPosSize = InitFromFirstWindowViewport = false ;
IsDockSpace = IsDocumentRoot = HasCloseButton = HasCollapseButton = WantCloseAll = WantLockSizeOnce = WantMouseMove = false ;
}
ImGuiDockNode : : ~ ImGuiDockNode ( )
@ -10292,7 +10294,7 @@ static void ImGui::DockNodeAddWindow(ImGuiDockNode* node, ImGuiWindow* window, b
// When reactivating a node from two loose window, the target window pos/size are authoritative
if ( node - > Windows . Size = = 2 & & ! node - > IsDockSpace )
node - > InitFromFirstWindow = true ;
node - > InitFromFirstWindow PosSize = node - > InitFromFirstWindowViewport = true ;
// Add to tab bar if requested
if ( add_to_tab_bar )
@ -10358,12 +10360,12 @@ static void ImGui::DockNodeRemoveWindow(ImGuiDockNode* node, ImGuiWindow* window
if ( node - > Windows . Size = = 1 & & ! node - > IsDocumentRoot & & node - > HostWindow )
{
ImGuiWindow * remaining_window = node - > Windows [ 0 ] ;
if ( node - > HostWindow - > ViewportOwned )
if ( node - > HostWindow - > ViewportOwned & & node - > IsRootNode ( ) )
{
// Transfer viewport back to the remaining loose window
IM_ASSERT ( node - > HostWindow - > Viewport - > Window = = node - > HostWindow ) ;
node - > HostWindow - > Viewport - > Window = node- > Windows [ 0 ] ;
node - > HostWindow - > Viewport - > ID = node- > Windows [ 0 ] - > ID ;
node - > HostWindow - > Viewport - > Window = remaining_window ;
node - > HostWindow - > Viewport - > ID = remaining_window - > ID ;
}
remaining_window - > Collapsed = node - > HostWindow - > Collapsed ;
}
@ -10557,22 +10559,29 @@ static void ImGui::DockNodeUpdate(ImGuiDockNode* node)
if ( node - > IsRootNode ( ) & & node - > Windows . Size = = 1 & & ! node - > IsDockSpace )
{
// Floating window pos/size is authoritative
node - > Pos = node - > Windows [ 0 ] - > Pos ;
node - > Size = node - > Windows [ 0 ] - > SizeFull ;
ImGuiWindow * single_window = node - > Windows [ 0 ] ;
node - > Pos = single_window - > Pos ;
node - > Size = single_window - > SizeFull ;
// Transfer focus immediately so when we revert to a regular window it is immediately selected
if ( node - > HostWindow & & g . NavWindow = = node - > HostWindow )
FocusWindow ( node - > Windows [ 0 ] ) ;
FocusWindow ( single_window ) ;
if ( node - > HostWindow )
{
single_window - > Viewport = node - > HostWindow - > Viewport ;
single_window - > ViewportId = node - > HostWindow - > ViewportId ;
single_window - > Viewport - > Window = single_window ;
}
DockNodeHideHostWindow ( node ) ;
node - > InitFromFirstWindow = false ;
node - > InitFromFirstWindow PosSize = node - > InitFromFirstWindowViewport = false ;
node - > WantCloseAll = false ;
node - > WantCloseTabID = 0 ;
node - > HasCloseButton = node - > HasCollapseButton = false ;
node - > LastFrameActive = g . FrameCount ;
if ( node - > WantMouseMove )
DockNodeStartMouseMovingWindow ( node , node- > Windows [ 0 ] ) ;
DockNodeStartMouseMovingWindow ( node , single_window ) ;
return ;
}
@ -10600,12 +10609,11 @@ static void ImGui::DockNodeUpdate(ImGuiDockNode* node)
if ( node - > IsRootNode ( ) & & node - > IsVisible )
{
if ( node - > InitFromFirstWindow & & node - > Windows . Size > 0 )
if ( node - > InitFromFirstWindow PosSize & & node - > Windows . Size > 0 )
{
ImGuiWindow * init_window = node - > Windows [ 0 ] ;
SetNextWindowPos ( init_window - > Pos ) ;
SetNextWindowSize ( init_window - > SizeFull ) ;
SetNextWindowViewport ( init_window - > ViewportId ) ;
SetNextWindowCollapsed ( init_window - > Collapsed ) ;
}
else if ( node - > HostWindow = = NULL )
@ -10614,6 +10622,8 @@ static void ImGui::DockNodeUpdate(ImGuiDockNode* node)
SetNextWindowPos ( node - > Pos ) ;
SetNextWindowSize ( node - > Size ) ;
}
if ( node - > InitFromFirstWindowViewport & & node - > Windows . Size > 0 )
SetNextWindowViewport ( node - > Windows [ 0 ] - > ViewportId ) ;
// Begin into the host window
char window_label [ 20 ] ;
@ -10637,7 +10647,7 @@ static void ImGui::DockNodeUpdate(ImGuiDockNode* node)
{
node - > HostWindow = host_window = node - > ParentNode - > HostWindow ;
}
node - > InitFromFirstWindow = false ;
node - > InitFromFirstWindow PosSize = node - > InitFromFirstWindowViewport = false ;
if ( node - > WantMouseMove & & node - > HostWindow )
DockNodeStartMouseMovingWindow ( node , node - > HostWindow ) ;
}
@ -11239,7 +11249,7 @@ void ImGui::DockNodeTreeMerge(ImGuiContext* ctx, ImGuiDockNode* parent_node, ImG
if ( child_1 )
DockNodeMoveWindows ( parent_node , child_1 ) ;
DockNodeApplyPosSizeToWindows ( parent_node ) ;
parent_node - > InitFromFirstWindow = false ;
parent_node - > InitFromFirstWindow PosSize = parent_node - > InitFromFirstWindowViewport = false ;
parent_node - > VisibleWindow = merge_lead_child - > VisibleWindow ;
parent_node - > IsDocumentRoot = ( child_0 & & child_0 - > IsDocumentRoot ) | | ( child_1 & & child_1 - > IsDocumentRoot ) ;
parent_node - > SizeRef = backup_last_explicit_size ;