diff --git a/OpenRA.Mods.RA/Widgets/Logic/MissionBrowserLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/MissionBrowserLogic.cs index 8b02492d51..da606bf6ec 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/MissionBrowserLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/MissionBrowserLogic.cs @@ -33,7 +33,8 @@ namespace OpenRA.Mods.RA.Widgets.Logic this.onStart = onStart; var missionList = widget.Get("MISSION_LIST"); - var template = widget.Get("MISSION_TEMPLATE"); + var headerTemplate = widget.Get("HEADER"); + var template = widget.Get("TEMPLATE"); widget.Get("MISSION_INFO").IsVisible = () => selectedMapPreview != null; @@ -46,29 +47,41 @@ namespace OpenRA.Mods.RA.Widgets.Logic var yaml = new MiniYaml(null, Game.modData.Manifest.Missions.Select(MiniYaml.FromFile).Aggregate(MiniYaml.MergeLiberal)).ToDictionary(); - var missionMapPaths = yaml["Missions"].Nodes.Select(n => Platform.ResolvePath(n.Key)); - - var maps = Game.modData.MapCache - .Where(p => p.Status == MapStatus.Available && missionMapPaths.Contains(Path.GetFullPath(p.Map.Path))) - .Select(p => p.Map); - missionList.RemoveChildren(); - foreach (var m in maps) + + var selectedFirst = false; + foreach (var kv in yaml) { - var map = m; + var header = ScrollItemWidget.Setup(headerTemplate, () => true, () => {}); + header.Get("LABEL").GetText = () => kv.Key; + missionList.AddChild(header); - var item = ScrollItemWidget.Setup(template, - () => selectedMapPreview != null && selectedMapPreview.Uid == map.Uid, - () => SelectMap(map), - StartMission); + var missionMapPaths = kv.Value.Nodes.Select(n => Platform.ResolvePath(n.Key)); - item.Get("TITLE").GetText = () => map.Title; - missionList.AddChild(item); + var maps = Game.modData.MapCache + .Where(p => p.Status == MapStatus.Available && missionMapPaths.Contains(Path.GetFullPath(p.Map.Path))) + .Select(p => p.Map); + + foreach (var m in maps) + { + var map = m; + + var item = ScrollItemWidget.Setup(template, + () => selectedMapPreview != null && selectedMapPreview.Uid == map.Uid, + () => SelectMap(map), + StartMission); + + item.Get("TITLE").GetText = () => map.Title; + missionList.AddChild(item); + + if (!selectedFirst) + { + SelectMap(map); + selectedFirst = true; + } + } } - if (maps.Any()) - SelectMap(maps.First()); - widget.Get("STARTGAME_BUTTON").OnClick = StartMission; widget.Get("BACK_BUTTON").OnClick = () => diff --git a/mods/cnc/chrome/missionbrowser.yaml b/mods/cnc/chrome/missionbrowser.yaml index cbc6963d8b..995559029e 100644 --- a/mods/cnc/chrome/missionbrowser.yaml +++ b/mods/cnc/chrome/missionbrowser.yaml @@ -23,7 +23,19 @@ Container@MISSIONBROWSER_PANEL: Width: 260 Height: 330 Children: - ScrollItem@MISSION_TEMPLATE: + ScrollItem@HEADER: + Width: PARENT_RIGHT-27 + Height: 13 + X: 2 + Y: 0 + Visible: false + Children: + Label@LABEL: + Font: TinyBold + Width: PARENT_RIGHT + Height: 10 + Align: Center + ScrollItem@TEMPLATE: Width: PARENT_RIGHT-27 Height: 25 X: 2 diff --git a/mods/ra/chrome/missionbrowser.yaml b/mods/ra/chrome/missionbrowser.yaml index 388dc2287e..fdd60ce8dc 100644 --- a/mods/ra/chrome/missionbrowser.yaml +++ b/mods/ra/chrome/missionbrowser.yaml @@ -19,7 +19,20 @@ Background@MISSIONBROWSER_PANEL: Width: 260 Height: 330 Children: - ScrollItem@MISSION_TEMPLATE: + ScrollItem@HEADER: + BaseName: scrollheader + Width: PARENT_RIGHT-27 + Height: 13 + X: 2 + Y: 0 + Visible: false + Children: + Label@LABEL: + Font: TinyBold + Width: PARENT_RIGHT + Height: 10 + Align: Center + ScrollItem@TEMPLATE: Width: PARENT_RIGHT-27 Height: 25 X: 2