Use the new dropdowns everywhere

This commit is contained in:
Paul Chote
2011-05-17 20:36:11 +12:00
parent b2c60e0876
commit 58e3a1f41e
4 changed files with 201 additions and 117 deletions

View File

@@ -310,95 +310,122 @@ namespace OpenRA.Mods.Cnc.Widgets
return orderManager.LobbyInfo.ClientInSlot( slot ); return orderManager.LobbyInfo.ClientInSlot( slot );
} }
bool ShowSlotDropDown(Session.Slot slot, ButtonWidget name, bool showBotOptions) class SlotDropDownOption
{ {
var dropDownOptions = new List<Pair<string, Action>> public string Title;
public string Order;
public Func<bool> Selected;
public SlotDropDownOption(string title, string order, Func<bool> selected)
{ {
new Pair<string, Action>( "Open", Title = title;
() => orderManager.IssueOrder( Order.Command( "slot_open " + slot.Index ) )), Order = order;
new Pair<string, Action>( "Closed", Selected = selected;
() => orderManager.IssueOrder( Order.Command( "slot_close " + slot.Index ) )), }
}
bool ShowSlotDropDown(CncDropDownButtonWidget dropdown, Session.Slot slot, bool showBotOptions)
{
var substitutions = new Dictionary<string,int>() {{ "DROPDOWN_WIDTH", dropdown.Bounds.Width }};
var panel = (ScrollPanelWidget)Widget.LoadWidget("LABEL_DROPDOWN_TEMPLATE", null, new WidgetArgs()
{
{ "substitutions", substitutions }
});
var itemTemplate = panel.GetWidget<ScrollItemWidget>("TEMPLATE");
var options = new List<SlotDropDownOption>()
{
new SlotDropDownOption("Open", "slot_open "+slot.Index, () => (!slot.Closed && slot.Bot == null)),
new SlotDropDownOption("Closed", "slot_close "+slot.Index, () => slot.Closed)
}; };
if (showBotOptions) if (showBotOptions)
foreach (var bot in Rules.Info["player"].Traits.WithInterface<IBotInfo>().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 bots = Rules.Info["player"].Traits.WithInterface<IBotInfo>().Select(t => t.Name); var o = option;
bots.Do(bot => var item = ScrollItemWidget.Setup(itemTemplate, o.Selected,
dropDownOptions.Add(new Pair<string, Action>("Bot: {0}".F(bot), () => {
() => orderManager.IssueOrder(Order.Command("slot_bot {0} {1}".F(slot.Index, bot)))))); orderManager.IssueOrder(Order.Command(o.Order));
dropdown.RemovePanel();
});
item.GetWidget<LabelWidget>("LABEL").GetText = () => o.Title;
panel.AddChild(item);
} }
CncDropDownButtonWidget.ShowDropDown( name, panel.Bounds.Height = Math.Min(150, panel.ContentHeight);
dropDownOptions, dropdown.AttachPanel(panel);
(ac, w) => new LabelWidget
{
Bounds = new Rectangle(0, 0, w, 24),
Text = " {0}".F(ac.First),
OnMouseUp = mi => { ac.Second(); return true; },
});
return true; 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; return false;
var dropDownOptions = new List<Pair<string, Action>>(); var substitutions = new Dictionary<string,int>() {{ "DROPDOWN_WIDTH", dropdown.Bounds.Width }};
var panel = (ScrollPanelWidget)Widget.LoadWidget("RACE_DROPDOWN_TEMPLATE", null, new WidgetArgs()
{
{ "substitutions", substitutions }
});
var itemTemplate = panel.GetWidget<ScrollItemWidget>("TEMPLATE");
foreach (var c in CountryNames) foreach (var c in CountryNames)
{ {
var cc = c; var race = c;
dropDownOptions.Add(new Pair<string, Action>( cc.Key, var sr = GetClientInSlot(slot).Country;
() => orderManager.IssueOrder( Order.Command("race "+cc.Key) )) ); var item = ScrollItemWidget.Setup(itemTemplate, () => sr == race.Key,
}; () => {
orderManager.IssueOrder(Order.Command("race "+race.Key));
CncDropDownButtonWidget.ShowDropDown( race, dropdown.RemovePanel();
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;
}); });
item.GetWidget<LabelWidget>("LABEL").GetText = () => race.Value;
var flag = item.GetWidget<ImageWidget>("FLAG");
flag.GetImageCollection = () => "flags";
flag.GetImageName = () => race.Key;
panel.AddChild(item);
}
panel.Bounds.Height = Math.Min(150, panel.ContentHeight);
dropdown.AttachPanel(panel);
return true; return true;
} }
bool ShowTeamDropDown(ButtonWidget team) bool ShowTeamDropDown(CncDropDownButtonWidget dropdown, Session.Slot slot)
{ {
var dropDownOptions = new List<Pair<string, Action>>(); var substitutions = new Dictionary<string,int>() {{ "DROPDOWN_WIDTH", dropdown.Bounds.Width }};
var panel = (ScrollPanelWidget)Widget.LoadWidget("TEAM_DROPDOWN_TEMPLATE", null, new WidgetArgs()
{
{ "substitutions", substitutions }
});
var itemTemplate = panel.GetWidget<ScrollItemWidget>("TEMPLATE");
for (int i = 0; i <= Map.PlayerCount; i++) for (int i = 0; i <= Map.PlayerCount; i++)
{ {
var ii = i; var ii = i;
dropDownOptions.Add(new Pair<string, Action>( ii == 0 ? "-" : ii.ToString(), var c = GetClientInSlot(slot);
() => orderManager.IssueOrder( Order.Command("team "+ii) )) ); var item = ScrollItemWidget.Setup(itemTemplate, () => c.Team == ii,
() => {
orderManager.IssueOrder(Order.Command("team "+ii));
dropdown.RemovePanel();
});
item.GetWidget<LabelWidget>("LABEL").GetText = () => ii == 0 ? "-" : ii.ToString();
panel.AddChild(item);
}; };
CncDropDownButtonWidget.ShowDropDown( team, panel.Bounds.Height = Math.Min(150, panel.ContentHeight);
dropDownOptions, dropdown.AttachPanel(panel);
(ac, w) => new LabelWidget
{
Bounds = new Rectangle(0, 0, w, 24),
Text = " {0}".F(ac.First),
OnMouseUp = mi => { ac.Second(); return true; },
});
return true; return true;
} }
void ShowColorDropDown(Session.Slot s, CncDropDownButtonWidget color) bool ShowColorDropDown(Session.Slot s, CncDropDownButtonWidget color)
{ {
if (Map.Players[s.MapPlayer].LockColor) if (Map.Players[s.MapPlayer].LockColor)
return; return true;
Action<ColorRamp> onSelect = c => Action<ColorRamp> onSelect = c =>
{ {
@@ -421,6 +448,7 @@ namespace OpenRA.Mods.Cnc.Widgets
}); });
color.AttachPanel(colorChooser); color.AttachPanel(colorChooser);
return true;
} }
void UpdatePlayerList() void UpdatePlayerList()
@@ -442,18 +470,18 @@ namespace OpenRA.Mods.Cnc.Widgets
if (slot.Spectator) if (slot.Spectator)
{ {
template = EmptySlotTemplateHost.Clone(); template = EmptySlotTemplateHost.Clone();
var name = template.GetWidget<ButtonWidget>("NAME"); var name = template.GetWidget<CncDropDownButtonWidget>("NAME");
name.GetText = () => s.Closed ? "Closed" : "Open"; name.GetText = () => s.Closed ? "Closed" : "Open";
name.OnMouseDown = _ => ShowSlotDropDown(s, name, false); name.OnMouseDown = _ => ShowSlotDropDown(name, s, false);
var btn = template.GetWidget<ButtonWidget>("JOIN"); var btn = template.GetWidget<ButtonWidget>("JOIN");
btn.GetText = () => "Spectate in this slot"; btn.GetText = () => "Spectate in this slot";
} }
else else
{ {
template = EmptySlotTemplateHost.Clone(); template = EmptySlotTemplateHost.Clone();
var name = template.GetWidget<ButtonWidget>("NAME"); var name = template.GetWidget<CncDropDownButtonWidget>("NAME");
name.GetText = () => s.Closed ? "Closed" : (s.Bot == null) ? "Open" : s.Bot; 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 else
@@ -503,13 +531,13 @@ namespace OpenRA.Mods.Cnc.Widgets
name.OnLoseFocus = () => name.OnEnterKey(); name.OnLoseFocus = () => name.OnEnterKey();
var color = template.GetWidget<CncDropDownButtonWidget>("COLOR"); var color = template.GetWidget<CncDropDownButtonWidget>("COLOR");
color.OnClick = () => ShowColorDropDown(s, color); color.OnMouseDown = _ => ShowColorDropDown(s, color);
var colorBlock = color.GetWidget<ColorBlockWidget>("COLORBLOCK"); var colorBlock = color.GetWidget<ColorBlockWidget>("COLORBLOCK");
colorBlock.GetColor = () => c.ColorRamp.GetColor(0); colorBlock.GetColor = () => c.ColorRamp.GetColor(0);
var faction = template.GetWidget<ButtonWidget>("FACTION"); var faction = template.GetWidget<CncDropDownButtonWidget>("FACTION");
faction.OnMouseDown = _ => ShowRaceDropDown(s, faction); faction.OnMouseDown = _ => ShowRaceDropDown(faction, s);
var factionname = faction.GetWidget<LabelWidget>("FACTIONNAME"); var factionname = faction.GetWidget<LabelWidget>("FACTIONNAME");
factionname.GetText = () => CountryNames[c.Country]; factionname.GetText = () => CountryNames[c.Country];
@@ -517,8 +545,8 @@ namespace OpenRA.Mods.Cnc.Widgets
factionflag.GetImageName = () => c.Country; factionflag.GetImageName = () => c.Country;
factionflag.GetImageCollection = () => "flags"; factionflag.GetImageCollection = () => "flags";
var team = template.GetWidget<ButtonWidget>("TEAM"); var team = template.GetWidget<CncDropDownButtonWidget>("TEAM");
team.OnMouseDown = _ => ShowTeamDropDown(team); team.OnMouseDown = _ => ShowTeamDropDown(team, s);
team.GetText = () => (c.Team == 0) ? "-" : c.Team.ToString(); team.GetText = () => (c.Team == 0) ? "-" : c.Team.ToString();
var status = template.GetWidget<CheckboxWidget>("STATUS"); var status = template.GetWidget<CheckboxWidget>("STATUS");

View File

@@ -59,7 +59,7 @@ namespace OpenRA.Mods.Cnc.Widgets
playerPalettePreview.Ramp = playerColor; playerPalettePreview.Ramp = playerColor;
var colorDropdown = generalPane.GetWidget<CncDropDownButtonWidget>("COLOR_DROPDOWN"); var colorDropdown = generalPane.GetWidget<CncDropDownButtonWidget>("COLOR_DROPDOWN");
colorDropdown.OnClick = () => ShowColorPicker(colorDropdown); colorDropdown.OnMouseDown = _ => ShowColorPicker(colorDropdown);
colorDropdown.GetWidget<ColorBlockWidget>("COLORBLOCK").GetColor = () => playerColor.GetColor(0); colorDropdown.GetWidget<ColorBlockWidget>("COLORBLOCK").GetColor = () => playerColor.GetColor(0);
// Debug // Debug
@@ -86,7 +86,7 @@ namespace OpenRA.Mods.Cnc.Widgets
// Video // Video
windowMode = Game.Settings.Graphics.Mode; windowMode = Game.Settings.Graphics.Mode;
var windowModeDropdown = generalPane.GetWidget<CncDropDownButtonWidget>("MODE_DROPDOWN"); var windowModeDropdown = generalPane.GetWidget<CncDropDownButtonWidget>("MODE_DROPDOWN");
windowModeDropdown.OnClick = () => ShowWindowModeDropdown(windowModeDropdown); windowModeDropdown.OnMouseDown = _ => ShowWindowModeDropdown(windowModeDropdown);
windowModeDropdown.GetText = () => windowMode == WindowMode.Windowed ? "Windowed" : windowMode == WindowMode.Fullscreen ? "Fullscreen" : "Pseudo-Fullscreen"; windowModeDropdown.GetText = () => windowMode == WindowMode.Windowed ? "Windowed" : windowMode == WindowMode.Fullscreen ? "Fullscreen" : "Pseudo-Fullscreen";
generalPane.GetWidget("WINDOW_RESOLUTION").IsVisible = () => windowMode == WindowMode.Windowed; generalPane.GetWidget("WINDOW_RESOLUTION").IsVisible = () => windowMode == WindowMode.Windowed;
@@ -137,7 +137,7 @@ namespace OpenRA.Mods.Cnc.Widgets
mouseScroll = Game.Settings.Game.MouseScroll; mouseScroll = Game.Settings.Game.MouseScroll;
var mouseScrollDropdown = inputPane.GetWidget<CncDropDownButtonWidget>("MOUSE_SCROLL"); var mouseScrollDropdown = inputPane.GetWidget<CncDropDownButtonWidget>("MOUSE_SCROLL");
mouseScrollDropdown.OnClick = () => ShowMouseScrollDropdown(mouseScrollDropdown); mouseScrollDropdown.OnMouseDown = _ => ShowMouseScrollDropdown(mouseScrollDropdown);
mouseScrollDropdown.GetText = () => mouseScroll.ToString(); mouseScrollDropdown.GetText = () => mouseScroll.ToString();
var teamchat = Game.Settings.Game.TeamChatToggle; var teamchat = Game.Settings.Game.TeamChatToggle;
@@ -147,7 +147,7 @@ namespace OpenRA.Mods.Cnc.Widgets
groupAddModifier = Game.Settings.Keyboard.ControlGroupModifier; groupAddModifier = Game.Settings.Keyboard.ControlGroupModifier;
var groupModifierDropdown = inputPane.GetWidget<CncDropDownButtonWidget>("GROUPADD_MODIFIER"); var groupModifierDropdown = inputPane.GetWidget<CncDropDownButtonWidget>("GROUPADD_MODIFIER");
groupModifierDropdown.OnClick = () => ShowGroupModifierDropdown(groupModifierDropdown); groupModifierDropdown.OnMouseDown = _ => ShowGroupModifierDropdown(groupModifierDropdown);
groupModifierDropdown.GetText = () => groupAddModifier.ToString(); groupModifierDropdown.GetText = () => groupAddModifier.ToString();
@@ -194,7 +194,7 @@ namespace OpenRA.Mods.Cnc.Widgets
}; };
} }
void ShowColorPicker(CncDropDownButtonWidget color) bool ShowColorPicker(CncDropDownButtonWidget color)
{ {
Action<ColorRamp> onSelect = c => Action<ColorRamp> onSelect = c =>
{ {
@@ -215,9 +215,10 @@ namespace OpenRA.Mods.Cnc.Widgets
}); });
color.AttachPanel(colorChooser); color.AttachPanel(colorChooser);
return true;
} }
void ShowGroupModifierDropdown(CncDropDownButtonWidget dropdown) bool ShowGroupModifierDropdown(CncDropDownButtonWidget dropdown)
{ {
var substitutions = new Dictionary<string,int>() {{ "DROPDOWN_WIDTH", dropdown.Bounds.Width }}; var substitutions = new Dictionary<string,int>() {{ "DROPDOWN_WIDTH", dropdown.Bounds.Width }};
var panel = (ScrollPanelWidget)Game.LoadWidget(world, "LABEL_DROPDOWN_TEMPLATE", null, new WidgetArgs() 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<ScrollItemWidget>("TEMPLATE"); var itemTemplate = panel.GetWidget<ScrollItemWidget>("TEMPLATE");
var options = new List<Pair<string, Modifiers>>() var options = new Dictionary<string, Modifiers>()
{ {
Pair.New("Ctrl", Modifiers.Ctrl), { "Ctrl", Modifiers.Ctrl },
Pair.New("Alt", Modifiers.Alt), { "Alt", Modifiers.Alt },
Pair.New("Shift", Modifiers.Shift), { "Shift", Modifiers.Shift },
// TODO: Display this as Cmd on osx once we have platform detection // 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 o = option;
var item = ScrollItemWidget.Setup(itemTemplate, () => groupAddModifier == key.Second, () => { groupAddModifier = key.Second; dropdown.RemovePanel(); }); var item = ScrollItemWidget.Setup(itemTemplate, () => groupAddModifier == o.Value, () => { groupAddModifier = o.Value; dropdown.RemovePanel(); });
item.GetWidget<LabelWidget>("LABEL").GetText = () => key.First; item.GetWidget<LabelWidget>("LABEL").GetText = () => o.Key;
panel.AddChild(item); panel.AddChild(item);
} }
panel.Bounds.Height = panel.ContentHeight; panel.Bounds.Height = panel.ContentHeight;
dropdown.AttachPanel(panel); dropdown.AttachPanel(panel);
return true;
} }
void ShowWindowModeDropdown(CncDropDownButtonWidget dropdown) bool ShowWindowModeDropdown(CncDropDownButtonWidget dropdown)
{ {
var substitutions = new Dictionary<string,int>() {{ "DROPDOWN_WIDTH", dropdown.Bounds.Width }}; var substitutions = new Dictionary<string,int>() {{ "DROPDOWN_WIDTH", dropdown.Bounds.Width }};
var panel = (ScrollPanelWidget)Game.LoadWidget(world, "LABEL_DROPDOWN_TEMPLATE", null, new WidgetArgs() 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<ScrollItemWidget>("TEMPLATE"); var itemTemplate = panel.GetWidget<ScrollItemWidget>("TEMPLATE");
var options = new List<Pair<string, WindowMode>>() var options = new Dictionary<string, WindowMode>()
{ {
Pair.New("Pseudo-Fullscreen", WindowMode.PseudoFullscreen), { "Pseudo-Fullscreen", WindowMode.PseudoFullscreen },
Pair.New("Fullscreen",WindowMode.Fullscreen), { "Fullscreen", WindowMode.Fullscreen },
Pair.New("Windowed", WindowMode.Windowed), { "Windowed", WindowMode.Windowed },
}; };
foreach (var o in options) foreach (var option in options)
{ {
var key = o; var o = option;
var item = ScrollItemWidget.Setup(itemTemplate, () => windowMode == key.Second, () => { windowMode = key.Second; dropdown.RemovePanel(); }); var item = ScrollItemWidget.Setup(itemTemplate, () => windowMode == o.Value, () => { windowMode = o.Value; dropdown.RemovePanel(); });
item.GetWidget<LabelWidget>("LABEL").GetText = () => key.First; item.GetWidget<LabelWidget>("LABEL").GetText = () => o.Key;
panel.AddChild(item); panel.AddChild(item);
} }
panel.Bounds.Height = panel.ContentHeight; panel.Bounds.Height = panel.ContentHeight;
dropdown.AttachPanel(panel); dropdown.AttachPanel(panel);
return true;
} }
bool ShowMouseScrollDropdown(Widget dropdown) bool ShowMouseScrollDropdown(CncDropDownButtonWidget dropdown)
{ {
var dropDownOptions = new List<Pair<string, Action>>() var substitutions = new Dictionary<string,int>() {{ "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)), { "substitutions", substitutions }
Pair.New("Standard", new Action(() => mouseScroll = MouseScrollType.Standard)), });
Pair.New("Inverted", new Action(() => mouseScroll = MouseScrollType.Inverted)),
var itemTemplate = panel.GetWidget<ScrollItemWidget>("TEMPLATE");
var options = new Dictionary<string, MouseScrollType>()
{
{ "Disabled", MouseScrollType.Disabled },
{ "Standard", MouseScrollType.Standard },
{ "Inverted", MouseScrollType.Inverted },
}; };
CncDropDownButtonWidget.ShowDropDown(dropdown, foreach (var option in options)
dropDownOptions,
(ac, w) => new LabelWidget
{ {
Bounds = new Rectangle(0, 0, w, 24), var o = option;
Text = ac.First, var item = ScrollItemWidget.Setup(itemTemplate, () => mouseScroll == o.Value, () => { mouseScroll = o.Value; dropdown.RemovePanel(); });
Align = LabelWidget.TextAlign.Center, item.GetWidget<LabelWidget>("LABEL").GetText = () => o.Key;
OnMouseUp = mi => { ac.Second(); return true; }, panel.AddChild(item);
}); }
panel.Bounds.Height = panel.ContentHeight;
dropdown.AttachPanel(panel);
return true; return true;
} }
} }

View File

@@ -75,6 +75,7 @@ Background@COLOR_CHOOSER:
ScrollPanel@LABEL_DROPDOWN_TEMPLATE: ScrollPanel@LABEL_DROPDOWN_TEMPLATE:
Id:LABEL_DROPDOWN_TEMPLATE Id:LABEL_DROPDOWN_TEMPLATE
Width:DROPDOWN_WIDTH Width:DROPDOWN_WIDTH
Background:panel-black
Children: Children:
ScrollItem@TEMPLATE: ScrollItem@TEMPLATE:
Id:TEMPLATE Id:TEMPLATE
@@ -85,7 +86,7 @@ ScrollPanel@LABEL_DROPDOWN_TEMPLATE:
Visible:false Visible:false
Children: Children:
Label@LABEL: Label@LABEL:
X:10
Id:LABEL Id:LABEL
X:10
Width:PARENT_RIGHT-20 Width:PARENT_RIGHT-20
Height:25 Height:25

View File

@@ -381,3 +381,47 @@ Container@SERVER_LOBBY:
Width:140 Width:140
Height:35 Height:35
Text:Start Game 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