From 1e0148e092ea85b1ccc6e1c55f42f06e7715fbcd Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 23 Jul 2017 14:25:27 +0000 Subject: [PATCH] Migrate ButtonWidget to NamedHotkey. --- OpenRA.Mods.Common/Widgets/ButtonWidget.cs | 10 ++---- .../Widgets/Logic/ButtonTooltipLogic.cs | 5 +-- .../ButtonTooltipWithDescHighlightLogic.cs | 5 +-- .../Widgets/Logic/Editor/MapEditorLogic.cs | 1 - .../Logic/Ingame/ClassicProductionLogic.cs | 10 ------ .../Widgets/Logic/Ingame/CommandBarLogic.cs | 6 ---- .../Logic/Ingame/OrderButtonsChromeLogic.cs | 12 ------- .../Logic/Ingame/ProductionTabsLogic.cs | 10 ------ .../Logic/Ingame/ReplayControlBarLogic.cs | 6 ---- .../Logic/Ingame/StanceSelectorLogic.cs | 12 +++---- .../Widgets/ProductionTypeButtonWidget.cs | 1 - mods/cnc/chrome/editor.yaml | 1 + mods/cnc/chrome/ingame.yaml | 34 +++++++++++++++---- mods/common/chrome/editor.yaml | 1 + mods/common/chrome/ingame-observer.yaml | 14 +++++--- mods/d2k/chrome/ingame-player.yaml | 29 +++++++++++----- mods/ra/chrome/ingame-observer.yaml | 6 ++++ mods/ra/chrome/ingame-player.yaml | 29 +++++++++++----- mods/ts/chrome/ingame-observer.yaml | 14 +++++--- mods/ts/chrome/ingame-player.yaml | 14 +++++--- 20 files changed, 120 insertions(+), 100 deletions(-) diff --git a/OpenRA.Mods.Common/Widgets/ButtonWidget.cs b/OpenRA.Mods.Common/Widgets/ButtonWidget.cs index b994dbcf5a..9d1364c8fd 100644 --- a/OpenRA.Mods.Common/Widgets/ButtonWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ButtonWidget.cs @@ -19,14 +19,8 @@ namespace OpenRA.Mods.Common.Widgets { public readonly string TooltipContainer; public readonly string TooltipTemplate = "BUTTON_TOOLTIP"; - public Func GetKey = _ => Hotkey.Invalid; - - public Hotkey Key - { - get { return GetKey(this); } - set { GetKey = _ => value; } - } + public NamedHotkey Key = new NamedHotkey(); public bool DisableKeyRepeat = false; public bool DisableKeySound = false; @@ -136,7 +130,7 @@ namespace OpenRA.Mods.Common.Widgets public override bool HandleKeyPress(KeyInput e) { - if (Hotkey.FromKeyInput(e) != Key || e.Event != KeyInputEvent.Down || (DisableKeyRepeat && e.IsRepeat)) + if (Hotkey.FromKeyInput(e) != Key.GetValue() || e.Event != KeyInputEvent.Down || (DisableKeyRepeat && e.IsRepeat)) return false; if (!IsDisabled()) diff --git a/OpenRA.Mods.Common/Widgets/Logic/ButtonTooltipLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/ButtonTooltipLogic.cs index 223e96288e..cf27e1ff47 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/ButtonTooltipLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/ButtonTooltipLogic.cs @@ -23,17 +23,18 @@ namespace OpenRA.Mods.Common.Widgets.Logic var font = Game.Renderer.Fonts[label.Font]; var text = button.GetTooltipText(); var labelWidth = font.Measure(text).X; + var key = button.Key.GetValue(); label.GetText = () => text; label.Bounds.Width = labelWidth; widget.Bounds.Width = 2 * label.Bounds.X + labelWidth; - if (button.Key.IsValid()) + if (key.IsValid()) { var hotkey = widget.Get("HOTKEY"); hotkey.Visible = true; - var hotkeyLabel = "({0})".F(button.Key.DisplayString()); + var hotkeyLabel = "({0})".F(key.DisplayString()); hotkey.GetText = () => hotkeyLabel; hotkey.Bounds.X = labelWidth + 2 * label.Bounds.X; diff --git a/OpenRA.Mods.Common/Widgets/Logic/ButtonTooltipWithDescHighlightLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/ButtonTooltipWithDescHighlightLogic.cs index d47e0f0c44..4d719d037c 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/ButtonTooltipWithDescHighlightLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/ButtonTooltipWithDescHighlightLogic.cs @@ -25,17 +25,18 @@ namespace OpenRA.Mods.Common.Widgets.Logic var font = Game.Renderer.Fonts[label.Font]; var text = button.GetTooltipText(); var labelWidth = font.Measure(text).X; + var key = button.Key.GetValue(); label.GetText = () => text; label.Bounds.Width = labelWidth; widget.Bounds.Width = 2 * label.Bounds.X + labelWidth; - if (button.Key.IsValid()) + if (key.IsValid()) { var hotkey = widget.Get("HOTKEY"); hotkey.Visible = true; - var hotkeyLabel = "({0})".F(button.Key.DisplayString()); + var hotkeyLabel = "({0})".F(key.DisplayString()); hotkey.GetText = () => hotkeyLabel; hotkey.Bounds.X = labelWidth + 2 * label.Bounds.X; diff --git a/OpenRA.Mods.Common/Widgets/Logic/Editor/MapEditorLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Editor/MapEditorLogic.cs index a48d94b3c4..ac0606156e 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Editor/MapEditorLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Editor/MapEditorLogic.cs @@ -62,7 +62,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic var options = worldRenderer.Viewport.AvailableZoomSteps; zoomDropdown.OnMouseDown = _ => zoomDropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 150, options, setupItem); zoomDropdown.GetText = () => zoomDropdown.SelectedItem; - zoomDropdown.GetKey = _ => Game.Settings.Keys.TogglePixelDoubleKey; zoomDropdown.OnKeyPress = e => { var key = Hotkey.FromKeyInput(e); diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ClassicProductionLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ClassicProductionLogic.cs index c599a44122..50c407901b 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ClassicProductionLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ClassicProductionLogic.cs @@ -43,21 +43,11 @@ namespace OpenRA.Mods.Common.Widgets.Logic palette.PickUpCompletedBuilding(); }; - Func getKey = _ => Hotkey.Invalid; - if (!string.IsNullOrEmpty(button.HotkeyName)) - { - var ks = Game.Settings.Keys; - var field = ks.GetType().GetField(button.HotkeyName); - if (field != null) - getKey = _ => (Hotkey)field.GetValue(ks); - } - button.IsDisabled = () => !queues.Any(q => q.BuildableItems().Any()); button.OnMouseUp = mi => selectTab(mi.Modifiers.HasModifier(Modifiers.Shift)); button.OnKeyPress = e => selectTab(e.Modifiers.HasModifier(Modifiers.Shift)); button.OnClick = () => selectTab(false); button.IsHighlighted = () => queues.Contains(palette.CurrentQueue); - button.GetKey = getKey; var chromeName = button.ProductionGroup.ToLowerInvariant(); var icon = button.Get("ICON"); diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/CommandBarLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/CommandBarLogic.cs index ef54eea9b8..d1cdfe4fa3 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/CommandBarLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/CommandBarLogic.cs @@ -43,14 +43,12 @@ namespace OpenRA.Mods.Common.Widgets public CommandBarLogic(Widget widget, World world) { this.world = world; - var ks = Game.Settings.Keys; var attackMoveButton = widget.GetOrNull("ATTACK_MOVE"); if (attackMoveButton != null) { BindButtonIcon(attackMoveButton); - attackMoveButton.GetKey = _ => ks.AttackMoveKey; attackMoveButton.IsDisabled = () => { UpdateStateIfNecessary(); return attackMoveDisabled; }; attackMoveButton.IsHighlighted = () => world.OrderGenerator is GenericSelectTarget && ((GenericSelectTarget)world.OrderGenerator).OrderName == "AttackMove"; @@ -108,7 +106,6 @@ namespace OpenRA.Mods.Common.Widgets { BindButtonIcon(guardButton); - guardButton.GetKey = _ => ks.GuardKey; guardButton.IsDisabled = () => { UpdateStateIfNecessary(); return guardDisabled; }; guardButton.IsHighlighted = () => world.OrderGenerator is GenericSelectTarget && ((GenericSelectTarget)world.OrderGenerator).OrderName == "Guard"; @@ -134,7 +131,6 @@ namespace OpenRA.Mods.Common.Widgets { BindButtonIcon(scatterButton); - scatterButton.GetKey = _ => ks.ScatterKey; scatterButton.IsDisabled = () => { UpdateStateIfNecessary(); return scatterDisabled; }; scatterButton.IsHighlighted = () => scatterHighlighted > 0; scatterButton.OnClick = () => PerformKeyboardOrderOnSelection(a => new Order("Scatter", a, false)); @@ -146,7 +142,6 @@ namespace OpenRA.Mods.Common.Widgets { BindButtonIcon(deployButton); - deployButton.GetKey = _ => ks.DeployKey; deployButton.IsDisabled = () => { UpdateStateIfNecessary(); return !selectedDeploys.Any(Exts.IsTraitEnabled); }; deployButton.IsHighlighted = () => deployHighlighted > 0; deployButton.OnClick = PerformDeployOrderOnSelection; @@ -158,7 +153,6 @@ namespace OpenRA.Mods.Common.Widgets { BindButtonIcon(stopButton); - stopButton.GetKey = _ => ks.StopKey; stopButton.IsDisabled = () => { UpdateStateIfNecessary(); return stopDisabled; }; stopButton.IsHighlighted = () => stopHighlighted > 0; stopButton.OnClick = () => PerformKeyboardOrderOnSelection(a => new Order("Stop", a, false)); diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/OrderButtonsChromeLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/OrderButtonsChromeLogic.cs index 433869d128..9a7208f540 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/OrderButtonsChromeLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/OrderButtonsChromeLogic.cs @@ -21,10 +21,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic { var sell = widget as ButtonWidget; if (sell != null) - { - sell.GetKey = _ => Game.Settings.Keys.SellKey; OrderButtonsChromeUtils.BindOrderButton(world, sell, "sell"); - } } } @@ -35,10 +32,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic { var repair = widget as ButtonWidget; if (repair != null) - { - repair.GetKey = _ => Game.Settings.Keys.RepairKey; OrderButtonsChromeUtils.BindOrderButton(world, repair, "repair"); - } } } @@ -49,10 +43,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic { var power = widget as ButtonWidget; if (power != null) - { - power.GetKey = _ => Game.Settings.Keys.PowerDownKey; OrderButtonsChromeUtils.BindOrderButton(world, power, "power"); - } } } @@ -63,10 +54,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic { var beacon = widget as ButtonWidget; if (beacon != null) - { - beacon.GetKey = _ => Game.Settings.Keys.PlaceBeaconKey; OrderButtonsChromeUtils.BindOrderButton(world, beacon, "beacon"); - } } } diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ProductionTabsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ProductionTabsLogic.cs index 5dfc3e1819..81a3e7419d 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ProductionTabsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ProductionTabsLogic.cs @@ -34,20 +34,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic tabs.PickUpCompletedBuilding(); }; - Func getKey = _ => Hotkey.Invalid; - if (!string.IsNullOrEmpty(button.HotkeyName)) - { - var ks = Game.Settings.Keys; - var field = ks.GetType().GetField(button.HotkeyName); - if (field != null) - getKey = _ => (Hotkey)field.GetValue(ks); - } - 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.IsHighlighted = () => tabs.QueueGroup == button.ProductionGroup; - button.GetKey = getKey; var chromeName = button.ProductionGroup.ToLowerInvariant(); var icon = button.Get("ICON"); diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ReplayControlBarLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ReplayControlBarLogic.cs index 1cf7aac8c8..71527d5269 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ReplayControlBarLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ReplayControlBarLogic.cs @@ -46,18 +46,15 @@ namespace OpenRA.Mods.Common.Widgets.Logic var originalTimestep = world.Timestep; var pauseButton = widget.Get("BUTTON_PAUSE"); - pauseButton.GetKey = _ => Game.Settings.Keys.PauseKey; pauseButton.IsVisible = () => world.Timestep != 0 && orderManager.NetFrameNumber < replayNetTicks; pauseButton.OnClick = () => world.Timestep = 0; var playButton = widget.Get("BUTTON_PLAY"); - playButton.GetKey = _ => Game.Settings.Keys.PauseKey; playButton.IsVisible = () => world.Timestep == 0 || orderManager.NetFrameNumber >= replayNetTicks; playButton.OnClick = () => world.Timestep = (int)Math.Ceiling(originalTimestep * multipliers[speed]); playButton.IsDisabled = () => orderManager.NetFrameNumber >= replayNetTicks; var slowButton = widget.Get("BUTTON_SLOW"); - slowButton.GetKey = _ => Game.Settings.Keys.ReplaySpeedSlowKey; slowButton.IsHighlighted = () => speed == PlaybackSpeed.Slow; slowButton.IsDisabled = () => orderManager.NetFrameNumber >= replayNetTicks; slowButton.OnClick = () => @@ -68,7 +65,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic }; var normalSpeedButton = widget.Get("BUTTON_REGULAR"); - normalSpeedButton.GetKey = _ => Game.Settings.Keys.ReplaySpeedRegularKey; normalSpeedButton.IsHighlighted = () => speed == PlaybackSpeed.Regular; normalSpeedButton.IsDisabled = () => orderManager.NetFrameNumber >= replayNetTicks; normalSpeedButton.OnClick = () => @@ -79,7 +75,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic }; var fastButton = widget.Get("BUTTON_FAST"); - fastButton.GetKey = _ => Game.Settings.Keys.ReplaySpeedFastKey; fastButton.IsHighlighted = () => speed == PlaybackSpeed.Fast; fastButton.IsDisabled = () => orderManager.NetFrameNumber >= replayNetTicks; fastButton.OnClick = () => @@ -90,7 +85,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic }; var maximumButton = widget.Get("BUTTON_MAXIMUM"); - maximumButton.GetKey = _ => Game.Settings.Keys.ReplaySpeedMaxKey; maximumButton.IsHighlighted = () => speed == PlaybackSpeed.Maximum; maximumButton.IsDisabled = () => orderManager.NetFrameNumber >= replayNetTicks; maximumButton.OnClick = () => diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/StanceSelectorLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/StanceSelectorLogic.cs index 682fd5237c..edfa7d10e7 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/StanceSelectorLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/StanceSelectorLogic.cs @@ -27,32 +27,30 @@ namespace OpenRA.Mods.Common.Widgets public StanceSelectorLogic(Widget widget, World world) { this.world = world; - var ks = Game.Settings.Keys; var holdFireButton = widget.GetOrNull("STANCE_HOLDFIRE"); if (holdFireButton != null) - BindStanceButton(holdFireButton, UnitStance.HoldFire, _ => ks.StanceHoldFireKey); + BindStanceButton(holdFireButton, UnitStance.HoldFire); var returnFireButton = widget.GetOrNull("STANCE_RETURNFIRE"); if (returnFireButton != null) - BindStanceButton(returnFireButton, UnitStance.ReturnFire, _ => ks.StanceReturnFireKey); + BindStanceButton(returnFireButton, UnitStance.ReturnFire); var defendButton = widget.GetOrNull("STANCE_DEFEND"); if (defendButton != null) - BindStanceButton(defendButton, UnitStance.Defend, _ => ks.StanceDefendKey); + BindStanceButton(defendButton, UnitStance.Defend); var attackAnythingButton = widget.GetOrNull("STANCE_ATTACKANYTHING"); if (attackAnythingButton != null) - BindStanceButton(attackAnythingButton, UnitStance.AttackAnything, _ => ks.StanceAttackAnythingKey); + BindStanceButton(attackAnythingButton, UnitStance.AttackAnything); } - void BindStanceButton(ButtonWidget button, UnitStance stance, Func getHotkey) + void BindStanceButton(ButtonWidget button, UnitStance stance) { var icon = button.Get("ICON"); icon.GetImageName = () => button.IsDisabled() ? icon.ImageName + "-disabled" : button.IsHighlighted() ? icon.ImageName + "-active" : icon.ImageName; - button.GetKey = getHotkey; button.IsDisabled = () => { UpdateStateIfNecessary(); return !actorStances.Any(); }; button.IsHighlighted = () => actorStances.Any( at => !at.Trait.IsTraitDisabled && at.Trait.PredictedStance == stance); diff --git a/OpenRA.Mods.Common/Widgets/ProductionTypeButtonWidget.cs b/OpenRA.Mods.Common/Widgets/ProductionTypeButtonWidget.cs index 448e0bed3c..c3fb7e399a 100644 --- a/OpenRA.Mods.Common/Widgets/ProductionTypeButtonWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ProductionTypeButtonWidget.cs @@ -14,7 +14,6 @@ namespace OpenRA.Mods.Common.Widgets public class ProductionTypeButtonWidget : ButtonWidget { public readonly string ProductionGroup; - public readonly string HotkeyName; [ObjectCreator.UseCtor] public ProductionTypeButtonWidget(ModData modData) diff --git a/mods/cnc/chrome/editor.yaml b/mods/cnc/chrome/editor.yaml index 553d5210b7..9709fa58cf 100644 --- a/mods/cnc/chrome/editor.yaml +++ b/mods/cnc/chrome/editor.yaml @@ -450,6 +450,7 @@ Container@EDITOR_WORLD_ROOT: Width: 70 Height: 25 Font: Bold + Key: TogglePixelDouble Button@COPYPASTE_BUTTON: X: WINDOW_RIGHT - 390 Y: 5 diff --git a/mods/cnc/chrome/ingame.yaml b/mods/cnc/chrome/ingame.yaml index f44eeb9acb..91582160a5 100644 --- a/mods/cnc/chrome/ingame.yaml +++ b/mods/cnc/chrome/ingame.yaml @@ -141,6 +141,9 @@ Container@OBSERVER_WIDGETS: Y: 10 Width: 26 Height: 26 + Key: Pause + TooltipText: Pause + TooltipContainer: TOOLTIP_CONTAINER IgnoreChildMouseOver: true Children: Image@IMAGE_PAUSE: @@ -155,6 +158,9 @@ Container@OBSERVER_WIDGETS: Y: 10 Width: 26 Height: 26 + Key: Pause + TooltipText: Play + TooltipContainer: TOOLTIP_CONTAINER IgnoreChildMouseOver: true Children: Image@IMAGE_PLAY: @@ -170,6 +176,7 @@ Container@OBSERVER_WIDGETS: Width: 36 Height: 20 BaseLine: 1 + Key: ReplaySpeedSlow TooltipText: Slow speed TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 @@ -181,6 +188,7 @@ Container@OBSERVER_WIDGETS: Width: 38 Height: 20 BaseLine: 1 + Key: ReplaySpeedRegular TooltipText: Regular speed TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 @@ -192,6 +200,7 @@ Container@OBSERVER_WIDGETS: Width: 38 Height: 20 BaseLine: 1 + Key: ReplaySpeedFast TooltipText: Fast speed TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 @@ -203,6 +212,7 @@ Container@OBSERVER_WIDGETS: Width: 38 Height: 20 BaseLine: 1 + Key: ReplaySpeedMax TooltipText: Maximum speed TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 @@ -270,6 +280,7 @@ Container@PLAYER_WIDGETS: Width: 34 Height: 34 Background: command-button + Key: AttackMove DisableKeySound: true TooltipText: Attack Move TooltipDesc: Selected units will move to the desired location\nand attack any enemies they encounter en route.\n\nLeft-click icon then right-click on target location. @@ -320,6 +331,7 @@ Container@PLAYER_WIDGETS: Width: 34 Height: 34 Background: command-button + Key: Guard DisableKeySound: true TooltipText: Guard TooltipDesc: Selected units will follow the targeted unit.\n\nLeft-click icon then right-click on target unit. @@ -336,6 +348,7 @@ Container@PLAYER_WIDGETS: Width: 34 Height: 34 Background: command-button + Key: Deploy DisableKeyRepeat: true DisableKeySound: true TooltipText: Deploy @@ -353,6 +366,7 @@ Container@PLAYER_WIDGETS: Width: 34 Height: 34 Background: command-button + Key: Scatter DisableKeyRepeat: true DisableKeySound: true TooltipText: Scatter @@ -370,6 +384,7 @@ Container@PLAYER_WIDGETS: Width: 34 Height: 34 Background: command-button + Key: Stop DisableKeyRepeat: true DisableKeySound: true TooltipText: Stop @@ -412,6 +427,7 @@ Container@PLAYER_WIDGETS: Width: 34 Height: 26 Background: stance-button + Key: StanceAttackAnything DisableKeyRepeat: true DisableKeySound: true TooltipText: Attack Anything Stance @@ -429,6 +445,7 @@ Container@PLAYER_WIDGETS: Width: 34 Height: 26 Background: stance-button + Key: StanceDefend DisableKeyRepeat: true DisableKeySound: true TooltipText: Defend Stance @@ -446,6 +463,7 @@ Container@PLAYER_WIDGETS: Width: 34 Height: 26 Background: stance-button + Key: StanceReturnFire DisableKeyRepeat: true DisableKeySound: true TooltipText: Return Fire Stance @@ -463,6 +481,7 @@ Container@PLAYER_WIDGETS: Width: 34 Height: 26 Background: stance-button + Key: StanceHoldFire DisableKeyRepeat: true DisableKeySound: true TooltipText: Hold Fire Stance @@ -483,12 +502,12 @@ Container@PLAYER_WIDGETS: Background: panel-black Children: MenuButton@OPTIONS_BUTTON: - Key: escape X: 22 Y: 0 - 24 Width: 30 Height: 25 Font: Bold + Key: escape TooltipText: Menu TooltipContainer: TOOLTIP_CONTAINER DisableWorldSounds: true @@ -505,6 +524,7 @@ Container@PLAYER_WIDGETS: Width: 30 Height: 25 Font: Bold + Key: PlaceBeacon TooltipText: Place Beacon TooltipContainer: TOOLTIP_CONTAINER Children: @@ -519,6 +539,7 @@ Container@PLAYER_WIDGETS: Width: 30 Height: 25 Font: Bold + Key: Sell TooltipText: Sell TooltipContainer: TOOLTIP_CONTAINER Children: @@ -533,6 +554,7 @@ Container@PLAYER_WIDGETS: Width: 30 Height: 25 Font: Bold + Key: Repair TooltipText: Repair TooltipContainer: TOOLTIP_CONTAINER Children: @@ -614,7 +636,7 @@ Container@PLAYER_WIDGETS: TooltipText: Buildings TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Building - HotkeyName: ProductionTypeBuildingKey + Key: ProductionTypeBuilding Children: Image@ICON: X: 7 @@ -627,7 +649,7 @@ Container@PLAYER_WIDGETS: TooltipText: Support TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Defence - HotkeyName: ProductionTypeDefenseKey + Key: ProductionTypeDefense Children: Image@ICON: X: 7 @@ -640,7 +662,7 @@ Container@PLAYER_WIDGETS: TooltipText: Infantry TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Infantry - HotkeyName: ProductionTypeInfantryKey + Key: ProductionTypeInfantry Children: Image@ICON: X: 7 @@ -653,7 +675,7 @@ Container@PLAYER_WIDGETS: TooltipText: Vehicles TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Vehicle - HotkeyName: ProductionTypeVehicleKey + Key: ProductionTypeVehicle Children: Image@ICON: X: 7 @@ -666,7 +688,7 @@ Container@PLAYER_WIDGETS: TooltipText: Aircraft TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Aircraft - HotkeyName: ProductionTypeAircraftKey + Key: ProductionTypeAircraft Children: Image@ICON: X: 7 diff --git a/mods/common/chrome/editor.yaml b/mods/common/chrome/editor.yaml index c80a3a504e..b209839d19 100644 --- a/mods/common/chrome/editor.yaml +++ b/mods/common/chrome/editor.yaml @@ -431,6 +431,7 @@ Container@EDITOR_WORLD_ROOT: Width: 70 Height: 25 Font: Bold + Key: TogglePixelDouble Label@COORDINATE_LABEL: X: 485 Width: 50 diff --git a/mods/common/chrome/ingame-observer.yaml b/mods/common/chrome/ingame-observer.yaml index 21dfe47bbd..edf92f6784 100644 --- a/mods/common/chrome/ingame-observer.yaml +++ b/mods/common/chrome/ingame-observer.yaml @@ -94,6 +94,9 @@ Container@OBSERVER_WIDGETS: Y: 10 Width: 26 Height: 26 + Key: Pause + TooltipText: Pause + TooltipContainer: TOOLTIP_CONTAINER IgnoreChildMouseOver: true Children: Image@IMAGE_PAUSE: @@ -107,7 +110,10 @@ Container@OBSERVER_WIDGETS: Y: 10 Width: 26 Height: 26 + Key: Pause IgnoreChildMouseOver: true + TooltipText: Play + TooltipContainer: TOOLTIP_CONTAINER Children: Image@IMAGE_PLAY: Width: 25 @@ -120,9 +126,9 @@ Container@OBSERVER_WIDGETS: Width: 36 Height: 20 BaseLine: 1 + Key: ReplaySpeedSlow TooltipText: Slow speed TooltipContainer: TOOLTIP_CONTAINER - VisualHeight: 0 Text: 50% Font: TinyBold Button@BUTTON_REGULAR: @@ -131,9 +137,9 @@ Container@OBSERVER_WIDGETS: Width: 38 Height: 20 BaseLine: 1 + Key: ReplaySpeedRegular TooltipText: Regular speed TooltipContainer: TOOLTIP_CONTAINER - VisualHeight: 0 Text: 100% Font: TinyBold Button@BUTTON_FAST: @@ -142,9 +148,9 @@ Container@OBSERVER_WIDGETS: Width: 38 Height: 20 BaseLine: 1 + Key: ReplaySpeedFast TooltipText: Fast speed TooltipContainer: TOOLTIP_CONTAINER - VisualHeight: 0 Text: 200% Font: TinyBold Button@BUTTON_MAXIMUM: @@ -153,8 +159,8 @@ Container@OBSERVER_WIDGETS: Width: 38 Height: 20 BaseLine: 1 + Key: ReplaySpeedMax TooltipText: Maximum speed TooltipContainer: TOOLTIP_CONTAINER - VisualHeight: 0 Text: MAX Font: TinyBold diff --git a/mods/d2k/chrome/ingame-player.yaml b/mods/d2k/chrome/ingame-player.yaml index 1651d06b4c..3d54a570ab 100644 --- a/mods/d2k/chrome/ingame-player.yaml +++ b/mods/d2k/chrome/ingame-player.yaml @@ -43,6 +43,7 @@ Container@PLAYER_WIDGETS: Height: 41 VisualHeight: 0 Background: command-button + Key: AttackMove DisableKeySound: true TooltipText: Attack Move TooltipDesc: Selected units will move to the desired location\nand attack any enemies they encounter en route.\n\nLeft-click icon then right-click on target location. @@ -93,6 +94,7 @@ Container@PLAYER_WIDGETS: Height: 41 VisualHeight: 0 Background: command-button + Key: Guard DisableKeySound: true TooltipText: Guard TooltipDesc: Selected units will follow the targeted unit.\n\nLeft-click icon then right-click on target unit. @@ -109,6 +111,7 @@ Container@PLAYER_WIDGETS: Height: 41 VisualHeight: 0 Background: command-button + Key: Deploy DisableKeyRepeat: true DisableKeySound: true TooltipText: Deploy @@ -126,6 +129,7 @@ Container@PLAYER_WIDGETS: Height: 41 VisualHeight: 0 Background: command-button + Key: Scatter DisableKeyRepeat: true DisableKeySound: true TooltipText: Scatter @@ -143,6 +147,7 @@ Container@PLAYER_WIDGETS: Height: 41 VisualHeight: 0 Background: command-button + Key: Stop DisableKeyRepeat: true DisableKeySound: true TooltipText: Stop @@ -183,6 +188,7 @@ Container@PLAYER_WIDGETS: Height: 26 VisualHeight: 0 Background: + Key: StanceAttackAnything DisableKeyRepeat: true DisableKeySound: true TooltipText: Attack Anything Stance @@ -200,6 +206,7 @@ Container@PLAYER_WIDGETS: Height: 26 VisualHeight: 0 Background: + Key: StanceDefend DisableKeyRepeat: true DisableKeySound: true TooltipText: Defend Stance @@ -217,6 +224,7 @@ Container@PLAYER_WIDGETS: Height: 26 VisualHeight: 0 Background: + Key: StanceReturnFire DisableKeyRepeat: true DisableKeySound: true TooltipText: Return Fire Stance @@ -234,6 +242,7 @@ Container@PLAYER_WIDGETS: Height: 26 VisualHeight: 0 Background: + Key: StanceHoldFire DisableKeyRepeat: true DisableKeySound: true TooltipText: Hold Fire Stance @@ -260,11 +269,11 @@ Container@PLAYER_WIDGETS: Y: 236 Children: MenuButton@DEBUG_BUTTON: - Key: escape Shift X: 4 Width: 34 Height: 35 Background: + Key: escape Shift TooltipText: Debug Menu TooltipContainer: TOOLTIP_CONTAINER DisableWorldSounds: true @@ -281,6 +290,7 @@ Container@PLAYER_WIDGETS: Width: 34 Height: 35 Background: + Key: Repair TooltipText: Repair TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 @@ -295,6 +305,7 @@ Container@PLAYER_WIDGETS: Width: 34 Height: 35 Background: + Key: Sell TooltipText: Sell TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 @@ -309,6 +320,7 @@ Container@PLAYER_WIDGETS: Width: 36 Height: 35 Background: + Key: PlaceBeacon TooltipText: Place Beacon TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 @@ -323,6 +335,7 @@ Container@PLAYER_WIDGETS: Width: 36 Height: 35 Background: + Key: PowerDown TooltipText: Power Down TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 @@ -491,7 +504,7 @@ Container@PLAYER_WIDGETS: TooltipText: Buildings TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Building - HotkeyName: ProductionTypeBuildingKey + Key: ProductionTypeBuilding Children: Image@ICON: X: 5 @@ -506,7 +519,7 @@ Container@PLAYER_WIDGETS: TooltipText: Upgrades TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Upgrade - HotkeyName: ProductionTypeUpgradeKey + Key: ProductionTypeUpgrade Children: Image@ICON: X: 5 @@ -521,7 +534,7 @@ Container@PLAYER_WIDGETS: TooltipText: Infantry TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Infantry - HotkeyName: ProductionTypeInfantryKey + Key: ProductionTypeInfantry Children: Image@ICON: X: 5 @@ -536,7 +549,7 @@ Container@PLAYER_WIDGETS: TooltipText: Light Vehicles TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Vehicle - HotkeyName: ProductionTypeVehicleKey + Key: ProductionTypeVehicle Children: Image@ICON: X: 5 @@ -551,7 +564,7 @@ Container@PLAYER_WIDGETS: TooltipText: Heavy Vehicles TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Armor - HotkeyName: ProductionTypeTankKey + Key: ProductionTypeTank Children: Image@ICON: X: 5 @@ -566,7 +579,7 @@ Container@PLAYER_WIDGETS: TooltipText: Aircraft TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Aircraft - HotkeyName: ProductionTypeAircraftKey + Key: ProductionTypeAircraft Children: Image@ICON: X: 5 @@ -581,7 +594,7 @@ Container@PLAYER_WIDGETS: TooltipText: Starport TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Starport - HotkeyName: ProductionTypeMerchantKey + Key: ProductionTypeMerchant Children: Image@ICON: X: 5 diff --git a/mods/ra/chrome/ingame-observer.yaml b/mods/ra/chrome/ingame-observer.yaml index 73783d0daa..e802bf9bd2 100644 --- a/mods/ra/chrome/ingame-observer.yaml +++ b/mods/ra/chrome/ingame-observer.yaml @@ -128,6 +128,7 @@ Container@OBSERVER_WIDGETS: Width: 28 Height: 28 Background: sidebar-button-observer + Key: Pause TooltipText: Pause TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 @@ -143,6 +144,7 @@ Container@OBSERVER_WIDGETS: Width: 28 Height: 28 Background: sidebar-button-observer + Key: Pause TooltipText: Play TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 @@ -159,6 +161,7 @@ Container@OBSERVER_WIDGETS: Height: 22 BaseLine: 1 Background: sidebar-button-observer + Key: ReplaySpeedSlow TooltipText: Slow speed TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 @@ -171,6 +174,7 @@ Container@OBSERVER_WIDGETS: Height: 22 BaseLine: 1 Background: sidebar-button-observer + Key: ReplaySpeedRegular TooltipText: Regular speed TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 @@ -183,6 +187,7 @@ Container@OBSERVER_WIDGETS: Height: 22 BaseLine: 1 Background: sidebar-button-observer + Key: ReplaySpeedFast TooltipText: Fast speed TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 @@ -195,6 +200,7 @@ Container@OBSERVER_WIDGETS: Height: 22 BaseLine: 1 Background: sidebar-button-observer + Key: ReplaySpeedMax TooltipText: Maximum speed TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 diff --git a/mods/ra/chrome/ingame-player.yaml b/mods/ra/chrome/ingame-player.yaml index 1f394b390c..aecaf57f8e 100644 --- a/mods/ra/chrome/ingame-player.yaml +++ b/mods/ra/chrome/ingame-player.yaml @@ -49,6 +49,7 @@ Container@PLAYER_WIDGETS: Height: 26 VisualHeight: 0 Background: command-button + Key: AttackMove DisableKeySound: true TooltipText: Attack Move TooltipDesc: Selected units will move to the desired location\nand attack any enemies they encounter en route.\n\nLeft-click icon then right-click on target location. @@ -102,6 +103,7 @@ Container@PLAYER_WIDGETS: Height: 26 VisualHeight: 0 Background: command-button + Key: Guard DisableKeySound: true TooltipText: Guard TooltipDesc: Selected units will follow the targeted unit.\n\nLeft-click icon then right-click on target unit. @@ -119,6 +121,7 @@ Container@PLAYER_WIDGETS: Height: 26 VisualHeight: 0 Background: command-button + Key: Deploy DisableKeyRepeat: true DisableKeySound: true TooltipText: Deploy @@ -137,6 +140,7 @@ Container@PLAYER_WIDGETS: Height: 26 VisualHeight: 0 Background: command-button + Key: Scatter DisableKeyRepeat: true DisableKeySound: true TooltipText: Scatter @@ -155,6 +159,7 @@ Container@PLAYER_WIDGETS: Height: 26 VisualHeight: 0 Background: command-button + Key: Stop DisableKeyRepeat: true DisableKeySound: true TooltipText: Stop @@ -197,6 +202,7 @@ Container@PLAYER_WIDGETS: Height: 26 VisualHeight: 0 Background: command-button + Key: StanceAttackAnything DisableKeyRepeat: true DisableKeySound: true TooltipText: Attack Anything Stance @@ -215,6 +221,7 @@ Container@PLAYER_WIDGETS: Height: 26 VisualHeight: 0 Background: command-button + Key: StanceDefend DisableKeyRepeat: true DisableKeySound: true TooltipText: Defend Stance @@ -233,6 +240,7 @@ Container@PLAYER_WIDGETS: Height: 26 VisualHeight: 0 Background: command-button + Key: StanceReturnFire DisableKeyRepeat: true DisableKeySound: true TooltipText: Return Fire Stance @@ -251,6 +259,7 @@ Container@PLAYER_WIDGETS: Height: 26 VisualHeight: 0 Background: command-button + Key: StanceHoldFire DisableKeyRepeat: true DisableKeySound: true TooltipText: Hold Fire Stance @@ -282,6 +291,7 @@ Container@PLAYER_WIDGETS: Width: 28 Height: 28 Background: sidebar-button + Key: PlaceBeacon TooltipText: Place Beacon TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 @@ -296,6 +306,7 @@ Container@PLAYER_WIDGETS: Width: 28 Height: 28 Background: sidebar-button + Key: Sell TooltipText: Sell TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 @@ -310,6 +321,7 @@ Container@PLAYER_WIDGETS: Width: 28 Height: 28 Background: sidebar-button + Key: PowerDown TooltipText: Power Down TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 @@ -324,6 +336,7 @@ Container@PLAYER_WIDGETS: Width: 28 Height: 28 Background: sidebar-button + Key: Repair TooltipText: Repair TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 @@ -334,11 +347,11 @@ Container@PLAYER_WIDGETS: ImageCollection: order-icons MenuButton@DEBUG_BUTTON: Logic: AddFactionSuffixLogic - Key: escape Shift X: 128 Width: 28 Height: 28 Background: sidebar-button + Key: escape Shift TooltipText: Debug Menu TooltipContainer: TOOLTIP_CONTAINER DisableWorldSounds: true @@ -351,11 +364,11 @@ Container@PLAYER_WIDGETS: ImageName: debug MenuButton@OPTIONS_BUTTON: Logic: AddFactionSuffixLogic - Key: escape X: 192 Width: 28 Height: 28 Background: sidebar-button + Key: escape TooltipText: Options TooltipContainer: TOOLTIP_CONTAINER DisableWorldSounds: true @@ -481,7 +494,7 @@ Container@PLAYER_WIDGETS: TooltipText: Buildings TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Building - HotkeyName: ProductionTypeBuildingKey + Key: ProductionTypeBuilding Children: Image@ICON: X: 6 @@ -497,7 +510,7 @@ Container@PLAYER_WIDGETS: TooltipText: Defense TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Defense - HotkeyName: ProductionTypeDefenseKey + Key: ProductionTypeDefense Children: Image@ICON: X: 6 @@ -513,7 +526,7 @@ Container@PLAYER_WIDGETS: TooltipText: Infantry TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Infantry - HotkeyName: ProductionTypeInfantryKey + Key: ProductionTypeInfantry Children: Image@ICON: X: 6 @@ -529,7 +542,7 @@ Container@PLAYER_WIDGETS: TooltipText: Vehicles TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Vehicle - HotkeyName: ProductionTypeVehicleKey + Key: ProductionTypeVehicle Children: Image@ICON: X: 6 @@ -545,7 +558,7 @@ Container@PLAYER_WIDGETS: TooltipText: Aircraft TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Aircraft - HotkeyName: ProductionTypeAircraftKey + Key: ProductionTypeAircraft Children: Image@ICON: X: 6 @@ -561,7 +574,7 @@ Container@PLAYER_WIDGETS: TooltipText: Naval TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Ship - HotkeyName: ProductionTypeNavalKey + Key: ProductionTypeNaval Children: Image@ICON: X: 6 diff --git a/mods/ts/chrome/ingame-observer.yaml b/mods/ts/chrome/ingame-observer.yaml index 4a61bb4763..dc2bd64dd1 100644 --- a/mods/ts/chrome/ingame-observer.yaml +++ b/mods/ts/chrome/ingame-observer.yaml @@ -94,6 +94,9 @@ Container@OBSERVER_WIDGETS: Y: 10 Width: 26 Height: 26 + Key: Pause + TooltipText: Pause + TooltipContainer: TOOLTIP_CONTAINER IgnoreChildMouseOver: true Children: Image@IMAGE_PAUSE: @@ -107,6 +110,9 @@ Container@OBSERVER_WIDGETS: Y: 10 Width: 26 Height: 26 + Key: Pause + TooltipText: Play + TooltipContainer: TOOLTIP_CONTAINER IgnoreChildMouseOver: true Children: Image@IMAGE_PLAY: @@ -120,9 +126,9 @@ Container@OBSERVER_WIDGETS: Width: 36 Height: 20 BaseLine: 1 + Key: ReplaySpeedSlow TooltipText: Slow speed TooltipContainer: TOOLTIP_CONTAINER - VisualHeight: 0 Text: 50% Font: TinyBold Button@BUTTON_REGULAR: @@ -131,9 +137,9 @@ Container@OBSERVER_WIDGETS: Width: 38 Height: 20 BaseLine: 1 + Key: ReplaySpeedRegular TooltipText: Regular speed TooltipContainer: TOOLTIP_CONTAINER - VisualHeight: 0 Text: 100% Font: TinyBold Button@BUTTON_FAST: @@ -142,9 +148,9 @@ Container@OBSERVER_WIDGETS: Width: 38 Height: 20 BaseLine: 1 + Key: ReplaySpeedFast TooltipText: Fast speed TooltipContainer: TOOLTIP_CONTAINER - VisualHeight: 0 Text: 200% Font: TinyBold Button@BUTTON_MAXIMUM: @@ -153,8 +159,8 @@ Container@OBSERVER_WIDGETS: Width: 38 Height: 20 BaseLine: 1 + Key: ReplaySpeedMax TooltipText: Maximum speed TooltipContainer: TOOLTIP_CONTAINER - VisualHeight: 0 Text: MAX Font: TinyBold diff --git a/mods/ts/chrome/ingame-player.yaml b/mods/ts/chrome/ingame-player.yaml index e6018a2d97..f5413375b2 100644 --- a/mods/ts/chrome/ingame-player.yaml +++ b/mods/ts/chrome/ingame-player.yaml @@ -68,6 +68,7 @@ Container@PLAYER_WIDGETS: Width: 30 Height: 31 Background: sidebar-button + Key: Repair TooltipText: Repair TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 @@ -83,6 +84,7 @@ Container@PLAYER_WIDGETS: Width: 30 Height: 31 Background: sidebar-button + Key: Sell TooltipText: Sell TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 @@ -98,6 +100,7 @@ Container@PLAYER_WIDGETS: Width: 30 Height: 31 Background: sidebar-button + Key: PlaceBeacon TooltipText: Place Beacon TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 @@ -113,6 +116,7 @@ Container@PLAYER_WIDGETS: Width: 30 Height: 31 Background: sidebar-button + Key: PowerDown TooltipText: Power Down TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 @@ -276,7 +280,7 @@ Container@PLAYER_WIDGETS: TooltipText: Buildings TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Building - HotkeyName: ProductionTypeBuildingKey + Key: ProductionTypeBuilding Children: Image@ICON: Logic: AddFactionSuffixLogic @@ -294,7 +298,7 @@ Container@PLAYER_WIDGETS: TooltipText: Defense TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Defense - HotkeyName: ProductionTypeDefenseKey + Key: ProductionTypeDefense Children: Image@ICON: Logic: AddFactionSuffixLogic @@ -312,7 +316,7 @@ Container@PLAYER_WIDGETS: TooltipText: Infantry TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Infantry - HotkeyName: ProductionTypeInfantryKey + Key: ProductionTypeInfantry Children: Image@ICON: Logic: AddFactionSuffixLogic @@ -330,7 +334,7 @@ Container@PLAYER_WIDGETS: TooltipText: Vehicles TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Vehicle - HotkeyName: ProductionTypeVehicleKey + Key: ProductionTypeVehicle Children: Image@ICON: Logic: AddFactionSuffixLogic @@ -348,7 +352,7 @@ Container@PLAYER_WIDGETS: TooltipText: Aircraft TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Air - HotkeyName: ProductionTypeAircraftKey + Key: ProductionTypeAircraft Children: Image@ICON: Logic: AddFactionSuffixLogic