@ -6108,7 +6108,10 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
// Synchronize window --> viewport in most situations
// Synchronize viewport -> window in case the platform window has been moved or resized from the OS/WM
if ( window - > Viewport - > PlatformRequestMove )
{
window - > Pos = window - > Viewport - > Pos ;
MarkIniSettingsDirty ( window ) ;
}
else if ( memcmp ( & window - > Viewport - > Pos , & window - > Pos , sizeof ( window - > Pos ) ) ! = 0 )
{
viewport_rect_changed = true ;
@ -6116,7 +6119,10 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
}
if ( window - > Viewport - > PlatformRequestResize )
{
window - > Size = window - > SizeFull = window - > Viewport - > Size ;
MarkIniSettingsDirty ( window ) ;
}
else if ( memcmp ( & window - > Viewport - > Size , & window - > Size , sizeof ( window - > Size ) ) ! = 0 )
{
viewport_rect_changed = true ;
@ -6453,7 +6459,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
{
window - > Viewport - > PlatformRequestClose = false ;
g . NavWindowingToggleLayer = false ; // Assume user mapped PlatformRequestClose on ALT-F4 so we disable ALT for menu toggle. False positive not an issue.
//IMGUI_DEBUG_LOG("Window '%s' PlatformRequestClose\n", window->Name);
IMGUI_DEBUG_LOG_VIEWPORT ( " Window '%s' PlatformRequestClose \n " , window - > Name ) ;
* p_open = false ;
}
}
@ -10259,7 +10265,7 @@ void ImGui::SetCurrentViewport(ImGuiWindow* current_window, ImGuiViewportP* view
if ( g . CurrentViewport = = viewport )
return ;
g . CurrentViewport = viewport ;
//IMGUI_DEBUG_LOG ("SetCurrentViewport changed '%s' 0x%08X\n", current_window ? current_window->Name : NULL, viewport ? viewport->ID : 0);
//IMGUI_DEBUG_LOG _VIEWPORT ("SetCurrentViewport changed '%s' 0x%08X\n", current_window ? current_window->Name : NULL, viewport ? viewport->ID : 0);
// Notify platform layer of viewport changes
// FIXME-DPI: This is only currently used for experimenting with handling of multiple DPI
@ -10414,7 +10420,7 @@ static void ImGui::UpdateViewportsNewFrame()
g . Viewports . erase ( g . Viewports . Data + n ) ;
// Destroy
//IMGUI_DEBUG_LOG("Delete Viewport %08X (%s)\n", viewport->ID, viewport->Window ? viewport->Window->Name : "n/a");
IMGUI_DEBUG_LOG_VIEWPORT ( " Delete Viewport %08X (%s) \n " , viewport - > ID , viewport - > Window ? viewport - > Window - > Name : " n/a " ) ;
DestroyPlatformWindow ( viewport ) ; // In most circumstances the platform window will already be destroyed here.
IM_ASSERT ( g . PlatformIO . Viewports . contains ( viewport ) = = false ) ;
IM_DELETE ( viewport ) ;
@ -10585,7 +10591,7 @@ ImGuiViewportP* ImGui::AddUpdateViewport(ImGuiWindow* window, ImGuiID id, const
viewport - > Flags = flags ;
UpdateViewportPlatformMonitor ( viewport ) ;
g . Viewports . push_back ( viewport ) ;
//IMGUI_DEBUG_LOG("Add Viewport %08X (%s)\n", id, window->Name);
IMGUI_DEBUG_LOG_VIEWPORT ( " Add Viewport %08X (%s) \n " , id , window - > Name ) ;
// We normally setup for all viewports in NewFrame() but here need to handle the mid-frame creation of a new viewport.
// We need to extend the fullscreen clip rect so the OverlayDrawList clip is correct for that the first frame
@ -10709,7 +10715,7 @@ static void ImGui::UpdateSelectWindowViewport(ImGuiWindow* window)
if ( ( window - > Flags & ImGuiWindowFlags_DockNodeHost ) & & window - > Viewport - > LastFrameActive < g . FrameCount & & will_be_visible )
{
// Steal/transfer ownership
//IMGUI_DEBUG_LOG("[%05d] Window '%s' steal Viewport %08X from Window '%s'\n", g.FrameCount, window->Name, window->Viewport->ID, window->Viewport->Window->Name);
IMGUI_DEBUG_LOG_VIEWPORT ( " Window '%s' steal Viewport %08X from Window '%s' \n " , window - > Name , window - > Viewport - > ID , window - > Viewport - > Window - > Name ) ;
window - > Viewport - > Window = window ;
window - > Viewport - > ID = window - > ID ;
window - > Viewport - > LastNameHash = 0 ;
@ -10773,7 +10779,7 @@ void ImGui::UpdatePlatformWindows()
bool is_new_platform_window = ( viewport - > PlatformWindowCreated = = false ) ;
if ( is_new_platform_window )
{
//IMGUI_DEBUG_LOG("Create Platform Window %08X (%s)\n", viewport->ID, viewport->Window ? viewport->Window->Name : "n/a");
IMGUI_DEBUG_LOG_VIEWPORT ( " Create Platform Window %08X (%s) \n " , viewport - > ID , viewport - > Window ? viewport - > Window - > Name : " n/a " ) ;
g . PlatformIO . Platform_CreateWindow ( viewport ) ;
if ( g . PlatformIO . Renderer_CreateWindow ! = NULL )
g . PlatformIO . Renderer_CreateWindow ( viewport ) ;
@ -11187,7 +11193,7 @@ void ImGui::DockContextClearNodes(ImGuiContext* ctx, ImGuiID root_id, bool clear
// This function also acts as a defacto test to make sure we can rebuild from scratch without a glitch
void ImGui : : DockContextRebuild ( ImGuiContext * ctx )
{
//IMGUI_DEBUG_LOG("[docking] full rebuild\n");
IMGUI_DEBUG_LOG_DOCKING ( " DockContextRebuild() \n " ) ;
ImGuiDockContext * dc = ctx - > DockContext ;
SaveIniSettingsToMemory ( ) ;
ImGuiID root_id = 0 ; // Rebuild all
@ -11284,6 +11290,7 @@ static ImGuiDockNode* ImGui::DockContextAddNode(ImGuiContext* ctx, ImGuiID id)
id = DockContextGenNodeID ( ctx ) ;
else
IM_ASSERT ( DockContextFindNodeByID ( ctx , id ) = = NULL ) ;
IMGUI_DEBUG_LOG_DOCKING ( " DockContextAddNode 0x%08X \n " , id ) ;
ImGuiDockNode * node = IM_NEW ( ImGuiDockNode ) ( id ) ;
ctx - > DockContext - > Nodes . SetVoidPtr ( node - > ID , node ) ;
return node ;
@ -11294,7 +11301,7 @@ static void ImGui::DockContextRemoveNode(ImGuiContext* ctx, ImGuiDockNode* node,
ImGuiContext & g = * ctx ;
ImGuiDockContext * dc = ctx - > DockContext ;
//printf("[%05d] RemoveNode 0x%04X\n", node->ID);
IMGUI_DEBUG_LOG_DOCKING ( " DockContextRemoveNode 0x%08X \n " , node - > ID ) ;
IM_ASSERT ( DockContextFindNodeByID ( ctx , node - > ID ) = = node ) ;
IM_ASSERT ( node - > ChildNodes [ 0 ] = = NULL & & node - > ChildNodes [ 1 ] = = NULL ) ;
IM_ASSERT ( node - > Windows . Size = = 0 ) ;
@ -11380,6 +11387,7 @@ static void ImGui::DockContextPruneUnusedSettingsNodes(ImGuiContext* ctx)
remove | = ( data_root - > CountChildWindows = = 0 ) ;
if ( remove )
{
IMGUI_DEBUG_LOG_DOCKING ( " DockContextPruneUnusedSettingsNodes: Prune 0x%08X \n " , settings - > ID ) ;
DockSettingsRemoveNodeReferences ( & settings - > ID , 1 ) ;
settings - > ID = 0 ;
}
@ -11488,6 +11496,10 @@ void ImGui::DockContextProcessDock(ImGuiContext* ctx, ImGuiDockRequest* req)
ImGuiWindow * payload_window = req - > DockPayload ; // Optional
ImGuiWindow * target_window = req - > DockTargetWindow ;
ImGuiDockNode * node = req - > DockTargetNode ;
if ( payload_window )
IMGUI_DEBUG_LOG_DOCKING ( " DockContextProcessDock node 0x%08X target '%s' dock window '%s', split_dir %d \n " , node ? node - > ID : 0 , target_window ? target_window - > Name : " NULL " , payload_window ? payload_window - > Name : " NULL " , req - > DockSplitDir ) ;
else
IMGUI_DEBUG_LOG_DOCKING ( " DockContextProcessDock node 0x%08X, split_dir %d \n " , node ? node - > ID : 0 , req - > DockSplitDir ) ;
// Decide which Tab will be selected at the end of the operation
ImGuiID next_selected_id = 0 ;
@ -11726,6 +11738,7 @@ static void ImGui::DockNodeAddWindow(ImGuiDockNode* node, ImGuiWindow* window, b
DockNodeRemoveWindow ( window - > DockNode , window , 0 ) ;
}
IM_ASSERT ( window - > DockNode = = NULL | | window - > DockNodeAsHost = = NULL ) ;
IMGUI_DEBUG_LOG_DOCKING ( " DockNodeAddWindow node 0x%08X window '%s' \n " , node - > ID , window - > Name ) ;
node - > Windows . push_back ( window ) ;
node - > WantHiddenTabBarUpdate = true ;
@ -11783,6 +11796,7 @@ static void ImGui::DockNodeRemoveWindow(ImGuiDockNode* node, ImGuiWindow* window
//IM_ASSERT(window->RootWindow == node->HostWindow);
//IM_ASSERT(window->LastFrameActive < g.FrameCount); // We may call this from Begin()
IM_ASSERT ( save_dock_id = = 0 | | save_dock_id = = node - > ID ) ;
IMGUI_DEBUG_LOG_DOCKING ( " DockNodeRemoveWindow node 0x%08X window '%s' \n " , node - > ID , window - > Name ) ;
window - > DockNode = NULL ;
window - > DockIsActive = window - > DockTabWantClose = false ;
@ -12454,12 +12468,18 @@ static void ImGui::DockNodeUpdateTabBar(ImGuiDockNode* node, ImGuiWindow* host_w
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 - - )
{
// 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?
tab_bar - > Tabs [ tab_n ] . Flags & = ~ ImGuiTabItemFlags_Unsorted ;
tabs_unsorted_start = tab_n ;
}
//printf("[%05d] Sorting %d new appearing tabs\n", g.FrameCount, tab_bar->Tabs.Size - tabs_unsorted_start);
if ( tab_bar - > Tabs . Size > tabs_unsorted_start )
{
IMGUI_DEBUG_LOG_DOCKING ( " In node 0x%08X: %d new appearing tabs:%s \n " , node - > ID , tab_bar - > Tabs . Size - tabs_unsorted_start , ( tab_bar - > Tabs . Size > tabs_unsorted_start + 1 ) ? " (will sort) " : " " ) ;
for ( int tab_n = tabs_unsorted_start ; tab_n < tab_bar - > Tabs . Size ; tab_n + + )
IMGUI_DEBUG_LOG_DOCKING ( " - Tab '%s' Order %d \n " , tab_bar - > Tabs [ tab_n ] . Window - > Name , tab_bar - > Tabs [ tab_n ] . Window - > DockOrder ) ;
if ( tab_bar - > Tabs . Size > tabs_unsorted_start + 1 )
ImQsort ( tab_bar - > Tabs . Data + tabs_unsorted_start , tab_bar - > Tabs . Size - tabs_unsorted_start , sizeof ( ImGuiTabItem ) , TabItemComparerByDockOrder ) ;
}
// Selected newly added tabs, or persistent tab ID if the tab bar was just recreated
if ( tab_bar_is_recreated & & TabBarFindTabByID ( tab_bar , node - > SelectedTabID ) ! = NULL )
@ -12985,6 +13005,7 @@ void ImGui::DockNodeTreeMerge(ImGuiContext* ctx, ImGuiDockNode* parent_node, ImG
IM_ASSERT ( parent_node - > TabBar = = NULL ) ;
IM_ASSERT ( parent_node - > Windows . Size = = 0 ) ;
}
IMGUI_DEBUG_LOG_DOCKING ( " DockNodeTreeMerge 0x%08X & 0x%08X back into parent 0x%08X \n " , child_0 ? child_0 - > ID : 0 , child_1 ? child_1 - > ID : 0 , parent_node - > ID ) ;
ImVec2 backup_last_explicit_size = parent_node - > SizeRef ;
DockNodeMoveChildNodes ( parent_node , merge_lead_child ) ;
@ -13316,9 +13337,12 @@ void ImGui::DockSpace(ImGuiID id, const ImVec2& size_arg, ImGuiDockNodeFlags fla
ImGuiDockNode * node = DockContextFindNodeByID ( ctx , id ) ;
if ( ! node )
{
IMGUI_DEBUG_LOG_DOCKING ( " DockSpace: dockspace node 0x%08X created \n " , id ) ;
node = DockContextAddNode ( ctx , id ) ;
node - > LocalFlags | = ImGuiDockNodeFlags_CentralNode ;
}
if ( window_class & & window_class - > ClassId ! = node - > WindowClass . ClassId )
IMGUI_DEBUG_LOG_DOCKING ( " DockSpace: dockspace node 0x%08X: setup WindowClass 0x%08X -> 0x%08X \n " , id , node - > WindowClass . ClassId , window_class - > ClassId ) ;
node - > SharedFlags = flags ;
node - > WindowClass = window_class ? * window_class : ImGuiWindowClass ( ) ;
@ -13352,6 +13376,7 @@ void ImGui::DockSpace(ImGuiID id, const ImVec2& size_arg, ImGuiDockNodeFlags fla
SetNextWindowSize ( node - > Size ) ;
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?
ImGuiWindowFlags window_flags = ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_DockNodeHost ;
window_flags | = ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar ;
window_flags | = ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse ;
@ -13611,6 +13636,7 @@ ImGuiID ImGui::DockBuilderSplitNode(ImGuiID id, ImGuiDir split_dir, float size_r
{
ImGuiContext * ctx = GImGui ;
IM_ASSERT ( split_dir ! = ImGuiDir_None ) ;
IMGUI_DEBUG_LOG_DOCKING ( " DockBuilderSplitNode node 0x%08X, split_dir %d \n " , id , split_dir ) ;
ImGuiDockNode * node = DockContextFindNodeByID ( ctx , id ) ;
if ( node = = NULL )
@ -13661,7 +13687,7 @@ static ImGuiDockNode* DockBuilderCopyNodeRec(ImGuiDockNode* src_node, ImGuiID ds
dst_node - > ChildNodes [ child_n ] - > ParentNode = dst_node ;
}
//IMGUI_DEBUG_LOG("Fork node %08X -> %08X (%d childs)\n", src_node->ID, dst_node->ID, dst_node->IsSplitNode() ? 2 : 0);
IMGUI_DEBUG_LOG_DOCKING ( " Fork node %08X -> %08X (%d childs) \n " , src_node - > ID , dst_node - > ID , dst_node - > IsSplitNode ( ) ? 2 : 0 ) ;
return dst_node ;
}
@ -13753,13 +13779,14 @@ void ImGui::DockBuilderCopyDockSpace(ImGuiID src_dockspace_id, ImGuiID dst_docks
if ( dst_dock_id ! = 0 )
{
// Docked windows gets redocked into the new node hierarchy.
//IMGUI_DEBUG_LOG("Remap window '%s' %08X -> %08X\n", dst_window_name, src_dock_id, dst_dock_id);
IMGUI_DEBUG_LOG_DOCKING ( " Remap live window '%s' 0x%08X -> '%s' 0x%08X \n " , src_window_name , src_dock_id , dst_window_name , dst_dock_id ) ;
DockBuilderDockWindow ( dst_window_name , dst_dock_id ) ;
}
else
{
// Floating windows gets their settings transferred (regardless of whether the new window already exist or not)
// When this is leading to a Copy and not a Move, we would get two overlapping floating windows. Could we possibly dock them together?
IMGUI_DEBUG_LOG_DOCKING ( " Remap window settings '%s' -> '%s' \n " , src_window_name , dst_window_name ) ;
DockBuilderCopyWindowSettings ( src_window_name , dst_window_name ) ;
}
}
@ -13778,7 +13805,7 @@ void ImGui::DockBuilderCopyDockSpace(ImGuiID src_dockspace_id, ImGuiID dst_docks
continue ;
// Docked windows gets redocked into the new node hierarchy.
//IMGUI_DEBUG_LOG("Remap window '%s' %08X -> %08X\n", window->Name, src_dock_id, dst_dock_id);
IMGUI_DEBUG_LOG_DOCKING ( " Remap window '%s' %08X -> %08X \n " , window - > Name , src_dock_id , dst_dock_id ) ;
DockBuilderDockWindow ( window - > Name , dst_dock_id ) ;
}
}
@ -14047,6 +14074,7 @@ void ImGui::BeginAsDockableDragDropTarget(ImGuiWindow* window)
static void ImGui : : DockSettingsRenameNodeReferences ( ImGuiID old_node_id , ImGuiID new_node_id )
{
ImGuiContext & g = * GImGui ;
IMGUI_DEBUG_LOG_DOCKING ( " DockSettingsRenameNodeReferences: from 0x%08X -> to 0x%08X \n " , old_node_id , new_node_id ) ;
for ( int window_n = 0 ; window_n < g . Windows . Size ; window_n + + )
{
ImGuiWindow * window = g . Windows [ window_n ] ;
@ -14586,6 +14614,7 @@ void ImGui::ShowMetricsWindow(bool* p_open)
( flags & ImGuiWindowFlags_ChildWindow ) ? " Child " : " " , ( flags & ImGuiWindowFlags_Tooltip ) ? " Tooltip " : " " , ( flags & ImGuiWindowFlags_Popup ) ? " Popup " : " " ,
( flags & ImGuiWindowFlags_Modal ) ? " Modal " : " " , ( flags & ImGuiWindowFlags_ChildMenu ) ? " ChildMenu " : " " , ( flags & ImGuiWindowFlags_NoSavedSettings ) ? " NoSavedSettings " : " " ,
( flags & ImGuiWindowFlags_NoMouseInputs ) ? " NoMouseInputs " : " " , ( flags & ImGuiWindowFlags_NoNavInputs ) ? " NoNavInputs " : " " , ( flags & ImGuiWindowFlags_AlwaysAutoResize ) ? " AlwaysAutoResize " : " " ) ;
ImGui : : BulletText ( " WindowClassId: 0x%08X " , window - > WindowClass . ClassId ) ;
ImGui : : BulletText ( " Scroll: (%.2f/%.2f,%.2f/%.2f) " , window - > Scroll . x , window - > ScrollMax . x , window - > Scroll . y , window - > ScrollMax . y ) ;
ImGui : : BulletText ( " Active: %d/%d, WriteAccessed: %d, BeginOrderWithinContext: %d " , window - > Active , window - > WasActive , window - > WriteAccessed , ( window - > Active | | window - > WasActive ) ? window - > BeginOrderWithinContext : - 1 ) ;
ImGui : : BulletText ( " Appearing: %d, Hidden: %d (CanSkip %d Cannot %d), SkipItems: %d " , window - > Appearing , window - > Hidden , window - > HiddenFramesCanSkipItems , window - > HiddenFramesCannotSkipItems , window - > SkipItems ) ;
@ -14897,6 +14926,7 @@ void ImGui::ShowMetricsWindow(bool* p_open)
char * p = buf ;
ImDrawList * overlay_draw_list = node - > HostWindow ? GetForegroundDrawList ( node - > HostWindow ) : GetForegroundDrawList ( ( ImGuiViewportP * ) GetMainViewport ( ) ) ;
p + = ImFormatString ( p , buf + IM_ARRAYSIZE ( buf ) - p , " DockId: %X%s \n " , node - > ID , node - > IsCentralNode ( ) ? " *CentralNode* " : " " ) ;
p + = ImFormatString ( p , buf + IM_ARRAYSIZE ( buf ) - p , " WindowClass: %08X \n " , node - > WindowClass . ClassId ) ;
p + = ImFormatString ( p , buf + IM_ARRAYSIZE ( buf ) - p , " Size: (%.0f, %.0f) \n " , node - > Size . x , node - > Size . y ) ;
p + = ImFormatString ( p , buf + IM_ARRAYSIZE ( buf ) - p , " SizeRef: (%.0f, %.0f) \n " , node - > SizeRef . x , node - > SizeRef . y ) ;
int depth = DockNodeGetDepth ( node ) ;