mirror of
				https://github.com/ocornut/imgui.git
				synced 2025-10-26 12:27:30 +00:00 
			
		
		
		
	AutoFit can be triggered on each axis separately via SetNextWindowSize() (mentioned in #249)
This commit is contained in:
		
							
								
								
									
										61
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -1419,7 +1419,7 @@ struct ImGuiWindow | |||||||
|     bool                    SkipItems;                          // == Visible && !Collapsed |     bool                    SkipItems;                          // == Visible && !Collapsed | ||||||
|     int                     BeginCount;                         // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs) |     int                     BeginCount;                         // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs) | ||||||
|     ImGuiID                 PopupID;                            // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling)  |     ImGuiID                 PopupID;                            // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling)  | ||||||
|     int                     AutoFitFrames; |     int                     AutoFitFramesX, AutoFitFramesY; | ||||||
|     bool                    AutoFitOnlyGrows; |     bool                    AutoFitOnlyGrows; | ||||||
|     int                     AutoPosLastDirection; |     int                     AutoPosLastDirection; | ||||||
|     int                     HiddenFrames; |     int                     HiddenFrames; | ||||||
| @@ -1783,7 +1783,7 @@ ImGuiWindow::ImGuiWindow(const char* name) | |||||||
|     SkipItems = false; |     SkipItems = false; | ||||||
|     BeginCount = 0; |     BeginCount = 0; | ||||||
|     PopupID = 0; |     PopupID = 0; | ||||||
|     AutoFitFrames = -1; |     AutoFitFramesX = AutoFitFramesY = -1; | ||||||
|     AutoFitOnlyGrows = false; |     AutoFitOnlyGrows = false; | ||||||
|     AutoPosLastDirection = -1; |     AutoPosLastDirection = -1; | ||||||
|     HiddenFrames = 0; |     HiddenFrames = 0; | ||||||
| @@ -3499,13 +3499,16 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFl | |||||||
|  |  | ||||||
|     if ((flags & ImGuiWindowFlags_AlwaysAutoResize) != 0) |     if ((flags & ImGuiWindowFlags_AlwaysAutoResize) != 0) | ||||||
|     { |     { | ||||||
|         window->AutoFitFrames = 2; |         window->AutoFitFramesX = window->AutoFitFramesY = 2; | ||||||
|         window->AutoFitOnlyGrows = false; |         window->AutoFitOnlyGrows = false; | ||||||
|     } |     } | ||||||
|     else if (ImLengthSqr(window->Size) < 0.00001f) |     else | ||||||
|     { |     { | ||||||
|         window->AutoFitFrames = 2; |         if (window->Size.x <= 0.0f) | ||||||
|         window->AutoFitOnlyGrows = true; |             window->AutoFitFramesX = 2; | ||||||
|  |         if (window->Size.y <= 0.0f) | ||||||
|  |             window->AutoFitFramesY = 2; | ||||||
|  |         window->AutoFitOnlyGrows = (window->AutoFitFramesX > 0) || (window->AutoFitFramesY > 0); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     g.Windows.push_back(window); |     g.Windows.push_back(window); | ||||||
| @@ -3705,8 +3708,10 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_ | |||||||
|         { |         { | ||||||
|             // We still process initial auto-fit on collapsed windows to get a window width, |             // We still process initial auto-fit on collapsed windows to get a window width, | ||||||
|             // But otherwise we don't honor ImGuiWindowFlags_AlwaysAutoResize when collapsed. |             // But otherwise we don't honor ImGuiWindowFlags_AlwaysAutoResize when collapsed. | ||||||
|             if (window->AutoFitFrames > 0) |             if (window->AutoFitFramesX > 0) | ||||||
|                 window->SizeFull = window->AutoFitOnlyGrows ? ImMax(window->SizeFull, size_auto_fit) : size_auto_fit; |                 window->SizeFull.x = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.x, size_auto_fit.x) : size_auto_fit.x; | ||||||
|  |             if (window->AutoFitFramesY > 0) | ||||||
|  |                 window->SizeFull.y = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.y, size_auto_fit.y) : size_auto_fit.y; | ||||||
|             window->Size = window->TitleBarRect().GetSize(); |             window->Size = window->TitleBarRect().GetSize(); | ||||||
|         } |         } | ||||||
|         else |         else | ||||||
| @@ -3715,10 +3720,13 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_ | |||||||
|             { |             { | ||||||
|                 window->SizeFull = size_auto_fit; |                 window->SizeFull = size_auto_fit; | ||||||
|             } |             } | ||||||
|             else if (window->AutoFitFrames > 0 && !window_size_set_by_api) |             else if ((window->AutoFitFramesX > 0 || window->AutoFitFramesY > 0) && !window_size_set_by_api) | ||||||
|             { |             { | ||||||
|                 // Auto-fit only grows during the first few frames |                 // Auto-fit only grows during the first few frames | ||||||
|                 window->SizeFull = window->AutoFitOnlyGrows ? ImMax(window->SizeFull, size_auto_fit) : size_auto_fit; |                 if (window->AutoFitFramesX > 0) | ||||||
|  |                     window->SizeFull.x = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.x, size_auto_fit.x) : size_auto_fit.x; | ||||||
|  |                 if (window->AutoFitFramesY > 0) | ||||||
|  |                     window->SizeFull.y = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.y, size_auto_fit.y) : size_auto_fit.y; | ||||||
|                 if (!(flags & ImGuiWindowFlags_NoSavedSettings)) |                 if (!(flags & ImGuiWindowFlags_NoSavedSettings)) | ||||||
|                     MarkSettingsDirty(); |                     MarkSettingsDirty(); | ||||||
|             } |             } | ||||||
| @@ -3801,7 +3809,7 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_ | |||||||
|         // Clamp position so it stays visible |         // Clamp position so it stays visible | ||||||
|         if (!(flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Tooltip)) |         if (!(flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Tooltip)) | ||||||
|         { |         { | ||||||
|             if (!window_pos_set_by_api && window->AutoFitFrames <= 0 && g.IO.DisplaySize.x > 0.0f && g.IO.DisplaySize.y > 0.0f) // Ignore zero-sized display explicitly to avoid losing positions if a window manager reports zero-sized window when initializing or minimizing. |             if (!window_pos_set_by_api && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0 && g.IO.DisplaySize.x > 0.0f && g.IO.DisplaySize.y > 0.0f) // Ignore zero-sized display explicitly to avoid losing positions if a window manager reports zero-sized window when initializing or minimizing. | ||||||
|             { |             { | ||||||
|                 ImVec2 padding = ImMax(style.DisplayWindowPadding, style.DisplaySafeAreaPadding); |                 ImVec2 padding = ImMax(style.DisplayWindowPadding, style.DisplaySafeAreaPadding); | ||||||
|                 window->PosFloat = ImMax(window->PosFloat + window->Size, padding) - window->Size; |                 window->PosFloat = ImMax(window->PosFloat + window->Size, padding) - window->Size; | ||||||
| @@ -3855,7 +3863,7 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_ | |||||||
|         else |         else | ||||||
|         { |         { | ||||||
|             ImU32 resize_col = 0; |             ImU32 resize_col = 0; | ||||||
|             if (!(flags & ImGuiWindowFlags_AlwaysAutoResize) && window->AutoFitFrames <= 0 && !(flags & ImGuiWindowFlags_NoResize)) |             if (!(flags & ImGuiWindowFlags_AlwaysAutoResize) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0 && !(flags & ImGuiWindowFlags_NoResize)) | ||||||
|             { |             { | ||||||
|                 // Manual resize |                 // Manual resize | ||||||
|                 const ImRect resize_rect(window->Rect().GetBR()-ImVec2(14,14), window->Rect().GetBR()); |                 const ImRect resize_rect(window->Rect().GetBR()-ImVec2(14,14), window->Rect().GetBR()); | ||||||
| @@ -3980,8 +3988,10 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_ | |||||||
|         window->DC.GroupStack.resize(0); |         window->DC.GroupStack.resize(0); | ||||||
|         window->MenuColumns.Update(3, style.ItemSpacing.x, !window_was_visible); |         window->MenuColumns.Update(3, style.ItemSpacing.x, !window_was_visible); | ||||||
|  |  | ||||||
|         if (window->AutoFitFrames > 0) |         if (window->AutoFitFramesX > 0) | ||||||
|             window->AutoFitFrames--; |             window->AutoFitFramesX--; | ||||||
|  |         if (window->AutoFitFramesY > 0) | ||||||
|  |             window->AutoFitFramesY--; | ||||||
|  |  | ||||||
|         // Title bar |         // Title bar | ||||||
|         if (!(flags & ImGuiWindowFlags_NoTitleBar)) |         if (!(flags & ImGuiWindowFlags_NoTitleBar)) | ||||||
| @@ -4039,7 +4049,7 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_ | |||||||
|         IM_ASSERT((flags & ImGuiWindowFlags_NoTitleBar) != 0); |         IM_ASSERT((flags & ImGuiWindowFlags_NoTitleBar) != 0); | ||||||
|         window->Collapsed = parent_window && parent_window->Collapsed; |         window->Collapsed = parent_window && parent_window->Collapsed; | ||||||
|  |  | ||||||
|         if (!(flags & ImGuiWindowFlags_AlwaysAutoResize) && window->AutoFitFrames <= 0) |         if (!(flags & ImGuiWindowFlags_AlwaysAutoResize) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0) | ||||||
|         { |         { | ||||||
|             const ImVec4 clip_rect_t = window->ClipRectStack.back(); |             const ImVec4 clip_rect_t = window->ClipRectStack.back(); | ||||||
|             window->Collapsed |= (clip_rect_t.x >= clip_rect_t.z || clip_rect_t.y >= clip_rect_t.w); |             window->Collapsed |= (clip_rect_t.x >= clip_rect_t.z || clip_rect_t.y >= clip_rect_t.w); | ||||||
| @@ -4054,7 +4064,7 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_ | |||||||
|         window->Active = false; |         window->Active = false; | ||||||
|  |  | ||||||
|     // Return false if we don't intend to display anything to allow user to perform an early out optimization |     // Return false if we don't intend to display anything to allow user to perform an early out optimization | ||||||
|     window->SkipItems = (window->Collapsed || !window->Active) && window->AutoFitFrames <= 0; |     window->SkipItems = (window->Collapsed || !window->Active) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0; | ||||||
|     return !window->SkipItems; |     return !window->SkipItems; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -4528,15 +4538,24 @@ static void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiSetCond | |||||||
|     window->SetWindowSizeAllowFlags &= ~(ImGuiSetCond_Once | ImGuiSetCond_FirstUseEver | ImGuiSetCond_Appearing); |     window->SetWindowSizeAllowFlags &= ~(ImGuiSetCond_Once | ImGuiSetCond_FirstUseEver | ImGuiSetCond_Appearing); | ||||||
|  |  | ||||||
|     // Set |     // Set | ||||||
|     if (ImLengthSqr(size) > 0.00001f) |     if (size.x > 0.0f) | ||||||
|     { |     { | ||||||
|         window->SizeFull = size; | 		window->AutoFitFramesX = 0; | ||||||
|         window->AutoFitFrames = 0; |         window->SizeFull.x = size.x; | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         // Autofit |         window->AutoFitFramesX = 2; | ||||||
|         window->AutoFitFrames = 2; |         window->AutoFitOnlyGrows = false; | ||||||
|  |     } | ||||||
|  |     if (size.y > 0.0f) | ||||||
|  |     { | ||||||
|  | 		window->AutoFitFramesY = 0; | ||||||
|  |         window->SizeFull.y = size.y; | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         window->AutoFitFramesY = 2; | ||||||
|         window->AutoFitOnlyGrows = false; |         window->AutoFitOnlyGrows = false; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 ocornut
					ocornut