Use new mechanism for ra dropdowns

This commit is contained in:
Paul Chote
2011-05-22 16:57:22 +12:00
parent ab298e1eae
commit 078972e3be
6 changed files with 182 additions and 123 deletions

View File

@@ -333,8 +333,11 @@ namespace OpenRA.Mods.Cnc.Widgets
}; };
if (showBotOptions) if (showBotOptions)
foreach (var bot in Rules.Info["player"].Traits.WithInterface<IBotInfo>().Select(t => t.Name)) foreach (var b in Rules.Info["player"].Traits.WithInterface<IBotInfo>().Select(t => t.Name))
{
var bot = b;
options.Add(new SlotDropDownOption("Bot: {0}".F(bot), "slot_bot {0} {1}".F(slot.Index, bot), () => slot.Bot == bot)); options.Add(new SlotDropDownOption("Bot: {0}".F(bot), "slot_bot {0} {1}".F(slot.Index, bot), () => slot.Bot == bot));
}
Func<SlotDropDownOption, ScrollItemWidget, ScrollItemWidget> setupItem = (o, itemTemplate) => Func<SlotDropDownOption, ScrollItemWidget, ScrollItemWidget> setupItem = (o, itemTemplate) =>
{ {

View File

@@ -190,89 +190,84 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
{ {
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 ) )),
};
if (showBotOptions)
{
var bots = Rules.Info["player"].Traits.WithInterface<IBotInfo>().Select(t => t.Name);
bots.Do(bot =>
dropDownOptions.Add(new Pair<string, Action>("Bot: {0}".F(bot),
() => orderManager.IssueOrder(Order.Command("slot_bot {0} {1}".F(slot.Index, bot))))));
} }
}
DropDownButtonWidget.ShowDropDown( name,
dropDownOptions, bool ShowSlotDropDown(DropDownButtonWidget dropdown, Session.Slot slot, bool showBotOptions)
(ac, w) => new LabelWidget {
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)
foreach (var b in Rules.Info["player"].Traits.WithInterface<IBotInfo>().Select(t => t.Name))
{ {
Bounds = new Rectangle(0, 0, w, 24), var bot = b;
Text = " {0}".F(ac.First), options.Add(new SlotDropDownOption("Bot: {0}".F(bot), "slot_bot {0} {1}".F(slot.Index, bot), () => slot.Bot == bot));
OnMouseUp = mi => { ac.Second(); return true; }, }
}); Func<SlotDropDownOption, ScrollItemWidget, ScrollItemWidget> setupItem = (o, itemTemplate) =>
{
var item = ScrollItemWidget.Setup(itemTemplate,
o.Selected,
() => orderManager.IssueOrder(Order.Command(o.Order)));
item.GetWidget<LabelWidget>("LABEL").GetText = () => o.Title;
return item;
};
dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 150, options, setupItem);
return true; return true;
} }
bool ShowRaceDropDown(Session.Slot s, ButtonWidget race) bool ShowRaceDropDown(DropDownButtonWidget 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 sr = GetClientInSlot(slot).Country;
foreach (var c in CountryNames) Func<string, ScrollItemWidget, ScrollItemWidget> setupItem = (race, itemTemplate) =>
{ {
var cc = c; var item = ScrollItemWidget.Setup(itemTemplate,
dropDownOptions.Add(new Pair<string, Action>( cc.Key, () => sr == race,
() => orderManager.IssueOrder( Order.Command("race "+cc.Key) )) ); () => orderManager.IssueOrder(Order.Command("race "+race)));
item.GetWidget<LabelWidget>("LABEL").GetText = () => CountryNames[race];
var flag = item.GetWidget<ImageWidget>("FLAG");
flag.GetImageCollection = () => "flags";
flag.GetImageName = () => race;
return item;
}; };
DropDownButtonWidget.ShowDropDown( race, dropdown.ShowDropDown("RACE_DROPDOWN_TEMPLATE", 150, CountryNames.Keys.ToList(), setupItem);
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;
});
return true; return true;
} }
bool ShowTeamDropDown(ButtonWidget team) bool ShowTeamDropDown(DropDownButtonWidget dropdown, Session.Slot slot)
{ {
var dropDownOptions = new List<Pair<string, Action>>(); var c = GetClientInSlot(slot);
for (int i = 0; i <= Map.PlayerCount; i++) Func<int, ScrollItemWidget, ScrollItemWidget> setupItem = (ii, itemTemplate) =>
{ {
var ii = i; var item = ScrollItemWidget.Setup(itemTemplate,
dropDownOptions.Add(new Pair<string, Action>( ii == 0 ? "-" : ii.ToString(), () => c.Team == ii,
() => orderManager.IssueOrder( Order.Command("team "+ii) )) ); () => orderManager.IssueOrder(Order.Command("team "+ii)));
item.GetWidget<LabelWidget>("LABEL").GetText = () => ii == 0 ? "-" : ii.ToString();
return item;
}; };
DropDownButtonWidget.ShowDropDown( team, var options = Graphics.Util.MakeArray(Map.PlayerCount, i => i).ToList();
dropDownOptions, dropdown.ShowDropDown("TEAM_DROPDOWN_TEMPLATE", 150, options, setupItem);
(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;
} }
@@ -327,18 +322,18 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
if (slot.Spectator) if (slot.Spectator)
{ {
template = EmptySlotTemplateHost.Clone(); template = EmptySlotTemplateHost.Clone();
var name = template.GetWidget<ButtonWidget>("NAME"); var name = template.GetWidget<DropDownButtonWidget>("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<DropDownButtonWidget>("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
@@ -393,8 +388,8 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
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<DropDownButtonWidget>("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];
@@ -402,8 +397,8 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
factionflag.GetImageName = () => c.Country; factionflag.GetImageName = () => c.Country;
factionflag.GetImageCollection = () => "flags"; factionflag.GetImageCollection = () => "flags";
var team = template.GetWidget<ButtonWidget>("TEAM"); var team = template.GetWidget<DropDownButtonWidget>("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

@@ -89,4 +89,49 @@ ScrollPanel@LABEL_DROPDOWN_TEMPLATE:
Id:LABEL Id:LABEL
X:10 X:10
Width:PARENT_RIGHT-20 Width:PARENT_RIGHT-20
Height:25 Height:25
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

View File

@@ -380,48 +380,4 @@ Container@SERVER_LOBBY:
Y:499 Y:499
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

View File

@@ -0,0 +1,60 @@
ScrollPanel@LABEL_DROPDOWN_TEMPLATE:
Id:LABEL_DROPDOWN_TEMPLATE
Width:DROPDOWN_WIDTH
Children:
ScrollItem@TEMPLATE:
Id:TEMPLATE
Width:PARENT_RIGHT-27
Height:25
X:2
Y:0
Visible:false
Children:
Label@LABEL:
Id:LABEL
X:10
Width:PARENT_RIGHT-20
Height:25
ScrollPanel@RACE_DROPDOWN_TEMPLATE:
Id:RACE_DROPDOWN_TEMPLATE
Width:DROPDOWN_WIDTH
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
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

View File

@@ -61,7 +61,7 @@ ChromeLayout:
mods/ra/chrome/gamelobby.yaml mods/ra/chrome/gamelobby.yaml
mods/ra/chrome/serverbrowser.yaml mods/ra/chrome/serverbrowser.yaml
mods/ra/chrome/replaybrowser.yaml mods/ra/chrome/replaybrowser.yaml
mods/ra/chrome/dropdowns.yaml
Weapons: Weapons:
mods/ra/weapons.yaml mods/ra/weapons.yaml