| 5373 | } |
| 5374 | |
| 5375 | static void ImGui::RenderDimmedBackgrounds() |
| 5376 | { |
| 5377 | ImGuiContext& g = *GImGui; |
| 5378 | ImGuiWindow* modal_window = GetTopMostAndVisiblePopupModal(); |
| 5379 | if (g.DimBgRatio <= 0.0f && g.NavWindowingHighlightAlpha <= 0.0f) |
| 5380 | return; |
| 5381 | const bool dim_bg_for_modal = (modal_window != NULL); |
| 5382 | const bool dim_bg_for_window_list = (g.NavWindowingTargetAnim != NULL && g.NavWindowingTargetAnim->Active); |
| 5383 | if (!dim_bg_for_modal && !dim_bg_for_window_list) |
| 5384 | return; |
| 5385 | |
| 5386 | ImGuiViewport* viewports_already_dimmed[2] = { NULL, NULL }; |
| 5387 | if (dim_bg_for_modal) |
| 5388 | { |
| 5389 | // Draw dimming behind modal or a begin stack child, whichever comes first in draw order. |
| 5390 | ImGuiWindow* dim_behind_window = FindBottomMostVisibleWindowWithinBeginStack(modal_window); |
| 5391 | RenderDimmedBackgroundBehindWindow(dim_behind_window, GetColorU32(ImGuiCol_ModalWindowDimBg, g.DimBgRatio)); |
| 5392 | viewports_already_dimmed[0] = modal_window->Viewport; |
| 5393 | } |
| 5394 | else if (dim_bg_for_window_list) |
| 5395 | { |
| 5396 | // Draw dimming behind CTRL+Tab target window and behind CTRL+Tab UI window |
| 5397 | RenderDimmedBackgroundBehindWindow(g.NavWindowingTargetAnim, GetColorU32(ImGuiCol_NavWindowingDimBg, g.DimBgRatio)); |
| 5398 | if (g.NavWindowingListWindow != NULL && g.NavWindowingListWindow->Viewport && g.NavWindowingListWindow->Viewport != g.NavWindowingTargetAnim->Viewport) |
| 5399 | RenderDimmedBackgroundBehindWindow(g.NavWindowingListWindow, GetColorU32(ImGuiCol_NavWindowingDimBg, g.DimBgRatio)); |
| 5400 | viewports_already_dimmed[0] = g.NavWindowingTargetAnim->Viewport; |
| 5401 | viewports_already_dimmed[1] = g.NavWindowingListWindow ? g.NavWindowingListWindow->Viewport : NULL; |
| 5402 | |
| 5403 | // Draw border around CTRL+Tab target window |
| 5404 | ImGuiWindow* window = g.NavWindowingTargetAnim; |
| 5405 | ImGuiViewport* viewport = window->Viewport; |
| 5406 | float distance = g.FontSize; |
| 5407 | ImRect bb = window->Rect(); |
| 5408 | bb.Expand(distance); |
| 5409 | if (bb.GetWidth() >= viewport->Size.x && bb.GetHeight() >= viewport->Size.y) |
| 5410 | bb.Expand(-distance - 1.0f); // If a window fits the entire viewport, adjust its highlight inward |
| 5411 | if (window->DrawList->CmdBuffer.Size == 0) |
| 5412 | window->DrawList->AddDrawCmd(); |
| 5413 | window->DrawList->PushClipRect(viewport->Pos, viewport->Pos + viewport->Size); |
| 5414 | window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_NavWindowingHighlight, g.NavWindowingHighlightAlpha), window->WindowRounding, 0, 3.0f); |
| 5415 | window->DrawList->PopClipRect(); |
| 5416 | } |
| 5417 | |
| 5418 | // Draw dimming background on _other_ viewports than the ones our windows are in |
| 5419 | for (int viewport_n = 0; viewport_n < g.Viewports.Size; viewport_n++) |
| 5420 | { |
| 5421 | ImGuiViewportP* viewport = g.Viewports[viewport_n]; |
| 5422 | if (viewport == viewports_already_dimmed[0] || viewport == viewports_already_dimmed[1]) |
| 5423 | continue; |
| 5424 | if (modal_window && viewport->Window && IsWindowAbove(viewport->Window, modal_window)) |
| 5425 | continue; |
| 5426 | ImDrawList* draw_list = GetForegroundDrawList(viewport); |
| 5427 | const ImU32 dim_bg_col = GetColorU32(dim_bg_for_modal ? ImGuiCol_ModalWindowDimBg : ImGuiCol_NavWindowingDimBg, g.DimBgRatio); |
| 5428 | draw_list->AddRectFilled(viewport->Pos, viewport->Pos + viewport->Size, dim_bg_col); |
| 5429 | } |
| 5430 | } |
| 5431 | |
| 5432 | // This is normally called by Render(). You may want to call it directly if you want to avoid calling Render() but the gain will be very minimal. |
nothing calls this directly
no test coverage detected