mirror of
				https://github.com/ocornut/imgui.git
				synced 2025-11-04 01:34:32 +00:00 
			
		
		
		
	Viewport: Fix modal/popup window being stuck in unowned hidden viewport associated to fallback window without stealing it back. (#1542)
Viewport: Fix modal reference viewport when opened outside of another window. + Comments
This commit is contained in:
		
							
								
								
									
										20
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								imgui.cpp
									
									
									
									
									
								
							@@ -4519,9 +4519,9 @@ void ImGui::Render()
 | 
			
		||||
    if (g.FrameCountEnded != g.FrameCount)
 | 
			
		||||
        EndFrame();
 | 
			
		||||
    g.FrameCountRendered = g.FrameCount;
 | 
			
		||||
 | 
			
		||||
    // Gather ImDrawList to render (for each active window)
 | 
			
		||||
    g.IO.MetricsRenderVertices = g.IO.MetricsRenderIndices = g.IO.MetricsRenderWindows = 0;
 | 
			
		||||
    
 | 
			
		||||
    // Add background ImDrawList (for each active viewport)
 | 
			
		||||
    for (int n = 0; n != g.Viewports.Size; n++)
 | 
			
		||||
    {
 | 
			
		||||
        ImGuiViewportP* viewport = g.Viewports[n];
 | 
			
		||||
@@ -4530,9 +4530,10 @@ void ImGui::Render()
 | 
			
		||||
            AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[0], GetBackgroundDrawList(viewport));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Add ImDrawList to render (for each active window)
 | 
			
		||||
    ImGuiWindow* windows_to_render_top_most[2];
 | 
			
		||||
    windows_to_render_top_most[0] = (g.NavWindowingTarget && !(g.NavWindowingTarget->Flags & ImGuiWindowFlags_NoBringToFrontOnFocus)) ? g.NavWindowingTarget->RootWindow : NULL;
 | 
			
		||||
    windows_to_render_top_most[1] = g.NavWindowingTarget ? g.NavWindowingList : NULL;
 | 
			
		||||
    windows_to_render_top_most[1] = (g.NavWindowingTarget ? g.NavWindowingList : NULL);
 | 
			
		||||
    for (int n = 0; n != g.Windows.Size; n++)
 | 
			
		||||
    {
 | 
			
		||||
        ImGuiWindow* window = g.Windows[n];
 | 
			
		||||
@@ -4553,8 +4554,11 @@ void ImGui::Render()
 | 
			
		||||
    {
 | 
			
		||||
        ImGuiViewportP* viewport = g.Viewports[n];
 | 
			
		||||
        viewport->DrawDataBuilder.FlattenIntoSingleLayer();
 | 
			
		||||
 | 
			
		||||
        // Add foreground ImDrawList (for each active viewport)
 | 
			
		||||
        if (viewport->DrawLists[1] != NULL)
 | 
			
		||||
            AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[0], GetForegroundDrawList(viewport));
 | 
			
		||||
 | 
			
		||||
        SetupViewportDrawData(viewport, &viewport->DrawDataBuilder.Layers[0]);
 | 
			
		||||
        g.IO.MetricsRenderVertices += viewport->DrawData->TotalVtxCount;
 | 
			
		||||
        g.IO.MetricsRenderIndices += viewport->DrawData->TotalIdxCount;
 | 
			
		||||
@@ -8298,7 +8302,10 @@ bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags fla
 | 
			
		||||
    // Center modal windows by default
 | 
			
		||||
    // FIXME: Should test for (PosCond & window->SetWindowPosAllowFlags) with the upcoming window.
 | 
			
		||||
    if ((g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasPos) == 0)
 | 
			
		||||
        SetNextWindowPos(window->Viewport->GetCenter(), ImGuiCond_Appearing, ImVec2(0.5f, 0.5f));
 | 
			
		||||
    {
 | 
			
		||||
        ImGuiViewportP* viewport = window->WasActive ? window->Viewport : (ImGuiViewportP*)GetMainViewport(); // FIXME-VIEWPORT: What may be our reference viewport?
 | 
			
		||||
        SetNextWindowPos(viewport->GetCenter(), ImGuiCond_Appearing, ImVec2(0.5f, 0.5f));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    flags |= ImGuiWindowFlags_Popup | ImGuiWindowFlags_Modal | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoDocking;
 | 
			
		||||
    const bool is_open = Begin(name, p_open, flags);
 | 
			
		||||
@@ -10342,7 +10349,8 @@ static bool ImGui::GetWindowAlwaysWantOwnViewport(ImGuiWindow* window)
 | 
			
		||||
    if (g.IO.ConfigViewportsNoAutoMerge || (window->WindowClass.ViewportFlagsOverrideSet & ImGuiViewportFlags_NoAutoMerge))
 | 
			
		||||
        if (g.ConfigFlagsCurrFrame & ImGuiConfigFlags_ViewportsEnable)
 | 
			
		||||
            if (!window->DockIsActive)
 | 
			
		||||
                if ((window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_ChildMenu | ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_Popup)) == 0)
 | 
			
		||||
                if ((window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_ChildMenu | ImGuiWindowFlags_Tooltip)) == 0)
 | 
			
		||||
                    if ((window->Flags & ImGuiWindowFlags_Popup) == 0 || (window->Flags & ImGuiWindowFlags_Modal) != 0)
 | 
			
		||||
                        return true;
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
@@ -10715,7 +10723,7 @@ static void ImGui::UpdateSelectWindowViewport(ImGuiWindow* window)
 | 
			
		||||
    if ((g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasViewport) == 0)
 | 
			
		||||
    {
 | 
			
		||||
        // By default inherit from parent window
 | 
			
		||||
        if (window->Viewport == NULL && window->ParentWindow)
 | 
			
		||||
        if (window->Viewport == NULL && window->ParentWindow && !window->ParentWindow->FallbackWindow)
 | 
			
		||||
            window->Viewport = window->ParentWindow->Viewport;
 | 
			
		||||
 | 
			
		||||
        // Attempt to restore saved viewport id (= window that hasn't been activated yet), try to restore the viewport based on saved 'window->ViewportPos' restored from .ini file
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user