diff --git a/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs b/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs index c18b2e3a73..d8b186356d 100755 --- a/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs @@ -335,7 +335,7 @@ namespace OpenRA.Mods.Cnc.Widgets () => orderManager.IssueOrder(Order.Command("slot_bot {0} {1}".F(slot.Index, bot)))))); } - DropDownButtonWidget.ShowDropDown( name, + CncDropDownButtonWidget.ShowDropDown( name, dropDownOptions, (ac, w) => new LabelWidget { @@ -359,7 +359,7 @@ namespace OpenRA.Mods.Cnc.Widgets () => orderManager.IssueOrder( Order.Command("race "+cc.Key) )) ); }; - DropDownButtonWidget.ShowDropDown( race, + CncDropDownButtonWidget.ShowDropDown( race, dropDownOptions, (ac, w) => { @@ -391,7 +391,7 @@ namespace OpenRA.Mods.Cnc.Widgets () => orderManager.IssueOrder( Order.Command("team "+ii) )) ); }; - DropDownButtonWidget.ShowDropDown( team, + CncDropDownButtonWidget.ShowDropDown( team, dropDownOptions, (ac, w) => new LabelWidget { @@ -426,7 +426,7 @@ namespace OpenRA.Mods.Cnc.Widgets rangeSlider.OnChange += _ => UpdateColorPreview(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); UpdateColorPreview(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); - DropDownButtonWidget.ShowDropPanel(color, colorChooser, new List() {colorChooser.GetWidget("BUTTON_OK")}, () => { + CncDropDownButtonWidget.ShowDropPanel(color, colorChooser, new List() {colorChooser.GetWidget("BUTTON_OK")}, () => { UpdateColorPreview(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); UpdatePlayerColor(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); return true; diff --git a/OpenRA.Mods.Cnc/Widgets/CncMenuButton.cs b/OpenRA.Mods.Cnc/Widgets/CncMenuButton.cs index 1db65d87d4..73dfe53aba 100644 --- a/OpenRA.Mods.Cnc/Widgets/CncMenuButton.cs +++ b/OpenRA.Mods.Cnc/Widgets/CncMenuButton.cs @@ -8,11 +8,12 @@ */ #endregion - using System; -using OpenRA.Widgets; -using OpenRA.Graphics; +using System.Collections.Generic; using System.Drawing; +using OpenRA.Graphics; +using OpenRA.Widgets; + namespace OpenRA.Mods.Cnc.Widgets { public class CncMenuButtonWidget : ButtonWidget @@ -91,7 +92,10 @@ namespace OpenRA.Mods.Cnc.Widgets public class CncScrollPanelWidget : ScrollPanelWidget { public CncScrollPanelWidget() - : base() { } + : base() + { + Background = "panel-gray"; + } protected CncScrollPanelWidget(CncScrollPanelWidget widget) : base(widget) { } @@ -129,7 +133,7 @@ namespace OpenRA.Mods.Cnc.Widgets thumbRect.Contains(Viewport.LastMousePos) ? "button-hover" : "button"; WidgetUtils.DrawPanel(scrollbarBg, scrollbarRect); - WidgetUtils.DrawPanel("panel-gray", backgroundRect); + WidgetUtils.DrawPanel(Background, backgroundRect); WidgetUtils.DrawPanel(upButtonBg, upButtonRect); WidgetUtils.DrawPanel(downButtonBg, downButtonRect); @@ -237,7 +241,6 @@ namespace OpenRA.Mods.Cnc.Widgets public CncSliderWidget() : base() { } public CncSliderWidget(CncSliderWidget other) : base(other) { } - public override Widget Clone() { return new CncSliderWidget(this); } public override void DrawInner() { @@ -269,5 +272,70 @@ namespace OpenRA.Mods.Cnc.Widgets WidgetUtils.DrawPanel(state, tr); } } + + public class CncDropDownButtonWidget : DropDownButtonWidget + { + public Func IsDisabled = () => false; + public Renderer.FontType Font = Renderer.FontType.Bold; + + public CncDropDownButtonWidget() : base() { } + protected CncDropDownButtonWidget(CncDropDownButtonWidget other) : base(other) + { + Font = other.Font; + } + public override Widget Clone() { return new CncDropDownButtonWidget(this); } + + public override void DrawInner() + { + var rb = RenderBounds; + var state = IsDisabled() ? "button-disabled" : + Depressed ? "button-pressed" : + rb.Contains(Viewport.LastMousePos) ? "button-hover" : + "button"; + + WidgetUtils.DrawPanel(state, rb); + + var font = Game.Renderer.Fonts[Font]; + var text = GetText(); + font.DrawText(text, + new int2(rb.X + UsableWidth / 2, rb.Y + Bounds.Height / 2) + - new int2(font.Measure(text).X / 2, + font.Measure(text).Y / 2), IsDisabled() ? Color.Gray : Color.White); + + var image = ChromeProvider.GetImage("scrollbar", "down_arrow"); + WidgetUtils.DrawRGBA( image, new float2(rb.Right - rb.Height + 4, + rb.Top + (rb.Height - image.bounds.Height) / 2)); + + WidgetUtils.FillRectWithColor(new Rectangle(rb.Right - rb.Height, rb.Top + 3, 1, rb.Height - 6), + Color.White); + } + + public static new void ShowDropDown(Widget w, IEnumerable ts, Func ft) + { + var dropDown = new CncScrollPanelWidget(); + dropDown.Bounds = new Rectangle(w.RenderOrigin.X, w.RenderOrigin.Y + w.Bounds.Height, w.Bounds.Width, 100); + dropDown.ItemSpacing = 1; + dropDown.Background = "panel-black"; + + List items = new List(); + List dismissAfter = new List(); + foreach (var t in ts) + { + var ww = ft(t, dropDown.Bounds.Width - dropDown.ScrollbarWidth); + dismissAfter.Add(ww); + ww.OnMouseMove = mi => items.Do(lw => + { + lw.Background = null; + ww.Background = "button-hover"; + }); + + dropDown.AddChild(ww); + items.Add(ww); + } + + dropDown.Bounds.Height = Math.Min(150, dropDown.ContentHeight); + ShowDropPanel(w, dropDown, dismissAfter, () => true); + } + } } diff --git a/mods/cnc/chrome/lobby.yaml b/mods/cnc/chrome/lobby.yaml index 205c47b01d..0fa47a7e10 100644 --- a/mods/cnc/chrome/lobby.yaml +++ b/mods/cnc/chrome/lobby.yaml @@ -66,15 +66,13 @@ Container@SERVER_LOBBY: Text:Name Width:150 Height:25 - X:0 - Y:0 MaxLength:16 - DropDownButton@COLOR: + CncDropDownButton@COLOR: Id:COLOR Width:80 Height:25 X:160 - Y:0 + Font:Regular Children: ColorBlock@COLORBLOCK: Id:COLORBLOCK @@ -82,12 +80,12 @@ Container@SERVER_LOBBY: Y:6 Width:PARENT_RIGHT-35 Height:PARENT_BOTTOM-12 - DropDownButton@FACTION: + CncDropDownButton@FACTION: Id:FACTION Width:130 Height:25 X:250 - Y:0 + Font:Regular Children: Image@FACTIONFLAG: Id:FACTIONFLAG @@ -102,13 +100,13 @@ Container@SERVER_LOBBY: Height:25 X:40 Y:0 - DropDownButton@TEAM: + CncDropDownButton@TEAM: Id:TEAM Text:Team Width:48 Height:25 X:390 - Y:0 + Font:Regular CncCheckbox@STATUS: Id:STATUS X:448 @@ -236,13 +234,12 @@ Container@SERVER_LOBBY: Height:25 Visible:false Children: - DropDownButton@NAME: + CncDropDownButton@NAME: Id:NAME Text:Name Width:150 Height:25 - X:0 - Y:0 + Font:Regular CncMenuButton@JOIN: Id:JOIN Text:Play in this slot