Refactor `PutCore{S,SyncS}ettings` call chain

This commit is contained in:
YoshiRulz 2021-11-20 03:42:28 +10:00 committed by James Groom
parent 3f090e47a5
commit 5b403f9c2a
35 changed files with 81 additions and 85 deletions

View File

@ -10,9 +10,5 @@ namespace BizHawk.Client.EmuHawk
/// <exception cref="InvalidOperationException">loaded emulator is not instance of <typeparamref name="T"/></exception>
SettingsAdapter GetSettingsAdapterForLoadedCore<T>()
where T : IEmulator;
void PutCoreSettings(object o, SettingsAdapter settable);
void PutCoreSyncSettings(object o, SettingsAdapter settable);
}
}

View File

@ -152,8 +152,7 @@ namespace BizHawk.Client.EmuHawk
var ss = ((N64) Emulator!).GetSyncSettings();
var glidenSS = ss.GLideN64Plugin;
foreach (var pi in props) pi.SetValue(obj: glidenSS, value: RandomElem(propDict[pi], rng));
var mf = (MainForm) MainForm;
mf.PutCoreSyncSettings(ss, mf.GetSettingsAdapterForLoadedCore<N64>());
((MainForm) MainForm).GetSettingsAdapterForLoadedCore<N64>().PutCoreSyncSettings(ss);
}
SzButtonEx btnLightFuzz = new() { Size = new(200, 23), Text = "--> randomise some props" };
btnLightFuzz.Click += (_, _) => Fuzz(limit: true);

View File

@ -1732,7 +1732,7 @@ namespace BizHawk.Client.EmuHawk
{
var ss = coleco.GetSyncSettings();
ss.SkipBiosIntro ^= true;
PutCoreSyncSettings(ss, GetSettingsAdapterForLoadedCore<ColecoVision>());
GetSettingsAdapterForLoadedCore<ColecoVision>().PutCoreSyncSettings(ss);
}
}
@ -1742,7 +1742,7 @@ namespace BizHawk.Client.EmuHawk
{
var ss = coleco.GetSyncSettings();
ss.UseSGM ^= true;
PutCoreSyncSettings(ss, GetSettingsAdapterForLoadedCore<ColecoVision>());
GetSettingsAdapterForLoadedCore<ColecoVision>().PutCoreSyncSettings(ss);
}
}

View File

@ -2408,38 +2408,25 @@ namespace BizHawk.Client.EmuHawk
e.Settings = Config.GetCoreSettings(e.Core, e.SettingsType);
}
/// <summary>
/// send core settings to emu, setting reboot flag if needed
/// </summary>
public void PutCoreSettings(object o, SettingsAdapter settable)
private void HandlePutCoreSettings(PutSettingsDirtyBits dirty)
{
if (!settable.HasSettings)
return;
var dirty = settable.PutSettings(o);
if(dirty.HasFlag(PutSettingsDirtyBits.RebootCore))
FlagNeedsReboot();
if (dirty.HasFlag(PutSettingsDirtyBits.ScreenLayoutChanged))
FrameBufferResized();
if (dirty.HasFlag(PutSettingsDirtyBits.RebootCore)) FlagNeedsReboot();
if (dirty.HasFlag(PutSettingsDirtyBits.ScreenLayoutChanged)) FrameBufferResized();
}
// TODO: Get/Put settings/sync settings methods could become a service we instantiate and use and pass to other forms
/// <summary>
/// send core sync settings to emu, setting reboot flag if needed
/// </summary>
public void PutCoreSyncSettings(object o, SettingsAdapter settable)
private bool MayPutCoreSyncSettings()
{
if (MovieSession.Movie.IsActive())
{
AddOnScreenMessage("Attempt to change sync-relevant settings while recording BLOCKED.");
return false;
}
else
{
if (!settable.HasSyncSettings)
return;
var dirty = settable.PutSyncSettings(o);
if(dirty.HasFlag(PutSettingsDirtyBits.RebootCore))
FlagNeedsReboot();
}
return true;
}
private void HandlePutCoreSyncSettings(PutSettingsDirtyBits dirty)
{
if (dirty.HasFlag(PutSettingsDirtyBits.RebootCore)) FlagNeedsReboot();
}
public SettingsAdapter GetSettingsAdapterForLoadedCore<T>()
@ -2450,7 +2437,7 @@ namespace BizHawk.Client.EmuHawk
}
public SettingsAdapter GetSettingsAdapterForLoadedCoreUntyped()
=> new(Emulator);
=> new(Emulator, static () => true, HandlePutCoreSettings, MayPutCoreSyncSettings, HandlePutCoreSyncSettings);
private void SaveConfig(string path = "")
{

View File

@ -42,7 +42,7 @@ namespace BizHawk.Client.EmuHawk
_syncSettings.Port1 = Port1ComboBox.SelectedItem.ToString();
_syncSettings.Port2 = Port2ComboBox.SelectedItem.ToString();
_mainForm.PutCoreSyncSettings(_syncSettings, _mainForm.GetSettingsAdapterForLoadedCore<A7800Hawk>());
_mainForm.GetSettingsAdapterForLoadedCore<A7800Hawk>().PutCoreSyncSettings(_syncSettings);
}
DialogResult = DialogResult.OK;

View File

@ -39,7 +39,7 @@ namespace BizHawk.Client.EmuHawk
if (changed)
{
_syncSettings.Filter = Port1ComboBox.SelectedItem.ToString();
_mainForm.PutCoreSyncSettings(_syncSettings, _mainForm.GetSettingsAdapterForLoadedCore<A7800Hawk>());
_mainForm.GetSettingsAdapterForLoadedCore<A7800Hawk>().PutCoreSyncSettings(_syncSettings);
}
DialogResult = DialogResult.OK;

View File

@ -51,7 +51,7 @@ namespace BizHawk.Client.EmuHawk
_settings.TapeVolume = tapeVolumetrackBar.Value;
_settings.AYVolume = ayVolumetrackBar.Value;
_mainForm.PutCoreSettings(_settings, _mainForm.GetSettingsAdapterForLoadedCore<AmstradCPC>());
_mainForm.GetSettingsAdapterForLoadedCore<AmstradCPC>().PutCoreSettings(_settings);
}
DialogResult = DialogResult.OK;
Close();

View File

@ -59,7 +59,7 @@ namespace BizHawk.Client.EmuHawk
_syncSettings.DeterministicEmulation = determEmucheckBox1.Checked;
_syncSettings.AutoStartStopTape = autoLoadcheckBox1.Checked;
_mainForm.PutCoreSyncSettings(_syncSettings, _mainForm.GetSettingsAdapterForLoadedCore<AmstradCPC>());
_mainForm.GetSettingsAdapterForLoadedCore<AmstradCPC>().PutCoreSyncSettings(_syncSettings);
DialogResult = DialogResult.OK;
Close();

View File

@ -40,7 +40,7 @@ namespace BizHawk.Client.EmuHawk
{
_settings.OSDMessageVerbosity = (AmstradCPC.OSDVerbosity)Enum.Parse(typeof(AmstradCPC.OSDVerbosity), osdMessageVerbositycomboBox1.SelectedItem.ToString());
_mainForm.PutCoreSettings(_settings, _mainForm.GetSettingsAdapterForLoadedCore<AmstradCPC>());
_mainForm.GetSettingsAdapterForLoadedCore<AmstradCPC>().PutCoreSettings(_settings);
DialogResult = DialogResult.OK;
Close();

View File

@ -42,7 +42,7 @@ namespace BizHawk.Client.EmuHawk
_syncSettings.Port1 = Port1ComboBox.SelectedItem.ToString();
_syncSettings.Port2 = Port2ComboBox.SelectedItem.ToString();
_mainForm.PutCoreSyncSettings(_syncSettings, _mainForm.GetSettingsAdapterForLoadedCore<ColecoVision>());
_mainForm.GetSettingsAdapterForLoadedCore<ColecoVision>().PutCoreSyncSettings(_syncSettings);
}
DialogResult = DialogResult.OK;

View File

@ -68,7 +68,7 @@ namespace BizHawk.Client.EmuHawk
gambatte.PutSettings(s);
if (dlg.SyncSettingsChanged)
{
mainForm.PutCoreSyncSettings(ss, mainForm.GetSettingsAdapterForLoadedCore<GambatteLink>());
mainForm.GetSettingsAdapterForLoadedCore<GambatteLink>().PutCoreSyncSettings(ss);
}
}
return result;

View File

@ -32,7 +32,7 @@ namespace BizHawk.Client.EmuHawk
gb.PutSettings(s);
if (dlg.gbPrefControl1.SyncSettingsChanged)
{
mainForm.PutCoreSyncSettings(ss, mainForm.GetSettingsAdapterForLoadedCore<Gameboy>());
mainForm.GetSettingsAdapterForLoadedCore<Gameboy>().PutCoreSyncSettings(ss);
}
}
return result;

View File

@ -316,7 +316,7 @@ namespace BizHawk.Client.EmuHawk
_settings.SetCustomPalette(colors);
_mainForm.PutCoreSettings(_settings, _mainForm.GetSettingsAdapterForLoadedCore<Sameboy>());
_mainForm.GetSettingsAdapterForLoadedCore<Sameboy>().PutCoreSettings(_settings);
DialogResult = DialogResult.OK;
Close();

View File

@ -10,7 +10,6 @@ namespace BizHawk.Client.EmuHawk
{
private readonly SettingsAdapter _settable;
private readonly IMainFormForConfig _mainForm;
private object _s;
private object _ss;
private bool _syncSettingsChanged;
@ -23,9 +22,8 @@ namespace BizHawk.Client.EmuHawk
bool ignoreSyncSettings = false)
{
InitializeComponent();
_mainForm = mainForm;
_settable = ((MainForm) _mainForm).GetSettingsAdapterForLoadedCoreUntyped(); //HACK
_settable = ((MainForm) mainForm).GetSettingsAdapterForLoadedCoreUntyped(); //HACK
if (_settable.HasSettings && !ignoreSettings) _s = _settable.GetSettings();
@ -61,12 +59,12 @@ namespace BizHawk.Client.EmuHawk
{
if (_s != null && _settingsChanged)
{
_mainForm.PutCoreSettings(_s, _settable);
_settable.PutCoreSettings(_s);
}
if (_ss != null && _syncSettingsChanged)
{
_mainForm.PutCoreSyncSettings(_ss, _settable);
_settable.PutCoreSyncSettings(_ss);
}
DialogResult = DialogResult.OK;

View File

@ -42,7 +42,7 @@ namespace BizHawk.Client.EmuHawk
_syncSettings.Port1 = Port1ComboBox.SelectedItem.ToString();
_syncSettings.Port2 = Port2ComboBox.SelectedItem.ToString();
_mainForm.PutCoreSyncSettings(_syncSettings, _mainForm.GetSettingsAdapterForLoadedCore<Intellivision>());
_mainForm.GetSettingsAdapterForLoadedCore<Intellivision>().PutCoreSyncSettings(_syncSettings);
}
DialogResult = DialogResult.OK;

View File

@ -52,7 +52,7 @@ namespace BizHawk.Client.EmuHawk
_syncSettings.Controllers[c.ControllerNumber - 1].PakType = c.PakType;
});
_mainForm.PutCoreSyncSettings(_syncSettings, _mainForm.GetSettingsAdapterForLoadedCore<N64>());
_mainForm.GetSettingsAdapterForLoadedCore<N64>().PutCoreSyncSettings(_syncSettings);
DialogResult = DialogResult.OK;
Close();

View File

@ -124,8 +124,8 @@ namespace BizHawk.Client.EmuHawk
if (_emulator is N64)
{
var settable = _mainForm.GetSettingsAdapterForLoadedCore<N64>();
_mainForm.PutCoreSettings(_s, settable);
_mainForm.PutCoreSyncSettings(_ss, settable);
settable.PutCoreSettings(_s);
settable.PutCoreSyncSettings(_ss);
}
else
{

View File

@ -149,7 +149,7 @@ namespace BizHawk.Client.EmuHawk
_settings.BackgroundColor &= 0x00FFFFFF;
}
_mainForm.PutCoreSettings(_settings, _mainForm.GetSettingsAdapterForLoadedCore<NES>());
_mainForm.GetSettingsAdapterForLoadedCore<NES>().PutCoreSettings(_settings);
Close();
}

View File

@ -92,7 +92,7 @@ namespace BizHawk.Client.EmuHawk
DialogResult = DialogResult.OK;
if (changed)
{
_mainForm.PutCoreSyncSettings(_syncSettings, _mainForm.GetSettingsAdapterForLoadedCore<NES>());
_mainForm.GetSettingsAdapterForLoadedCore<NES>().PutCoreSyncSettings(_syncSettings);
}
}

View File

@ -42,7 +42,7 @@ namespace BizHawk.Client.EmuHawk
_settings.VSDipswitches.Dip_Switch_7 = Dipswitch7CheckBox.Checked;
_settings.VSDipswitches.Dip_Switch_8 = Dipswitch8CheckBox.Checked;
_mainForm.PutCoreSyncSettings(_settings, _mainForm.GetSettingsAdapterForLoadedCore<NES>());
_mainForm.GetSettingsAdapterForLoadedCore<NES>().PutCoreSyncSettings(_settings);
Close();
}

View File

@ -53,7 +53,7 @@ namespace BizHawk.Client.EmuHawk
if (changed)
{
_mainForm.PutCoreSyncSettings(_syncSettings, _mainForm.GetSettingsAdapterForLoadedCore<NES>());
_mainForm.GetSettingsAdapterForLoadedCore<NES>().PutCoreSyncSettings(_syncSettings);
}
DialogResult = DialogResult.OK;

View File

@ -106,7 +106,7 @@ namespace BizHawk.Client.EmuHawk
private void ButtonOk_Click(object sender, EventArgs e)
{
_mainForm.PutCoreSettings(_settings, _mainForm.GetSettingsAdapterForLoadedCore<QuickNES>());
_mainForm.GetSettingsAdapterForLoadedCore<QuickNES>().PutCoreSettings(_settings);
DialogResult = DialogResult.OK;
Close();
}

View File

@ -141,7 +141,7 @@ namespace BizHawk.Client.EmuHawk
private void BtnOk_Click(object sender, EventArgs e)
{
_syncSettings.FIOConfig = UserConfigFromGui();
_mainForm.PutCoreSyncSettings(_syncSettings, _mainForm.GetSettingsAdapterForLoadedCore<Octoshock>());
_mainForm.GetSettingsAdapterForLoadedCore<Octoshock>().PutCoreSyncSettings(_syncSettings);
DialogResult = DialogResult.OK;
Close();

View File

@ -126,8 +126,8 @@ namespace BizHawk.Client.EmuHawk
SyncSettingsFromGui(_settings, _syncSettings);
_settings.Validate();
var settable = _mainForm.GetSettingsAdapterForLoadedCore<Octoshock>();
_mainForm.PutCoreSettings(_settings, settable);
_mainForm.PutCoreSyncSettings(_syncSettings, settable);
settable.PutCoreSettings(_settings);
settable.PutCoreSyncSettings(_syncSettings);
DialogResult = DialogResult.OK;
Close();

View File

@ -257,7 +257,7 @@ namespace BizHawk.Client.EmuHawk
{
if (_emulator is TEmulator)
{
_mainForm.PutCoreSyncSettings(o, _mainForm.GetSettingsAdapterForLoadedCore<TEmulator>());
_mainForm.GetSettingsAdapterForLoadedCore<TEmulator>().PutCoreSyncSettings(o);
}
else
{

View File

@ -41,7 +41,7 @@ namespace BizHawk.Client.EmuHawk
_syncSettings.RightPort = (BsnesApi.BSNES_INPUT_DEVICE) Port2ComboBox.SelectedIndex;
_syncSettings.LimitAnalogChangeSensitivity = LimitAnalogChangeCheckBox.Checked;
_mainForm.PutCoreSyncSettings(_syncSettings, _mainForm.GetSettingsAdapterForLoadedCore<BsnesCore>());
_mainForm.GetSettingsAdapterForLoadedCore<BsnesCore>().PutCoreSyncSettings(_syncSettings);
}
DialogResult = DialogResult.OK;

View File

@ -66,8 +66,8 @@ namespace BizHawk.Client.EmuHawk
s.ShowBG4_1 = dlg.ShowBg4_1;
var settable = mainForm.GetSettingsAdapterForLoadedCore<BsnesCore>();
mainForm.PutCoreSettings(s, settable);
mainForm.PutCoreSyncSettings(ss, settable);
settable.PutCoreSettings(s);
settable.PutCoreSyncSettings(ss);
}
return result;
}

View File

@ -44,7 +44,7 @@ namespace BizHawk.Client.EmuHawk
_syncSettings.RightPort = (LibsnesControllerDeck.ControllerType)Enum.Parse(typeof(LibsnesControllerDeck.ControllerType), Port2ComboBox.SelectedItem.ToString());
_syncSettings.LimitAnalogChangeSensitivity = LimitAnalogChangeCheckBox.Checked;
_mainForm.PutCoreSyncSettings(_syncSettings, _mainForm.GetSettingsAdapterForLoadedCore<LibsnesCore>());
_mainForm.GetSettingsAdapterForLoadedCore<LibsnesCore>().PutCoreSyncSettings(_syncSettings);
}
DialogResult = DialogResult.OK;

View File

@ -49,8 +49,8 @@ namespace BizHawk.Client.EmuHawk
s.ShowBG4_0 = s.ShowBG4_1 = dlg.ShowBg4;
var settable = mainForm.GetSettingsAdapterForLoadedCore<LibsnesCore>();
mainForm.PutCoreSettings(s, settable);
mainForm.PutCoreSyncSettings(ss, settable);
settable.PutCoreSettings(s);
settable.PutCoreSyncSettings(ss);
}
return result;
}

View File

@ -32,7 +32,7 @@ namespace BizHawk.Client.EmuHawk
_settings.BGColor = (uint)BackgroundPanel.BackColor.ToArgb();
_settings.ForeColor = (uint)ForeGroundPanel.BackColor.ToArgb();
_mainForm.PutCoreSettings(_settings, _mainForm.GetSettingsAdapterForLoadedCore<TI83>());
_mainForm.GetSettingsAdapterForLoadedCore<TI83>().PutCoreSettings(_settings);
DialogResult = DialogResult.OK;
Close();

View File

@ -55,7 +55,7 @@ namespace BizHawk.Client.EmuHawk
_settings.EarVolume = earVolumetrackBar.Value;
_settings.AYVolume = ayVolumetrackBar.Value;
_mainForm.PutCoreSettings(_settings, _mainForm.GetSettingsAdapterForLoadedCore<ZXSpectrum>());
_mainForm.GetSettingsAdapterForLoadedCore<ZXSpectrum>().PutCoreSettings(_settings);
}
DialogResult = DialogResult.OK;
Close();

View File

@ -61,7 +61,7 @@ namespace BizHawk.Client.EmuHawk
_syncSettings.DeterministicEmulation = determEmucheckBox1.Checked;
_syncSettings.AutoLoadTape = autoLoadcheckBox1.Checked;
_mainForm.PutCoreSyncSettings(_syncSettings, _mainForm.GetSettingsAdapterForLoadedCore<ZXSpectrum>());
_mainForm.GetSettingsAdapterForLoadedCore<ZXSpectrum>().PutCoreSyncSettings(_syncSettings);
}
DialogResult = DialogResult.OK;
Close();

View File

@ -103,7 +103,7 @@ namespace BizHawk.Client.EmuHawk
_syncSettings.JoystickType2 = (JoystickType)Enum.Parse(typeof(JoystickType), Port2ComboBox.SelectedItem.ToString());
_syncSettings.JoystickType3 = (JoystickType)Enum.Parse(typeof(JoystickType), Port3ComboBox.SelectedItem.ToString());
_mainForm.PutCoreSyncSettings(_syncSettings, _mainForm.GetSettingsAdapterForLoadedCore<ZXSpectrum>());
_mainForm.GetSettingsAdapterForLoadedCore<ZXSpectrum>().PutCoreSyncSettings(_syncSettings);
DialogResult = DialogResult.OK;
Close();

View File

@ -58,7 +58,7 @@ namespace BizHawk.Client.EmuHawk
_settings.BackgroundColor = _bgColor;
_settings.UseCoreBorderForBackground = checkBoxShowCoreBrdColor.Checked;
_mainForm.PutCoreSettings(_settings, _mainForm.GetSettingsAdapterForLoadedCore<ZXSpectrum>());
_mainForm.GetSettingsAdapterForLoadedCore<ZXSpectrum>().PutCoreSettings(_settings);
DialogResult = DialogResult.OK;
Close();

View File

@ -71,8 +71,26 @@ namespace BizHawk.Emulation.Common
/// </summary>
public class SettingsAdapter
{
public SettingsAdapter(IEmulator emulator)
private readonly Action<PutSettingsDirtyBits> _handlePutCoreSettings;
private readonly Action<PutSettingsDirtyBits> _handlePutCoreSyncSettings;
private readonly Func<bool> _mayPutCoreSettings;
private readonly Func<bool> _mayPutCoreSyncSettings;
public SettingsAdapter(
IEmulator emulator,
Func<bool> mayPutCoreSettings,
Action<PutSettingsDirtyBits> handlePutCoreSettings,
Func<bool> mayPutCoreSyncSettings,
Action<PutSettingsDirtyBits> handlePutCoreSyncSettings)
{
_handlePutCoreSettings = handlePutCoreSettings;
_handlePutCoreSyncSettings = handlePutCoreSyncSettings;
_mayPutCoreSettings = mayPutCoreSettings;
_mayPutCoreSyncSettings = mayPutCoreSyncSettings;
var settableType = emulator.ServiceProvider.AvailableServices
.SingleOrDefault(t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(ISettable<,>));
if (settableType == null)
@ -139,26 +157,24 @@ namespace BizHawk.Emulation.Common
return _getss.Invoke(_settable, Empty);
}
/// <exception cref="InvalidOperationException">does not have non-sync settings</exception>
public PutSettingsDirtyBits PutSettings(object o)
public void PutCoreSettings(object s)
{
if (!HasSettings)
{
throw new InvalidOperationException();
}
if (HasSettings && _mayPutCoreSettings()) _handlePutCoreSettings(DoPutSettings(s));
}
public void PutCoreSyncSettings(object ss)
{
if (HasSyncSettings && _mayPutCoreSyncSettings()) _handlePutCoreSyncSettings(DoPutSyncSettings(ss));
}
private PutSettingsDirtyBits DoPutSettings(object o)
{
_tempObject[0] = o;
return (PutSettingsDirtyBits)_puts.Invoke(_settable, _tempObject);
}
/// <exception cref="InvalidOperationException">does not have sync settings</exception>
public PutSettingsDirtyBits PutSyncSettings(object o)
private PutSettingsDirtyBits DoPutSyncSettings(object o)
{
if (!HasSyncSettings)
{
throw new InvalidOperationException();
}
_tempObject[0] = o;
return (PutSettingsDirtyBits)_putss.Invoke(_settable, _tempObject);
}