mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 05:01:05 +01:00 
			
		
		
		
	Internals: Storing ScrollMax into a member. Mostly to facilitate debugging. Also locking down window->Scroll slightly lower in the Begin function.
This commit is contained in:
		
							
								
								
									
										46
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -4747,16 +4747,6 @@ ImVec2 ImGui::CalcWindowExpectedSize(ImGuiWindow* window) | ||||
|     return CalcSizeAfterConstraint(window, CalcSizeAutoFit(window, size_contents)); | ||||
| } | ||||
|  | ||||
| float ImGui::GetWindowScrollMaxX(ImGuiWindow* window) | ||||
| { | ||||
|     return ImMax(0.0f, window->ContentSize.x + window->WindowPadding.x * 2.0f - window->InnerRect.GetWidth()); | ||||
| } | ||||
|  | ||||
| float ImGui::GetWindowScrollMaxY(ImGuiWindow* window) | ||||
| { | ||||
|     return ImMax(0.0f, window->ContentSize.y + window->WindowPadding.y * 2.0f - window->InnerRect.GetHeight()); | ||||
| } | ||||
|  | ||||
| static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window, bool snap_on_edges) | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
| @@ -4780,8 +4770,8 @@ static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window, bool s | ||||
|     scroll = ImMax(scroll, ImVec2(0.0f, 0.0f)); | ||||
|     if (!window->Collapsed && !window->SkipItems) | ||||
|     { | ||||
|         scroll.x = ImMin(scroll.x, ImGui::GetWindowScrollMaxX(window)); | ||||
|         scroll.y = ImMin(scroll.y, ImGui::GetWindowScrollMaxY(window)); | ||||
|         scroll.x = ImMin(scroll.x, window->ScrollMax.x); | ||||
|         scroll.y = ImMin(scroll.y, window->ScrollMax.y); | ||||
|     } | ||||
|     return scroll; | ||||
| } | ||||
| @@ -5470,10 +5460,6 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) | ||||
|         // Lock window rounding for the frame (so that altering them doesn't cause inconsistencies) | ||||
|         window->WindowRounding = (flags & ImGuiWindowFlags_ChildWindow) ? style.ChildRounding : ((flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiWindowFlags_Modal)) ? style.PopupRounding : style.WindowRounding; | ||||
|  | ||||
|         // Apply scrolling | ||||
|         window->Scroll = CalcNextScrollFromScrollTargetAndClamp(window, true); | ||||
|         window->ScrollTarget = ImVec2(FLT_MAX, FLT_MAX); | ||||
|  | ||||
|         // Apply window focus (new and reactivated windows are moved to front) | ||||
|         bool want_focus = false; | ||||
|         if (window_just_activated_by_user && !(flags & ImGuiWindowFlags_NoFocusOnAppearing)) | ||||
| @@ -5538,6 +5524,18 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) | ||||
|         window->InnerClipRect.Max.y = ImFloor(0.5f + window->InnerRect.Max.y - window->WindowBorderSize); | ||||
|         window->InnerClipRect.ClipWithFull(host_rect); | ||||
|  | ||||
|         // SCROLLING | ||||
|  | ||||
|         // Lock down maximum scrolling | ||||
|         // The value of ScrollMax are ahead from ScrollbarX/ScrollbarY which is intentionally using InnerRect from previous rect in order to accommodate | ||||
|         // for right/bottom aligned items without creating a scrollbar. | ||||
|         window->ScrollMax.x = ImMax(0.0f, window->ContentSize.x + window->WindowPadding.x * 2.0f - window->InnerRect.GetWidth()); | ||||
|         window->ScrollMax.y = ImMax(0.0f, window->ContentSize.y + window->WindowPadding.y * 2.0f - window->InnerRect.GetHeight()); | ||||
|  | ||||
|         // Apply scrolling | ||||
|         window->Scroll = CalcNextScrollFromScrollTargetAndClamp(window, true); | ||||
|         window->ScrollTarget = ImVec2(FLT_MAX, FLT_MAX); | ||||
|  | ||||
|         // DRAWING | ||||
|  | ||||
|         // Setup draw list and outer clipping rectangle | ||||
| @@ -5619,7 +5617,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) | ||||
|         window->DC.CurrLineSize = window->DC.PrevLineSize = ImVec2(0.0f, 0.0f); | ||||
|         window->DC.CurrLineTextBaseOffset = window->DC.PrevLineTextBaseOffset = 0.0f; | ||||
|         window->DC.NavHideHighlightOneFrame = false; | ||||
|         window->DC.NavHasScroll = (GetWindowScrollMaxY(window) > 0.0f); | ||||
|         window->DC.NavHasScroll = (window->ScrollMax.y > 0.0f); | ||||
|         window->DC.NavLayerActiveMask = window->DC.NavLayerActiveMaskNext; | ||||
|         window->DC.NavLayerActiveMaskNext = 0x00; | ||||
|         window->DC.MenuBarAppending = false; | ||||
| @@ -6687,22 +6685,26 @@ void ImGui::SetCursorScreenPos(const ImVec2& pos) | ||||
|  | ||||
| float ImGui::GetScrollX() | ||||
| { | ||||
|     return GImGui->CurrentWindow->Scroll.x; | ||||
|     ImGuiWindow* window = GImGui->CurrentWindow; | ||||
|     return window->Scroll.x; | ||||
| } | ||||
|  | ||||
| float ImGui::GetScrollY() | ||||
| { | ||||
|     return GImGui->CurrentWindow->Scroll.y; | ||||
|     ImGuiWindow* window = GImGui->CurrentWindow; | ||||
|     return window->Scroll.y; | ||||
| } | ||||
|  | ||||
| float ImGui::GetScrollMaxX() | ||||
| { | ||||
|     return GetWindowScrollMaxX(GImGui->CurrentWindow); | ||||
|     ImGuiWindow* window = GImGui->CurrentWindow; | ||||
|     return window->ScrollMax.x; | ||||
| } | ||||
|  | ||||
| float ImGui::GetScrollMaxY() | ||||
| { | ||||
|     return GetWindowScrollMaxY(GImGui->CurrentWindow); | ||||
|     ImGuiWindow* window = GImGui->CurrentWindow; | ||||
|     return window->ScrollMax.y; | ||||
| } | ||||
|  | ||||
| void ImGui::SetScrollX(float scroll_x) | ||||
| @@ -9906,7 +9908,7 @@ void ImGui::ShowMetricsWindow(bool* p_open) | ||||
|                 (flags & ImGuiWindowFlags_ChildWindow)  ? "Child " : "",      (flags & ImGuiWindowFlags_Tooltip)     ? "Tooltip "   : "",  (flags & ImGuiWindowFlags_Popup) ? "Popup " : "", | ||||
|                 (flags & ImGuiWindowFlags_Modal)        ? "Modal " : "",      (flags & ImGuiWindowFlags_ChildMenu)   ? "ChildMenu " : "",  (flags & ImGuiWindowFlags_NoSavedSettings) ? "NoSavedSettings " : "", | ||||
|                 (flags & ImGuiWindowFlags_NoMouseInputs)? "NoMouseInputs":"", (flags & ImGuiWindowFlags_NoNavInputs) ? "NoNavInputs" : "", (flags & ImGuiWindowFlags_AlwaysAutoResize) ? "AlwaysAutoResize" : ""); | ||||
|             ImGui::BulletText("Scroll: (%.2f/%.2f,%.2f/%.2f)", window->Scroll.x, GetWindowScrollMaxX(window), window->Scroll.y, GetWindowScrollMaxY(window)); | ||||
|             ImGui::BulletText("Scroll: (%.2f/%.2f,%.2f/%.2f)", window->Scroll.x, window->ScrollMax.x, window->Scroll.y, window->ScrollMax.y); | ||||
|             ImGui::BulletText("Active: %d/%d, WriteAccessed: %d, BeginOrderWithinContext: %d", window->Active, window->WasActive, window->WriteAccessed, (window->Active || window->WasActive) ? window->BeginOrderWithinContext : -1); | ||||
|             ImGui::BulletText("Appearing: %d, Hidden: %d (CanSkip %d Cannot %d), SkipItems: %d", window->Appearing, window->Hidden, window->HiddenFramesCanSkipItems, window->HiddenFramesCannotSkipItems, window->SkipItems); | ||||
|             ImGui::BulletText("NavLastIds: 0x%08X,0x%08X, NavLayerActiveMask: %X", window->NavLastIds[0], window->NavLastIds[1], window->DC.NavLayerActiveMask); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user