diff --git a/OpenRA.Game/HotkeyDefinition.cs b/OpenRA.Game/HotkeyDefinition.cs index 7c95ee2160..598a6b2b75 100644 --- a/OpenRA.Game/HotkeyDefinition.cs +++ b/OpenRA.Game/HotkeyDefinition.cs @@ -21,6 +21,7 @@ namespace OpenRA public readonly string Description = ""; public readonly HashSet Types = new HashSet(); public readonly HashSet Contexts = new HashSet(); + public readonly bool Readonly = false; public bool HasDuplicates { get; internal set; } public HotkeyDefinition(string name, MiniYaml node) @@ -49,6 +50,10 @@ namespace OpenRA if (platformOverride != null) Default = FieldLoader.GetValue("value", platformOverride.Value.Value); } + + var readonlyNode = node.Nodes.FirstOrDefault(n => n.Key == "Readonly"); + if (readonlyNode != null) + Readonly = FieldLoader.GetValue("Readonly", readonlyNode.Value.Value); } } } diff --git a/OpenRA.Game/HotkeyManager.cs b/OpenRA.Game/HotkeyManager.cs index 9ddd5f4b2c..63a42479a2 100644 --- a/OpenRA.Game/HotkeyManager.cs +++ b/OpenRA.Game/HotkeyManager.cs @@ -35,7 +35,7 @@ namespace OpenRA foreach (var kv in settings) { - if (definitions.ContainsKey(kv.Key)) + if (definitions.ContainsKey(kv.Key) && !definitions[kv.Key].Readonly) keys[kv.Key] = kv.Value; } @@ -61,6 +61,9 @@ namespace OpenRA if (!definitions.TryGetValue(name, out var definition)) return; + if (definition.Readonly) + return; + keys[name] = value; if (value != definition.Default) settings[name] = value; diff --git a/OpenRA.Mods.Common/Widgets/Logic/Settings/HotkeysSettingsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Settings/HotkeysSettingsLogic.cs index 9d964c14d5..01ce2e86fd 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Settings/HotkeysSettingsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Settings/HotkeysSettingsLogic.cs @@ -86,7 +86,11 @@ namespace OpenRA.Mods.Common.Widgets.Logic selectedHotkeyButton = remapButton; hotkeyEntryWidget.Key = modData.Hotkeys[hd.Name].GetValue(); ValidateHotkey(); - hotkeyEntryWidget.TakeKeyboardFocus(); + + if (hd.Readonly) + hotkeyEntryWidget.YieldKeyboardFocus(); + else + hotkeyEntryWidget.TakeKeyboardFocus(); }; hotkeyList.AddChild(key); @@ -228,17 +232,21 @@ namespace OpenRA.Mods.Common.Widgets.Logic var originalNoticeText = new CachedTransform(hd => originalNotice.Text.F(hd?.Default.DisplayString())); originalNotice.GetText = () => originalNoticeText.Update(selectedHotkeyDefinition); + var readonlyNotice = panel.Get("READONLY_NOTICE"); + readonlyNotice.TextColor = ChromeMetrics.Get("NoticeInfoColor"); + readonlyNotice.IsVisible = () => selectedHotkeyDefinition.Readonly; + var resetButton = panel.Get("RESET_HOTKEY_BUTTON"); - resetButton.IsDisabled = () => isHotkeyDefault; + resetButton.IsDisabled = () => isHotkeyDefault || selectedHotkeyDefinition.Readonly; resetButton.OnClick = ResetHotkey; var clearButton = panel.Get("CLEAR_HOTKEY_BUTTON"); - clearButton.IsDisabled = () => !hotkeyEntryWidget.Key.IsValid(); + clearButton.IsDisabled = () => selectedHotkeyDefinition.Readonly || !hotkeyEntryWidget.Key.IsValid(); clearButton.OnClick = ClearHotkey; var overrideButton = panel.Get("OVERRIDE_HOTKEY_BUTTON"); overrideButton.IsDisabled = () => isHotkeyValid; - overrideButton.IsVisible = () => !isHotkeyValid; + overrideButton.IsVisible = () => !isHotkeyValid && !duplicateHotkeyDefinition.Readonly; overrideButton.OnClick = OverrideHotkey; hotkeyEntryWidget = panel.Get("HOTKEY_ENTRY"); @@ -248,6 +256,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic { hotkeyEntryWidget.Key = modData.Hotkeys[selectedHotkeyDefinition.Name].GetValue(); }; + hotkeyEntryWidget.IsDisabled = () => selectedHotkeyDefinition.Readonly; validHotkeyEntryWidth = hotkeyEntryWidget.Bounds.Width; invalidHotkeyEntryWidth = validHotkeyEntryWidth - (clearButton.Bounds.X - overrideButton.Bounds.X); @@ -259,7 +268,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic return; duplicateHotkeyDefinition = modData.Hotkeys.GetFirstDuplicate(selectedHotkeyDefinition, hotkeyEntryWidget.Key); - isHotkeyValid = duplicateHotkeyDefinition == null; + isHotkeyValid = duplicateHotkeyDefinition == null || selectedHotkeyDefinition.Readonly; isHotkeyDefault = hotkeyEntryWidget.Key == selectedHotkeyDefinition.Default || (!hotkeyEntryWidget.Key.IsValid() && !selectedHotkeyDefinition.Default.IsValid()); if (isHotkeyValid) @@ -269,13 +278,16 @@ namespace OpenRA.Mods.Common.Widgets.Logic } else { - hotkeyEntryWidget.Bounds.Width = invalidHotkeyEntryWidth; + hotkeyEntryWidget.Bounds.Width = duplicateHotkeyDefinition.Readonly ? validHotkeyEntryWidth : invalidHotkeyEntryWidth; hotkeyEntryWidget.TakeKeyboardFocus(); } } void SaveHotkey() { + if (selectedHotkeyDefinition.Readonly) + return; + WidgetUtils.TruncateButtonToTooltip(selectedHotkeyButton, hotkeyEntryWidget.Key.DisplayString()); modData.Hotkeys.Set(selectedHotkeyDefinition.Name, hotkeyEntryWidget.Key); Game.Settings.Save(); diff --git a/mods/cnc/chrome/ingame-chat.yaml b/mods/cnc/chrome/ingame-chat.yaml index 6153af88c5..bc0b3293bd 100644 --- a/mods/cnc/chrome/ingame-chat.yaml +++ b/mods/cnc/chrome/ingame-chat.yaml @@ -32,7 +32,7 @@ Container@CHAT_PANEL: Height: 25 Text: Team Font: Bold - Key: Tab SHIFT + Key: ToggleChatMode TooltipText: Toggle chat mode TooltipTemplate: BUTTON_TOOLTIP_FACTIONSUFFIX TooltipContainer: TOOLTIP_CONTAINER diff --git a/mods/cnc/chrome/ingame-infochat.yaml b/mods/cnc/chrome/ingame-infochat.yaml index a32467e740..64be9d5f4c 100644 --- a/mods/cnc/chrome/ingame-infochat.yaml +++ b/mods/cnc/chrome/ingame-infochat.yaml @@ -19,7 +19,7 @@ Container@CHAT_CONTAINER: Height: 25 Text: Team Font: Bold - Key: Tab SHIFT + Key: ToggleChatMode TooltipText: Toggle chat mode TooltipContainer: TOOLTIP_CONTAINER TextField@CHAT_TEXTFIELD: diff --git a/mods/cnc/chrome/lobby.yaml b/mods/cnc/chrome/lobby.yaml index 573a13e66d..3f0d13e77b 100644 --- a/mods/cnc/chrome/lobby.yaml +++ b/mods/cnc/chrome/lobby.yaml @@ -110,7 +110,7 @@ Container@SERVER_LOBBY: Height: 25 Text: Team Font: Bold - Key: Tab SHIFT + Key: ToggleChatMode TooltipText: Toggle chat mode TooltipContainer: TOOLTIP_CONTAINER TextField@CHAT_TEXTFIELD: diff --git a/mods/cnc/chrome/settings-hotkeys.yaml b/mods/cnc/chrome/settings-hotkeys.yaml index 3fc2c783ed..1b1f153eb4 100644 --- a/mods/cnc/chrome/settings-hotkeys.yaml +++ b/mods/cnc/chrome/settings-hotkeys.yaml @@ -131,6 +131,11 @@ Container@HOTKEYS_PANEL: Height: PARENT_BOTTOM Font: Tiny Text: This is already used for "{0}" in the {1} context + Label@READONLY_NOTICE: + Width: PARENT_RIGHT + Height: PARENT_BOTTOM + Font: Tiny + Text: This hotkey cannot be modified Button@OVERRIDE_HOTKEY_BUTTON: X: PARENT_RIGHT - 3 * WIDTH - 30 Y: 20 diff --git a/mods/common/chrome/ingame-chat.yaml b/mods/common/chrome/ingame-chat.yaml index dceb441d02..0d2a819c4e 100644 --- a/mods/common/chrome/ingame-chat.yaml +++ b/mods/common/chrome/ingame-chat.yaml @@ -31,7 +31,7 @@ Container@CHAT_PANEL: Height: 25 Text: Team Font: Bold - Key: Tab SHIFT + Key: ToggleChatMode TooltipText: Toggle chat mode TooltipContainer: TOOLTIP_CONTAINER TextField@CHAT_TEXTFIELD: diff --git a/mods/common/chrome/ingame-infochat.yaml b/mods/common/chrome/ingame-infochat.yaml index 6b7313bd9c..6d681bfa9c 100644 --- a/mods/common/chrome/ingame-infochat.yaml +++ b/mods/common/chrome/ingame-infochat.yaml @@ -19,7 +19,7 @@ Container@CHAT_CONTAINER: Height: 25 Text: Team Font: Bold - Key: Tab SHIFT + Key: ToggleChatMode TooltipText: Toggle chat mode TooltipContainer: TOOLTIP_CONTAINER TextField@CHAT_TEXTFIELD: diff --git a/mods/common/chrome/lobby.yaml b/mods/common/chrome/lobby.yaml index 0535cb1d58..cb5f89b507 100644 --- a/mods/common/chrome/lobby.yaml +++ b/mods/common/chrome/lobby.yaml @@ -114,7 +114,7 @@ Background@SERVER_LOBBY: Height: 25 Text: Team Font: Bold - Key: Tab SHIFT + Key: ToggleChatMode TooltipText: Toggle chat mode TooltipContainer: TOOLTIP_CONTAINER TextField@CHAT_TEXTFIELD: diff --git a/mods/common/chrome/settings-hotkeys.yaml b/mods/common/chrome/settings-hotkeys.yaml index 8cc27338c4..9fac07e92f 100644 --- a/mods/common/chrome/settings-hotkeys.yaml +++ b/mods/common/chrome/settings-hotkeys.yaml @@ -131,6 +131,11 @@ Container@HOTKEYS_PANEL: Height: PARENT_BOTTOM Font: Tiny Text: This is already used for "{0}" in the {1} context + Label@READONLY_NOTICE: + Width: PARENT_RIGHT + Height: PARENT_BOTTOM + Font: Tiny + Text: This hotkey cannot be modified Button@OVERRIDE_HOTKEY_BUTTON: X: PARENT_RIGHT - 3 * WIDTH - 30 Y: 20 diff --git a/mods/common/hotkeys/chat.yaml b/mods/common/hotkeys/chat.yaml index 9eac1b60ac..c02d3c34a2 100644 --- a/mods/common/hotkeys/chat.yaml +++ b/mods/common/hotkeys/chat.yaml @@ -7,3 +7,15 @@ OpenGeneralChat: Return Shift Description: Open General Chat Types: Chat Contexts: Player, Spectator + +ToggleChatMode: Tab Shift + Description: Toggle Chat Mode + Types: Chat + Contexts: Chat Input, Menu + Readonly: True + +Autocomplete: Tab + Description: Autocomplete + Types: Chat + Contexts: Chat Input + Readonly: True diff --git a/mods/ts/chrome/settings-hotkeys.yaml b/mods/ts/chrome/settings-hotkeys.yaml index 48911c1b13..49a94d5f38 100644 --- a/mods/ts/chrome/settings-hotkeys.yaml +++ b/mods/ts/chrome/settings-hotkeys.yaml @@ -133,6 +133,11 @@ Container@HOTKEYS_PANEL: Height: PARENT_BOTTOM Font: Tiny Text: This is already used for "{0}" in the {1} context + Label@READONLY_NOTICE: + Width: PARENT_RIGHT + Height: PARENT_BOTTOM + Font: Tiny + Text: This hotkey cannot be modified Button@OVERRIDE_HOTKEY_BUTTON: X: PARENT_RIGHT - 3 * WIDTH - 30 Y: 20