mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 13:11:05 +01:00 
			
		
		
		
	Internals: Extracted code out of EndFrame() into UpdateMouseMovingWindowEndFrame()
This commit is contained in:
		
							
								
								
									
										99
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										99
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -2969,7 +2969,7 @@ void ImGui::StartMouseMovingWindow(ImGuiWindow* window) | ||||
|  | ||||
| // Handle mouse moving window | ||||
| // Note: moving window with the navigation keys (Square + d-pad / CTRL+TAB + Arrows) are processed in NavUpdateWindowing() | ||||
| void ImGui::UpdateMouseMovingWindow() | ||||
| void ImGui::UpdateMouseMovingWindowNewFrame() | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     if (g.MovingWindow != NULL) | ||||
| @@ -3007,6 +3007,56 @@ void ImGui::UpdateMouseMovingWindow() | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Initiate moving window, handle left-click and right-click focus | ||||
| void ImGui::UpdateMouseMovingWindowEndFrame() | ||||
| { | ||||
|     // Initiate moving window | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     if (g.ActiveId != 0 || g.HoveredId != 0) | ||||
|         return; | ||||
|  | ||||
|     // Unless we just made a window/popup appear | ||||
|     if (g.NavWindow && g.NavWindow->Appearing) | ||||
|         return; | ||||
|  | ||||
|     // Click to focus window and start moving (after we're done with all our widgets) | ||||
|     if (g.IO.MouseClicked[0]) | ||||
|     { | ||||
|         if (g.HoveredRootWindow != NULL) | ||||
|         { | ||||
|             StartMouseMovingWindow(g.HoveredWindow); | ||||
|             if (g.IO.ConfigWindowsMoveFromTitleBarOnly && !(g.HoveredRootWindow->Flags & ImGuiWindowFlags_NoTitleBar)) | ||||
|                 if (!g.HoveredRootWindow->TitleBarRect().Contains(g.IO.MouseClickedPos[0])) | ||||
|                     g.MovingWindow = NULL; | ||||
|         } | ||||
|         else if (g.NavWindow != NULL && GetFrontMostPopupModal() == NULL) | ||||
|         { | ||||
|             FocusWindow(NULL);  // Clicking on void disable focus | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // With right mouse button we close popups without changing focus | ||||
|     // (The left mouse button path calls FocusWindow which will lead NewFrame->ClosePopupsOverWindow to trigger) | ||||
|     if (g.IO.MouseClicked[1]) | ||||
|     { | ||||
|         // Find the top-most window between HoveredWindow and the front most Modal Window. | ||||
|         // This is where we can trim the popup stack. | ||||
|         ImGuiWindow* modal = GetFrontMostPopupModal(); | ||||
|         bool hovered_window_above_modal = false; | ||||
|         if (modal == NULL) | ||||
|             hovered_window_above_modal = true; | ||||
|         for (int i = g.Windows.Size - 1; i >= 0 && hovered_window_above_modal == false; i--) | ||||
|         { | ||||
|             ImGuiWindow* window = g.Windows[i]; | ||||
|             if (window == modal) | ||||
|                 break; | ||||
|             if (window == g.HoveredWindow) | ||||
|                 hovered_window_above_modal = true; | ||||
|         } | ||||
|         ClosePopupsOverWindow(hovered_window_above_modal ? g.HoveredWindow : modal); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static bool IsWindowActiveAndVisible(ImGuiWindow* window) | ||||
| { | ||||
|     return (window->Active) && (!window->Hidden); | ||||
| @@ -3298,7 +3348,7 @@ void ImGui::NewFrame() | ||||
|     g.IO.Framerate = (g.FramerateSecPerFrameAccum > 0.0f) ? (1.0f / (g.FramerateSecPerFrameAccum / (float)IM_ARRAYSIZE(g.FramerateSecPerFrame))) : FLT_MAX; | ||||
|  | ||||
|     // Handle user moving window with mouse (at the beginning of the frame to avoid input lag or sheering) | ||||
|     UpdateMouseMovingWindow(); | ||||
|     UpdateMouseMovingWindowNewFrame(); | ||||
|     UpdateHoveredWindowAndCaptureFlags(); | ||||
|  | ||||
|     // Background darkening/whitening | ||||
| @@ -3635,49 +3685,8 @@ void ImGui::EndFrame() | ||||
|     g.FrameScopeActive = false; | ||||
|     g.FrameCountEnded = g.FrameCount; | ||||
|  | ||||
|     // Initiate moving window | ||||
|     if (g.ActiveId == 0 && g.HoveredId == 0) | ||||
|     { | ||||
|         if (!g.NavWindow || !g.NavWindow->Appearing) // Unless we just made a window/popup appear | ||||
|         { | ||||
|             // Click to focus window and start moving (after we're done with all our widgets) | ||||
|             if (g.IO.MouseClicked[0]) | ||||
|             { | ||||
|                 if (g.HoveredRootWindow != NULL) | ||||
|                 { | ||||
|                     StartMouseMovingWindow(g.HoveredWindow); | ||||
|                     if (g.IO.ConfigWindowsMoveFromTitleBarOnly && !(g.HoveredRootWindow->Flags & ImGuiWindowFlags_NoTitleBar)) | ||||
|                         if (!g.HoveredRootWindow->TitleBarRect().Contains(g.IO.MouseClickedPos[0])) | ||||
|                             g.MovingWindow = NULL; | ||||
|                 } | ||||
|                 else if (g.NavWindow != NULL && GetFrontMostPopupModal() == NULL) | ||||
|                 { | ||||
|                     FocusWindow(NULL);  // Clicking on void disable focus | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             // With right mouse button we close popups without changing focus | ||||
|             // (The left mouse button path calls FocusWindow which will lead NewFrame->ClosePopupsOverWindow to trigger) | ||||
|             if (g.IO.MouseClicked[1]) | ||||
|             { | ||||
|                 // Find the top-most window between HoveredWindow and the front most Modal Window. | ||||
|                 // This is where we can trim the popup stack. | ||||
|                 ImGuiWindow* modal = GetFrontMostPopupModal(); | ||||
|                 bool hovered_window_above_modal = false; | ||||
|                 if (modal == NULL) | ||||
|                     hovered_window_above_modal = true; | ||||
|                 for (int i = g.Windows.Size - 1; i >= 0 && hovered_window_above_modal == false; i--) | ||||
|                 { | ||||
|                     ImGuiWindow* window = g.Windows[i]; | ||||
|                     if (window == modal) | ||||
|                         break; | ||||
|                     if (window == g.HoveredWindow) | ||||
|                         hovered_window_above_modal = true; | ||||
|                 } | ||||
|                 ClosePopupsOverWindow(hovered_window_above_modal ? g.HoveredWindow : modal); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     // Initiate moving window + handle left-click and right-click focus | ||||
|     UpdateMouseMovingWindowEndFrame(); | ||||
|  | ||||
|     // 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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user