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
src
BizHawk.Client.Common/config
BizHawk.Client.EmuHawk
BizHawk.Tests/Client.Common/config

View File

@ -1,272 +1,209 @@
using System.Collections;
using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
// TODO [LARP] - It's pointless and annoying to store such a big structure filled with static information
// use this instead
// 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.
using BizHawk.Common;
using BizHawk.Common.CollectionExtensions;
namespace BizHawk.Client.Common
{
public class Binding
public class HotkeyInfo
{
public string DisplayName { get; set; }
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; }
}
public static readonly IReadOnlyDictionary<string, HotkeyInfo> AllHotkeys;
[Newtonsoft.Json.JsonObject]
public class BindingCollection : IEnumerable<Binding>
{
public List<Binding> Bindings { get; }
public static readonly IReadOnlyList<string> Groupings;
[Newtonsoft.Json.JsonConstructor]
public BindingCollection(List<Binding> bindings)
static HotkeyInfo()
{
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>();
Bindings.AddRange(DefaultValues);
foreach (var (k, v) in AllHotkeys) if (!dict.ContainsKey(k)) dict[k] = v.DefaultBinding; // add missing
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);
}
public IEnumerator<Binding> GetEnumerator()
{
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;
}
DefaultBinding = defaultBinding;
DisplayName = displayName;
Ordinal = ordinal;
TabGroup = tabGroup;
ToolTip = toolTip;
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

@ -528,9 +528,8 @@ namespace BizHawk.Client.EmuHawk
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($"Use {binding} to add branches");
Tastudio.MainForm.AddOnScreenMessage($"Use {Tastudio.Config!.HotkeyBindings["Add Branch"]} to add branches");
}
public void UpdateValues()

View File

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

View File

@ -14,8 +14,6 @@ namespace BizHawk.Tests.Client.Common.config
[TestClass]
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 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>
{
[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(FeedbackBind)] = @"{""Channels"":""Left+Right"",""GamepadPrefix"":""X1 "",""Prescale"":1.0}",
[typeof(MessagePosition)] = @"{""X"":0,""Y"":0,""Anchor"":0}",