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