diff --git a/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs b/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs index 362cbaeddb..e94b5a8c39 100644 --- a/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs @@ -66,11 +66,32 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic var buildPalette = playerWidgets.GetWidget("PRODUCTION_PALETTE"); var queueTabs = playerWidgets.GetWidget("PRODUCTION_TABS"); var queueTypes = sidebarRoot.GetWidget("PRODUCTION_TYPES"); - queueTypes.GetWidget("BUILDING").OnClick = () => queueTabs.QueueType = "Building"; - queueTypes.GetWidget("DEFENSE").OnClick = () => queueTabs.QueueType = "Defense"; - queueTypes.GetWidget("INFANTRY").OnClick = () => queueTabs.QueueType = "Infantry"; - queueTypes.GetWidget("VEHICLE").OnClick = () => queueTabs.QueueType = "Vehicle"; - queueTypes.GetWidget("AIRCRAFT").OnClick = () => queueTabs.QueueType = "Aircraft"; + + var buildingTab = queueTypes.GetWidget("BUILDING"); + buildingTab.OnClick = () => queueTabs.QueueType = "Building"; + buildingTab.IsDisabled = () => !queueTabs.QueueCounts.ContainsKey("Building") + || queueTabs.QueueCounts["Building"] == 0; + + var defenseTab = queueTypes.GetWidget("DEFENSE"); + defenseTab.OnClick = () => queueTabs.QueueType = "Defense"; + defenseTab.IsDisabled = () => !queueTabs.QueueCounts.ContainsKey("Defense") + || queueTabs.QueueCounts["Defense"] == 0; + + var infantryTab = queueTypes.GetWidget("INFANTRY"); + infantryTab.OnClick = () => queueTabs.QueueType = "Infantry"; + infantryTab.IsDisabled = () => !queueTabs.QueueCounts.ContainsKey("Infantry") + || queueTabs.QueueCounts["Infantry"] == 0; + + var vehicleTab = queueTypes.GetWidget("VEHICLE"); + vehicleTab.OnClick = () => queueTabs.QueueType = "Vehicle"; + vehicleTab.IsDisabled = () => !queueTabs.QueueCounts.ContainsKey("Vehicle") + || queueTabs.QueueCounts["Vehicle"] == 0; + + var aircraftTab = queueTypes.GetWidget("AIRCRAFT"); + aircraftTab.OnClick = () => queueTabs.QueueType = "Aircraft"; + aircraftTab.IsDisabled = () => !queueTabs.QueueCounts.ContainsKey("Aircraft") + || queueTabs.QueueCounts["Aircraft"] == 0; + } ingameRoot.GetWidget("OPTIONS_BUTTON").OnClick = () => { diff --git a/OpenRA.Mods.Cnc/Widgets/ProductionTabsWidget.cs b/OpenRA.Mods.Cnc/Widgets/ProductionTabsWidget.cs index 8fe35cfa75..b43d83f955 100755 --- a/OpenRA.Mods.Cnc/Widgets/ProductionTabsWidget.cs +++ b/OpenRA.Mods.Cnc/Widgets/ProductionTabsWidget.cs @@ -34,7 +34,7 @@ namespace OpenRA.Mods.Cnc.Widgets ListOffset = 0; ResetButtons(); Widget.RootWidget.GetWidget(PaletteWidget) - .CurrentQueue = VisibleQueues.Keys.FirstOrDefault(); + .CurrentQueue = tabs.Keys.FirstOrDefault(); } } @@ -42,7 +42,10 @@ namespace OpenRA.Mods.Cnc.Widgets public float ScrollVelocity = 4f; public int TabWidth = 30; public int ArrowWidth = 20; - Dictionary VisibleQueues = new Dictionary(); + + public ProductionQueue[] AllQueues; + public Dictionary QueueCounts = new Dictionary(); + Dictionary tabs = new Dictionary(); int ContentWidth = 0; float ListOffset = 0; @@ -85,14 +88,14 @@ namespace OpenRA.Mods.Cnc.Widgets var palette = Widget.RootWidget.GetWidget(PaletteWidget); // TODO: Draw children buttons var i = 1; - foreach (var queue in VisibleQueues) + foreach (var tab in tabs) { - ButtonWidget.DrawBackground("button", queue.Value, false, queue.Key == palette.CurrentQueue, queue.Value.Contains(Viewport.LastMousePos)); + ButtonWidget.DrawBackground("button", tab.Value, false, tab.Key == palette.CurrentQueue, tab.Value.Contains(Viewport.LastMousePos)); SpriteFont font = Game.Renderer.Fonts["TinyBold"]; var text = i.ToString(); int2 textSize = font.Measure(text); - int2 position = new int2(queue.Value.X + (queue.Value.Width - textSize.X)/2, queue.Value.Y + (queue.Value.Height - textSize.Y)/2); + int2 position = new int2(tab.Value.X + (tab.Value.Width - textSize.X)/2, tab.Value.Y + (tab.Value.Height - textSize.Y)/2); font.DrawTextWithContrast(text, position, Color.White, Color.Black, 1); i++; } @@ -108,19 +111,15 @@ namespace OpenRA.Mods.Cnc.Widgets public void ResetButtons() { - VisibleQueues.Clear(); + tabs.Clear(); ContentWidth = 0; var rb = RenderBounds; var origin = new int2(leftButtonRect.Right - 1 + (int)ListOffset, leftButtonRect.Y); - - var queues = world.ActorsWithTrait() - .Where(p => p.Actor.Owner == world.LocalPlayer && p.Trait.Info.Type == QueueType) - .Select(p => p.Trait).ToList(); - - foreach (var queue in queues) + + foreach (var queue in AllQueues.Where(q => q.Info.Type == QueueType)) { var rect = new Rectangle(origin.X + ContentWidth, origin.Y, TabWidth, rb.Height); - VisibleQueues.Add(queue, rect); + tabs.Add(queue, rect); ContentWidth += TabWidth - 1; } } @@ -130,6 +129,13 @@ namespace OpenRA.Mods.Cnc.Widgets if (leftPressed) Scroll(1); if (rightPressed) Scroll(-1); + AllQueues = world.ActorsWithTrait() + .Where(p => p.Actor.Owner == world.LocalPlayer) + .Select(p => p.Trait).ToArray(); + + QueueCounts = AllQueues.Select(q => q.Info.Type).Distinct() + .ToDictionary(t => t, t => AllQueues.Count(q => q.Info.Type == t)); + ResetButtons(); base.Tick(); } @@ -169,7 +175,7 @@ namespace OpenRA.Mods.Cnc.Widgets leftPressed = leftButtonRect.Contains(mi.Location.X, mi.Location.Y); rightPressed = rightButtonRect.Contains(mi.Location.X, mi.Location.Y); - var queue = VisibleQueues.Where(a => a.Value.Contains(mi.Location)) + var queue = tabs.Where(a => a.Value.Contains(mi.Location)) .Select(a => a.Key).FirstOrDefault(); if (queue != null)