diff --git a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj index 687c921db7..c3db98869f 100644 --- a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj +++ b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj @@ -115,6 +115,8 @@ + + diff --git a/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs b/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs index 2582274ac6..dd2609c3b7 100644 --- a/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs @@ -20,7 +20,6 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic public class CncIngameChromeLogic { Widget ingameRoot; - ProductionTabsWidget queueTabs; World world; void AddChatLine(Color c, string from, string text) @@ -32,32 +31,6 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic { Game.AddChatLine -= AddChatLine; Game.BeforeGameStart -= UnregisterEvents; - - if (queueTabs != null) - { - world.ActorAdded += queueTabs.ActorChanged; - world.ActorRemoved += queueTabs.ActorChanged; - } - } - - void SetupProductionGroupButton(ToggleButtonWidget button, string group) - { - Action selectTab = reverse => - { - if (queueTabs.QueueGroup == group) - queueTabs.SelectNextTab(reverse); - else - queueTabs.QueueGroup = group; - }; - - button.IsDisabled = () => queueTabs.Groups[group].Tabs.Count == 0; - button.OnMouseUp = mi => selectTab(mi.Modifiers.HasModifier(Modifiers.Shift)); - button.OnKeyPress = e => selectTab(e.Modifiers.HasModifier(Modifiers.Shift)); - button.IsToggled = () => queueTabs.QueueGroup == group; - var chromeName = group.ToLowerInvariant(); - var icon = button.Get("ICON"); - icon.GetImageName = () => button.IsDisabled() ? chromeName+"-disabled" : - queueTabs.Groups[group].Alert ? chromeName+"-alert" : chromeName; } [ObjectCreator.UseCtor] @@ -125,17 +98,6 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic sidebarRoot.Get("CASH").GetText = () => "${0}".F(playerResources.DisplayCash + playerResources.DisplayOre); - queueTabs = playerWidgets.Get("PRODUCTION_TABS"); - world.ActorAdded += queueTabs.ActorChanged; - world.ActorRemoved += queueTabs.ActorChanged; - - var queueTypes = sidebarRoot.Get("PRODUCTION_TYPES"); - SetupProductionGroupButton(queueTypes.Get("BUILDING"), "Building"); - SetupProductionGroupButton(queueTypes.Get("DEFENSE"), "Defense"); - SetupProductionGroupButton(queueTypes.Get("INFANTRY"), "Infantry"); - SetupProductionGroupButton(queueTypes.Get("VEHICLE"), "Vehicle"); - SetupProductionGroupButton(queueTypes.Get("AIRCRAFT"), "Aircraft"); - playerWidgets.Get("OPTIONS_BUTTON").OnClick = OptionsClicked; var winLossWatcher = playerWidgets.Get("WIN_LOSS_WATCHER"); diff --git a/OpenRA.Mods.Cnc/Widgets/Logic/ProductionTabsLogic.cs b/OpenRA.Mods.Cnc/Widgets/Logic/ProductionTabsLogic.cs new file mode 100644 index 0000000000..09bab8b0ce --- /dev/null +++ b/OpenRA.Mods.Cnc/Widgets/Logic/ProductionTabsLogic.cs @@ -0,0 +1,70 @@ +#region Copyright & License Information +/* + * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System; +using System.Drawing; +using OpenRA.Mods.RA.Orders; +using OpenRA.Mods.RA.Buildings; +using OpenRA.Traits; +using OpenRA.Widgets; + +namespace OpenRA.Mods.Cnc.Widgets.Logic +{ + public class ProductionTabsLogic + { + ProductionTabsWidget tabs; + World world; + + void SetupProductionGroupButton(ProductionTypeButtonWidget button) + { + if (button == null) + return; + + Action selectTab = reverse => + { + if (tabs.QueueGroup == button.ProductionGroup) + tabs.SelectNextTab(reverse); + else + tabs.QueueGroup = button.ProductionGroup; + }; + + button.IsDisabled = () => tabs.Groups[button.ProductionGroup].Tabs.Count == 0; + button.OnMouseUp = mi => selectTab(mi.Modifiers.HasModifier(Modifiers.Shift)); + button.OnKeyPress = e => selectTab(e.Modifiers.HasModifier(Modifiers.Shift)); + button.IsToggled = () => tabs.QueueGroup == button.ProductionGroup; + + var chromeName = button.ProductionGroup.ToLowerInvariant(); + var icon = button.Get("ICON"); + icon.GetImageName = () => button.IsDisabled() ? chromeName+"-disabled" : + tabs.Groups[button.ProductionGroup].Alert ? chromeName+"-alert" : chromeName; + } + + [ObjectCreator.UseCtor] + public ProductionTabsLogic(Widget widget, World world) + { + this.world = world; + tabs = widget.Get("PRODUCTION_TABS"); + world.ActorAdded += tabs.ActorChanged; + world.ActorRemoved += tabs.ActorChanged; + Game.BeforeGameStart += UnregisterEvents; + + var typesContainer = Ui.Root.Get(tabs.TypesContainer); + foreach (var i in typesContainer.Children) + SetupProductionGroupButton(i as ProductionTypeButtonWidget); + } + + void UnregisterEvents() + { + Game.BeforeGameStart -= UnregisterEvents; + world.ActorAdded -= tabs.ActorChanged; + world.ActorRemoved -= tabs.ActorChanged; + } + } +} diff --git a/OpenRA.Mods.Cnc/Widgets/ProductionTabsWidget.cs b/OpenRA.Mods.Cnc/Widgets/ProductionTabsWidget.cs index deda1ea1b8..c584d2cfa8 100755 --- a/OpenRA.Mods.Cnc/Widgets/ProductionTabsWidget.cs +++ b/OpenRA.Mods.Cnc/Widgets/ProductionTabsWidget.cs @@ -61,6 +61,8 @@ namespace OpenRA.Mods.Cnc.Widgets class ProductionTabsWidget : Widget { public readonly string PaletteWidget = null; + public readonly string TypesContainer = null; + public readonly float ScrollVelocity = 4f; public readonly int TabWidth = 30; public readonly int ArrowWidth = 20; diff --git a/OpenRA.Mods.Cnc/Widgets/ProductionTypeButtonWidget.cs b/OpenRA.Mods.Cnc/Widgets/ProductionTypeButtonWidget.cs new file mode 100644 index 0000000000..f521509f97 --- /dev/null +++ b/OpenRA.Mods.Cnc/Widgets/ProductionTypeButtonWidget.cs @@ -0,0 +1,29 @@ +#region Copyright & License Information +/* + * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System; +using System.Drawing; +using OpenRA.FileFormats; +using OpenRA.Widgets; + +namespace OpenRA.Mods.Cnc.Widgets +{ + public class ProductionTypeButtonWidget : ToggleButtonWidget + { + public readonly string ProductionGroup; + + public ProductionTypeButtonWidget() : base() {} + protected ProductionTypeButtonWidget(ProductionTypeButtonWidget other) + : base(other) + { + ProductionGroup = other.ProductionGroup; + } + } +} diff --git a/mods/cnc/chrome/ingame.yaml b/mods/cnc/chrome/ingame.yaml index c1e935cfe6..1e864cb18c 100644 --- a/mods/cnc/chrome/ingame.yaml +++ b/mods/cnc/chrome/ingame.yaml @@ -190,67 +190,74 @@ Container@PLAYER_WIDGETS: Width:170 Height:30 Children: - ToggleButton@BUILDING: + ProductionTypeButton@BUILDING: Width:30 Height:30 Key: q TooltipText: Buildings TooltipContainer:TOOLTIP_CONTAINER + ProductionGroup:Building Children: Image@ICON: X:7 Y:7 ImageCollection:production-icons - ToggleButton@DEFENSE: + ProductionTypeButton@DEFENSE: X:35 Width:30 Height:30 Key: w TooltipText: Defense TooltipContainer:TOOLTIP_CONTAINER + ProductionGroup:Defense Children: Image@ICON: X:7 Y:7 ImageCollection:production-icons - ToggleButton@INFANTRY: + ProductionTypeButton@INFANTRY: X:70 Width:30 Height:30 Key: e TooltipText: Infantry TooltipContainer:TOOLTIP_CONTAINER + ProductionGroup:Infantry Children: Image@ICON: X:7 Y:7 ImageCollection:production-icons - ToggleButton@VEHICLE: + ProductionTypeButton@VEHICLE: X:105 Width:30 Height:30 Key: r TooltipText: Vehicles TooltipContainer:TOOLTIP_CONTAINER + ProductionGroup:Vehicle Children: Image@ICON: X:7 Y:7 ImageCollection:production-icons - ToggleButton@AIRCRAFT: + ProductionTypeButton@AIRCRAFT: X:140 Width:30 Height:30 Key: t TooltipText: Aircraft TooltipContainer:TOOLTIP_CONTAINER + ProductionGroup:Aircraft Children: Image@ICON: X:7 Y:7 ImageCollection:production-icons ProductionTabs@PRODUCTION_TABS: + Logic:ProductionTabsLogic PaletteWidget:PRODUCTION_PALETTE + TypesContainer:PRODUCTION_TYPES X:WINDOW_RIGHT - 204 Y:268 Width:194