mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 13:11:05 +01:00 
			
		
		
		
	Viewport: Reorder flags. Set owned viewport common decoration flags in Begin(). Moved code in UpdateViewportsEndFrame() before we introduce family/class based overrides.
This commit is contained in:
		
							
								
								
									
										76
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										76
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -1010,7 +1010,8 @@ static void             UpdateManualResize(ImGuiWindow* window, const ImVec2& si | ||||
| // Viewports | ||||
| const ImGuiID           IMGUI_VIEWPORT_DEFAULT_ID = 0x11111111; // Using an arbitrary constant instead of e.g. ImHash("ViewportDefault", 0); so it's easier to spot in the debugger. The exact value doesn't matter. | ||||
| static ImGuiViewportP*  AddUpdateViewport(ImGuiWindow* window, ImGuiID id, const ImVec2& platform_pos, const ImVec2& size, ImGuiViewportFlags flags); | ||||
| static void             UpdateViewports(); | ||||
| static void             UpdateViewportsNewFrame(); | ||||
| static void             UpdateViewportsEndFrame(); | ||||
| static void             UpdateSelectWindowViewport(ImGuiWindow* window); | ||||
| static bool             UpdateTryMergeWindowIntoHostViewport(ImGuiWindow* window, ImGuiViewportP* host_viewport); | ||||
| static void             SetCurrentViewport(ImGuiWindow* window, ImGuiViewportP* viewport); | ||||
| @@ -3352,7 +3353,7 @@ void ImGui::NewFrame() | ||||
|     g.WindowsActiveCount = 0; | ||||
|     g.ConfigFlagsForFrame = g.IO.ConfigFlags; | ||||
|  | ||||
|     UpdateViewports(); | ||||
|     UpdateViewportsNewFrame(); | ||||
|  | ||||
|     // Setup current font, and draw list shared data | ||||
|     // FIXME-VIEWPORT: the concept of a single ClipRectFullscreen is not ideal! | ||||
| @@ -3846,24 +3847,8 @@ void ImGui::EndFrame() | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Update user-facing viewport list | ||||
|     g.PlatformIO.MainViewport = g.Viewports[0]; | ||||
|     g.PlatformIO.Viewports.resize(0); | ||||
|     for (int i = 0; i < g.Viewports.Size; i++) | ||||
|     { | ||||
|         ImGuiViewportP* viewport = g.Viewports[i]; | ||||
|         viewport->LastPos = viewport->Pos; | ||||
|         if (viewport->LastFrameActive < g.FrameCount || viewport->Size.x <= 0.0f || viewport->Size.y <= 0.0f) | ||||
|             continue; | ||||
|         if (viewport->Window && !IsWindowActiveAndVisible(viewport->Window)) // Will be destroyed in UpdatePlatformWindows() | ||||
|             continue; | ||||
|         if (i > 0) | ||||
|             IM_ASSERT(viewport->Window != NULL); | ||||
|  | ||||
|         // Add to user-facing list | ||||
|         g.PlatformIO.Viewports.push_back(viewport); | ||||
|     } | ||||
|     g.Viewports[0]->ClearRequestFlags(); // Clear main viewport flags because UpdatePlatformWindows() won't do it and may not even be called | ||||
|     // Update user-facing viewport list (g.Viewports -> g.PlatformIO.Viewports after filtering out some) | ||||
|     UpdateViewportsEndFrame(); | ||||
|  | ||||
|     // Sort the window list so that all child windows are after their parent | ||||
|     // We cannot do that on FocusWindow() because childs may not exist yet | ||||
| @@ -5178,16 +5163,26 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) | ||||
|                 SetCurrentWindow(window); | ||||
|             } | ||||
|  | ||||
|         // Synchronize viewport --> window in case the platform window has been moved or resized from the OS/WM | ||||
|         if (window->ViewportOwned) | ||||
|         { | ||||
|             // 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; | ||||
|             if (window->Viewport->PlatformRequestResize) | ||||
|                 window->Size = window->SizeFull = window->Viewport->Size; | ||||
|  | ||||
|             // Update common viewport flags | ||||
|             ImGuiViewportFlags viewport_flags = (window->Viewport->Flags) & ~(ImGuiViewportFlags_TopMost | ImGuiViewportFlags_NoTaskBarIcon | ImGuiViewportFlags_NoDecoration); | ||||
|             if (flags & ImGuiWindowFlags_Tooltip) | ||||
|                 viewport_flags |= ImGuiViewportFlags_TopMost; | ||||
|             if ((g.IO.ConfigFlags & ImGuiConfigFlags_ViewportsNoTaskBarIcon) != 0 || (flags & (ImGuiWindowFlags_ChildMenu | ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_Popup)) != 0) | ||||
|                 viewport_flags |= ImGuiViewportFlags_NoTaskBarIcon; | ||||
|             if ((g.IO.ConfigFlags & ImGuiConfigFlags_ViewportsDecoration) == 0 || (flags & (ImGuiWindowFlags_ChildMenu | ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_Popup)) != 0) | ||||
|                 viewport_flags |= ImGuiViewportFlags_NoDecoration; | ||||
|  | ||||
|             // We also tell the back-end that clearing the platform window won't be necessary, as our window is filling the viewport and we have disabled BgAlpha | ||||
|             window->Viewport->Flags |= ImGuiViewportFlags_NoRendererClear; | ||||
|             viewport_flags |= ImGuiViewportFlags_NoRendererClear; | ||||
|             window->Viewport->Flags = viewport_flags; | ||||
|         } | ||||
|  | ||||
|         // Clamp position so window stays visible within its viewport or monitor | ||||
| @@ -7387,8 +7382,7 @@ static ImGuiViewportP* FindViewportHoveredFromPlatformWindowStack(const ImVec2 m | ||||
|     return best_candidate; | ||||
| } | ||||
|  | ||||
| // Called in NewFrame() | ||||
| static void ImGui::UpdateViewports() | ||||
| static void ImGui::UpdateViewportsNewFrame() | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     IM_ASSERT(g.PlatformIO.Viewports.Size <= g.Viewports.Size); | ||||
| @@ -7540,6 +7534,27 @@ static void ImGui::UpdateViewports() | ||||
|     IM_ASSERT(g.MouseViewport != NULL); | ||||
| } | ||||
|  | ||||
| // Update user-facing viewport list (g.Viewports -> g.PlatformIO.Viewports after filtering out some) | ||||
| static void ImGui::UpdateViewportsEndFrame() | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     g.PlatformIO.MainViewport = g.Viewports[0]; | ||||
|     g.PlatformIO.Viewports.resize(0); | ||||
|     for (int i = 0; i < g.Viewports.Size; i++) | ||||
|     { | ||||
|         ImGuiViewportP* viewport = g.Viewports[i]; | ||||
|         viewport->LastPos = viewport->Pos; | ||||
|         if (viewport->LastFrameActive < g.FrameCount || viewport->Size.x <= 0.0f || viewport->Size.y <= 0.0f) | ||||
|             continue; | ||||
|         if (viewport->Window && !IsWindowActiveAndVisible(viewport->Window)) | ||||
|             continue; | ||||
|         if (i > 0) | ||||
|             IM_ASSERT(viewport->Window != NULL); | ||||
|         g.PlatformIO.Viewports.push_back(viewport); | ||||
|     } | ||||
|     g.Viewports[0]->ClearRequestFlags(); // Clear main viewport flags because UpdatePlatformWindows() won't do it and may not even be called | ||||
| } | ||||
|  | ||||
| // FIXME: We should ideally refactor the system to call this every frame (we currently don't) | ||||
| ImGuiViewportP* ImGui::AddUpdateViewport(ImGuiWindow* window, ImGuiID id, const ImVec2& pos, const ImVec2& size, ImGuiViewportFlags flags) | ||||
| { | ||||
| @@ -7734,19 +7749,6 @@ void ImGui::UpdatePlatformWindows() | ||||
|         if (viewport->LastFrameActive < g.FrameCount || viewport->Size.x <= 0 || viewport->Size.y <= 0) | ||||
|             continue; | ||||
|  | ||||
|         // Update common viewport flags for owned viewports | ||||
|         if (ImGuiWindow* window = viewport->Window) | ||||
|         { | ||||
|             ImGuiViewportFlags flags = viewport->Flags & ~(ImGuiViewportFlags_TopMost | ImGuiViewportFlags_NoTaskBarIcon | ImGuiViewportFlags_NoDecoration); | ||||
|             if (window->Flags & ImGuiWindowFlags_Tooltip) | ||||
|                 flags |= ImGuiViewportFlags_TopMost; | ||||
|             if ((g.IO.ConfigFlags & ImGuiConfigFlags_ViewportsNoTaskBarIcon) != 0 || (window->Flags & (ImGuiWindowFlags_ChildMenu | ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_Popup)) != 0) | ||||
|                 flags |= ImGuiViewportFlags_NoTaskBarIcon; | ||||
|             if ((g.IO.ConfigFlags & ImGuiConfigFlags_ViewportsDecoration) == 0 || (window->Flags & (ImGuiWindowFlags_ChildMenu | ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_Popup)) != 0) | ||||
|                 flags |= ImGuiViewportFlags_NoDecoration; | ||||
|             viewport->Flags = flags; | ||||
|         } | ||||
|  | ||||
|         // Create window | ||||
|         bool is_new_platform_window = (viewport->PlatformWindowCreated == false); | ||||
|         if (is_new_platform_window) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user