diff --git a/src/AcDream.App/UI/UiChannelMenu.cs b/src/AcDream.App/UI/UiChannelMenu.cs index 0d7445c8..0403527c 100644 --- a/src/AcDream.App/UI/UiChannelMenu.cs +++ b/src/AcDream.App/UI/UiChannelMenu.cs @@ -53,7 +53,7 @@ public sealed class UiChannelMenu : UiElement public uint PressedSprite { get; set; } public Vector4 TextColor { get; set; } = new(1f, 0.92f, 0.72f, 1f); /// Popup panel fill — the retail talk-focus menu is a warm tan/orange. - public Vector4 PopupColor { get; set; } = new(0.56f, 0.40f, 0.18f, 0.97f); + public Vector4 PopupColor { get; set; } = new(0.56f, 0.40f, 0.18f, 1f); private bool _open; private static float PopupW => 2 * ColW; @@ -61,26 +61,51 @@ public sealed class UiChannelMenu : UiElement public UiChannelMenu() { CapturesPointerDrag = true; } + /// The button face label = the active talk target (retail updates the + /// "Chat" button to whichever target you pick). "Chat" = Chat-to-All (Say). + private string ButtonText => Selected switch + { + ChatChannelKind.Say => "Chat", + ChatChannelKind.General => "General", + ChatChannelKind.Trade => "Trade", + ChatChannelKind.Lfg => "LFG", + ChatChannelKind.Fellowship => "Fellow", + ChatChannelKind.Allegiance => "Alleg", + ChatChannelKind.Patron => "Patron", + ChatChannelKind.Vassals => "Vassals", + ChatChannelKind.Monarch => "Monarch", + ChatChannelKind.Roleplay => "Roleplay", + ChatChannelKind.Society => "Society", + ChatChannelKind.Olthoi => "Olthoi", + _ => "Chat", + }; + protected override void OnDraw(UiRenderContext ctx) { - // Button face + the "Chat" label (retail labels the talk-focus button "Chat"). + // Button face + the active-target label (retail updates this to the chosen target). if (SpriteResolve is { } resolve) { var (tex, _, _) = resolve(_open ? PressedSprite : NormalSprite); if (tex != 0) ctx.DrawSprite(tex, 0, 0, Width, Height, 0f, 0f, 1f, 1f, Vector4.One); } - DrawLabel(ctx, "Chat", 4f, (Height - LineH()) * 0.5f); + DrawLabel(ctx, ButtonText, 4f, (Height - LineH()) * 0.5f); if (!_open) return; // Two-column popup opening UPWARD from the button (chat sits at screen bottom). - float top = -PopupH; - ctx.DrawRect(0, top, PopupW, PopupH, PopupColor); - for (int i = 0; i < Items.Length; i++) + // Force OPAQUE: the menu must read solid even though the chat window is translucent. + ctx.PushAlphaAbsolute(1f); + try { - int col = i / Rows, row = i % Rows; - DrawLabel(ctx, Items[i].Label, 4f + col * ColW, top + row * ItemH); + float top = -PopupH; + ctx.DrawRect(0, top, PopupW, PopupH, PopupColor); + for (int i = 0; i < Items.Length; i++) + { + int col = i / Rows, row = i % Rows; + DrawLabel(ctx, Items[i].Label, 4f + col * ColW, top + row * ItemH); + } } + finally { ctx.PopAlpha(); } } private float LineH() => DatFont?.LineHeight ?? Font?.LineHeight ?? 14f; diff --git a/src/AcDream.App/UI/UiRenderContext.cs b/src/AcDream.App/UI/UiRenderContext.cs index ecda1c1c..5b97492e 100644 --- a/src/AcDream.App/UI/UiRenderContext.cs +++ b/src/AcDream.App/UI/UiRenderContext.cs @@ -34,6 +34,10 @@ public sealed class UiRenderContext /// Multiply into the running opacity. Pair with . public void PushAlpha(float a) { _alphaStack.Add(_alpha); _alpha *= a; } + /// Push an ABSOLUTE opacity (replaces, not multiplies) — for popups/overlays + /// that must stay opaque even inside a translucent window. Pair with . + public void PushAlphaAbsolute(float a) { _alphaStack.Add(_alpha); _alpha = a; } + public void PopAlpha() { if (_alphaStack.Count == 0) return;