fix(chat): size the popups from their rows, not the rows from a guess

An ImGui popup does not grow for draw-list content, so both new popups carried a
fixed minimum width -- and German outran it within a day. The menu clipped
Schnellauswahl and Chat ausblenden mid-word; the channel picker would have done
the same to Freie Gesellschaft on a narrow theme font.

PopupRow gets a CalcWidth that measures label plus icon plus padding under the
faces that will draw them, and both popups take the widest visible entry as
their width. Locale-proof by construction: whatever language writes the longest
string sets the size.
This commit is contained in:
2026-08-19 19:13:30 +02:00
parent 3e46600fc3
commit 8a9692a71d
2 changed files with 78 additions and 2 deletions
+61 -2
View File
@@ -313,7 +313,18 @@ internal sealed class InputBar
return;
}
ImGui.Dummy(new Vector2(150f * StyleEngine.Metrics.Scale, 0f));
var pickerWidth = 0f;
foreach (var chatType in tab.SelectedChannels.Keys)
{
if (chatType.ToInputChannel() is not { } ch)
continue;
pickerWidth = MathF.Max(
pickerWidth,
StyleEngine.Widgets.PopupRow.CalcWidth(ch.ToChatType().Name(), null, _fonts)
);
}
ImGui.Dummy(new Vector2(pickerWidth, 0f));
var i = 0;
foreach (var chatType in tab.SelectedChannels.Keys)
@@ -799,7 +810,55 @@ internal sealed class InputBar
try
{
ImGui.Dummy(new Vector2(160f * StyleEngine.Metrics.Scale, 0f));
// Width from the widest visible entry, not a fixed minimum -- the
// popup does not grow for draw-list content, and German labels
// outran the first guess within a day.
var menuWidth = 0f;
if (_themeQuickPicker is not null)
menuWidth = MathF.Max(
menuWidth,
StyleEngine.Widgets.PopupRow.CalcWidth(
HellionStrings.Settings_QuickPicker_Tooltip,
FontAwesomeIcon.Palette,
_fonts
)
);
menuWidth = MathF.Max(
menuWidth,
StyleEngine.Widgets.PopupRow.CalcWidth(
HellionStrings.InputBar_Settings_Tooltip,
FontAwesomeIcon.Cog,
_fonts
)
);
menuWidth = MathF.Max(
menuWidth,
StyleEngine.Widgets.PopupRow.CalcWidth(
Language.Context_ScreenshotMode,
FontAwesomeIcon.Camera,
_fonts
)
);
if (Plugin.Config.ShowHideButton && _onHideWindow is not null)
menuWidth = MathF.Max(
menuWidth,
StyleEngine.Widgets.PopupRow.CalcWidth(
HellionStrings.InputBar_HideChat_Tooltip,
FontAwesomeIcon.EyeSlash,
_fonts
)
);
if (OnPopIn is not null)
menuWidth = MathF.Max(
menuWidth,
StyleEngine.Widgets.PopupRow.CalcWidth(
HellionStrings.InputBar_PopIn_Tooltip,
FontAwesomeIcon.Times,
_fonts
)
);
ImGui.Dummy(new Vector2(menuWidth, 0f));
if (
_themeQuickPicker is not null
@@ -21,6 +21,23 @@ internal static class PopupRow
private const float IconGapRaw = 8f;
private const float AccentBarRaw = 2f;
// The popup must be sized from its rows, not the rows from the popup: an
// ImGui popup does not grow for draw-list content, so a fixed minimum width
// clips whichever locale writes the longest labels. German did, first day.
internal static float CalcWidth(string label, FontAwesomeIcon? icon, FontManager fonts)
{
var scale = Metrics.Scale;
var w = PadXRaw * 2f * scale + ImGui.CalcTextSize(label).X;
if (icon is { } glyph)
{
using (fonts.FontAwesome.Push())
w += ImGui.CalcTextSize(glyph.ToIconString()).X + IconGapRaw * scale;
}
return w;
}
internal static bool Draw(
string id,
string label,