From 6766e45c5ed66e6a6845e6f2e8f967afe1630350 Mon Sep 17 00:00:00 2001 From: YoshiRulz Date: Sat, 6 Jun 2020 21:02:42 +1000 Subject: [PATCH] Simplify core selection menu code --- src/BizHawk.Client.EmuHawk/MainForm.cs | 113 +++++++++---------------- 1 file changed, 40 insertions(+), 73 deletions(-) diff --git a/src/BizHawk.Client.EmuHawk/MainForm.cs b/src/BizHawk.Client.EmuHawk/MainForm.cs index 0e28759ad5..c922ccb267 100644 --- a/src/BizHawk.Client.EmuHawk/MainForm.cs +++ b/src/BizHawk.Client.EmuHawk/MainForm.cs @@ -38,81 +38,66 @@ namespace BizHawk.Client.EmuHawk { public partial class MainForm : Form { - /// CoreData[x].CoveredSystems[0] should be x; adding a label that's distinct from x can be done in future if necessary - private static readonly IReadOnlyDictionary CoreData = new Dictionary { - ["NES"] = ( - new[] { "NES" }, - new[] { - (CoreNames.QuickNes, "QuickNES"), - (CoreNames.NesHawk, "NesHawk"), - (CoreNames.SubNesHawk, "SubNesHawk (Experimental)") - } - ), - ["SNES"] = ( - new[] { "SNES" }, - new[] { - (CoreNames.Faust, "Faust"), - (CoreNames.Snes9X, "Snes9x"), - (CoreNames.Bsnes, "BSNES") - } - ), - ["SGB"] = ( - new[] { "SGB" }, - new[] { - (CoreNames.Bsnes, "BSNES"), - (CoreNames.SameBoy, "SameBoy") - } - ), - ["GB"] = ( - new[] { "GB", "GBC" }, - new[] { - (CoreNames.Gambatte, "Gambatte"), - (CoreNames.GbHawk, "GBHawk"), - (CoreNames.SubGbHawk, "SubGBHawk (Experimental)") - } - ), - ["PCE"] = ( - new[] { "PCE", "PCECD", "SGX" }, - new[] { - (CoreNames.TurboTurboNyma, "TurboTurboNyma"), - (CoreNames.PceHawk, "PCEHawk"), - (CoreNames.TurboNyma, "TurboNyma") - } - ) + /// AppliesTo[0] is used as the group label, and Config.PreferredCores[AppliesTo[0]] determines the currently selected option + private static readonly IReadOnlyCollection<(string[] AppliesTo, string[] CoreNames)> CoreData = new List<(string[], string[])> { + (new[] { "NES" }, new[] { CoreNames.QuickNes, CoreNames.NesHawk, CoreNames.SubNesHawk }), + (new[] { "SNES" }, new[] { CoreNames.Faust, CoreNames.Snes9X, CoreNames.Bsnes }), + (new[] { "SGB" }, new[] { CoreNames.Bsnes, CoreNames.SameBoy }), + (new[] { "GB", "GBC" }, new[] { CoreNames.Gambatte, CoreNames.GbHawk, CoreNames.SubGbHawk }), + (new[] { "PCE", "PCECD", "SGX" }, new[] { CoreNames.TurboTurboNyma, CoreNames.PceHawk, CoreNames.TurboNyma }) }; private void MainForm_Load(object sender, EventArgs e) { SetWindowText(); - EventHandler GenClickHandlerForSystem(string system) + ToolStripMenuItem GenSubmenuForSystem((string[] AppliesTo, string[] CoreNames) systemData, EventHandler onclick = null, EventHandler onmouseover = null) { - var coveredSystems = CoreData[system].CoveredSystems; - return (clickSender, clickArgs) => + var (appliesTo, coreNames) = systemData; + var groupLabel = appliesTo[0]; + var submenu = new ToolStripMenuItem { Text = groupLabel }; + onclick ??= (clickSender, clickArgs) => { var coreName = (string) ((ToolStripMenuItem) clickSender).Tag; - foreach (var covered in coveredSystems) Config.PreferredCores[covered] = coreName; - if (coveredSystems.Contains(Emulator.SystemId)) FlagNeedsReboot(); //TODO don't alert if the loaded core was the one selected + foreach (var system in appliesTo) Config.PreferredCores[system] = coreName; + if (appliesTo.Contains(Emulator.SystemId)) FlagNeedsReboot(); //TODO don't alert if the loaded core was the one selected }; - } - - ToolStripMenuItem GenSubmenuForSystem(string system, EventHandler onclick = null, EventHandler onmouseover = null) - { - onclick ??= GenClickHandlerForSystem(system); - var submenu = new ToolStripMenuItem { Text = system }; - submenu.DropDownItems.AddRange(CoreData[system].Entries.Select(entryData => { - var entry = new ToolStripMenuItem { Tag = entryData.CoreName, Text = entryData.Label }; + submenu.DropDownItems.AddRange(coreNames.Select(coreName => { + var entry = new ToolStripMenuItem + { + Tag = coreName, + Text = coreName.StartsWith("Sub") ? $"{coreName} (Experimental)" : coreName //TODO if we ditch this "Experimental" thing, we can use Text instead of Tag + }; entry.Click += onclick; return (ToolStripItem) entry; }).ToArray()); submenu.DropDownOpened += onmouseover ?? ((openedSender, openedArgs) => { foreach (ToolStripMenuItem entry in ((ToolStripMenuItem) openedSender).DropDownItems) { - entry.Checked = (string) entry.Tag == Config.PreferredCores[system]; + entry.Checked = (string) entry.Tag == Config.PreferredCores[groupLabel]; } }); return submenu; } + CoresSubMenu.DropDownItems.AddRange(CoreData.Select(systemData => + systemData.AppliesTo[0] == "SGB" + ? GenSubmenuForSystem( + systemData, + (clickSender, clickArgs) => + { + Config.SgbUseBsnes = (string) ((ToolStripMenuItem) clickSender).Tag == CoreNames.Bsnes; + if (Emulator.SystemId == "GB" || Emulator.SystemId == "GBC") FlagNeedsReboot(); //TODO don't alert if the loaded core was the one selected + }, + (openedSender, openedArgs) => + { + //TODO use Config.PreferredCores for SGB, then this custom EventHandler can go away + var entries = ((ToolStripMenuItem) openedSender).DropDownItems.Cast().ToList(); + entries[0].Checked = Config.SgbUseBsnes; + entries[1].Checked = !Config.SgbUseBsnes; + } + ) + : (ToolStripItem) GenSubmenuForSystem(systemData) + ).ToArray()); var GBInSGBMenuItem = new ToolStripMenuItem { Text = "GB in SGB" }; GBInSGBMenuItem.Click += (clickSender, clickArgs) => @@ -125,24 +110,6 @@ namespace BizHawk.Client.EmuHawk var setLibretroCoreToolStripMenuItem = new ToolStripMenuItem { Text = "Set Libretro Core" }; setLibretroCoreToolStripMenuItem.Click += (clickSender, clickArgs) => RunLibretroCoreChooser(); CoresSubMenu.DropDownItems.AddRange(new ToolStripItem[] { - GenSubmenuForSystem("NES"), - GenSubmenuForSystem("SNES"), - GenSubmenuForSystem( - "SGB", - (clickSender, clickArgs) => - { - Config.SgbUseBsnes = (string) ((ToolStripMenuItem) clickSender).Tag == CoreNames.Bsnes; - if (Emulator.SystemId == "GB" || Emulator.SystemId == "GBC") FlagNeedsReboot(); //TODO don't alert if the loaded core was the one selected - }, - (openedSender, openedArgs) => - { - var entries = ((ToolStripMenuItem) openedSender).DropDownItems.Cast().ToList(); - entries[0].Checked = Config.SgbUseBsnes; - entries[1].Checked = !Config.SgbUseBsnes; - } - ), - GenSubmenuForSystem("GB"), - GenSubmenuForSystem("PCE"), GBInSGBMenuItem, new ToolStripSeparator { AutoSize = true }, N64VideoPluginSettingsMenuItem,