From 58e3a1f41eeec2afbed0242377b9dba0e6916c05 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Tue, 17 May 2011 20:36:11 +1200 Subject: [PATCH] Use the new dropdowns everywhere --- OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs | 182 +++++++++++--------- OpenRA.Mods.Cnc/Widgets/CncSettingsLogic.cs | 87 ++++++---- mods/cnc/chrome/dropdowns.yaml | 3 +- mods/cnc/chrome/lobby.yaml | 46 ++++- 4 files changed, 201 insertions(+), 117 deletions(-) diff --git a/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs b/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs index c876c58839..e149944352 100755 --- a/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs @@ -309,96 +309,123 @@ namespace OpenRA.Mods.Cnc.Widgets { return orderManager.LobbyInfo.ClientInSlot( slot ); } - - bool ShowSlotDropDown(Session.Slot slot, ButtonWidget name, bool showBotOptions) + + class SlotDropDownOption { - var dropDownOptions = new List> + public string Title; + public string Order; + public Func Selected; + + public SlotDropDownOption(string title, string order, Func selected) { - new Pair( "Open", - () => orderManager.IssueOrder( Order.Command( "slot_open " + slot.Index ) )), - new Pair( "Closed", - () => orderManager.IssueOrder( Order.Command( "slot_close " + slot.Index ) )), - }; - - if (showBotOptions) - { - var bots = Rules.Info["player"].Traits.WithInterface().Select(t => t.Name); - bots.Do(bot => - dropDownOptions.Add(new Pair("Bot: {0}".F(bot), - () => orderManager.IssueOrder(Order.Command("slot_bot {0} {1}".F(slot.Index, bot)))))); + Title = title; + Order = order; + Selected = selected; } - - CncDropDownButtonWidget.ShowDropDown( name, - dropDownOptions, - (ac, w) => new LabelWidget - { - Bounds = new Rectangle(0, 0, w, 24), - Text = " {0}".F(ac.First), - OnMouseUp = mi => { ac.Second(); return true; }, - }); + } + + bool ShowSlotDropDown(CncDropDownButtonWidget dropdown, Session.Slot slot, bool showBotOptions) + { + var substitutions = new Dictionary() {{ "DROPDOWN_WIDTH", dropdown.Bounds.Width }}; + var panel = (ScrollPanelWidget)Widget.LoadWidget("LABEL_DROPDOWN_TEMPLATE", null, new WidgetArgs() + { + { "substitutions", substitutions } + }); + + var itemTemplate = panel.GetWidget("TEMPLATE"); + var options = new List() + { + new SlotDropDownOption("Open", "slot_open "+slot.Index, () => (!slot.Closed && slot.Bot == null)), + new SlotDropDownOption("Closed", "slot_close "+slot.Index, () => slot.Closed) + }; + + if (showBotOptions) + foreach (var bot in Rules.Info["player"].Traits.WithInterface().Select(t => t.Name)) + options.Add(new SlotDropDownOption("Bot: {0}".F(bot), "slot_bot {0} {1}".F(slot.Index, bot), () => slot.Bot == bot)); + + foreach (var option in options) + { + var o = option; + var item = ScrollItemWidget.Setup(itemTemplate, o.Selected, + () => { + orderManager.IssueOrder(Order.Command(o.Order)); + dropdown.RemovePanel(); + }); + item.GetWidget("LABEL").GetText = () => o.Title; + panel.AddChild(item); + } + + panel.Bounds.Height = Math.Min(150, panel.ContentHeight); + dropdown.AttachPanel(panel); return true; } - bool ShowRaceDropDown(Session.Slot s, ButtonWidget race) + bool ShowRaceDropDown(CncDropDownButtonWidget dropdown, Session.Slot slot) { - if (Map.Players[s.MapPlayer].LockRace) + if (Map.Players[slot.MapPlayer].LockRace) return false; - - var dropDownOptions = new List>(); + + var substitutions = new Dictionary() {{ "DROPDOWN_WIDTH", dropdown.Bounds.Width }}; + var panel = (ScrollPanelWidget)Widget.LoadWidget("RACE_DROPDOWN_TEMPLATE", null, new WidgetArgs() + { + { "substitutions", substitutions } + }); + + var itemTemplate = panel.GetWidget("TEMPLATE"); + foreach (var c in CountryNames) { - var cc = c; - dropDownOptions.Add(new Pair( cc.Key, - () => orderManager.IssueOrder( Order.Command("race "+cc.Key) )) ); - }; - - CncDropDownButtonWidget.ShowDropDown( race, - dropDownOptions, - (ac, w) => - { - var ret = new LabelWidget - { - Bounds = new Rectangle(0, 0, w, 24), - Text = " {0}".F(CountryNames[ac.First]), - OnMouseUp = mi => { ac.Second(); return true; }, - }; - - ret.AddChild(new ImageWidget - { - Bounds = new Rectangle(5, 5, 40, 15), - GetImageName = () => ac.First, - GetImageCollection = () => "flags", - }); - return ret; - }); + var race = c; + var sr = GetClientInSlot(slot).Country; + var item = ScrollItemWidget.Setup(itemTemplate, () => sr == race.Key, + () => { + orderManager.IssueOrder(Order.Command("race "+race.Key)); + dropdown.RemovePanel(); + }); + item.GetWidget("LABEL").GetText = () => race.Value; + var flag = item.GetWidget("FLAG"); + flag.GetImageCollection = () => "flags"; + flag.GetImageName = () => race.Key; + panel.AddChild(item); + } + + panel.Bounds.Height = Math.Min(150, panel.ContentHeight); + dropdown.AttachPanel(panel); return true; } - - bool ShowTeamDropDown(ButtonWidget team) + + bool ShowTeamDropDown(CncDropDownButtonWidget dropdown, Session.Slot slot) { - var dropDownOptions = new List>(); + var substitutions = new Dictionary() {{ "DROPDOWN_WIDTH", dropdown.Bounds.Width }}; + var panel = (ScrollPanelWidget)Widget.LoadWidget("TEAM_DROPDOWN_TEMPLATE", null, new WidgetArgs() + { + { "substitutions", substitutions } + }); + + var itemTemplate = panel.GetWidget("TEMPLATE"); + for (int i = 0; i <= Map.PlayerCount; i++) { var ii = i; - dropDownOptions.Add(new Pair( ii == 0 ? "-" : ii.ToString(), - () => orderManager.IssueOrder( Order.Command("team "+ii) )) ); + var c = GetClientInSlot(slot); + var item = ScrollItemWidget.Setup(itemTemplate, () => c.Team == ii, + () => { + orderManager.IssueOrder(Order.Command("team "+ii)); + dropdown.RemovePanel(); + }); + item.GetWidget("LABEL").GetText = () => ii == 0 ? "-" : ii.ToString(); + panel.AddChild(item); }; - - CncDropDownButtonWidget.ShowDropDown( team, - dropDownOptions, - (ac, w) => new LabelWidget - { - Bounds = new Rectangle(0, 0, w, 24), - Text = " {0}".F(ac.First), - OnMouseUp = mi => { ac.Second(); return true; }, - }); + + panel.Bounds.Height = Math.Min(150, panel.ContentHeight); + dropdown.AttachPanel(panel); return true; } - void ShowColorDropDown(Session.Slot s, CncDropDownButtonWidget color) + bool ShowColorDropDown(Session.Slot s, CncDropDownButtonWidget color) { if (Map.Players[s.MapPlayer].LockColor) - return; + return true; Action onSelect = c => { @@ -421,6 +448,7 @@ namespace OpenRA.Mods.Cnc.Widgets }); color.AttachPanel(colorChooser); + return true; } void UpdatePlayerList() @@ -442,18 +470,18 @@ namespace OpenRA.Mods.Cnc.Widgets if (slot.Spectator) { template = EmptySlotTemplateHost.Clone(); - var name = template.GetWidget("NAME"); + var name = template.GetWidget("NAME"); name.GetText = () => s.Closed ? "Closed" : "Open"; - name.OnMouseDown = _ => ShowSlotDropDown(s, name, false); + name.OnMouseDown = _ => ShowSlotDropDown(name, s, false); var btn = template.GetWidget("JOIN"); btn.GetText = () => "Spectate in this slot"; } else { template = EmptySlotTemplateHost.Clone(); - var name = template.GetWidget("NAME"); + var name = template.GetWidget("NAME"); name.GetText = () => s.Closed ? "Closed" : (s.Bot == null) ? "Open" : s.Bot; - name.OnMouseDown = _ => ShowSlotDropDown(s, name, Map.Players[ s.MapPlayer ].AllowBots); + name.OnMouseDown = _ => ShowSlotDropDown(name, s, Map.Players[ s.MapPlayer ].AllowBots); } } else @@ -503,13 +531,13 @@ namespace OpenRA.Mods.Cnc.Widgets name.OnLoseFocus = () => name.OnEnterKey(); var color = template.GetWidget("COLOR"); - color.OnClick = () => ShowColorDropDown(s, color); + color.OnMouseDown = _ => ShowColorDropDown(s, color); var colorBlock = color.GetWidget("COLORBLOCK"); colorBlock.GetColor = () => c.ColorRamp.GetColor(0); - var faction = template.GetWidget("FACTION"); - faction.OnMouseDown = _ => ShowRaceDropDown(s, faction); + var faction = template.GetWidget("FACTION"); + faction.OnMouseDown = _ => ShowRaceDropDown(faction, s); var factionname = faction.GetWidget("FACTIONNAME"); factionname.GetText = () => CountryNames[c.Country]; @@ -517,8 +545,8 @@ namespace OpenRA.Mods.Cnc.Widgets factionflag.GetImageName = () => c.Country; factionflag.GetImageCollection = () => "flags"; - var team = template.GetWidget("TEAM"); - team.OnMouseDown = _ => ShowTeamDropDown(team); + var team = template.GetWidget("TEAM"); + team.OnMouseDown = _ => ShowTeamDropDown(team, s); team.GetText = () => (c.Team == 0) ? "-" : c.Team.ToString(); var status = template.GetWidget("STATUS"); diff --git a/OpenRA.Mods.Cnc/Widgets/CncSettingsLogic.cs b/OpenRA.Mods.Cnc/Widgets/CncSettingsLogic.cs index 86e87f5e44..e83da2891b 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.OnClick = () => ShowColorPicker(colorDropdown); + colorDropdown.OnMouseDown = _ => ShowColorPicker(colorDropdown); colorDropdown.GetWidget("COLORBLOCK").GetColor = () => playerColor.GetColor(0); // Debug @@ -86,7 +86,7 @@ namespace OpenRA.Mods.Cnc.Widgets // Video windowMode = Game.Settings.Graphics.Mode; var windowModeDropdown = generalPane.GetWidget("MODE_DROPDOWN"); - windowModeDropdown.OnClick = () => ShowWindowModeDropdown(windowModeDropdown); + windowModeDropdown.OnMouseDown = _ => ShowWindowModeDropdown(windowModeDropdown); windowModeDropdown.GetText = () => windowMode == WindowMode.Windowed ? "Windowed" : windowMode == WindowMode.Fullscreen ? "Fullscreen" : "Pseudo-Fullscreen"; generalPane.GetWidget("WINDOW_RESOLUTION").IsVisible = () => windowMode == WindowMode.Windowed; @@ -137,7 +137,7 @@ namespace OpenRA.Mods.Cnc.Widgets mouseScroll = Game.Settings.Game.MouseScroll; var mouseScrollDropdown = inputPane.GetWidget("MOUSE_SCROLL"); - mouseScrollDropdown.OnClick = () => ShowMouseScrollDropdown(mouseScrollDropdown); + mouseScrollDropdown.OnMouseDown = _ => ShowMouseScrollDropdown(mouseScrollDropdown); mouseScrollDropdown.GetText = () => mouseScroll.ToString(); var teamchat = Game.Settings.Game.TeamChatToggle; @@ -147,7 +147,7 @@ namespace OpenRA.Mods.Cnc.Widgets groupAddModifier = Game.Settings.Keyboard.ControlGroupModifier; var groupModifierDropdown = inputPane.GetWidget("GROUPADD_MODIFIER"); - groupModifierDropdown.OnClick = () => ShowGroupModifierDropdown(groupModifierDropdown); + groupModifierDropdown.OnMouseDown = _ => ShowGroupModifierDropdown(groupModifierDropdown); groupModifierDropdown.GetText = () => groupAddModifier.ToString(); @@ -194,7 +194,7 @@ namespace OpenRA.Mods.Cnc.Widgets }; } - void ShowColorPicker(CncDropDownButtonWidget color) + bool ShowColorPicker(CncDropDownButtonWidget color) { Action onSelect = c => { @@ -215,9 +215,10 @@ namespace OpenRA.Mods.Cnc.Widgets }); color.AttachPanel(colorChooser); + return true; } - void ShowGroupModifierDropdown(CncDropDownButtonWidget dropdown) + bool ShowGroupModifierDropdown(CncDropDownButtonWidget dropdown) { var substitutions = new Dictionary() {{ "DROPDOWN_WIDTH", dropdown.Bounds.Width }}; var panel = (ScrollPanelWidget)Game.LoadWidget(world, "LABEL_DROPDOWN_TEMPLATE", null, new WidgetArgs() @@ -226,27 +227,28 @@ namespace OpenRA.Mods.Cnc.Widgets }); var itemTemplate = panel.GetWidget("TEMPLATE"); - var options = new List>() + var options = new Dictionary() { - Pair.New("Ctrl", Modifiers.Ctrl), - Pair.New("Alt", Modifiers.Alt), - Pair.New("Shift", Modifiers.Shift), + { "Ctrl", Modifiers.Ctrl }, + { "Alt", Modifiers.Alt }, + { "Shift", Modifiers.Shift }, // TODO: Display this as Cmd on osx once we have platform detection - Pair.New("Meta", Modifiers.Meta) + { "Meta", Modifiers.Meta } }; - foreach (var o in options) + foreach (var option in options) { - var key = o; - var item = ScrollItemWidget.Setup(itemTemplate, () => groupAddModifier == key.Second, () => { groupAddModifier = key.Second; dropdown.RemovePanel(); }); - item.GetWidget("LABEL").GetText = () => key.First; + var o = option; + var item = ScrollItemWidget.Setup(itemTemplate, () => groupAddModifier == o.Value, () => { groupAddModifier = o.Value; dropdown.RemovePanel(); }); + item.GetWidget("LABEL").GetText = () => o.Key; panel.AddChild(item); } panel.Bounds.Height = panel.ContentHeight; dropdown.AttachPanel(panel); + return true; } - void ShowWindowModeDropdown(CncDropDownButtonWidget dropdown) + bool ShowWindowModeDropdown(CncDropDownButtonWidget dropdown) { var substitutions = new Dictionary() {{ "DROPDOWN_WIDTH", dropdown.Bounds.Width }}; var panel = (ScrollPanelWidget)Game.LoadWidget(world, "LABEL_DROPDOWN_TEMPLATE", null, new WidgetArgs() @@ -255,44 +257,53 @@ namespace OpenRA.Mods.Cnc.Widgets }); var itemTemplate = panel.GetWidget("TEMPLATE"); - var options = new List>() + var options = new Dictionary() { - Pair.New("Pseudo-Fullscreen", WindowMode.PseudoFullscreen), - Pair.New("Fullscreen",WindowMode.Fullscreen), - Pair.New("Windowed", WindowMode.Windowed), + { "Pseudo-Fullscreen", WindowMode.PseudoFullscreen }, + { "Fullscreen", WindowMode.Fullscreen }, + { "Windowed", WindowMode.Windowed }, }; - foreach (var o in options) + foreach (var option in options) { - var key = o; - var item = ScrollItemWidget.Setup(itemTemplate, () => windowMode == key.Second, () => { windowMode = key.Second; dropdown.RemovePanel(); }); - item.GetWidget("LABEL").GetText = () => key.First; + var o = option; + var item = ScrollItemWidget.Setup(itemTemplate, () => windowMode == o.Value, () => { windowMode = o.Value; dropdown.RemovePanel(); }); + item.GetWidget("LABEL").GetText = () => o.Key; panel.AddChild(item); } panel.Bounds.Height = panel.ContentHeight; dropdown.AttachPanel(panel); + return true; } - bool ShowMouseScrollDropdown(Widget dropdown) + bool ShowMouseScrollDropdown(CncDropDownButtonWidget dropdown) { - var dropDownOptions = new List>() + var substitutions = new Dictionary() {{ "DROPDOWN_WIDTH", dropdown.Bounds.Width }}; + var panel = (ScrollPanelWidget)Game.LoadWidget(world, "LABEL_DROPDOWN_TEMPLATE", null, new WidgetArgs() { - Pair.New("Disabled", new Action(() => mouseScroll = MouseScrollType.Disabled)), - Pair.New("Standard", new Action(() => mouseScroll = MouseScrollType.Standard)), - Pair.New("Inverted", new Action(() => mouseScroll = MouseScrollType.Inverted)), + { "substitutions", substitutions } + }); + + var itemTemplate = panel.GetWidget("TEMPLATE"); + var options = new Dictionary() + { + { "Disabled", MouseScrollType.Disabled }, + { "Standard", MouseScrollType.Standard }, + { "Inverted", MouseScrollType.Inverted }, }; - CncDropDownButtonWidget.ShowDropDown(dropdown, - dropDownOptions, - (ac, w) => new LabelWidget - { - Bounds = new Rectangle(0, 0, w, 24), - Text = ac.First, - Align = LabelWidget.TextAlign.Center, - OnMouseUp = mi => { ac.Second(); return true; }, - }); + foreach (var option in options) + { + var o = option; + var item = ScrollItemWidget.Setup(itemTemplate, () => mouseScroll == o.Value, () => { mouseScroll = o.Value; dropdown.RemovePanel(); }); + item.GetWidget("LABEL").GetText = () => o.Key; + panel.AddChild(item); + } + + panel.Bounds.Height = panel.ContentHeight; + dropdown.AttachPanel(panel); return true; } } diff --git a/mods/cnc/chrome/dropdowns.yaml b/mods/cnc/chrome/dropdowns.yaml index ca750aa5cb..353a3125af 100644 --- a/mods/cnc/chrome/dropdowns.yaml +++ b/mods/cnc/chrome/dropdowns.yaml @@ -75,6 +75,7 @@ Background@COLOR_CHOOSER: ScrollPanel@LABEL_DROPDOWN_TEMPLATE: Id:LABEL_DROPDOWN_TEMPLATE Width:DROPDOWN_WIDTH + Background:panel-black Children: ScrollItem@TEMPLATE: Id:TEMPLATE @@ -85,7 +86,7 @@ ScrollPanel@LABEL_DROPDOWN_TEMPLATE: Visible:false Children: Label@LABEL: - X:10 Id:LABEL + X:10 Width:PARENT_RIGHT-20 Height:25 \ No newline at end of file diff --git a/mods/cnc/chrome/lobby.yaml b/mods/cnc/chrome/lobby.yaml index f437d09a13..b7be6d890f 100644 --- a/mods/cnc/chrome/lobby.yaml +++ b/mods/cnc/chrome/lobby.yaml @@ -380,4 +380,48 @@ Container@SERVER_LOBBY: Y:499 Width:140 Height:35 - Text:Start Game \ No newline at end of file + Text:Start Game + +ScrollPanel@RACE_DROPDOWN_TEMPLATE: + Id:RACE_DROPDOWN_TEMPLATE + Width:DROPDOWN_WIDTH + Background:panel-black + Children: + ScrollItem@TEMPLATE: + Id:TEMPLATE + Width:PARENT_RIGHT-27 + Height:25 + X:2 + Y:0 + Visible:false + Children: + Image@FLAG: + Id:FLAG + X:5 + Y:5 + Width:30 + Height:15 + Label@LABEL: + Id:LABEL + X:40 + Width:60 + Height:25 +ScrollPanel@TEAM_DROPDOWN_TEMPLATE: + Id:TEAM_DROPDOWN_TEMPLATE + Width:DROPDOWN_WIDTH + Background:panel-black + Children: + ScrollItem@TEMPLATE: + Id:TEMPLATE + Width:PARENT_RIGHT-27 + Height:25 + X:2 + Y:0 + Visible:false + Children: + Label@LABEL: + Id:LABEL + X:0 + Width:PARENT_RIGHT + Height:25 + Align:Center \ No newline at end of file