diff --git a/OpenRA.Game/Widgets/ButtonWidget.cs b/OpenRA.Game/Widgets/ButtonWidget.cs index b1b086a136..b396d0298d 100644 --- a/OpenRA.Game/Widgets/ButtonWidget.cs +++ b/OpenRA.Game/Widgets/ButtonWidget.cs @@ -115,7 +115,7 @@ namespace OpenRA.Widgets public override Widget Clone() { return new DropDownButtonWidget(this); } public override int UsableWidth { get { return Bounds.Width - Bounds.Height; } } /* space for button */ - public static void ShowDropDown(Widget w, IEnumerable ts, Func ft) + public static void ShowDropPanel(Widget w, Widget panel, IEnumerable dismissAfter, Func onDismiss) { var fullscreenMask = new ContainerWidget { @@ -123,8 +123,36 @@ namespace OpenRA.Widgets ClickThrough = false, Visible = true }; - Widget.RootWidget.AddChild(fullscreenMask); + + Action HideDropDown = () => + { + Widget.RootWidget.Children.Remove(fullscreenMask); + Widget.RootWidget.Children.Remove(panel); + }; + + fullscreenMask.OnMouseDown = mi => + { + if (onDismiss()) HideDropDown(); + return false; + }; + + var oldBounds = panel.Bounds; + panel.Bounds = new Rectangle(w.RenderOrigin.X, w.RenderOrigin.Y + w.Bounds.Height, oldBounds.Width, oldBounds.Height); + panel.ClickThrough = false; + panel.Visible = true; + panel.OnMouseUp = mi => true; + + foreach (var ww in dismissAfter) + { + var origMouseUp = ww.OnMouseUp; + ww.OnMouseUp = mi => { var result = origMouseUp(mi); if (onDismiss()) HideDropDown(); return result; }; + } + Widget.RootWidget.AddChild(panel); + } + + public static void ShowDropDown(Widget w, IEnumerable ts, Func ft) + { var dropDown = new ScrollPanelWidget { Bounds = new Rectangle(w.RenderOrigin.X, w.RenderOrigin.Y + w.Bounds.Height, w.Bounds.Width, 100), @@ -133,28 +161,13 @@ namespace OpenRA.Widgets OnMouseUp = mi => true, }; - Widget.RootWidget.AddChild(dropDown); - - Action HideDropDown = () => - { - Widget.RootWidget.Children.Remove(fullscreenMask); - Widget.RootWidget.Children.Remove(dropDown); - }; - - fullscreenMask.OnMouseDown = mi => - { - HideDropDown(); - return false; - }; - var y = 0; List items = new List(); - + List dismissAfter = new List(); foreach (var t in ts) { var ww = ft(t, dropDown.Bounds.Width); - var origMouseUp = ww.OnMouseUp; - ww.OnMouseUp = mi => { var result = origMouseUp(mi); HideDropDown(); return result; }; + dismissAfter.Add(ww); ww.ClickThrough = false; ww.IsVisible = () => true; ww.Bounds = new Rectangle(1, y, ww.Bounds.Width, ww.Bounds.Height); @@ -175,6 +188,7 @@ namespace OpenRA.Widgets dropDown.ContentHeight = y; dropDown.Bounds.Height = y + 2; + ShowDropPanel(w,dropDown, dismissAfter, () => true); } } } \ No newline at end of file diff --git a/OpenRA.Game/Widgets/WidgetLoader.cs b/OpenRA.Game/Widgets/WidgetLoader.cs index 1434901887..4ccb125de6 100644 --- a/OpenRA.Game/Widgets/WidgetLoader.cs +++ b/OpenRA.Game/Widgets/WidgetLoader.cs @@ -41,7 +41,9 @@ namespace OpenRA public Widget LoadWidget( Dictionary args, Widget parent, MiniYamlNode node) { var widget = NewWidget(node.Key, args); - parent.AddChild( widget ); + + if (parent != null) + parent.AddChild( widget ); foreach (var child in node.Value.Nodes) if (child.Key != "Children") diff --git a/OpenRA.Mods.RA/Widgets/Delegates/LobbyDelegate.cs b/OpenRA.Mods.RA/Widgets/Delegates/LobbyDelegate.cs index ab105c55e8..6a6deaa56b 100755 --- a/OpenRA.Mods.RA/Widgets/Delegates/LobbyDelegate.cs +++ b/OpenRA.Mods.RA/Widgets/Delegates/LobbyDelegate.cs @@ -140,25 +140,6 @@ namespace OpenRA.Widgets.Delegates chatLabel.Text = (teamChat) ? "Team:" : "Chat:"; return true; }; - - var colorChooser = lobby.GetWidget("COLOR_CHOOSER"); - var hueSlider = colorChooser.GetWidget("HUE_SLIDER"); - var satSlider = colorChooser.GetWidget("SAT_SLIDER"); - var lumSlider = colorChooser.GetWidget("LUM_SLIDER"); - var rangeSlider = colorChooser.GetWidget("RANGE_SLIDER"); - - hueSlider.OnChange += _ => UpdateColorPreview(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); - satSlider.OnChange += _ => UpdateColorPreview(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); - lumSlider.OnChange += _ => UpdateColorPreview(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); - rangeSlider.OnChange += _ => UpdateColorPreview(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); - - colorChooser.GetWidget("BUTTON_OK").OnMouseUp = mi => - { - colorChooser.IsVisible = () => false; - UpdateColorPreview(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); - UpdatePlayerColor(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); - return true; - }; } void UpdatePlayerColor(float hf, float sf, float lf, float r) @@ -216,7 +197,7 @@ namespace OpenRA.Widgets.Delegates return orderManager.LobbyInfo.ClientInSlot( slot ); } - void ShowDropDown(Session.Slot slot, ButtonWidget name, bool showBotOptions) + bool ShowSlotDropDown(Session.Slot slot, ButtonWidget name, bool showBotOptions) { var dropDownOptions = new List> { @@ -242,12 +223,13 @@ namespace OpenRA.Widgets.Delegates Text = " {0}".F(ac.First), OnMouseUp = mi => { ac.Second(); return true; }, }); + return true; } - void ShowRaceDropDown(Session.Slot s, ButtonWidget race) + bool ShowRaceDropDown(Session.Slot s, ButtonWidget race) { if (Map.Players[s.MapPlayer].LockRace) - return; + return false; var dropDownOptions = new List>(); foreach (var c in CountryNames) @@ -276,9 +258,10 @@ namespace OpenRA.Widgets.Delegates }); return ret; }); + return true; } - void ShowTeamDropDown(ButtonWidget team) + bool ShowTeamDropDown(ButtonWidget team) { var dropDownOptions = new List>(); for (int i = 0; i <= Map.PlayerCount; i++) @@ -296,6 +279,39 @@ namespace OpenRA.Widgets.Delegates Text = " {0}".F(ac.First), OnMouseUp = mi => { ac.Second(); return true; }, }); + return true; + } + + bool ShowColorDropDown(Session.Slot s, ButtonWidget color) + { + if (Map.Players[s.MapPlayer].LockColor) + return false; + + var colorChooser = Game.modData.WidgetLoader.LoadWidget( new Dictionary(), null, "COLOR_CHOOSER" ); + var hueSlider = colorChooser.GetWidget("HUE_SLIDER"); + hueSlider.SetOffset(orderManager.LocalClient.Color1.GetHue()/360f); + + var satSlider = colorChooser.GetWidget("SAT_SLIDER"); + satSlider.SetOffset(orderManager.LocalClient.Color1.GetSaturation()); + + var lumSlider = colorChooser.GetWidget("LUM_SLIDER"); + lumSlider.SetOffset(orderManager.LocalClient.Color1.GetBrightness()); + + var rangeSlider = colorChooser.GetWidget("RANGE_SLIDER"); + rangeSlider.SetOffset(orderManager.LocalClient.Color1.GetBrightness() == 0 ? 0 : orderManager.LocalClient.Color2.GetBrightness()/orderManager.LocalClient.Color1.GetBrightness()); + + hueSlider.OnChange += _ => UpdateColorPreview(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); + satSlider.OnChange += _ => UpdateColorPreview(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); + lumSlider.OnChange += _ => UpdateColorPreview(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); + 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")}, () => { + UpdateColorPreview(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); + UpdatePlayerColor(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); + return true; + }); + return true; } void UpdatePlayerList() @@ -322,7 +338,7 @@ namespace OpenRA.Widgets.Delegates var btn = template.GetWidget("JOIN"); btn.GetText = () => "Spectate in this slot"; name.GetText = () => s.Closed ? "Closed" : "Open"; - name.OnMouseDown = _ => { ShowDropDown(s, name, false); return true; }; + name.OnMouseDown = _ => ShowSlotDropDown(s, name, false); } else @@ -330,7 +346,7 @@ namespace OpenRA.Widgets.Delegates template = EmptySlotTemplateHost.Clone(); var name = template.GetWidget("NAME"); name.GetText = () => s.Closed ? "Closed" : (s.Bot == null) ? "Open" : "Bot: " + s.Bot; - name.OnMouseDown = _ => { ShowDropDown(s, name, Map.Players[ s.MapPlayer ].AllowBots); return true; }; + name.OnMouseDown = _ => ShowSlotDropDown(s, name, Map.Players[ s.MapPlayer ].AllowBots); } } else @@ -376,34 +392,13 @@ namespace OpenRA.Widgets.Delegates name.OnLoseFocus = () => name.OnEnterKey(); var color = template.GetWidget("COLOR"); - color.OnMouseUp = mi => - { - if (Map.Players[s.MapPlayer].LockColor) - return false; - - var colorChooser = Widget.RootWidget.GetWidget("SERVER_LOBBY").GetWidget("COLOR_CHOOSER"); - var hueSlider = colorChooser.GetWidget("HUE_SLIDER"); - hueSlider.SetOffset(orderManager.LocalClient.Color1.GetHue()/360f); - - var satSlider = colorChooser.GetWidget("SAT_SLIDER"); - satSlider.SetOffset(orderManager.LocalClient.Color1.GetSaturation()); - - var lumSlider = colorChooser.GetWidget("LUM_SLIDER"); - lumSlider.SetOffset(orderManager.LocalClient.Color1.GetBrightness()); - - var rangeSlider = colorChooser.GetWidget("RANGE_SLIDER"); - rangeSlider.SetOffset(orderManager.LocalClient.Color1.GetBrightness() == 0 ? 0 : orderManager.LocalClient.Color2.GetBrightness()/orderManager.LocalClient.Color1.GetBrightness()); - - UpdateColorPreview(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); - colorChooser.IsVisible = () => true; - return true; - }; - + color.OnMouseUp = _ => ShowColorDropDown(s, color); + var colorBlock = color.GetWidget("COLORBLOCK"); colorBlock.GetColor = () => c.Color1; var faction = template.GetWidget("FACTION"); - faction.OnMouseDown = _ => {ShowRaceDropDown(s, faction); return true;}; + faction.OnMouseDown = _ => ShowRaceDropDown(s, faction); var factionname = faction.GetWidget("FACTIONNAME"); factionname.GetText = () => CountryNames[c.Country]; @@ -412,7 +407,7 @@ namespace OpenRA.Widgets.Delegates factionflag.GetImageCollection = () => "flags"; var team = template.GetWidget("TEAM"); - team.OnMouseDown = _ => {ShowTeamDropDown(team); return true;}; + team.OnMouseDown = _ => ShowTeamDropDown(team); team.GetText = () => (c.Team == 0) ? "-" : c.Team.ToString(); var status = template.GetWidget("STATUS"); diff --git a/mods/ra/chrome/gamelobby.yaml b/mods/ra/chrome/gamelobby.yaml index 20a6f45dd5..87703abe69 100644 --- a/mods/ra/chrome/gamelobby.yaml +++ b/mods/ra/chrome/gamelobby.yaml @@ -334,94 +334,85 @@ Background@SERVER_LOBBY: Width: 80 Height: 20 Text: Lock Teams - Background@COLOR_CHOOSER: - Id:COLOR_CHOOSER - Width:500 - Height:195 - X:(WINDOW_RIGHT - WIDTH)/2 - PARENT_LEFT - Y:100 - Visible:false - Children: - Button@BUTTON_OK: - Id:BUTTON_OK - X:PARENT_RIGHT - 180 - Y:PARENT_BOTTOM - 45 - Width:160 - Height:25 - Text:Ok - Bold:True - ShpImage@MCV: - Id:MCV - X:PARENT_RIGHT - 90 - Y:20 - Image:mcv - Frame:8 - Palette:colorpicker - ShpImage@FACT: - Id:FACT - X:PARENT_RIGHT - 100 - Y:70 - Image:fact - Palette:colorpicker - Label@HUE_LABEL: - X:0 - Y:30 - Width:110 - Height:20 - Align: Right - Text: Hue: - Slider@HUE: - Id:HUE_SLIDER - X:120 - Y:30 - Width:260 - Height:20 - Ticks:5 - Label@SAT_LABEL: - X:0 - Y:60 - Width:110 - Height:20 - Align: Right - Text: Saturation: - Slider@SAT: - Id:SAT_SLIDER - X:120 - Y:60 - Width:260 - Height:20 - Ticks:5 - Label@LUM_LABEL: - X:0 - Y:90 - Width:110 - Height:20 - Align: Right - Text: Brightness: - Slider@LUM: - Id:LUM_SLIDER - X:120 - Id:LUM_SLIDER - Y:90 - Width:260 - Height:20 - Ticks:5 - Range:0.2,1 - Label@RANGE_LABEL: - X:0 - Y:120 - Width:110 - Height:20 - Align: Right - Text: Range: - Slider@RANGE: - Id:RANGE_SLIDER - X:120 - Y:120 - Width:260 - Height:20 - Ticks:5 - Range:0,0.25 +Background@COLOR_CHOOSER: + Id:COLOR_CHOOSER + Background:dialog2 + Width:310 + Height:120 + Visible:false + Children: + Button@BUTTON_OK: + Id:BUTTON_OK + X:210 + Y:85 + Width:90 + Height:25 + Text:Ok + Bold:True + ShpImage@FACT: + Id:FACT + X:220 + Y:10 + Image:fact + Palette:colorpicker + Label@HUE_LABEL: + X:0 + Y:5 + Width:40 + Height:20 + Align: Right + Text: Hue: + Slider@HUE: + Id:HUE_SLIDER + X:43 + Y:10 + Width:160 + Height:20 + Ticks:5 + Label@SAT_LABEL: + X:0 + Y:30 + Width:40 + Height:20 + Align: Right + Text: Sat: + Slider@SAT: + Id:SAT_SLIDER + X:43 + Y:35 + Width:160 + Height:20 + Ticks:5 + Label@LUM_LABEL: + X:0 + Y:55 + Width:40 + Height:20 + Align: Right + Text: Lum: + Slider@LUM: + Id:LUM_SLIDER + X:43 + Y:60 + Width:160 + Height:20 + Ticks:5 + Range:0.2,1 + Label@RANGE_LABEL: + X:0 + Y:80 + Width:40 + Height:20 + Align: Right + Text: Ran: + Slider@RANGE: + Id:RANGE_SLIDER + X:43 + Y:85 + Width:160 + Height:20 + Ticks:5 + Range:0,0.25 Background@MAP_CHOOSER: Id:MAP_CHOOSER X:(WINDOW_RIGHT - WIDTH)/2