diff --git a/OpenRA.Game/Widgets/DropDownButtonWidget.cs b/OpenRA.Game/Widgets/DropDownButtonWidget.cs index 100b7803e8..f91e06e0ac 100644 --- a/OpenRA.Game/Widgets/DropDownButtonWidget.cs +++ b/OpenRA.Game/Widgets/DropDownButtonWidget.cs @@ -143,5 +143,28 @@ namespace OpenRA.Widgets dropDown.Bounds.Height = Math.Min(150, dropDown.ContentHeight); ShowDropPanel(w, dropDown, dismissAfter, () => true); } + + public void ShowDropDown(string panelTemplate, int height, List options, Func setupItem) + { + var substitutions = new Dictionary() {{ "DROPDOWN_WIDTH", Bounds.Width }}; + var panel = (ScrollPanelWidget)Widget.LoadWidget(panelTemplate, null, new WidgetArgs() + {{ "substitutions", substitutions }}); + + var itemTemplate = panel.GetWidget("TEMPLATE"); + panel.RemoveChildren(); + foreach (var option in options) + { + var o = option; + + ScrollItemWidget item = setupItem(o, itemTemplate); + var onClick = item.OnClick; + item.OnClick = () => { onClick(); RemovePanel(); }; + + panel.AddChild(item); + } + + panel.Bounds.Height = Math.Min(height, panel.ContentHeight); + AttachPanel(panel); + } } } \ No newline at end of file diff --git a/OpenRA.Mods.Cnc/Widgets/CncDiplomacyLogic.cs b/OpenRA.Mods.Cnc/Widgets/CncDiplomacyLogic.cs index 99a7e06647..6a8a9db521 100755 --- a/OpenRA.Mods.Cnc/Widgets/CncDiplomacyLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/CncDiplomacyLogic.cs @@ -61,29 +61,19 @@ namespace OpenRA.Mods.Cnc.Widgets if (dropdown.IsDisabled()) return true; - var substitutions = new Dictionary() {{ "DROPDOWN_WIDTH", dropdown.Bounds.Width }}; - var panel = (ScrollPanelWidget)Widget.LoadWidget("LABEL_DROPDOWN_TEMPLATE", null, new WidgetArgs() + var stances = Enum.GetValues(typeof(Stance)).OfType().ToList(); + Func setupItem = (s, template) => { - { "substitutions", substitutions } - }); + var item = ScrollItemWidget.Setup(template, + () => s == world.LocalPlayer.Stances[ pp ], + () => world.IssueOrder(new Order("SetStance", world.LocalPlayer.PlayerActor, false) + { TargetLocation = new int2(pp.Index, (int)s) })); + + item.GetWidget("LABEL").GetText = () => s.ToString(); + return item; + }; - var itemTemplate = panel.GetWidget("TEMPLATE"); - - foreach (var option in Enum.GetValues(typeof(Stance)).OfType()) - { - var o = option; - var item = ScrollItemWidget.Setup(itemTemplate, () => o == world.LocalPlayer.Stances[ pp ], - () => { - world.IssueOrder(new Order("SetStance", world.LocalPlayer.PlayerActor, - false) { TargetLocation = new int2(pp.Index, (int)o) }); - dropdown.RemovePanel(); - }); - item.GetWidget("LABEL").GetText = () => o.ToString(); - panel.AddChild(item); - } - - panel.Bounds.Height = Math.Min(150, panel.ContentHeight); - dropdown.AttachPanel(panel); + dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 150, stances, setupItem); return true; } } diff --git a/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs b/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs index 14b8f82459..6b396d4504 100755 --- a/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs @@ -326,13 +326,6 @@ namespace OpenRA.Mods.Cnc.Widgets bool ShowSlotDropDown(DropDownButtonWidget 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)), @@ -343,20 +336,16 @@ namespace OpenRA.Mods.Cnc.Widgets 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) + Func setupItem = (o, itemTemplate) => { - var o = option; - var item = ScrollItemWidget.Setup(itemTemplate, o.Selected, - () => { - orderManager.IssueOrder(Order.Command(o.Order)); - dropdown.RemovePanel(); - }); + var item = ScrollItemWidget.Setup(itemTemplate, + o.Selected, + () => orderManager.IssueOrder(Order.Command(o.Order))); item.GetWidget("LABEL").GetText = () => o.Title; - panel.AddChild(item); - } + return item; + }; - panel.Bounds.Height = Math.Min(150, panel.ContentHeight); - dropdown.AttachPanel(panel); + dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 150, options, setupItem); return true; } @@ -365,60 +354,37 @@ namespace OpenRA.Mods.Cnc.Widgets if (Map.Players[slot.MapPlayer].LockRace) return false; - var substitutions = new Dictionary() {{ "DROPDOWN_WIDTH", dropdown.Bounds.Width }}; - var panel = (ScrollPanelWidget)Widget.LoadWidget("RACE_DROPDOWN_TEMPLATE", null, new WidgetArgs() + var sr = GetClientInSlot(slot).Country; + Func setupItem = (race, itemTemplate) => { - { "substitutions", substitutions } - }); - - var itemTemplate = panel.GetWidget("TEMPLATE"); - - foreach (var c in CountryNames) - { - 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 item = ScrollItemWidget.Setup(itemTemplate, + () => sr == race, + () => orderManager.IssueOrder(Order.Command("race "+race))); + item.GetWidget("LABEL").GetText = () => CountryNames[race]; var flag = item.GetWidget("FLAG"); flag.GetImageCollection = () => "flags"; - flag.GetImageName = () => race.Key; - panel.AddChild(item); - } + flag.GetImageName = () => race; + return item; + }; - panel.Bounds.Height = Math.Min(150, panel.ContentHeight); - dropdown.AttachPanel(panel); + dropdown.ShowDropDown("RACE_DROPDOWN_TEMPLATE", 150, CountryNames.Keys.ToList(), setupItem); return true; } bool ShowTeamDropDown(DropDownButtonWidget dropdown, Session.Slot slot) { - var substitutions = new Dictionary() {{ "DROPDOWN_WIDTH", dropdown.Bounds.Width }}; - var panel = (ScrollPanelWidget)Widget.LoadWidget("TEAM_DROPDOWN_TEMPLATE", null, new WidgetArgs() + var c = GetClientInSlot(slot); + Func setupItem = (ii, itemTemplate) => { - { "substitutions", substitutions } - }); - - var itemTemplate = panel.GetWidget("TEMPLATE"); - - for (int i = 0; i <= Map.PlayerCount; i++) - { - var ii = i; - var c = GetClientInSlot(slot); - var item = ScrollItemWidget.Setup(itemTemplate, () => c.Team == ii, - () => { - orderManager.IssueOrder(Order.Command("team "+ii)); - dropdown.RemovePanel(); - }); + var item = ScrollItemWidget.Setup(itemTemplate, + () => c.Team == ii, + () => orderManager.IssueOrder(Order.Command("team "+ii))); item.GetWidget("LABEL").GetText = () => ii == 0 ? "-" : ii.ToString(); - panel.AddChild(item); + return item; }; - panel.Bounds.Height = Math.Min(150, panel.ContentHeight); - dropdown.AttachPanel(panel); + var options = Graphics.Util.MakeArray(Map.PlayerCount, i => i).ToList(); + dropdown.ShowDropDown("TEAM_DROPDOWN_TEMPLATE", 150, options, setupItem); return true; } diff --git a/OpenRA.Mods.Cnc/Widgets/CncSettingsLogic.cs b/OpenRA.Mods.Cnc/Widgets/CncSettingsLogic.cs index ec848ff938..b61042cdf8 100755 --- a/OpenRA.Mods.Cnc/Widgets/CncSettingsLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/CncSettingsLogic.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; using System.Drawing; +using System.Linq; using OpenRA.FileFormats; using OpenRA.FileFormats.Graphics; using OpenRA.GameRules; @@ -220,13 +221,6 @@ namespace OpenRA.Mods.Cnc.Widgets bool ShowGroupModifierDropdown(DropDownButtonWidget dropdown) { - var substitutions = new Dictionary() {{ "DROPDOWN_WIDTH", dropdown.Bounds.Width }}; - var panel = (ScrollPanelWidget)Game.LoadWidget(world, "LABEL_DROPDOWN_TEMPLATE", null, new WidgetArgs() - { - { "substitutions", substitutions } - }); - - var itemTemplate = panel.GetWidget("TEMPLATE"); var options = new Dictionary() { { "Ctrl", Modifiers.Ctrl }, @@ -235,58 +229,45 @@ namespace OpenRA.Mods.Cnc.Widgets // TODO: Display this as Cmd on osx once we have platform detection { "Meta", Modifiers.Meta } }; - - foreach (var option in options) + + Func setupItem = (o, itemTemplate) => { - 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); + var item = ScrollItemWidget.Setup(itemTemplate, + () => groupAddModifier == options[o], + () => groupAddModifier = options[o]); + item.GetWidget("LABEL").GetText = () => o; + return item; + }; + + dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, options.Keys.ToList(), setupItem); return true; } bool ShowWindowModeDropdown(DropDownButtonWidget dropdown) { - var substitutions = new Dictionary() {{ "DROPDOWN_WIDTH", dropdown.Bounds.Width }}; - var panel = (ScrollPanelWidget)Game.LoadWidget(world, "LABEL_DROPDOWN_TEMPLATE", null, new WidgetArgs() - { - { "substitutions", substitutions } - }); - - var itemTemplate = panel.GetWidget("TEMPLATE"); var options = new Dictionary() { { "Pseudo-Fullscreen", WindowMode.PseudoFullscreen }, { "Fullscreen", WindowMode.Fullscreen }, { "Windowed", WindowMode.Windowed }, }; - - foreach (var option in options) - { - 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); + Func setupItem = (o, itemTemplate) => + { + var item = ScrollItemWidget.Setup(itemTemplate, + () => windowMode == options[o], + () => windowMode = options[o]); + item.GetWidget("LABEL").GetText = () => o; + return item; + }; + + dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, options.Keys.ToList(), setupItem); return true; } bool ShowMouseScrollDropdown(DropDownButtonWidget dropdown) { - var substitutions = new Dictionary() {{ "DROPDOWN_WIDTH", dropdown.Bounds.Width }}; - var panel = (ScrollPanelWidget)Game.LoadWidget(world, "LABEL_DROPDOWN_TEMPLATE", null, new WidgetArgs() - { - { "substitutions", substitutions } - }); - - var itemTemplate = panel.GetWidget("TEMPLATE"); var options = new Dictionary() { { "Disabled", MouseScrollType.Disabled }, @@ -294,16 +275,16 @@ namespace OpenRA.Mods.Cnc.Widgets { "Inverted", MouseScrollType.Inverted }, }; - foreach (var option in options) + Func setupItem = (o, itemTemplate) => { - 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); - } + var item = ScrollItemWidget.Setup(itemTemplate, + () => mouseScroll == options[o], + () => mouseScroll = options[o]); + item.GetWidget("LABEL").GetText = () => o; + return item; + }; - panel.Bounds.Height = panel.ContentHeight; - dropdown.AttachPanel(panel); + dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, options.Keys.ToList(), setupItem); return true; } }