Remove special-case hotkey parsing.
This commit is contained in:
committed by
Gustas Kažukauskas
parent
575f6624a2
commit
98f7fe0db7
@@ -17,13 +17,16 @@ namespace OpenRA
|
|||||||
{
|
{
|
||||||
public sealed class HotkeyManager
|
public sealed class HotkeyManager
|
||||||
{
|
{
|
||||||
readonly Dictionary<string, Hotkey> settings;
|
[YamlNode("Keys", shared: true)]
|
||||||
|
sealed class HotkeySettings : SettingsModule { }
|
||||||
|
|
||||||
readonly Dictionary<string, HotkeyDefinition> definitions = [];
|
readonly Dictionary<string, HotkeyDefinition> definitions = [];
|
||||||
readonly Dictionary<string, Hotkey> keys = [];
|
readonly Dictionary<string, Hotkey> keys = [];
|
||||||
|
readonly HotkeySettings hotkeySettings;
|
||||||
|
|
||||||
public HotkeyManager(IReadOnlyFileSystem fileSystem, Dictionary<string, Hotkey> settings, Manifest manifest)
|
public HotkeyManager(IReadOnlyFileSystem fileSystem, ObjectCreator objectCreator, Manifest manifest)
|
||||||
{
|
{
|
||||||
this.settings = settings;
|
hotkeySettings = Game.Settings.GetOrCreate<HotkeySettings>(objectCreator, manifest.Id);
|
||||||
|
|
||||||
var keyDefinitions = MiniYaml.Load(fileSystem, manifest.Hotkeys, null);
|
var keyDefinitions = MiniYaml.Load(fileSystem, manifest.Hotkeys, null);
|
||||||
foreach (var kd in keyDefinitions)
|
foreach (var kd in keyDefinitions)
|
||||||
@@ -33,11 +36,9 @@ namespace OpenRA
|
|||||||
keys[kd.Key] = definition.Default;
|
keys[kd.Key] = definition.Default;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var kv in settings)
|
foreach (var node in hotkeySettings.Yaml.Nodes)
|
||||||
{
|
if (definitions.TryGetValue(node.Key, out var definition) && !definition.Readonly)
|
||||||
if (definitions.TryGetValue(kv.Key, out var definition) && !definition.Readonly)
|
keys[node.Key] = FieldLoader.GetValue<Hotkey>(node.Key, node.Value.Value);
|
||||||
keys[kv.Key] = kv.Value;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var hd in definitions)
|
foreach (var hd in definitions)
|
||||||
hd.Value.HasDuplicates = GetFirstDuplicate(hd.Value, this[hd.Value.Name].GetValue()) != null;
|
hd.Value.HasDuplicates = GetFirstDuplicate(hd.Value, this[hd.Value.Name].GetValue()) != null;
|
||||||
@@ -68,10 +69,9 @@ namespace OpenRA
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
keys[name] = value;
|
keys[name] = value;
|
||||||
|
hotkeySettings.Yaml.Nodes.RemoveAll(n => n.Key == name);
|
||||||
if (value != definition.Default)
|
if (value != definition.Default)
|
||||||
settings[name] = value;
|
hotkeySettings.Yaml.Nodes.Add(new MiniYamlNodeBuilder(name, FieldSaver.FormatValue(value)));
|
||||||
else
|
|
||||||
settings.Remove(name);
|
|
||||||
|
|
||||||
var hadDuplicates = definition.HasDuplicates;
|
var hadDuplicates = definition.HasDuplicates;
|
||||||
definition.HasDuplicates = GetFirstDuplicate(definition, this[definition.Name].GetValue()) != null;
|
definition.HasDuplicates = GetFirstDuplicate(definition, this[definition.Name].GetValue()) != null;
|
||||||
@@ -108,5 +108,10 @@ namespace OpenRA
|
|||||||
public HotkeyReference this[string name] => new(GetHotkeyReference(name));
|
public HotkeyReference this[string name] => new(GetHotkeyReference(name));
|
||||||
|
|
||||||
public IEnumerable<HotkeyDefinition> Definitions => definitions.Values;
|
public IEnumerable<HotkeyDefinition> Definitions => definitions.Values;
|
||||||
|
|
||||||
|
public void Save()
|
||||||
|
{
|
||||||
|
hotkeySettings.Save();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ namespace OpenRA
|
|||||||
SpriteLoaders = ObjectCreator.GetLoaders<ISpriteLoader>(Manifest.SpriteFormats, "sprite");
|
SpriteLoaders = ObjectCreator.GetLoaders<ISpriteLoader>(Manifest.SpriteFormats, "sprite");
|
||||||
VideoLoaders = ObjectCreator.GetLoaders<IVideoLoader>(Manifest.VideoFormats, "video");
|
VideoLoaders = ObjectCreator.GetLoaders<IVideoLoader>(Manifest.VideoFormats, "video");
|
||||||
SpriteSequenceLoader = ObjectCreator.GetLoader<ISpriteSequenceLoader>(Manifest.SpriteSequenceFormat, "sequence");
|
SpriteSequenceLoader = ObjectCreator.GetLoader<ISpriteSequenceLoader>(Manifest.SpriteSequenceFormat, "sequence");
|
||||||
Hotkeys = new HotkeyManager(ModFiles, Game.Settings.Keys, Manifest);
|
Hotkeys = new HotkeyManager(ModFiles, ObjectCreator, Manifest);
|
||||||
Cursors = ParseCursors(Manifest, DefaultFileSystem);
|
Cursors = ParseCursors(Manifest, DefaultFileSystem);
|
||||||
|
|
||||||
defaultRules = Exts.Lazy(() => Ruleset.LoadDefaults(this));
|
defaultRules = Exts.Lazy(() => Ruleset.LoadDefaults(this));
|
||||||
|
|||||||
@@ -383,7 +383,6 @@ namespace OpenRA
|
|||||||
public readonly ServerSettings Server;
|
public readonly ServerSettings Server;
|
||||||
public readonly DebugSettings Debug;
|
public readonly DebugSettings Debug;
|
||||||
public readonly SinglePlayerGameSettings SinglePlayerSettings;
|
public readonly SinglePlayerGameSettings SinglePlayerSettings;
|
||||||
internal readonly Dictionary<string, Hotkey> Keys = [];
|
|
||||||
|
|
||||||
readonly Arguments args;
|
readonly Arguments args;
|
||||||
readonly TypeDictionary modules = [];
|
readonly TypeDictionary modules = [];
|
||||||
@@ -409,12 +408,6 @@ namespace OpenRA
|
|||||||
Server = GetOrCreate<ServerSettings>(null);
|
Server = GetOrCreate<ServerSettings>(null);
|
||||||
Debug = GetOrCreate<DebugSettings>(null);
|
Debug = GetOrCreate<DebugSettings>(null);
|
||||||
SinglePlayerSettings = GetOrCreate<SinglePlayerGameSettings>(null);
|
SinglePlayerSettings = GetOrCreate<SinglePlayerGameSettings>(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<Hotkey>(node.Key, node.Value.Value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public T GetOrCreate<T>(ObjectCreator objectCreator, string mod = null) where T : SettingsModule
|
public T GetOrCreate<T>(ObjectCreator objectCreator, string mod = null) where T : SettingsModule
|
||||||
@@ -488,17 +481,6 @@ namespace OpenRA
|
|||||||
foreach (var m in modules)
|
foreach (var m in modules)
|
||||||
((SettingsModule)m).Commit();
|
((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
|
// Filter out modules with no fields and force a newline between each module
|
||||||
var container = new[] { null, new MiniYamlNodeBuilder("", "") };
|
var container = new[] { null, new MiniYamlNodeBuilder("", "") };
|
||||||
IEnumerable<MiniYamlNodeBuilder> AddSpacer(MiniYamlNodeBuilder n)
|
IEnumerable<MiniYamlNodeBuilder> AddSpacer(MiniYamlNodeBuilder n)
|
||||||
|
|||||||
@@ -317,7 +317,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
|
|
||||||
WidgetUtils.TruncateButtonToTooltip(selectedHotkeyButton, hotkeyEntryWidget.Key.DisplayString());
|
WidgetUtils.TruncateButtonToTooltip(selectedHotkeyButton, hotkeyEntryWidget.Key.DisplayString());
|
||||||
modData.Hotkeys.Set(selectedHotkeyDefinition.Name, hotkeyEntryWidget.Key);
|
modData.Hotkeys.Set(selectedHotkeyDefinition.Name, hotkeyEntryWidget.Key);
|
||||||
Game.Settings.Save();
|
modData.Hotkeys.Save();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResetHotkey()
|
void ResetHotkey()
|
||||||
@@ -338,7 +338,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
if (duplicateHotkeyButton != null)
|
if (duplicateHotkeyButton != null)
|
||||||
WidgetUtils.TruncateButtonToTooltip(duplicateHotkeyButton, Hotkey.Invalid.DisplayString());
|
WidgetUtils.TruncateButtonToTooltip(duplicateHotkeyButton, Hotkey.Invalid.DisplayString());
|
||||||
modData.Hotkeys.Set(duplicateHotkeyDefinition.Name, Hotkey.Invalid);
|
modData.Hotkeys.Set(duplicateHotkeyDefinition.Name, Hotkey.Invalid);
|
||||||
Game.Settings.Save();
|
modData.Hotkeys.Save();
|
||||||
hotkeyEntryWidget.YieldKeyboardFocus();
|
hotkeyEntryWidget.YieldKeyboardFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user