From 98f7fe0db73dc4958e9b62ac5e16e3b6b76c6dbf Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Wed, 10 Dec 2025 17:04:33 +0000 Subject: [PATCH] Remove special-case hotkey parsing. --- OpenRA.Game/HotkeyManager.cs | 27 +++++++++++-------- OpenRA.Game/ModData.cs | 2 +- OpenRA.Game/Settings.cs | 18 ------------- .../Logic/Settings/HotkeysSettingsLogic.cs | 4 +-- 4 files changed, 19 insertions(+), 32 deletions(-) diff --git a/OpenRA.Game/HotkeyManager.cs b/OpenRA.Game/HotkeyManager.cs index 825b3cbfe5..eecdf7ef47 100644 --- a/OpenRA.Game/HotkeyManager.cs +++ b/OpenRA.Game/HotkeyManager.cs @@ -17,13 +17,16 @@ namespace OpenRA { public sealed class HotkeyManager { - readonly Dictionary settings; + [YamlNode("Keys", shared: true)] + sealed class HotkeySettings : SettingsModule { } + readonly Dictionary definitions = []; readonly Dictionary keys = []; + readonly HotkeySettings hotkeySettings; - public HotkeyManager(IReadOnlyFileSystem fileSystem, Dictionary settings, Manifest manifest) + public HotkeyManager(IReadOnlyFileSystem fileSystem, ObjectCreator objectCreator, Manifest manifest) { - this.settings = settings; + hotkeySettings = Game.Settings.GetOrCreate(objectCreator, manifest.Id); var keyDefinitions = MiniYaml.Load(fileSystem, manifest.Hotkeys, null); foreach (var kd in keyDefinitions) @@ -33,11 +36,9 @@ namespace OpenRA keys[kd.Key] = definition.Default; } - foreach (var kv in settings) - { - if (definitions.TryGetValue(kv.Key, out var definition) && !definition.Readonly) - keys[kv.Key] = kv.Value; - } + foreach (var node in hotkeySettings.Yaml.Nodes) + if (definitions.TryGetValue(node.Key, out var definition) && !definition.Readonly) + keys[node.Key] = FieldLoader.GetValue(node.Key, node.Value.Value); foreach (var hd in definitions) hd.Value.HasDuplicates = GetFirstDuplicate(hd.Value, this[hd.Value.Name].GetValue()) != null; @@ -68,10 +69,9 @@ namespace OpenRA return; keys[name] = value; + hotkeySettings.Yaml.Nodes.RemoveAll(n => n.Key == name); if (value != definition.Default) - settings[name] = value; - else - settings.Remove(name); + hotkeySettings.Yaml.Nodes.Add(new MiniYamlNodeBuilder(name, FieldSaver.FormatValue(value))); var hadDuplicates = definition.HasDuplicates; definition.HasDuplicates = GetFirstDuplicate(definition, this[definition.Name].GetValue()) != null; @@ -108,5 +108,10 @@ namespace OpenRA public HotkeyReference this[string name] => new(GetHotkeyReference(name)); public IEnumerable Definitions => definitions.Values; + + public void Save() + { + hotkeySettings.Save(); + } } } diff --git a/OpenRA.Game/ModData.cs b/OpenRA.Game/ModData.cs index 03d860c615..0f44377078 100644 --- a/OpenRA.Game/ModData.cs +++ b/OpenRA.Game/ModData.cs @@ -107,7 +107,7 @@ namespace OpenRA SpriteLoaders = ObjectCreator.GetLoaders(Manifest.SpriteFormats, "sprite"); VideoLoaders = ObjectCreator.GetLoaders(Manifest.VideoFormats, "video"); SpriteSequenceLoader = ObjectCreator.GetLoader(Manifest.SpriteSequenceFormat, "sequence"); - Hotkeys = new HotkeyManager(ModFiles, Game.Settings.Keys, Manifest); + Hotkeys = new HotkeyManager(ModFiles, ObjectCreator, Manifest); Cursors = ParseCursors(Manifest, DefaultFileSystem); defaultRules = Exts.Lazy(() => Ruleset.LoadDefaults(this)); diff --git a/OpenRA.Game/Settings.cs b/OpenRA.Game/Settings.cs index 8e32c79792..1be5c888fd 100644 --- a/OpenRA.Game/Settings.cs +++ b/OpenRA.Game/Settings.cs @@ -383,7 +383,6 @@ namespace OpenRA public readonly ServerSettings Server; public readonly DebugSettings Debug; public readonly SinglePlayerGameSettings SinglePlayerSettings; - internal readonly Dictionary Keys = []; readonly Arguments args; readonly TypeDictionary modules = []; @@ -409,12 +408,6 @@ namespace OpenRA Server = GetOrCreate(null); Debug = GetOrCreate(null); SinglePlayerSettings = GetOrCreate(null); - - var keysNode = yaml.FirstOrDefault(n => n.Key == "Keys"); - if (keysNode != null) - foreach (var node in keysNode.Value.Nodes) - if (node.Key != null) - Keys[node.Key] = FieldLoader.GetValue(node.Key, node.Value.Value); } public T GetOrCreate(ObjectCreator objectCreator, string mod = null) where T : SettingsModule @@ -488,17 +481,6 @@ namespace OpenRA foreach (var m in modules) ((SettingsModule)m).Commit(); - var keysNode = yaml.FirstOrDefault(n => n.Key == "Keys"); - if (keysNode == null) - { - keysNode = new MiniYamlNodeBuilder("Keys", ""); - yaml.Add(keysNode); - } - - keysNode.Value.Nodes.Clear(); - foreach (var kv in Keys) - keysNode.Value.Nodes.Add(new MiniYamlNodeBuilder(kv.Key, FieldSaver.FormatValue(kv.Value))); - // Filter out modules with no fields and force a newline between each module var container = new[] { null, new MiniYamlNodeBuilder("", "") }; IEnumerable AddSpacer(MiniYamlNodeBuilder n) diff --git a/OpenRA.Mods.Common/Widgets/Logic/Settings/HotkeysSettingsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Settings/HotkeysSettingsLogic.cs index afdc7aeb08..eb7aaf4127 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Settings/HotkeysSettingsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Settings/HotkeysSettingsLogic.cs @@ -317,7 +317,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic WidgetUtils.TruncateButtonToTooltip(selectedHotkeyButton, hotkeyEntryWidget.Key.DisplayString()); modData.Hotkeys.Set(selectedHotkeyDefinition.Name, hotkeyEntryWidget.Key); - Game.Settings.Save(); + modData.Hotkeys.Save(); } void ResetHotkey() @@ -338,7 +338,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic if (duplicateHotkeyButton != null) WidgetUtils.TruncateButtonToTooltip(duplicateHotkeyButton, Hotkey.Invalid.DisplayString()); modData.Hotkeys.Set(duplicateHotkeyDefinition.Name, Hotkey.Invalid); - Game.Settings.Save(); + modData.Hotkeys.Save(); hotkeyEntryWidget.YieldKeyboardFocus(); }