mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 13:11:05 +01:00 
			
		
		
		
	Viewports Added ImGui::GetMainViewport() as a way to get the bounds and work area of the host display. (#3789, #1542)
Viewports: Backport a few constructs from 'docking' branch. Viewports: Added ImGuiViewportFlags_IsPlatformWindow, ImGuiViewportFlags_IsPlatformMonitor, ImGuiViewportFlags_OwnedByApp (none of them were in docking branch yet). ImGuiViewportFlags_IsPlatformMonitor is merely there to convey future intent, not yet used. Reduce uses of io.DisplaySize. MainMenuBar: Backport work area handling code from 'docking' branch. Metrics: Backported "Viewports" debug visualizer from 'docking' branch. Demo: Rework 'Examples->Fullscreen Window'. Demo: 'Simple Overlay' demo now moves under main menu-bar (if any) using GetMainViewport()'s work area.
This commit is contained in:
		| @@ -6569,18 +6569,39 @@ void ImGui::EndMenuBar() | ||||
|     window->DC.MenuBarAppending = false; | ||||
| } | ||||
|  | ||||
| // For the main menu bar, which cannot be moved, we honor g.Style.DisplaySafeAreaPadding to ensure text can be visible on a TV set. | ||||
| bool ImGui::BeginMainMenuBar() | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     ImGuiViewportP* viewport = (ImGuiViewportP*)(void*)GetMainViewport(); | ||||
|     ImGuiWindow* menu_bar_window = FindWindowByName("##MainMenuBar"); | ||||
|  | ||||
|     // For the main menu bar, which cannot be moved, we honor g.Style.DisplaySafeAreaPadding to ensure text can be visible on a TV set. | ||||
|     g.NextWindowData.MenuBarOffsetMinVal = ImVec2(g.Style.DisplaySafeAreaPadding.x, ImMax(g.Style.DisplaySafeAreaPadding.y - g.Style.FramePadding.y, 0.0f)); | ||||
|     SetNextWindowPos(ImVec2(0.0f, 0.0f)); | ||||
|     SetNextWindowSize(ImVec2(g.IO.DisplaySize.x, g.NextWindowData.MenuBarOffsetMinVal.y + g.FontBaseSize + g.Style.FramePadding.y)); | ||||
|  | ||||
|     // Get our rectangle at the top of the work area | ||||
|     if (menu_bar_window == NULL || menu_bar_window->BeginCount == 0) | ||||
|     { | ||||
|         // Set window position | ||||
|         // We don't attempt to calculate our height ahead, as it depends on the per-viewport font size.  | ||||
|         // However menu-bar will affect the minimum window size so we'll get the right height. | ||||
|         ImVec2 menu_bar_pos = viewport->Pos + viewport->CurrWorkOffsetMin; | ||||
|         ImVec2 menu_bar_size = ImVec2(viewport->Size.x - viewport->CurrWorkOffsetMin.x + viewport->CurrWorkOffsetMax.x, 1.0f); | ||||
|         SetNextWindowPos(menu_bar_pos); | ||||
|         SetNextWindowSize(menu_bar_size); | ||||
|     } | ||||
|  | ||||
|     // Create window | ||||
|     PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); | ||||
|     PushStyleVar(ImGuiStyleVar_WindowMinSize, ImVec2(0, 0)); | ||||
|     PushStyleVar(ImGuiStyleVar_WindowMinSize, ImVec2(0, 0)); // Lift normal size constraint, however the presence of a menu-bar will give us the minimum height we want. | ||||
|     ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_MenuBar; | ||||
|     bool is_open = Begin("##MainMenuBar", NULL, window_flags) && BeginMenuBar(); | ||||
|     PopStyleVar(2); | ||||
|  | ||||
|     // Report our size into work area (for next frame) using actual window size | ||||
|     menu_bar_window = GetCurrentWindow(); | ||||
|     if (menu_bar_window->BeginCount == 1) | ||||
|         viewport->CurrWorkOffsetMin.y += menu_bar_window->Size.y; | ||||
|  | ||||
|     g.NextWindowData.MenuBarOffsetMinVal = ImVec2(0.0f, 0.0f); | ||||
|     if (!is_open) | ||||
|     { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user