Simplify the map chooser code.

This commit is contained in:
Paul Chote
2014-03-14 18:00:35 +13:00
parent 4c4783262f
commit a501828660
3 changed files with 27 additions and 29 deletions

View File

@@ -154,10 +154,10 @@ namespace OpenRA.Mods.RA.Widgets.Logic
mapButton.IsDisabled = configurationDisabled; mapButton.IsDisabled = configurationDisabled;
mapButton.OnClick = () => mapButton.OnClick = () =>
{ {
var onSelect = new Action<Map>(m => var onSelect = new Action<string>(uid =>
{ {
orderManager.IssueOrder(Order.Command("map " + m.Uid)); orderManager.IssueOrder(Order.Command("map " + uid));
Game.Settings.Server.Map = m.Uid; Game.Settings.Server.Map = uid;
Game.Settings.Save(); Game.Settings.Save();
}); });

View File

@@ -18,21 +18,21 @@ namespace OpenRA.Mods.RA.Widgets.Logic
{ {
public class MapChooserLogic public class MapChooserLogic
{ {
Map map; string selectedUid;
// May be a subset of available maps if a mode filter is active // May be a subset of available maps if a mode filter is active
Dictionary<string, Map> visibleMaps; List<string> visibleMaps;
ScrollPanelWidget scrollpanel; ScrollPanelWidget scrollpanel;
ScrollItemWidget itemTemplate; ScrollItemWidget itemTemplate;
string gameMode; string gameMode;
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
internal MapChooserLogic(Widget widget, string initialMap, Action onExit, Action<Map> onSelect) internal MapChooserLogic(Widget widget, string initialMap, Action onExit, Action<string> onSelect)
{ {
map = Game.modData.MapCache[WidgetUtils.ChooseInitialMap(initialMap)].Map; selectedUid = WidgetUtils.ChooseInitialMap(initialMap);
widget.Get<ButtonWidget>("BUTTON_OK").OnClick = () => { Ui.CloseWindow(); onSelect(map); }; widget.Get<ButtonWidget>("BUTTON_OK").OnClick = () => { Ui.CloseWindow(); onSelect(selectedUid); };
widget.Get<ButtonWidget>("BUTTON_CANCEL").OnClick = () => { Ui.CloseWindow(); onExit(); }; widget.Get<ButtonWidget>("BUTTON_CANCEL").OnClick = () => { Ui.CloseWindow(); onExit(); };
scrollpanel = widget.Get<ScrollPanelWidget>("MAP_LIST"); scrollpanel = widget.Get<ScrollPanelWidget>("MAP_LIST");
@@ -75,9 +75,9 @@ namespace OpenRA.Mods.RA.Widgets.Logic
{ {
randomMapButton.OnClick = () => randomMapButton.OnClick = () =>
{ {
var kv = visibleMaps.Random(Game.CosmeticRandom); var uid = visibleMaps.Random(Game.CosmeticRandom);
map = kv.Value; selectedUid = uid;
scrollpanel.ScrollToItem(kv.Key); scrollpanel.ScrollToItem(uid);
}; };
randomMapButton.IsDisabled = () => visibleMaps == null || visibleMaps.Count == 0; randomMapButton.IsDisabled = () => visibleMaps == null || visibleMaps.Count == 0;
} }
@@ -85,25 +85,23 @@ namespace OpenRA.Mods.RA.Widgets.Logic
EnumerateMaps(onSelect); EnumerateMaps(onSelect);
} }
void EnumerateMaps(Action<Map> onSelect) void EnumerateMaps(Action<string> onSelect)
{ {
var maps = Game.modData.MapCache var maps = Game.modData.MapCache
.Where(m => m.Status == MapStatus.Available && m.Map.Selectable) .Where(m => m.Status == MapStatus.Available && m.Map.Selectable)
.ToDictionary(m => m.Uid, m => m.Map) .Where(m => m.Type == gameMode || gameMode == null)
.Where(kv => kv.Value.Type == gameMode || gameMode == null) .OrderBy(m => m.PlayerCount)
.OrderBy(kv => kv.Value.PlayerCount) .ThenBy(m => m.Title);
.ThenBy(kv => kv.Value.Title);
scrollpanel.RemoveChildren(); scrollpanel.RemoveChildren();
foreach (var kv in maps) foreach (var loop in maps)
{ {
var m = kv.Value; var preview = loop;
var item = ScrollItemWidget.Setup(kv.Key, itemTemplate, () => m == map, () => map = m, () => { Ui.CloseWindow(); onSelect(m); }); var item = ScrollItemWidget.Setup(preview.Uid, itemTemplate, () => selectedUid == preview.Uid, () => selectedUid = preview.Uid, () => { Ui.CloseWindow(); onSelect(preview.Uid); });
var titleLabel = item.Get<LabelWidget>("TITLE"); var titleLabel = item.Get<LabelWidget>("TITLE");
titleLabel.GetText = () => m.Title; titleLabel.GetText = () => preview.Title;
var preview = Game.modData.MapCache[m.Uid];
var previewWidget = item.Get<MapPreviewWidget>("PREVIEW"); var previewWidget = item.Get<MapPreviewWidget>("PREVIEW");
previewWidget.IgnoreMouseOver = true; previewWidget.IgnoreMouseOver = true;
previewWidget.IgnoreMouseInput = true; previewWidget.IgnoreMouseInput = true;
@@ -116,17 +114,17 @@ namespace OpenRA.Mods.RA.Widgets.Logic
var detailsWidget = item.GetOrNull<LabelWidget>("DETAILS"); var detailsWidget = item.GetOrNull<LabelWidget>("DETAILS");
if (detailsWidget != null) if (detailsWidget != null)
detailsWidget.GetText = () => "{0} ({1} players)".F(m.Type, m.PlayerCount); detailsWidget.GetText = () => "{0} ({1} players)".F(preview.Type, preview.PlayerCount);
var authorWidget = item.GetOrNull<LabelWidget>("AUTHOR"); var authorWidget = item.GetOrNull<LabelWidget>("AUTHOR");
if (authorWidget != null) if (authorWidget != null)
authorWidget.GetText = () => "Created by {0}".F(m.Author); authorWidget.GetText = () => "Created by {0}".F(preview.Author);
var sizeWidget = item.GetOrNull<LabelWidget>("SIZE"); var sizeWidget = item.GetOrNull<LabelWidget>("SIZE");
if (sizeWidget != null) if (sizeWidget != null)
{ {
var size = m.Bounds.Width + "x" + m.Bounds.Height; var size = preview.Bounds.Width + "x" + preview.Bounds.Height;
var numberPlayableCells = m.Bounds.Width * m.Bounds.Height; var numberPlayableCells = preview.Bounds.Width * preview.Bounds.Height;
if (numberPlayableCells >= 120 * 120) size += " (Huge)"; if (numberPlayableCells >= 120 * 120) size += " (Huge)";
else if (numberPlayableCells >= 90 * 90) size += " (Large)"; else if (numberPlayableCells >= 90 * 90) size += " (Large)";
else if (numberPlayableCells >= 60 * 60) size += " (Medium)"; else if (numberPlayableCells >= 60 * 60) size += " (Medium)";
@@ -137,9 +135,9 @@ namespace OpenRA.Mods.RA.Widgets.Logic
scrollpanel.AddChild(item); scrollpanel.AddChild(item);
} }
visibleMaps = maps.ToDictionary(kv => kv.Key, kv => kv.Value); visibleMaps = maps.Select(m => m.Uid).ToList();
if (visibleMaps.ContainsValue(map)) if (visibleMaps.Contains(selectedUid))
scrollpanel.ScrollToItem(visibleMaps.First(m => m.Value == map).Key); scrollpanel.ScrollToItem(selectedUid);
} }
} }
} }

View File

@@ -46,7 +46,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
{ {
{ "initialMap", preview.Uid }, { "initialMap", preview.Uid },
{ "onExit", () => {} }, { "onExit", () => {} },
{ "onSelect", (Action<Map>)(m => preview = Game.modData.MapCache[m.Uid]) } { "onSelect", (Action<String>)(uid => preview = Game.modData.MapCache[uid]) }
}); });
}; };