fix(ui): scale overlay-dialog card width with the font/DPI setting (fixes modal overflow)
Every BeginOverlayDialog is passed a raw pixel card width (550, 620, …), but the fonts and spacing inside scale with Layout::dpiScale() — which includes the user's font-size setting. At any non-default scale the content outgrew the fixed card, so text overflowed the card edge and elements misaligned. Scale the card width by dpiScale() (no-op at the default 1.0 scale) and clamp it to the viewport so a large scale can't push it off-screen. Fixes all overlay dialogs at once. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -925,6 +925,14 @@ inline bool BeginOverlayDialog(const char* title, bool* p_open, float cardWidth
|
|||||||
ImVec2 vp_pos = vp->Pos;
|
ImVec2 vp_pos = vp->Pos;
|
||||||
ImVec2 vp_size = vp->Size;
|
ImVec2 vp_size = vp->Size;
|
||||||
|
|
||||||
|
// Dialog widths are authored as raw pixels, but the fonts/spacing inside scale with
|
||||||
|
// Layout::dpiScale() (which includes the user's font-size setting). Scale the card by the same
|
||||||
|
// factor so the content doesn't outgrow a fixed card and overflow/misalign at non-default
|
||||||
|
// scales. No-op at the default scale (dpiScale() == 1). Clamped to the viewport so a large scale
|
||||||
|
// can't push the card off-screen.
|
||||||
|
cardWidth *= Layout::dpiScale();
|
||||||
|
cardWidth = std::min(cardWidth, vp_size.x - 32.0f);
|
||||||
|
|
||||||
// Fullscreen scrim overlay
|
// Fullscreen scrim overlay
|
||||||
ImGui::SetNextWindowPos(vp_pos);
|
ImGui::SetNextWindowPos(vp_pos);
|
||||||
ImGui::SetNextWindowSize(vp_size);
|
ImGui::SetNextWindowSize(vp_size);
|
||||||
|
|||||||
Reference in New Issue
Block a user