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:
@@ -313,7 +313,18 @@ internal sealed class InputBar
|
|||||||
return;
|
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;
|
var i = 0;
|
||||||
foreach (var chatType in tab.SelectedChannels.Keys)
|
foreach (var chatType in tab.SelectedChannels.Keys)
|
||||||
@@ -799,7 +810,55 @@ internal sealed class InputBar
|
|||||||
|
|
||||||
try
|
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 (
|
if (
|
||||||
_themeQuickPicker is not null
|
_themeQuickPicker is not null
|
||||||
|
|||||||
@@ -21,6 +21,23 @@ internal static class PopupRow
|
|||||||
private const float IconGapRaw = 8f;
|
private const float IconGapRaw = 8f;
|
||||||
private const float AccentBarRaw = 2f;
|
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(
|
internal static bool Draw(
|
||||||
string id,
|
string id,
|
||||||
string label,
|
string label,
|
||||||
|
|||||||
Reference in New Issue
Block a user