diff --git a/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs b/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs index 2797439b7a..bae7878e91 100755 --- a/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs @@ -395,15 +395,16 @@ namespace OpenRA.Mods.Cnc.Widgets return true; } - bool ShowColorDropDown(Session.Slot s, ButtonWidget color) + void ShowColorDropDown(Session.Slot s, CncDropDownButtonWidget color) { if (Map.Players[s.MapPlayer].LockColor) - return false; + return; Action onSelect = c => { Game.Settings.Player.ColorRamp = c; Game.Settings.Save(); + color.RemovePanel(); orderManager.IssueOrder(Order.Command("color {0}".F(c))); }; @@ -419,8 +420,7 @@ namespace OpenRA.Mods.Cnc.Widgets { "initialRamp", orderManager.LocalClient.ColorRamp } }); - CncDropDownButtonWidget.ShowDropPanel(color, colorChooser, new List() { colorChooser.GetWidget("SAVE_BUTTON") }, () => true); - return true; + color.DisplayPanel(colorChooser); } void UpdatePlayerList() @@ -502,8 +502,8 @@ namespace OpenRA.Mods.Cnc.Widgets }; name.OnLoseFocus = () => name.OnEnterKey(); - var color = template.GetWidget("COLOR"); - color.OnMouseUp = _ => ShowColorDropDown(s, color); + var color = template.GetWidget("COLOR"); + color.OnClick = () => ShowColorDropDown(s, color); var colorBlock = color.GetWidget("COLORBLOCK"); colorBlock.GetColor = () => c.ColorRamp.GetColor(0); diff --git a/OpenRA.Mods.Cnc/Widgets/CncMenuButton.cs b/OpenRA.Mods.Cnc/Widgets/CncMenuButton.cs index 62191d2930..63a44edd09 100644 --- a/OpenRA.Mods.Cnc/Widgets/CncMenuButton.cs +++ b/OpenRA.Mods.Cnc/Widgets/CncMenuButton.cs @@ -22,32 +22,40 @@ namespace OpenRA.Mods.Cnc.Widgets public CncDropDownButtonWidget() : base() { } protected CncDropDownButtonWidget(CncDropDownButtonWidget other) : base(other) { } public override Widget Clone() { return new CncDropDownButtonWidget(this); } - - public static new void ShowDropDown(Widget w, IEnumerable ts, Func ft) + + Widget panel; + Widget fullscreenMask; + + public void RemovePanel() { - var dropDown = new ScrollPanelWidget(); - 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); - } + Widget.RootWidget.RemoveChild(fullscreenMask); + Widget.RootWidget.RemoveChild(panel); + Game.BeforeGameStart -= RemovePanel; + panel = fullscreenMask = null; + } + + public void DisplayPanel(Widget p) + { + if (panel != null) + throw new InvalidOperationException("Attempted to attach a panel to an open dropdown"); + panel = p; - dropDown.Bounds.Height = Math.Min(150, dropDown.ContentHeight); - ShowDropPanel(w, dropDown, dismissAfter, () => true); + // Mask to prevent any clicks from being sent to other widgets + fullscreenMask = new ContainerWidget(); + fullscreenMask.Bounds = new Rectangle(0, 0, Game.viewport.Width, Game.viewport.Height); + Widget.RootWidget.AddChild(fullscreenMask); + Game.BeforeGameStart += RemovePanel; + + fullscreenMask.OnMouseDown = mi => + { + RemovePanel(); + return true; + }; + fullscreenMask.OnMouseUp = mi => true; + + var oldBounds = panel.Bounds; + panel.Bounds = new Rectangle(RenderOrigin.X, RenderOrigin.Y + Bounds.Height, oldBounds.Width, oldBounds.Height); + Widget.RootWidget.AddChild(panel); } } } diff --git a/OpenRA.Mods.Cnc/Widgets/CncSettingsLogic.cs b/OpenRA.Mods.Cnc/Widgets/CncSettingsLogic.cs index 88bf984d86..af9f2f23e4 100755 --- a/OpenRA.Mods.Cnc/Widgets/CncSettingsLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/CncSettingsLogic.cs @@ -59,7 +59,7 @@ namespace OpenRA.Mods.Cnc.Widgets playerPalettePreview.Ramp = playerColor; var colorDropdown = generalPane.GetWidget("COLOR_DROPDOWN"); - colorDropdown.OnMouseUp = _ => ShowColorPicker(colorDropdown); + colorDropdown.OnClick = () => ShowColorPicker(colorDropdown); colorDropdown.GetWidget("COLORBLOCK").GetColor = () => playerColor.GetColor(0); // Debug @@ -194,11 +194,12 @@ namespace OpenRA.Mods.Cnc.Widgets }; } - bool ShowColorPicker(Widget colorDropdown) + void ShowColorPicker(CncDropDownButtonWidget color) { Action onSelect = c => { playerColor = c; + color.RemovePanel(); }; Action onChange = c => @@ -213,8 +214,7 @@ namespace OpenRA.Mods.Cnc.Widgets { "initialRamp", playerColor } }); - CncDropDownButtonWidget.ShowDropPanel(colorDropdown, colorChooser, new List() { colorChooser.GetWidget("SAVE_BUTTON") }, () => true); - return true; + color.DisplayPanel(colorChooser); } bool ShowGroupModifierDropdown(Widget dropdown)