@ -3693,22 +3693,8 @@ static void NewFrameSanityChecks()
// Perform simple check: the beta io.ConfigWindowsResizeFromEdges option requires back-end to honor mouse cursor changes and set the ImGuiBackendFlags_HasMouseCursors flag accordingly.
if ( g . IO . ConfigWindowsResizeFromEdges & & ! ( g . IO . BackendFlags & ImGuiBackendFlags_HasMouseCursors ) )
g . IO . ConfigWindowsResizeFromEdges = false ;
}
void ImGui : : NewFrame ( )
{
IM_ASSERT ( GImGui ! = NULL & & " No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ? " ) ;
ImGuiContext & g = * GImGui ;
# ifdef IMGUI_ENABLE_TEST_ENGINE
ImGuiTestEngineHook_PreNewFrame ( & g ) ;
# endif
// Check and assert for various common IO and Configuration mistakes
NewFrameSanityChecks ( ) ;
// Perform simple check: error if Docking or Viewport are enabled _exactly_ on frame 1 (instead of frame 0 or later), which is a common error leading to loss of .ini data.
g . ConfigFlagsLastFrame = g . ConfigFlagsCurrFrame ;
if ( g . FrameCount = = 1 & & ( g . IO . ConfigFlags & ImGuiConfigFlags_DockingEnable ) & & ( g . ConfigFlagsLastFrame & ImGuiConfigFlags_DockingEnable ) = = 0 )
IM_ASSERT ( 0 & & " Please set DockingEnable before the first call to NewFrame()! Otherwise you will lose your .ini settings! " ) ;
if ( g . FrameCount = = 1 & & ( g . IO . ConfigFlags & ImGuiConfigFlags_ViewportsEnable ) & & ( g . ConfigFlagsLastFrame & ImGuiConfigFlags_ViewportsEnable ) = = 0 )
@ -3720,12 +3706,12 @@ void ImGui::NewFrame()
if ( ( g . IO . BackendFlags & ImGuiBackendFlags_PlatformHasViewports ) & & ( g . IO . BackendFlags & ImGuiBackendFlags_RendererHasViewports ) )
{
IM_ASSERT ( ( g . FrameCount = = 0 | | g . FrameCount = = g . FrameCountPlatformEnded ) & & " Forgot to call UpdatePlatformWindows() in main loop after EndFrame()? Check examples/ applications for reference. " ) ;
IM_ASSERT ( g . PlatformIO . Platform_CreateWindow ! = NULL & & " Platform init didn't install handlers? " ) ;
IM_ASSERT ( g . PlatformIO . Platform_CreateWindow ! = NULL & & " Platform init didn't install handlers? " ) ;
IM_ASSERT ( g . PlatformIO . Platform_DestroyWindow ! = NULL & & " Platform init didn't install handlers? " ) ;
IM_ASSERT ( g . PlatformIO . Platform_GetWindowPos ! = NULL & & " Platform init didn't install handlers? " ) ;
IM_ASSERT ( g . PlatformIO . Platform_SetWindowPos ! = NULL & & " Platform init didn't install handlers? " ) ;
IM_ASSERT ( g . PlatformIO . Platform_GetWindowSize ! = NULL & & " Platform init didn't install handlers? " ) ;
IM_ASSERT ( g . PlatformIO . Platform_SetWindowSize ! = NULL & & " Platform init didn't install handlers? " ) ;
IM_ASSERT ( g . PlatformIO . Platform_GetWindowPos ! = NULL & & " Platform init didn't install handlers? " ) ;
IM_ASSERT ( g . PlatformIO . Platform_SetWindowPos ! = NULL & & " Platform init didn't install handlers? " ) ;
IM_ASSERT ( g . PlatformIO . Platform_GetWindowSize ! = NULL & & " Platform init didn't install handlers? " ) ;
IM_ASSERT ( g . PlatformIO . Platform_SetWindowSize ! = NULL & & " Platform init didn't install handlers? " ) ;
IM_ASSERT ( g . PlatformIO . Monitors . Size > 0 & & " Platform init didn't setup Monitors list? " ) ;
IM_ASSERT ( ( g . Viewports [ 0 ] - > PlatformUserData ! = NULL | | g . Viewports [ 0 ] - > PlatformHandle ! = NULL ) & & " Platform init didn't setup main viewport. " ) ;
if ( g . IO . ConfigDockingTransparentPayload & & ( g . IO . ConfigFlags & ImGuiConfigFlags_DockingEnable ) )
@ -3750,6 +3736,20 @@ void ImGui::NewFrame()
IM_ASSERT ( mon . DpiScale ! = 0.0f ) ;
}
}
}
void ImGui : : NewFrame ( )
{
IM_ASSERT ( GImGui ! = NULL & & " No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ? " ) ;
ImGuiContext & g = * GImGui ;
# ifdef IMGUI_ENABLE_TEST_ENGINE
ImGuiTestEngineHook_PreNewFrame ( & g ) ;
# endif
// Check and assert for various common IO and Configuration mistakes
g . ConfigFlagsLastFrame = g . ConfigFlagsCurrFrame ;
NewFrameSanityChecks ( ) ;
g . ConfigFlagsCurrFrame = g . IO . ConfigFlags ;
// Load settings on first frame (if not explicitly loaded manually before)
@ -11232,6 +11232,7 @@ namespace ImGui
static void DockNodeRemoveWindow ( ImGuiDockNode * node , ImGuiWindow * window , ImGuiID save_dock_id ) ;
static void DockNodeHideHostWindow ( ImGuiDockNode * node ) ;
static void DockNodeUpdate ( ImGuiDockNode * node ) ;
static void DockNodeUpdateForRootNode ( ImGuiDockNode * node ) ;
static void DockNodeUpdateVisibleFlagAndInactiveChilds ( ImGuiDockNode * node ) ;
static void DockNodeUpdateTabBar ( ImGuiDockNode * node , ImGuiWindow * host_window ) ;
static void DockNodeAddTabBar ( ImGuiDockNode * node ) ;
@ -12168,7 +12169,6 @@ static ImGuiWindow* ImGui::DockNodeFindWindowByID(ImGuiDockNode* node, ImGuiID i
static void ImGui : : DockNodeUpdateVisibleFlagAndInactiveChilds ( ImGuiDockNode * node )
{
ImGuiContext & g = * GImGui ;
IM_ASSERT ( node - > ParentNode = = NULL | | node - > ParentNode - > ChildNodes [ 0 ] = = node | | node - > ParentNode - > ChildNodes [ 1 ] = = node ) ;
// Inherit most flags
@ -12247,6 +12247,36 @@ static void ImGui::DockNodeStartMouseMovingWindow(ImGuiDockNode* node, ImGuiWind
g . ActiveIdClickOffset = backup_active_click_offset ;
}
// Update CentralNode, OnlyNodeWithWindows, LastFocusedNodeID. Copy window class.
static void ImGui : : DockNodeUpdateForRootNode ( ImGuiDockNode * node )
{
DockNodeUpdateVisibleFlagAndInactiveChilds ( node ) ;
// FIXME-DOCK: Merge this scan into the one above.
// - Setup central node pointers
// - Find if there's only a single visible window in the hierarchy (in which case we need to display a regular title bar -> FIXME-DOCK: that last part is not done yet!)
ImGuiDockNodeFindInfoResults results ;
DockNodeFindInfo ( node , & results ) ;
node - > CentralNode = results . CentralNode ;
node - > OnlyNodeWithWindows = ( results . CountNodesWithWindows = = 1 ) ? results . FirstNodeWithWindows : NULL ;
if ( node - > LastFocusedNodeID = = 0 & & results . FirstNodeWithWindows ! = NULL )
node - > LastFocusedNodeID = results . FirstNodeWithWindows - > ID ;
// Copy the window class from of our first window so it can be used for proper dock filtering.
// When node has mixed windows, prioritize the class with the most constraint (DockingAllowUnclassed = false) as the reference to copy.
// FIXME-DOCK: We don't recurse properly, this code could be reworked to work from DockNodeUpdateScanRec.
if ( ImGuiDockNode * first_node_with_windows = results . FirstNodeWithWindows )
{
node - > WindowClass = first_node_with_windows - > Windows [ 0 ] - > WindowClass ;
for ( int n = 1 ; n < first_node_with_windows - > Windows . Size ; n + + )
if ( first_node_with_windows - > Windows [ n ] - > WindowClass . DockingAllowUnclassed = = false )
{
node - > WindowClass = first_node_with_windows - > Windows [ n ] - > WindowClass ;
break ;
}
}
}
static void ImGui : : DockNodeUpdate ( ImGuiDockNode * node )
{
ImGuiContext & g = * GImGui ;
@ -12256,33 +12286,7 @@ static void ImGui::DockNodeUpdate(ImGuiDockNode* node)
node - > CentralNode = node - > OnlyNodeWithWindows = NULL ;
if ( node - > IsRootNode ( ) )
{
DockNodeUpdateVisibleFlagAndInactiveChilds ( node ) ;
// FIXME-DOCK: Merge this scan into the one above.
// - Setup central node pointers
// - Find if there's only a single visible window in the hierarchy (in which case we need to display a regular title bar -> FIXME-DOCK: that last part is not done yet!)
ImGuiDockNodeFindInfoResults results ;
DockNodeFindInfo ( node , & results ) ;
node - > CentralNode = results . CentralNode ;
node - > OnlyNodeWithWindows = ( results . CountNodesWithWindows = = 1 ) ? results . FirstNodeWithWindows : NULL ;
if ( node - > LastFocusedNodeID = = 0 & & results . FirstNodeWithWindows ! = NULL )
node - > LastFocusedNodeID = results . FirstNodeWithWindows - > ID ;
// Copy the window class from of our first window so it can be used for proper dock filtering.
// When node has mixed windows, prioritize the class with the most constraint (DockingAllowUnclassed = false) as the reference to copy.
// FIXME-DOCK: We don't recurse properly, this code could be reworked to work from DockNodeUpdateScanRec.
if ( ImGuiDockNode * first_node_with_windows = results . FirstNodeWithWindows )
{
node - > WindowClass = first_node_with_windows - > Windows [ 0 ] - > WindowClass ;
for ( int n = 1 ; n < first_node_with_windows - > Windows . Size ; n + + )
if ( first_node_with_windows - > Windows [ n ] - > WindowClass . DockingAllowUnclassed = = false )
{
node - > WindowClass = first_node_with_windows - > Windows [ n ] - > WindowClass ;
break ;
}
}
}
DockNodeUpdateForRootNode ( node ) ;
// Remove tab bar if not needed
if ( node - > TabBar & & node - > IsNoTabBar ( ) )