Resolve TODO re: frontend hotkey config

breaks config backcompat
This commit is contained in:
YoshiRulz 2022-05-18 23:38:49 +10:00
parent 335be13fd8
commit ca71bb2faf
No known key found for this signature in database
GPG Key ID: C4DE31C245353FB7
9 changed files with 295 additions and 379 deletions

View File

@ -1,272 +1,209 @@
using System.Collections; using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq; using System.Linq;
// TODO [LARP] - It's pointless and annoying to store such a big structure filled with static information using BizHawk.Common;
// use this instead using BizHawk.Common.CollectionExtensions;
// public class UserBinding
// {
// public string DisplayName;
// public string Bindings;
// }
// ...also. We should consider using something other than DisplayName for keying, maybe make a KEYNAME distinct from displayname.
// displayname is OK for now though.
namespace BizHawk.Client.Common namespace BizHawk.Client.Common
{ {
public class Binding public class HotkeyInfo
{ {
public string DisplayName { get; set; } public static readonly IReadOnlyDictionary<string, HotkeyInfo> AllHotkeys;
public string Bindings { get; set; }
public string DefaultBinding { get; set; }
public string TabGroup { get; set; }
public string ToolTip { get; set; }
public int Ordinal { get; set; }
}
[Newtonsoft.Json.JsonObject] public static readonly IReadOnlyList<string> Groupings;
public class BindingCollection : IEnumerable<Binding>
{
public List<Binding> Bindings { get; }
[Newtonsoft.Json.JsonConstructor] static HotkeyInfo()
public BindingCollection(List<Binding> bindings)
{ {
Bindings = bindings; var dict = new Dictionary<string, HotkeyInfo>();
var i = 0;
#if true
void Bind(string tabGroup, string displayName, string defaultBinding = "", string toolTip = "")
=> dict.Add(displayName, new(tabGroup: tabGroup, i++, displayName: displayName, toolTip: toolTip, defaultBinding: defaultBinding));
#else //TODO switch to a sort key more resilient than the DisplayName, like with this example (need to update `Config.HotkeyBindings["A Hotkey"]` usages across codebase; please switch it to a `Config.GetHotkeyBindings` method so it can return "<not bound>")
void Bind(string tabGroup, string displayName, string defaultBinding = "", string toolTip = "")
=> dict.Add($"{tabGroup}__{displayName}".Replace(" ", ""), new(tabGroup: tabGroup, i++, displayName: displayName, toolTip: toolTip, defaultBinding: defaultBinding));
#endif
Bind("General", "Frame Advance", "F");
Bind("General", "Rewind", "Shift+R");
Bind("General", "Pause", "Pause");
Bind("General", "Fast Forward", "Tab");
Bind("General", "Turbo", "Shift+Tab");
Bind("General", "Toggle Throttle");
Bind("General", "Soft Reset");
Bind("General", "Hard Reset");
Bind("General", "Autofire");
Bind("General", "Autohold");
Bind("General", "Clear Autohold");
Bind("General", "Screenshot", "F12");
Bind("General", "Full Screen", "Alt+Enter");
Bind("General", "Open ROM", "Ctrl+O");
Bind("General", "Close ROM", "Ctrl+W");
Bind("General", "Load Last ROM");
Bind("General", "Flush SaveRAM", "Ctrl+S");
Bind("General", "Display FPS");
Bind("General", "Frame Counter");
Bind("General", "Lag Counter");
Bind("General", "Input Display");
Bind("General", "Toggle BG Input");
Bind("General", "Toggle Menu");
Bind("General", "Volume Up");
Bind("General", "Volume Down");
Bind("General", "Record A/V");
Bind("General", "Stop A/V");
Bind("General", "Larger Window", "Alt+Up");
Bind("General", "Smaller Window", "Alt+Down");
Bind("General", "Increase Speed", "Equals");
Bind("General", "Decrease Speed", "Minus");
Bind("General", "Reset Speed", "Shift+Equals");
Bind("General", "Reboot Core", "Ctrl+R");
Bind("General", "Toggle Sound");
Bind("General", "Exit Program");
Bind("General", "Screen Raw to Clipboard", "Ctrl+C");
Bind("General", "Screen Client to Clipboard", "Ctrl+Shift+C");
Bind("General", "Toggle Skip Lag Frame");
Bind("General", "Toggle Key Priority");
Bind("General", "Frame Inch");
Bind("Save States", "Save State 1", "Shift+F1");
Bind("Save States", "Save State 2", "Shift+F2");
Bind("Save States", "Save State 3", "Shift+F3");
Bind("Save States", "Save State 4", "Shift+F4");
Bind("Save States", "Save State 5", "Shift+F5");
Bind("Save States", "Save State 6", "Shift+F6");
Bind("Save States", "Save State 7", "Shift+F7");
Bind("Save States", "Save State 8", "Shift+F8");
Bind("Save States", "Save State 9", "Shift+F9");
Bind("Save States", "Save State 0", "Shift+F10");
Bind("Save States", "Load State 1", "F1");
Bind("Save States", "Load State 2", "F2");
Bind("Save States", "Load State 3", "F3");
Bind("Save States", "Load State 4", "F4");
Bind("Save States", "Load State 5", "F5");
Bind("Save States", "Load State 6", "F6");
Bind("Save States", "Load State 7", "F7");
Bind("Save States", "Load State 8", "F8");
Bind("Save States", "Load State 9", "F9");
Bind("Save States", "Load State 0", "F10");
Bind("Save States", "Select State 1", "Number1");
Bind("Save States", "Select State 2", "Number2");
Bind("Save States", "Select State 3", "Number3");
Bind("Save States", "Select State 4", "Number4");
Bind("Save States", "Select State 5", "Number5");
Bind("Save States", "Select State 6", "Number6");
Bind("Save States", "Select State 7", "Number7");
Bind("Save States", "Select State 8", "Number8");
Bind("Save States", "Select State 9", "Number9");
Bind("Save States", "Select State 0", "Number0");
Bind("Save States", "Quick Load", "P");
Bind("Save States", "Quick Save", "I");
Bind("Save States", "Save Named State");
Bind("Save States", "Load Named State");
Bind("Save States", "Previous Slot");
Bind("Save States", "Next Slot");
Bind("Movie", "Toggle read-only", "Q");
Bind("Movie", "Play Movie");
Bind("Movie", "Record Movie");
Bind("Movie", "Stop Movie");
Bind("Movie", "Play from beginning");
Bind("Movie", "Save Movie");
Bind("Tools", "RAM Watch");
Bind("Tools", "RAM Search");
Bind("Tools", "Hex Editor");
Bind("Tools", "Trace Logger");
Bind("Tools", "Lua Console");
Bind("Tools", "Cheats");
Bind("Tools", "TAStudio");
Bind("Tools", "ToolBox", "Shift+T");
Bind("Tools", "Virtual Pad");
Bind("RAM Search", "New Search");
Bind("RAM Search", "Do Search");
Bind("RAM Search", "Previous Compare To");
Bind("RAM Search", "Next Compare To");
Bind("RAM Search", "Previous Operator");
Bind("RAM Search", "Next Operator");
Bind("TAStudio", "Add Branch", "Alt+Insert");
Bind("TAStudio", "Delete Branch", "Alt+Delete");
Bind("TAStudio", "Show Cursor");
Bind("TAStudio", "Toggle Follow Cursor", "Shift+F");
Bind("TAStudio", "Toggle Auto-Restore", "Shift+R");
Bind("TAStudio", "Toggle Turbo Seek", "Shift+S");
Bind("TAStudio", "Undo", "Ctrl+Z"); // TODO: these are getting not unique enough
Bind("TAStudio", "Redo", "Ctrl+Y");
Bind("TAStudio", "Sel. bet. Markers", "Ctrl+A");
Bind("TAStudio", "Select All", "Ctrl+Shift+A");
Bind("TAStudio", "Reselect Clip.", "Ctrl+B");
Bind("TAStudio", "Clear Frames", "Delete");
Bind("TAStudio", "Insert Frame", "Insert");
Bind("TAStudio", "Insert # Frames", "Ctrl+Shift+Insert");
Bind("TAStudio", "Delete Frames", "Ctrl+Delete");
Bind("TAStudio", "Clone Frames", "Ctrl+Insert");
Bind("TAStudio", "Analog Increment", "Up");
Bind("TAStudio", "Analog Decrement", "Down");
Bind("TAStudio", "Analog Incr. by 10", "Shift+Up");
Bind("TAStudio", "Analog Decr. by 10", "Shift+Down");
Bind("TAStudio", "Analog Maximum", "Right");
Bind("TAStudio", "Analog Minimum", "Left");
Bind("SNES", "Toggle BG 1");
Bind("SNES", "Toggle BG 2");
Bind("SNES", "Toggle BG 3");
Bind("SNES", "Toggle BG 4");
Bind("SNES", "Toggle OBJ 1");
Bind("SNES", "Toggle OBJ 2");
Bind("SNES", "Toggle OBJ 3");
Bind("SNES", "Toggle OBJ 4");
Bind("GB", "GB Toggle BG");
Bind("GB", "GB Toggle Obj");
Bind("GB", "GB Toggle Window");
Bind("Analog", "Y Up Small", toolTip: "For Virtual Pad");
Bind("Analog", "Y Up Large", toolTip: "For Virtual Pad");
Bind("Analog", "Y Down Small", toolTip: "For Virtual Pad");
Bind("Analog", "Y Down Large", toolTip: "For Virtual Pad");
Bind("Analog", "X Up Small", toolTip: "For Virtual Pad");
Bind("Analog", "X Up Large", toolTip: "For Virtual Pad");
Bind("Analog", "X Down Small", toolTip: "For Virtual Pad");
Bind("Analog", "X Down Large", toolTip: "For Virtual Pad");
Bind("Tools", "Toggle All Cheats");
Bind("NDS", "Next Screen Layout");
Bind("NDS", "Previous Screen Layout");
Bind("NDS", "Screen Rotate");
AllHotkeys = dict;
Groupings = dict.Values.Select(static info => info.TabGroup).Distinct().ToList();
} }
public BindingCollection() public static void ResolveWithDefaults(IDictionary<string, string> dict)
{ {
Bindings = new List<Binding>(); foreach (var (k, v) in AllHotkeys) if (!dict.ContainsKey(k)) dict[k] = v.DefaultBinding; // add missing
Bindings.AddRange(DefaultValues); dict.RemoveAll(static kvp => !AllHotkeys.ContainsKey(kvp.Key)); // remove extraneous
} }
public void Add(Binding b) public readonly string DefaultBinding;
public readonly string DisplayName;
public readonly int Ordinal;
public readonly string TabGroup;
public readonly string ToolTip;
private HotkeyInfo(string tabGroup, int ordinal, string displayName, string toolTip, string defaultBinding)
{ {
Bindings.Add(b); DefaultBinding = defaultBinding;
} DisplayName = displayName;
Ordinal = ordinal;
public IEnumerator<Binding> GetEnumerator() TabGroup = tabGroup;
{ ToolTip = toolTip;
return Bindings.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public Binding this[string index] => Bindings.FirstOrDefault(b => b.DisplayName == index) ?? new Binding();
private static Binding Bind(string tabGroup, string displayName, string bindings = "", string defaultBinding = "", string toolTip = "")
{
if (string.IsNullOrEmpty(defaultBinding))
{
defaultBinding = bindings;
}
return new Binding { DisplayName = displayName, Bindings = bindings, TabGroup = tabGroup, DefaultBinding = defaultBinding, ToolTip = toolTip };
}
public void ResolveWithDefaults()
{
// TODO - this method is potentially disastrously O(N^2) slow due to linear search nested in loop
// Add missing entries
foreach (Binding defaultBinding in DefaultValues)
{
var binding = Bindings.FirstOrDefault(b => b.DisplayName == defaultBinding.DisplayName);
if (binding == null)
{
Bindings.Add(defaultBinding);
}
else
{
// patch entries with updated settings (necessary because of TODO LARP
binding.DisplayName = defaultBinding.DisplayName;
binding.DefaultBinding = defaultBinding.DefaultBinding;
binding.TabGroup = defaultBinding.TabGroup;
binding.ToolTip = defaultBinding.ToolTip;
binding.Ordinal = defaultBinding.Ordinal;
}
}
// Remove entries that no longer exist in defaults
Bindings.RemoveAll(entry => DefaultValues.All(b => b.DisplayName != entry.DisplayName));
}
private static List<Binding> _defaultValues;
public static List<Binding> DefaultValues
{
get
{
if (_defaultValues == null)
{
_defaultValues = new List<Binding>
{
Bind("General", "Frame Advance", "F"),
Bind("General", "Rewind", "Shift+R"),
Bind("General", "Pause", "Pause"),
Bind("General", "Fast Forward", "Tab"),
Bind("General", "Turbo", "Shift+Tab"),
Bind("General", "Toggle Throttle"),
Bind("General", "Soft Reset"),
Bind("General", "Hard Reset"),
Bind("General", "Autofire"),
Bind("General", "Autohold"),
Bind("General", "Clear Autohold"),
Bind("General", "Screenshot", "F12"),
Bind("General", "Full Screen", "Alt+Enter"),
Bind("General", "Open ROM", "Ctrl+O"),
Bind("General", "Close ROM", "Ctrl+W"),
Bind("General", "Load Last ROM"),
Bind("General", "Flush SaveRAM", "Ctrl+S"),
Bind("General", "Display FPS"),
Bind("General", "Frame Counter"),
Bind("General", "Lag Counter"),
Bind("General", "Input Display"),
Bind("General", "Toggle BG Input"),
Bind("General", "Toggle Menu"),
Bind("General", "Volume Up"),
Bind("General", "Volume Down"),
Bind("General", "Record A/V"),
Bind("General", "Stop A/V"),
Bind("General", "Larger Window", "Alt+Up"),
Bind("General", "Smaller Window", "Alt+Down"),
Bind("General", "Increase Speed", "Equals"),
Bind("General", "Decrease Speed", "Minus"),
Bind("General", "Reset Speed", "Shift+Equals"),
Bind("General", "Reboot Core", "Ctrl+R"),
Bind("General", "Toggle Sound"),
Bind("General", "Exit Program"),
Bind("General", "Screen Raw to Clipboard", "Ctrl+C"),
Bind("General", "Screen Client to Clipboard", "Ctrl+Shift+C"),
Bind("General", "Toggle Skip Lag Frame"),
Bind("General", "Toggle Key Priority"),
Bind("General", "Frame Inch"),
Bind("Save States", "Save State 1", "Shift+F1"),
Bind("Save States", "Save State 2", "Shift+F2"),
Bind("Save States", "Save State 3", "Shift+F3"),
Bind("Save States", "Save State 4", "Shift+F4"),
Bind("Save States", "Save State 5", "Shift+F5"),
Bind("Save States", "Save State 6", "Shift+F6"),
Bind("Save States", "Save State 7", "Shift+F7"),
Bind("Save States", "Save State 8", "Shift+F8"),
Bind("Save States", "Save State 9", "Shift+F9"),
Bind("Save States", "Save State 0", "Shift+F10"),
Bind("Save States", "Load State 1", "F1"),
Bind("Save States", "Load State 2", "F2"),
Bind("Save States", "Load State 3", "F3"),
Bind("Save States", "Load State 4", "F4"),
Bind("Save States", "Load State 5", "F5"),
Bind("Save States", "Load State 6", "F6"),
Bind("Save States", "Load State 7", "F7"),
Bind("Save States", "Load State 8", "F8"),
Bind("Save States", "Load State 9", "F9"),
Bind("Save States", "Load State 0", "F10"),
Bind("Save States", "Select State 1", "Number1"),
Bind("Save States", "Select State 2", "Number2"),
Bind("Save States", "Select State 3", "Number3"),
Bind("Save States", "Select State 4", "Number4"),
Bind("Save States", "Select State 5", "Number5"),
Bind("Save States", "Select State 6", "Number6"),
Bind("Save States", "Select State 7", "Number7"),
Bind("Save States", "Select State 8", "Number8"),
Bind("Save States", "Select State 9", "Number9"),
Bind("Save States", "Select State 0", "Number0"),
Bind("Save States", "Quick Load", "P"),
Bind("Save States", "Quick Save", "I"),
Bind("Save States", "Save Named State"),
Bind("Save States", "Load Named State"),
Bind("Save States", "Previous Slot"),
Bind("Save States", "Next Slot"),
Bind("Movie", "Toggle read-only", "Q"),
Bind("Movie", "Play Movie"),
Bind("Movie", "Record Movie"),
Bind("Movie", "Stop Movie"),
Bind("Movie", "Play from beginning"),
Bind("Movie", "Save Movie"),
Bind("Tools", "RAM Watch"),
Bind("Tools", "RAM Search"),
Bind("Tools", "Hex Editor"),
Bind("Tools", "Trace Logger"),
Bind("Tools", "Lua Console"),
Bind("Tools", "Cheats"),
Bind("Tools", "TAStudio"),
Bind("Tools", "ToolBox", "Shift+T"),
Bind("Tools", "Virtual Pad"),
Bind("RAM Search", "New Search"),
Bind("RAM Search", "Do Search"),
Bind("RAM Search", "Previous Compare To"),
Bind("RAM Search", "Next Compare To"),
Bind("RAM Search", "Previous Operator"),
Bind("RAM Search", "Next Operator"),
Bind("TAStudio", "Add Branch", "Alt+Insert"),
Bind("TAStudio", "Delete Branch", "Alt+Delete"),
Bind("TAStudio", "Show Cursor"),
Bind("TAStudio", "Toggle Follow Cursor", "Shift+F"),
Bind("TAStudio", "Toggle Auto-Restore", "Shift+R"),
Bind("TAStudio", "Toggle Turbo Seek", "Shift+S"),
Bind("TAStudio", "Undo", "Ctrl+Z"), // TODO: these are getting not unique enough
Bind("TAStudio", "Redo", "Ctrl+Y"),
Bind("TAStudio", "Sel. bet. Markers", "Ctrl+A"),
Bind("TAStudio", "Select All", "Ctrl+Shift+A"),
Bind("TAStudio", "Reselect Clip.", "Ctrl+B"),
Bind("TAStudio", "Clear Frames", "Delete"),
Bind("TAStudio", "Insert Frame", "Insert"),
Bind("TAStudio", "Insert # Frames", "Ctrl+Shift+Insert"),
Bind("TAStudio", "Delete Frames", "Ctrl+Delete"),
Bind("TAStudio", "Clone Frames", "Ctrl+Insert"),
Bind("TAStudio", "Analog Increment", "Up"),
Bind("TAStudio", "Analog Decrement", "Down"),
Bind("TAStudio", "Analog Incr. by 10", "Shift+Up"),
Bind("TAStudio", "Analog Decr. by 10", "Shift+Down"),
Bind("TAStudio", "Analog Maximum", "Right"),
Bind("TAStudio", "Analog Minimum", "Left"),
Bind("SNES", "Toggle BG 1"),
Bind("SNES", "Toggle BG 2"),
Bind("SNES", "Toggle BG 3"),
Bind("SNES", "Toggle BG 4"),
Bind("SNES", "Toggle OBJ 1"),
Bind("SNES", "Toggle OBJ 2"),
Bind("SNES", "Toggle OBJ 3"),
Bind("SNES", "Toggle OBJ 4"),
Bind("GB", "GB Toggle BG"),
Bind("GB", "GB Toggle Obj"),
Bind("GB", "GB Toggle Window"),
Bind("Analog", "Y Up Small", toolTip: "For Virtual Pad"),
Bind("Analog", "Y Up Large", toolTip: "For Virtual Pad"),
Bind("Analog", "Y Down Small", toolTip: "For Virtual Pad"),
Bind("Analog", "Y Down Large", toolTip: "For Virtual Pad"),
Bind("Analog", "X Up Small", toolTip: "For Virtual Pad"),
Bind("Analog", "X Up Large", toolTip: "For Virtual Pad"),
Bind("Analog", "X Down Small", toolTip: "For Virtual Pad"),
Bind("Analog", "X Down Large", toolTip: "For Virtual Pad"),
Bind("Tools", "Toggle All Cheats"),
Bind("NDS", "Next Screen Layout"),
Bind("NDS", "Previous Screen Layout"),
Bind("NDS", "Screen Rotate"),
};
// set ordinals based on order in list
for (int i = 0; i < _defaultValues.Count; i++)
{
_defaultValues[i].Ordinal = i;
}
} // if (s_DefaultValues == null)
return _defaultValues;
}
} }
} }
} }

View File

@ -62,7 +62,7 @@ namespace BizHawk.Client.Common
public void ResolveDefaults() public void ResolveDefaults()
{ {
PathEntries.ResolveWithDefaults(); PathEntries.ResolveWithDefaults();
HotkeyBindings.ResolveWithDefaults(); HotkeyInfo.ResolveWithDefaults(HotkeyBindings);
PathEntries.RefreshTempPath(); PathEntries.RefreshTempPath();
} }
@ -300,7 +300,7 @@ namespace BizHawk.Client.Common
public bool PlayMovieIncludeSubDir { get; set; } public bool PlayMovieIncludeSubDir { get; set; }
public bool PlayMovieMatchHash { get; set; } = true; public bool PlayMovieMatchHash { get; set; } = true;
public BindingCollection HotkeyBindings { get; set; } = new BindingCollection(); public Dictionary<string, string> HotkeyBindings { get; set; } = new();
// Analog Hotkey values // Analog Hotkey values
public int AnalogLargeChange { get; set; } = 10; public int AnalogLargeChange { get; set; } = 10;

View File

@ -145,7 +145,7 @@ namespace BizHawk.Client.Common
{ {
string ReplMulti(string multiBind) string ReplMulti(string multiBind)
=> multiBind.TransformFields(',', bind => bind.TransformFields('+', button => replMap.TryGetValue(button, out var repl) ? repl : button)); => multiBind.TransformFields(',', bind => bind.TransformFields('+', button => replMap.TryGetValue(button, out var repl) ? repl : button));
foreach (var hotkeyBinding in config.HotkeyBindings.Bindings) hotkeyBinding.Bindings = ReplMulti(hotkeyBinding.Bindings); foreach (var k in config.HotkeyBindings.Keys.ToList()) config.HotkeyBindings[k] = ReplMulti(config.HotkeyBindings[k]);
foreach (var bindCollection in new[] { config.AllTrollers, config.AllTrollersAutoFire }) // analog and feedback binds can only be bound to (host) gamepads, not keyboard foreach (var bindCollection in new[] { config.AllTrollers, config.AllTrollersAutoFire }) // analog and feedback binds can only be bound to (host) gamepads, not keyboard
{ {
foreach (var k in bindCollection.Keys.ToArray()) bindCollection[k] = bindCollection[k].ToDictionary(static kvp => kvp.Key, kvp => ReplMulti(kvp.Value)); foreach (var k in bindCollection.Keys.ToArray()) bindCollection[k] = bindCollection[k].ToDictionary(static kvp => kvp.Key, kvp => ReplMulti(kvp.Value));

View File

@ -43,8 +43,8 @@ namespace BizHawk.Client.EmuHawk
SaveSlotSubMenu.Enabled = SaveSlotSubMenu.Enabled =
Emulator.HasSavestates(); Emulator.HasSavestates();
OpenRomMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Open ROM"].Bindings; OpenRomMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Open ROM"];
CloseRomMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Close ROM"].Bindings; CloseRomMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Close ROM"];
MovieSubMenu.Enabled = MovieSubMenu.Enabled =
CloseRomMenuItem.Enabled = CloseRomMenuItem.Enabled =
@ -85,32 +85,32 @@ namespace BizHawk.Client.EmuHawk
SetSlotFont(SaveState9MenuItem, 9); SetSlotFont(SaveState9MenuItem, 9);
SetSlotFont(SaveState0MenuItem, 0); SetSlotFont(SaveState0MenuItem, 0);
SaveState1MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Save State 1"].Bindings; SaveState1MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Save State 1"];
SaveState2MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Save State 2"].Bindings; SaveState2MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Save State 2"];
SaveState3MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Save State 3"].Bindings; SaveState3MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Save State 3"];
SaveState4MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Save State 4"].Bindings; SaveState4MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Save State 4"];
SaveState5MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Save State 5"].Bindings; SaveState5MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Save State 5"];
SaveState6MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Save State 6"].Bindings; SaveState6MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Save State 6"];
SaveState7MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Save State 7"].Bindings; SaveState7MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Save State 7"];
SaveState8MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Save State 8"].Bindings; SaveState8MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Save State 8"];
SaveState9MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Save State 9"].Bindings; SaveState9MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Save State 9"];
SaveState0MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Save State 0"].Bindings; SaveState0MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Save State 0"];
SaveNamedStateMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Save Named State"].Bindings; SaveNamedStateMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Save Named State"];
} }
private void LoadStateSubMenu_DropDownOpened(object sender, EventArgs e) private void LoadStateSubMenu_DropDownOpened(object sender, EventArgs e)
{ {
LoadState1MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Load State 1"].Bindings; LoadState1MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Load State 1"];
LoadState2MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Load State 2"].Bindings; LoadState2MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Load State 2"];
LoadState3MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Load State 3"].Bindings; LoadState3MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Load State 3"];
LoadState4MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Load State 4"].Bindings; LoadState4MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Load State 4"];
LoadState5MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Load State 5"].Bindings; LoadState5MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Load State 5"];
LoadState6MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Load State 6"].Bindings; LoadState6MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Load State 6"];
LoadState7MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Load State 7"].Bindings; LoadState7MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Load State 7"];
LoadState8MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Load State 8"].Bindings; LoadState8MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Load State 8"];
LoadState9MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Load State 9"].Bindings; LoadState9MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Load State 9"];
LoadState0MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Load State 0"].Bindings; LoadState0MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Load State 0"];
LoadNamedStateMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Load Named State"].Bindings; LoadNamedStateMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Load Named State"];
AutoloadLastSlotMenuItem.Checked = Config.AutoLoadLastSaveSlot; AutoloadLastSlotMenuItem.Checked = Config.AutoLoadLastSaveSlot;
@ -128,20 +128,20 @@ namespace BizHawk.Client.EmuHawk
private void SaveSlotSubMenu_DropDownOpened(object sender, EventArgs e) private void SaveSlotSubMenu_DropDownOpened(object sender, EventArgs e)
{ {
SelectSlot1MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Select State 1"].Bindings; SelectSlot1MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Select State 1"];
SelectSlot2MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Select State 2"].Bindings; SelectSlot2MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Select State 2"];
SelectSlot3MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Select State 3"].Bindings; SelectSlot3MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Select State 3"];
SelectSlot4MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Select State 4"].Bindings; SelectSlot4MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Select State 4"];
SelectSlot5MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Select State 5"].Bindings; SelectSlot5MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Select State 5"];
SelectSlot6MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Select State 6"].Bindings; SelectSlot6MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Select State 6"];
SelectSlot7MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Select State 7"].Bindings; SelectSlot7MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Select State 7"];
SelectSlot8MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Select State 8"].Bindings; SelectSlot8MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Select State 8"];
SelectSlot9MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Select State 9"].Bindings; SelectSlot9MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Select State 9"];
SelectSlot0MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Select State 0"].Bindings; SelectSlot0MenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Select State 0"];
PreviousSlotMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Previous Slot"].Bindings; PreviousSlotMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Previous Slot"];
NextSlotMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Next Slot"].Bindings; NextSlotMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Next Slot"];
SaveToCurrentSlotMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Quick Save"].Bindings; SaveToCurrentSlotMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Quick Save"];
LoadCurrentSlotMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Quick Load"].Bindings; LoadCurrentSlotMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Quick Load"];
SelectSlot1MenuItem.Checked = Config.SaveSlot == 1; SelectSlot1MenuItem.Checked = Config.SaveSlot == 1;
SelectSlot2MenuItem.Checked = Config.SaveSlot == 2; SelectSlot2MenuItem.Checked = Config.SaveSlot == 2;
@ -157,7 +157,7 @@ namespace BizHawk.Client.EmuHawk
private void SaveRamSubMenu_DropDownOpened(object sender, EventArgs e) private void SaveRamSubMenu_DropDownOpened(object sender, EventArgs e)
{ {
FlushSaveRAMMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Flush SaveRAM"].Bindings; FlushSaveRAMMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Flush SaveRAM"];
} }
private void MovieSubMenu_DropDownOpened(object sender, EventArgs e) private void MovieSubMenu_DropDownOpened(object sender, EventArgs e)
@ -172,12 +172,12 @@ namespace BizHawk.Client.EmuHawk
AutomaticallyBackupMoviesMenuItem.Checked = Config.Movies.EnableBackupMovies; AutomaticallyBackupMoviesMenuItem.Checked = Config.Movies.EnableBackupMovies;
FullMovieLoadstatesMenuItem.Checked = Config.Movies.VBAStyleMovieLoadState; FullMovieLoadstatesMenuItem.Checked = Config.Movies.VBAStyleMovieLoadState;
ReadonlyMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Toggle read-only"].Bindings; ReadonlyMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Toggle read-only"];
RecordMovieMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Record Movie"].Bindings; RecordMovieMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Record Movie"];
PlayMovieMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Play Movie"].Bindings; PlayMovieMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Play Movie"];
StopMovieMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Stop Movie"].Bindings; StopMovieMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Stop Movie"];
PlayFromBeginningMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Play from beginning"].Bindings; PlayFromBeginningMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Play from beginning"];
SaveMovieMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Save Movie"].Bindings; SaveMovieMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Save Movie"];
PlayMovieMenuItem.Enabled PlayMovieMenuItem.Enabled
= ImportMoviesMenuItem.Enabled = ImportMoviesMenuItem.Enabled
@ -215,8 +215,8 @@ namespace BizHawk.Client.EmuHawk
private void AVSubMenu_DropDownOpened(object sender, EventArgs e) private void AVSubMenu_DropDownOpened(object sender, EventArgs e)
{ {
ConfigAndRecordAVMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Record A/V"].Bindings; ConfigAndRecordAVMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Record A/V"];
StopAVIMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Stop A/V"].Bindings; StopAVIMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Stop A/V"];
CaptureOSDMenuItem.Checked = Config.AviCaptureOsd; CaptureOSDMenuItem.Checked = Config.AviCaptureOsd;
CaptureLuaMenuItem.Checked = Config.AviCaptureLua || Config.AviCaptureOsd; // or with osd is for better compatibility with old config files CaptureLuaMenuItem.Checked = Config.AviCaptureLua || Config.AviCaptureOsd; // or with osd is for better compatibility with old config files
@ -237,9 +237,9 @@ namespace BizHawk.Client.EmuHawk
private void ScreenshotSubMenu_DropDownOpening(object sender, EventArgs e) private void ScreenshotSubMenu_DropDownOpening(object sender, EventArgs e)
{ {
ScreenshotCaptureOSDMenuItem1.Checked = Config.ScreenshotCaptureOsd; ScreenshotCaptureOSDMenuItem1.Checked = Config.ScreenshotCaptureOsd;
ScreenshotMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Screenshot"].Bindings; ScreenshotMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Screenshot"];
ScreenshotClipboardMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["ScreenshotToClipboard"].Bindings; ScreenshotClipboardMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["ScreenshotToClipboard"];
ScreenshotClientClipboardMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Screen Client to Clipboard"].Bindings; ScreenshotClientClipboardMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Screen Client to Clipboard"];
} }
private void OpenRomMenuItem_Click(object sender, EventArgs e) private void OpenRomMenuItem_Click(object sender, EventArgs e)
@ -619,10 +619,10 @@ namespace BizHawk.Client.EmuHawk
HardResetMenuItem.Enabled = Emulator.ControllerDefinition.BoolButtons.Contains("Power") HardResetMenuItem.Enabled = Emulator.ControllerDefinition.BoolButtons.Contains("Power")
&& !MovieSession.Movie.IsPlaying(); && !MovieSession.Movie.IsPlaying();
PauseMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Pause"].Bindings; PauseMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Pause"];
RebootCoreMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Reboot Core"].Bindings; RebootCoreMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Reboot Core"];
SoftResetMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Soft Reset"].Bindings; SoftResetMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Soft Reset"];
HardResetMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Hard Reset"].Bindings; HardResetMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Hard Reset"];
} }
private void PauseMenuItem_Click(object sender, EventArgs e) private void PauseMenuItem_Click(object sender, EventArgs e)
@ -660,11 +660,11 @@ namespace BizHawk.Client.EmuHawk
DisplayRerecordCountMenuItem.Checked = Config.DisplayRerecordCount; DisplayRerecordCountMenuItem.Checked = Config.DisplayRerecordCount;
DisplaySubtitlesMenuItem.Checked = Config.DisplaySubtitles; DisplaySubtitlesMenuItem.Checked = Config.DisplaySubtitles;
DisplayFPSMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Display FPS"].Bindings; DisplayFPSMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Display FPS"];
DisplayFrameCounterMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Frame Counter"].Bindings; DisplayFrameCounterMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Frame Counter"];
DisplayLagCounterMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Lag Counter"].Bindings; DisplayLagCounterMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Lag Counter"];
DisplayInputMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Input Display"].Bindings; DisplayInputMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Input Display"];
SwitchToFullscreenMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Full Screen"].Bindings; SwitchToFullscreenMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Full Screen"];
DisplayStatusBarMenuItem.Checked = Config.DispChromeStatusBarWindowed; DisplayStatusBarMenuItem.Checked = Config.DispChromeStatusBarWindowed;
DisplayLogWindowMenuItem.Checked = Tools.IsLoaded<LogWindow>(); DisplayLogWindowMenuItem.Checked = Tools.IsLoaded<LogWindow>();
@ -1143,15 +1143,15 @@ namespace BizHawk.Client.EmuHawk
private void ToolsSubMenu_DropDownOpened(object sender, EventArgs e) private void ToolsSubMenu_DropDownOpened(object sender, EventArgs e)
{ {
ToolBoxMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["ToolBox"].Bindings; ToolBoxMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["ToolBox"];
RamWatchMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["RAM Watch"].Bindings; RamWatchMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["RAM Watch"];
RamSearchMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["RAM Search"].Bindings; RamSearchMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["RAM Search"];
HexEditorMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Hex Editor"].Bindings; HexEditorMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Hex Editor"];
LuaConsoleMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Lua Console"].Bindings; LuaConsoleMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Lua Console"];
CheatsMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Cheats"].Bindings; CheatsMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Cheats"];
TAStudioMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["TAStudio"].Bindings; TAStudioMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["TAStudio"];
VirtualPadMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Virtual Pad"].Bindings; VirtualPadMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Virtual Pad"];
TraceLoggerMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Trace Logger"].Bindings; TraceLoggerMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Trace Logger"];
TraceLoggerMenuItem.Enabled = Tools.IsAvailable<TraceLogger>(); TraceLoggerMenuItem.Enabled = Tools.IsAvailable<TraceLogger>();
CodeDataLoggerMenuItem.Enabled = Tools.IsAvailable<CDL>(); CodeDataLoggerMenuItem.Enabled = Tools.IsAvailable<CDL>();

View File

@ -2093,13 +2093,10 @@ namespace BizHawk.Client.EmuHawk
{ {
Controller controls = new(new ControllerDefinition("Emulator Frontend Controls") Controller controls = new(new ControllerDefinition("Emulator Frontend Controls")
{ {
BoolButtons = Config.HotkeyBindings.Select(static x => x.DisplayName).ToList(), BoolButtons = Config.HotkeyBindings.Keys.ToList(),
}.MakeImmutable()); }.MakeImmutable());
foreach (var b in Config.HotkeyBindings) foreach (var (k, v) in Config.HotkeyBindings) controls.BindMulti(k, v);
{
controls.BindMulti(b.DisplayName, b.Bindings);
}
InputManager.ClientControls = controls; InputManager.ClientControls = controls;
InputManager.ControllerInputCoalescer = new(); // ctor initialises values for host haptics InputManager.ControllerInputCoalescer = new(); // ctor initialises values for host haptics

View File

@ -5,6 +5,7 @@ using System.Linq;
using System.Windows.Forms; using System.Windows.Forms;
using BizHawk.Client.Common; using BizHawk.Client.Common;
using BizHawk.Common;
namespace BizHawk.Client.EmuHawk namespace BizHawk.Client.EmuHawk
{ {
@ -35,7 +36,7 @@ namespace BizHawk.Client.EmuHawk
private void HotkeyConfig_Load(object sender, EventArgs e) private void HotkeyConfig_Load(object sender, EventArgs e)
{ {
var source = new AutoCompleteStringCollection(); var source = new AutoCompleteStringCollection();
source.AddRange(_config.HotkeyBindings.Select(x => x.DisplayName).ToArray()); source.AddRange(HotkeyInfo.AllHotkeys.Keys.ToArray());
SearchBox.AutoCompleteCustomSource = source; SearchBox.AutoCompleteCustomSource = source;
SearchBox.AutoCompleteSource = AutoCompleteSource.CustomSource; SearchBox.AutoCompleteSource = AutoCompleteSource.CustomSource;
@ -70,12 +71,7 @@ namespace BizHawk.Client.EmuHawk
private void Save() private void Save()
{ {
_config.HotkeyConfigAutoTab = AutoTabCheckBox.Checked; _config.HotkeyConfigAutoTab = AutoTabCheckBox.Checked;
foreach (var w in InputWidgets) _config.HotkeyBindings[w.WidgetName] = w.Bindings;
foreach (var w in InputWidgets)
{
var b = _config.HotkeyBindings.First(x => x.DisplayName == w.WidgetName);
b.Bindings = w.Bindings;
}
} }
private IEnumerable<InputCompositeWidget> InputWidgets => private IEnumerable<InputCompositeWidget> InputWidgets =>
@ -86,13 +82,11 @@ namespace BizHawk.Client.EmuHawk
HotkeyTabControl.SuspendLayout(); HotkeyTabControl.SuspendLayout();
HotkeyTabControl.TabPages.Clear(); HotkeyTabControl.TabPages.Clear();
// Buckets foreach (var tab in HotkeyInfo.Groupings)
var tabs = _config.HotkeyBindings.Select(x => x.TabGroup).Distinct();
foreach (var tab in tabs)
{ {
var tb = new TabPage { Name = tab, Text = tab }; var tb = new TabPage { Name = tab, Text = tab };
var bindings = _config.HotkeyBindings.Where(n => n.TabGroup == tab).OrderBy(n => n.Ordinal).ThenBy(n => n.DisplayName); var bindings = HotkeyInfo.AllHotkeys.Where(kvp => kvp.Value.TabGroup == tab)
.OrderBy(static kvp => kvp.Value.Ordinal).ThenBy(static kvp => kvp.Value.DisplayName);
int x = UIHelper.ScaleX(6); int x = UIHelper.ScaleX(6);
int y = UIHelper.ScaleY(14); int y = UIHelper.ScaleY(14);
int iwOffsetX = UIHelper.ScaleX(110); int iwOffsetX = UIHelper.ScaleX(110);
@ -101,7 +95,7 @@ namespace BizHawk.Client.EmuHawk
tb.SuspendLayout(); tb.SuspendLayout();
foreach (var b in bindings) foreach (var (k, b) in bindings)
{ {
var l = new Label var l = new Label
{ {
@ -115,13 +109,13 @@ namespace BizHawk.Client.EmuHawk
Location = new Point(x + iwOffsetX, y + iwOffsetY), Location = new Point(x + iwOffsetX, y + iwOffsetY),
AutoTab = AutoTabCheckBox.Checked, AutoTab = AutoTabCheckBox.Checked,
Width = iwWidth, Width = iwWidth,
WidgetName = b.DisplayName WidgetName = k
}; };
w.SetupTooltip(toolTip1, b.ToolTip); w.SetupTooltip(toolTip1, b.ToolTip);
toolTip1.SetToolTip(l, b.ToolTip); toolTip1.SetToolTip(l, b.ToolTip);
w.Bindings = b.Bindings; w.Bindings = _config.HotkeyBindings[k];
tb.Controls.Add(l); tb.Controls.Add(l);
tb.Controls.Add(w); tb.Controls.Add(w);
@ -153,14 +147,7 @@ namespace BizHawk.Client.EmuHawk
private void Defaults() private void Defaults()
{ {
foreach (var w in InputWidgets) foreach (var w in InputWidgets) w.Bindings = HotkeyInfo.AllHotkeys[w.WidgetName].DefaultBinding;
{
var b = _config.HotkeyBindings.FirstOrDefault(x => x.DisplayName == w.WidgetName);
if (b != null)
{
w.Bindings = b.DefaultBinding;
}
}
} }
private void ClearAll(bool currentTabOnly) private void ClearAll(bool currentTabOnly)
@ -210,12 +197,12 @@ namespace BizHawk.Client.EmuHawk
{ {
if (e.IsPressed(Keys.Enter) || e.IsPressed(Keys.Tab)) if (e.IsPressed(Keys.Enter) || e.IsPressed(Keys.Tab))
{ {
var b = _config.HotkeyBindings.FirstOrDefault(x => string.Compare(x.DisplayName, SearchBox.Text, true) == 0); var k = HotkeyInfo.AllHotkeys.FirstOrDefault(kvp => string.Compare(kvp.Value.DisplayName, SearchBox.Text, true) is 0).Key;
// Found // Found
if (b != null) if (k is not null)
{ {
var w = InputWidgets.FirstOrDefault(x => x.WidgetName == b.DisplayName); var w = InputWidgets.FirstOrDefault(x => x.WidgetName == k);
if (w != null) if (w != null)
{ {
HotkeyTabControl.SelectTab((TabPage)w.Parent); HotkeyTabControl.SelectTab((TabPage)w.Parent);

View File

@ -528,9 +528,8 @@ namespace BizHawk.Client.EmuHawk
public void NonExistentBranchMessage(int slot) public void NonExistentBranchMessage(int slot)
{ {
string binding = Tastudio.Config.HotkeyBindings.First(x => x.DisplayName == "Add Branch").Bindings;
Tastudio.MainForm.AddOnScreenMessage($"Branch {slot + 1} does not exist"); Tastudio.MainForm.AddOnScreenMessage($"Branch {slot + 1} does not exist");
Tastudio.MainForm.AddOnScreenMessage($"Use {binding} to add branches"); Tastudio.MainForm.AddOnScreenMessage($"Use {Tastudio.Config!.HotkeyBindings["Add Branch"]} to add branches");
} }
public void UpdateValues() public void UpdateValues()

View File

@ -349,16 +349,16 @@ namespace BizHawk.Client.EmuHawk
StateHistoryIntegrityCheckMenuItem.Visible = StateHistoryIntegrityCheckMenuItem.Visible =
VersionInfo.DeveloperBuild; VersionInfo.DeveloperBuild;
UndoMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Undo"].Bindings; UndoMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Undo"];
RedoMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Redo"].Bindings; RedoMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Redo"];
SelectBetweenMarkersMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Select between Markers"].Bindings; SelectBetweenMarkersMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Select between Markers"];
SelectAllMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Select All"].Bindings; SelectAllMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Select All"];
ReselectClipboardMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Reselect Clip."].Bindings; ReselectClipboardMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Reselect Clip."];
ClearFramesMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Clear Frames"].Bindings; ClearFramesMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Clear Frames"];
InsertFrameMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Insert Frame"].Bindings; InsertFrameMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Insert Frame"];
InsertNumFramesMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Insert # Frames"].Bindings; InsertNumFramesMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Insert # Frames"];
DeleteFramesMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Delete Frames"].Bindings; DeleteFramesMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Delete Frames"];
CloneFramesMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Clone Frames"].Bindings; CloneFramesMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Clone Frames"];
} }
private void UndoMenuItem_Click(object sender, EventArgs e) private void UndoMenuItem_Click(object sender, EventArgs e)
@ -1418,12 +1418,12 @@ namespace BizHawk.Client.EmuHawk
CancelSeekContextMenuItem.Enabled = MainForm.PauseOnFrame.HasValue; CancelSeekContextMenuItem.Enabled = MainForm.PauseOnFrame.HasValue;
BranchContextMenuItem.Visible = TasView.CurrentCell?.RowIndex == Emulator.Frame; BranchContextMenuItem.Visible = TasView.CurrentCell?.RowIndex == Emulator.Frame;
SelectBetweenMarkersContextMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Sel. bet. Markers"].Bindings; SelectBetweenMarkersContextMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Sel. bet. Markers"];
InsertNumFramesContextMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Insert # Frames"].Bindings; InsertNumFramesContextMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Insert # Frames"];
ClearContextMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Clear Frames"].Bindings; ClearContextMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Clear Frames"];
InsertFrameContextMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Insert Frame"].Bindings; InsertFrameContextMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Insert Frame"];
DeleteFramesContextMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Delete Frames"].Bindings; DeleteFramesContextMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Delete Frames"];
CloneContextMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Clone Frames"].Bindings; CloneContextMenuItem.ShortcutKeyDisplayString = Config.HotkeyBindings["Clone Frames"];
} }
private void CancelSeekContextMenuItem_Click(object sender, EventArgs e) private void CancelSeekContextMenuItem_Click(object sender, EventArgs e)

View File

@ -14,8 +14,6 @@ namespace BizHawk.Tests.Client.Common.config
[TestClass] [TestClass]
public sealed class SerializationStabilityTests public sealed class SerializationStabilityTests
{ {
private const string BINDING_SER = @"{""DisplayName"":""Frame Advance"",""Bindings"":""F"",""DefaultBinding"":""F"",""TabGroup"":""General"",""ToolTip"":"""",""Ordinal"":0}";
private const string PATHENTRY_SER = @"{""Type"":""Movies"",""Path"":""./Movies"",""System"":""Global_NULL""}"; private const string PATHENTRY_SER = @"{""Type"":""Movies"",""Path"":""./Movies"",""System"":""Global_NULL""}";
private const string RECENT_SER = @"{""recentlist"":[],""MAX_RECENT_FILES"":8,""AutoLoad"":false,""Frozen"":false}"; private const string RECENT_SER = @"{""recentlist"":[],""MAX_RECENT_FILES"":8,""AutoLoad"":false,""Frozen"":false}";
@ -43,8 +41,6 @@ namespace BizHawk.Tests.Client.Common.config
private static readonly IReadOnlyDictionary<Type, string> KnownGoodFromBizHawk = new Dictionary<Type, string> private static readonly IReadOnlyDictionary<Type, string> KnownGoodFromBizHawk = new Dictionary<Type, string>
{ {
[typeof(AnalogBind)] = @"{""Value"":""X1 LeftThumbX Axis"",""Mult"":0.8,""Deadzone"":0.1}", [typeof(AnalogBind)] = @"{""Value"":""X1 LeftThumbX Axis"",""Mult"":0.8,""Deadzone"":0.1}",
[typeof(Binding)] = BINDING_SER,
[typeof(BindingCollection)] = $@"{{""Bindings"":[{BINDING_SER}]}}",
[typeof(CheatConfig)] = $@"{{""DisableOnLoad"":false,""LoadFileByGame"":true,""AutoSaveOnClose"":true,""Recent"":{RECENT_SER}}}", [typeof(CheatConfig)] = $@"{{""DisableOnLoad"":false,""LoadFileByGame"":true,""AutoSaveOnClose"":true,""Recent"":{RECENT_SER}}}",
[typeof(FeedbackBind)] = @"{""Channels"":""Left+Right"",""GamepadPrefix"":""X1 "",""Prescale"":1.0}", [typeof(FeedbackBind)] = @"{""Channels"":""Left+Right"",""GamepadPrefix"":""X1 "",""Prescale"":1.0}",
[typeof(MessagePosition)] = @"{""X"":0,""Y"":0,""Anchor"":0}", [typeof(MessagePosition)] = @"{""X"":0,""Y"":0,""Anchor"":0}",