mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 21:21:06 +01:00 
			
		
		
		
	Internal: Begin: Update rectangles before Scrollbar() which now uses them. Fixes 39eeda0.
				
					
				
			This commit is contained in:
		
							
								
								
									
										66
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										66
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -5307,6 +5307,40 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) | |||||||
|         else |         else | ||||||
|             window->ItemWidthDefault = (float)(int)(g.FontSize * 16.0f); |             window->ItemWidthDefault = (float)(int)(g.FontSize * 16.0f); | ||||||
|  |  | ||||||
|  |         // Store a backup of SizeFull which we will use next frame to decide if we need scrollbars. | ||||||
|  |         window->SizeFullAtLastBegin = window->SizeFull; | ||||||
|  |  | ||||||
|  |         // UPDATE RECTANGLES | ||||||
|  |  | ||||||
|  |         // Update various regions. Variables they depends on are set above in this function. | ||||||
|  |         // FIXME: window->ContentsRegionRect.Max is currently very misleading / partly faulty, but some BeginChild() patterns relies on it. | ||||||
|  |         // NB: WindowBorderSize is included in WindowPadding _and_ ScrollbarSizes so we need to cancel one out. | ||||||
|  |         window->ContentsRegionRect.Min.x = window->Pos.x - window->Scroll.x + window->WindowPadding.x; | ||||||
|  |         window->ContentsRegionRect.Min.y = window->Pos.y - window->Scroll.y + window->WindowPadding.y + window->TitleBarHeight() + window->MenuBarHeight(); | ||||||
|  |         window->ContentsRegionRect.Max.x = window->Pos.x - window->Scroll.x - window->WindowPadding.x + (window->SizeContentsExplicit.x != 0.0f ? window->SizeContentsExplicit.x : (window->Size.x - window->ScrollbarSizes.x + ImMin(window->ScrollbarSizes.x, window->WindowBorderSize))); | ||||||
|  |         window->ContentsRegionRect.Max.y = window->Pos.y - window->Scroll.y - window->WindowPadding.y + (window->SizeContentsExplicit.y != 0.0f ? window->SizeContentsExplicit.y : (window->Size.y - window->ScrollbarSizes.y + ImMin(window->ScrollbarSizes.y, window->WindowBorderSize))); | ||||||
|  |  | ||||||
|  |         // Save clipped aabb so we can access it in constant-time in FindHoveredWindow() | ||||||
|  |         window->OuterRectClipped = window->Rect(); | ||||||
|  |         window->OuterRectClipped.ClipWith(window->ClipRect); | ||||||
|  |  | ||||||
|  |         // Inner rectangle | ||||||
|  |         // We set this up after processing the resize grip so that our clip rectangle doesn't lag by a frame | ||||||
|  |         // Note that if our window is collapsed we will end up with an inverted (~null) clipping rectangle which is the correct behavior. | ||||||
|  |         const ImRect title_bar_rect = window->TitleBarRect(); | ||||||
|  |         window->InnerMainRect.Min.x = title_bar_rect.Min.x + window->WindowBorderSize; | ||||||
|  |         window->InnerMainRect.Min.y = title_bar_rect.Max.y + window->MenuBarHeight() + (((flags & ImGuiWindowFlags_MenuBar) || !(flags & ImGuiWindowFlags_NoTitleBar)) ? style.FrameBorderSize : window->WindowBorderSize); | ||||||
|  |         window->InnerMainRect.Max.x = window->Pos.x + window->Size.x - ImMax(window->ScrollbarSizes.x, window->WindowBorderSize); | ||||||
|  |         window->InnerMainRect.Max.y = window->Pos.y + window->Size.y - ImMax(window->ScrollbarSizes.y, window->WindowBorderSize); | ||||||
|  |  | ||||||
|  |         // Inner clipping rectangle will extend a little bit outside the work region. | ||||||
|  |         // This is to allow e.g. Selectable or CollapsingHeader or some separators to cover that space. | ||||||
|  |         // Force round operator last to ensure that e.g. (int)(max.x-min.x) in user's render code produce correct result. | ||||||
|  |         window->InnerClipRect.Min.x = ImFloor(0.5f + window->InnerMainRect.Min.x + ImMax(0.0f, ImFloor(window->WindowPadding.x * 0.5f - window->WindowBorderSize))); | ||||||
|  |         window->InnerClipRect.Min.y = ImFloor(0.5f + window->InnerMainRect.Min.y); | ||||||
|  |         window->InnerClipRect.Max.x = ImFloor(0.5f + window->InnerMainRect.Max.x - ImMax(0.0f, ImFloor(window->WindowPadding.x * 0.5f - window->WindowBorderSize))); | ||||||
|  |         window->InnerClipRect.Max.y = ImFloor(0.5f + window->InnerMainRect.Max.y); | ||||||
|  |  | ||||||
|         // DRAWING |         // DRAWING | ||||||
|  |  | ||||||
|         // Setup draw list and outer clipping rectangle |         // Setup draw list and outer clipping rectangle | ||||||
| @@ -5342,7 +5376,6 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) | |||||||
|         const float window_border_size = window->WindowBorderSize; |         const float window_border_size = window->WindowBorderSize; | ||||||
|         const ImGuiWindow* window_to_highlight = g.NavWindowingTarget ? g.NavWindowingTarget : g.NavWindow; |         const ImGuiWindow* window_to_highlight = g.NavWindowingTarget ? g.NavWindowingTarget : g.NavWindow; | ||||||
|         const bool title_bar_is_highlight = want_focus || (window_to_highlight && window->RootWindowForTitleBarHighlight == window_to_highlight->RootWindowForTitleBarHighlight); |         const bool title_bar_is_highlight = want_focus || (window_to_highlight && window->RootWindowForTitleBarHighlight == window_to_highlight->RootWindowForTitleBarHighlight); | ||||||
|         const ImRect title_bar_rect = window->TitleBarRect(); |  | ||||||
|         if (window->Collapsed) |         if (window->Collapsed) | ||||||
|         { |         { | ||||||
|             // Title bar only |             // Title bar only | ||||||
| @@ -5422,37 +5455,6 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) | |||||||
|             window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_NavWindowingHighlight, g.NavWindowingHighlightAlpha), rounding, ~0, 3.0f); |             window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_NavWindowingHighlight, g.NavWindowingHighlightAlpha), rounding, ~0, 3.0f); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // Store a backup of SizeFull which we will use next frame to decide if we need scrollbars. |  | ||||||
|         window->SizeFullAtLastBegin = window->SizeFull; |  | ||||||
|  |  | ||||||
|         // Update various regions. Variables they depends on are set above in this function. |  | ||||||
|         // FIXME: window->ContentsRegionRect.Max is currently very misleading / partly faulty, but some BeginChild() patterns relies on it. |  | ||||||
|         // NB: WindowBorderSize is included in WindowPadding _and_ ScrollbarSizes so we need to cancel one out. |  | ||||||
|         window->ContentsRegionRect.Min.x = window->Pos.x - window->Scroll.x + window->WindowPadding.x; |  | ||||||
|         window->ContentsRegionRect.Min.y = window->Pos.y - window->Scroll.y + window->WindowPadding.y + window->TitleBarHeight() + window->MenuBarHeight(); |  | ||||||
|         window->ContentsRegionRect.Max.x = window->Pos.x - window->Scroll.x - window->WindowPadding.x + (window->SizeContentsExplicit.x != 0.0f ? window->SizeContentsExplicit.x : (window->Size.x - window->ScrollbarSizes.x + ImMin(window->ScrollbarSizes.x, window->WindowBorderSize))); |  | ||||||
|         window->ContentsRegionRect.Max.y = window->Pos.y - window->Scroll.y - window->WindowPadding.y + (window->SizeContentsExplicit.y != 0.0f ? window->SizeContentsExplicit.y : (window->Size.y - window->ScrollbarSizes.y + ImMin(window->ScrollbarSizes.y, window->WindowBorderSize))); |  | ||||||
|  |  | ||||||
|         // Save clipped aabb so we can access it in constant-time in FindHoveredWindow() |  | ||||||
|         window->OuterRectClipped = window->Rect(); |  | ||||||
|         window->OuterRectClipped.ClipWith(window->ClipRect); |  | ||||||
|  |  | ||||||
|         // Inner rectangle |  | ||||||
|         // We set this up after processing the resize grip so that our clip rectangle doesn't lag by a frame |  | ||||||
|         // Note that if our window is collapsed we will end up with an inverted (~null) clipping rectangle which is the correct behavior. |  | ||||||
|         window->InnerMainRect.Min.x = title_bar_rect.Min.x + window->WindowBorderSize; |  | ||||||
|         window->InnerMainRect.Min.y = title_bar_rect.Max.y + window->MenuBarHeight() + (((flags & ImGuiWindowFlags_MenuBar) || !(flags & ImGuiWindowFlags_NoTitleBar)) ? style.FrameBorderSize : window->WindowBorderSize); |  | ||||||
|         window->InnerMainRect.Max.x = window->Pos.x + window->Size.x - ImMax(window->ScrollbarSizes.x, window->WindowBorderSize); |  | ||||||
|         window->InnerMainRect.Max.y = window->Pos.y + window->Size.y - ImMax(window->ScrollbarSizes.y, window->WindowBorderSize); |  | ||||||
|  |  | ||||||
|         // Inner clipping rectangle will extend a little bit outside the work region. |  | ||||||
|         // This is to allow e.g. Selectable or CollapsingHeader or some separators to cover that space. |  | ||||||
|         // Force round operator last to ensure that e.g. (int)(max.x-min.x) in user's render code produce correct result. |  | ||||||
|         window->InnerClipRect.Min.x = ImFloor(0.5f + window->InnerMainRect.Min.x + ImMax(0.0f, ImFloor(window->WindowPadding.x * 0.5f - window->WindowBorderSize))); |  | ||||||
|         window->InnerClipRect.Min.y = ImFloor(0.5f + window->InnerMainRect.Min.y); |  | ||||||
|         window->InnerClipRect.Max.x = ImFloor(0.5f + window->InnerMainRect.Max.x - ImMax(0.0f, ImFloor(window->WindowPadding.x * 0.5f - window->WindowBorderSize))); |  | ||||||
|         window->InnerClipRect.Max.y = ImFloor(0.5f + window->InnerMainRect.Max.y); |  | ||||||
|  |  | ||||||
|         // Setup drawing context |         // Setup drawing context | ||||||
|         // (NB: That term "drawing context / DC" lost its meaning a long time ago. Initially was meant to hold transient data only. Nowadays difference between window-> and window->DC-> is dubious.) |         // (NB: That term "drawing context / DC" lost its meaning a long time ago. Initially was meant to hold transient data only. Nowadays difference between window-> and window->DC-> is dubious.) | ||||||
|         window->DC.Indent.x = 0.0f + window->WindowPadding.x - window->Scroll.x; |         window->DC.Indent.x = 0.0f + window->WindowPadding.x - window->Scroll.x; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user