diff --git a/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs b/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs index f6cfb06335..8305cf9630 100644 --- a/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs @@ -23,6 +23,7 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic MenuType menu = MenuType.None; Widget ingameRoot; + ProductionTabsWidget queueTabs; World world; void AddChatLine(Color c, string from, string text) @@ -35,19 +36,37 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic Game.AddChatLine -= AddChatLine; Game.BeforeGameStart -= UnregisterEvents; - if (world.LocalPlayer != null) + if (queueTabs != null) { - var queueTabs = ingameRoot.GetWidget("PRODUCTION_TABS"); world.ActorAdded += queueTabs.ActorChanged; world.ActorRemoved += queueTabs.ActorChanged; } } - ProductionQueue QueueForType(World world, string type) + void SetupProductionGroupButton(ButtonWidget button, string group) { - return world.ActorsWithTrait() - .Where(p => p.Actor.Owner == world.LocalPlayer) - .Select(p => p.Trait).FirstOrDefault(p => p.Info.Type == type); + button.IsDisabled = () => queueTabs.Groups[group].Tabs.Count == 0; + + button.OnMouseUp = mi => + { + if (button.IsDisabled()) + return true; + + if (queueTabs.QueueType == group) + queueTabs.SelectNextTab(mi.Modifiers.HasModifier(Modifiers.Shift)); + else + queueTabs.QueueType = group; + + return true; + }; + + button.OnKeyPress = e => + { + if (queueTabs.QueueType == group) + queueTabs.SelectNextTab(e.Modifiers.HasModifier(Modifiers.Shift)); + else + queueTabs.QueueType = group; + }; } [ObjectCreator.UseCtor] @@ -82,35 +101,19 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic var playerResources = world.LocalPlayer.PlayerActor.Trait(); sidebarRoot.GetWidget("CASH_DISPLAY").GetText = () => "${0}".F(playerResources.DisplayCash + playerResources.DisplayOre); - - var buildPalette = playerWidgets.GetWidget("PRODUCTION_PALETTE"); - var queueTabs = playerWidgets.GetWidget("PRODUCTION_TABS"); + queueTabs = playerWidgets.GetWidget("PRODUCTION_TABS"); world.ActorAdded += queueTabs.ActorChanged; world.ActorRemoved += queueTabs.ActorChanged; var queueTypes = sidebarRoot.GetWidget("PRODUCTION_TYPES"); - - var buildingTab = queueTypes.GetWidget("BUILDING"); - buildingTab.OnClick = () => queueTabs.QueueType = "Building"; - buildingTab.IsDisabled = () => queueTabs.Groups["Building"].Tabs.Count == 0; - - var defenseTab = queueTypes.GetWidget("DEFENSE"); - defenseTab.OnClick = () => queueTabs.QueueType = "Defense"; - defenseTab.IsDisabled = () => queueTabs.Groups["Defense"].Tabs.Count == 0; - - var infantryTab = queueTypes.GetWidget("INFANTRY"); - infantryTab.OnClick = () => queueTabs.QueueType = "Infantry"; - infantryTab.IsDisabled = () => queueTabs.Groups["Infantry"].Tabs.Count == 0; - - var vehicleTab = queueTypes.GetWidget("VEHICLE"); - vehicleTab.OnClick = () => queueTabs.QueueType = "Vehicle"; - vehicleTab.IsDisabled = () => queueTabs.Groups["Vehicle"].Tabs.Count == 0; - - var aircraftTab = queueTypes.GetWidget("AIRCRAFT"); - aircraftTab.OnClick = () => queueTabs.QueueType = "Aircraft"; - aircraftTab.IsDisabled = () => queueTabs.Groups["Aircraft"].Tabs.Count == 0; + SetupProductionGroupButton(queueTypes.GetWidget("BUILDING"), "Building"); + SetupProductionGroupButton(queueTypes.GetWidget("DEFENSE"), "Defense"); + SetupProductionGroupButton(queueTypes.GetWidget("INFANTRY"), "Infantry"); + SetupProductionGroupButton(queueTypes.GetWidget("VEHICLE"), "Vehicle"); + SetupProductionGroupButton(queueTypes.GetWidget("AIRCRAFT"), "Aircraft"); } + ingameRoot.GetWidget("OPTIONS_BUTTON").OnClick = () => { if (menu != MenuType.None) diff --git a/OpenRA.Mods.Cnc/Widgets/ProductionTabsWidget.cs b/OpenRA.Mods.Cnc/Widgets/ProductionTabsWidget.cs index bfdbb691e2..cea7b66c2a 100755 --- a/OpenRA.Mods.Cnc/Widgets/ProductionTabsWidget.cs +++ b/OpenRA.Mods.Cnc/Widgets/ProductionTabsWidget.cs @@ -90,7 +90,7 @@ namespace OpenRA.Mods.Cnc.Widgets readonly World world; [ObjectCreator.UseCtor] - public ProductionTabsWidget( [ObjectCreator.Param] World world ) + public ProductionTabsWidget([ObjectCreator.Param] World world) { this.world = world; Groups = Rules.Info.Values.SelectMany(a => a.Traits.WithInterface()) @@ -213,6 +213,33 @@ namespace OpenRA.Mods.Cnc.Widgets return (leftPressed || rightPressed); } + public override bool HandleKeyPressInner(KeyInput e) + { + if (e.Event != KeyInputEvent.Down) return false; + if (e.KeyName == "tab") + { + SelectNextTab(e.Modifiers.HasModifier(Modifiers.Shift)); + return true; + } + + return false; + } + + public void SelectNextTab(bool reverse) + { + if (queueType == null) + return; + + var pal = Widget.RootWidget.GetWidget(PaletteWidget); + var tabs = Groups[queueType].Tabs.ToList(); + if (reverse) tabs.Reverse(); + + var tab = tabs.SkipWhile(q => q.Queue != pal.CurrentQueue) + .Skip(1).FirstOrDefault() ?? tabs.FirstOrDefault(); + + pal.CurrentQueue = tab != null ? tab.Queue : null; + } + public void SelectQueue(ProductionQueue queue) { QueueType = queue.Info.Group; diff --git a/mods/cnc/chrome/ingame.yaml b/mods/cnc/chrome/ingame.yaml index 3723455c73..01c87199c5 100644 --- a/mods/cnc/chrome/ingame.yaml +++ b/mods/cnc/chrome/ingame.yaml @@ -185,30 +185,35 @@ Container@INGAME_ROOT: Width:30 Height:30 Text: B + Key: y Button@DEFENSE: Id:DEFENSE X:35 Width:30 Height:30 Text: D + Key: u Button@INFANTRY: Id:INFANTRY X:70 Width:30 Height:30 Text: I + Key: i Button@VEHICLE: Id:VEHICLE X:105 Width:30 Height:30 Text: V + Key: o Button@AIRCRAFT: Id:AIRCRAFT X:140 Width:30 Height:30 Text: H + Key: p ProductionTabs: Id:PRODUCTION_TABS PaletteWidget:PRODUCTION_PALETTE