Simplify the map chooser code.
This commit is contained in:
@@ -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();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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]) }
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user