From 3da01dbfce9345f4f2a09fb7045be534a9ece3db Mon Sep 17 00:00:00 2001 From: YoshiRulz Date: Thu, 25 Mar 2021 16:02:22 +1000 Subject: [PATCH] Init LuaFileList/LuaFunctionList outside platform impl. and pass in now init'ing the lists at construction instead of mutating them afterwards --- src/BizHawk.Client.Common/lua/LuaFileList.cs | 10 ++++++++- .../lua/LuaFunctionList.cs | 10 ++++----- .../tools/Lua/LuaConsole.cs | 21 +++++++++++++------ .../tools/Lua/UnixLuaLibraries.cs | 12 +++++++---- .../tools/Lua/Win32LuaLibraries.cs | 8 +++++-- 5 files changed, 43 insertions(+), 18 deletions(-) diff --git a/src/BizHawk.Client.Common/lua/LuaFileList.cs b/src/BizHawk.Client.Common/lua/LuaFileList.cs index f39ff73303..98077973bd 100644 --- a/src/BizHawk.Client.Common/lua/LuaFileList.cs +++ b/src/BizHawk.Client.Common/lua/LuaFileList.cs @@ -9,7 +9,8 @@ namespace BizHawk.Client.Common { private bool _changes; - public Action ChangedCallback { get; set; } + private readonly Action ChangedCallback; + public bool Changes { get => _changes; @@ -25,6 +26,13 @@ namespace BizHawk.Client.Common public string Filename { get; set; } = ""; + /// will not be called when initialising from given , only on subsequent mutations + public LuaFileList(IReadOnlyCollection collection, Action onChanged) + { + ChangedCallback = onChanged; + if (collection != null) AddRange(collection); // doesn't actually trigger callback as the superclass' Add is called; if this class is rewritten without `new` methods, something clever will need to be done, like a bool field _initialised + } + public void StopAllScripts() { ForEach(lf => lf.State = LuaFile.RunState.Disabled); diff --git a/src/BizHawk.Client.Common/lua/LuaFunctionList.cs b/src/BizHawk.Client.Common/lua/LuaFunctionList.cs index 6a232d103c..e294182b31 100644 --- a/src/BizHawk.Client.Common/lua/LuaFunctionList.cs +++ b/src/BizHawk.Client.Common/lua/LuaFunctionList.cs @@ -10,10 +10,12 @@ namespace BizHawk.Client.Common public class LuaFunctionList : IEnumerable { private readonly List _functions = new List(); - - public Action ChangedCallback { get; set; } - public NamedLuaFunction this[string guid] => + private readonly Action Changed; + + public LuaFunctionList(Action onChanged) => Changed = onChanged; + + public NamedLuaFunction this[string guid] => _functions.FirstOrDefault(nlf => nlf.Guid.ToString() == guid); public void Add(NamedLuaFunction nlf) @@ -77,7 +79,5 @@ namespace BizHawk.Client.Common public IEnumerator GetEnumerator() => _functions.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => _functions.GetEnumerator(); - - private void Changed() => ChangedCallback?.Invoke(); } } diff --git a/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs b/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs index c67801fb28..08da0e8276 100644 --- a/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs +++ b/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs @@ -224,13 +224,22 @@ namespace BizHawk.Client.EmuHawk } } - var currentScripts = LuaImp?.ScriptList; // Temp fix for now + LuaFileList newScripts = new(LuaImp?.ScriptList, onChanged: SessionChangedCallback); + LuaFunctionList registeredFuncList = new(onChanged: UpdateRegisteredFunctionsDialog); LuaImp = OSTailoredCode.IsUnixHost - ? new UnixLuaLibraries() - : new Win32LuaLibraries(Emulator.ServiceProvider, (MainForm) MainForm, DisplayManager, InputManager, Config, Emulator, Game); - LuaImp.ScriptList.AddRange(currentScripts ?? Enumerable.Empty()); - LuaImp.ScriptList.ChangedCallback = SessionChangedCallback; - LuaImp.RegisteredFunctions.ChangedCallback = UpdateRegisteredFunctionsDialog; + ? new UnixLuaLibraries( + newScripts, + registeredFuncList) + : new Win32LuaLibraries( + newScripts, + registeredFuncList, + Emulator.ServiceProvider, + (MainForm) MainForm, //HACK + DisplayManager, + InputManager, + Config, + Emulator, + Game); InputBox.AutoCompleteCustomSource.AddRange(LuaImp.Docs.Select(a => $"{a.Library}.{a.Name}").ToArray()); diff --git a/src/BizHawk.Client.EmuHawk/tools/Lua/UnixLuaLibraries.cs b/src/BizHawk.Client.EmuHawk/tools/Lua/UnixLuaLibraries.cs index 91b2af748c..ec6aeb7cce 100644 --- a/src/BizHawk.Client.EmuHawk/tools/Lua/UnixLuaLibraries.cs +++ b/src/BizHawk.Client.EmuHawk/tools/Lua/UnixLuaLibraries.cs @@ -11,8 +11,6 @@ namespace BizHawk.Client.EmuHawk /// public sealed class UnixLuaLibraries : IPlatformLuaLibEnv { - private static readonly LuaFunctionList EmptyLuaFunList = new LuaFunctionList(); - public LuaDocumentation Docs { get; } = new LuaDocumentation(); public string EngineName => null; @@ -21,9 +19,15 @@ namespace BizHawk.Client.EmuHawk public bool IsUpdateSupressed { get; set; } - public LuaFunctionList RegisteredFunctions => EmptyLuaFunList; + public LuaFunctionList RegisteredFunctions { get; } - public LuaFileList ScriptList { get; } = new LuaFileList(); + public LuaFileList ScriptList { get; } + + public UnixLuaLibraries(LuaFileList scriptList, LuaFunctionList registeredFuncList) + { + RegisteredFunctions = registeredFuncList; + ScriptList = scriptList; + } public void CallLoadStateEvent(string name) {} diff --git a/src/BizHawk.Client.EmuHawk/tools/Lua/Win32LuaLibraries.cs b/src/BizHawk.Client.EmuHawk/tools/Lua/Win32LuaLibraries.cs index f1335a4a2e..52e6890e16 100644 --- a/src/BizHawk.Client.EmuHawk/tools/Lua/Win32LuaLibraries.cs +++ b/src/BizHawk.Client.EmuHawk/tools/Lua/Win32LuaLibraries.cs @@ -16,6 +16,8 @@ namespace BizHawk.Client.EmuHawk public class Win32LuaLibraries : IPlatformLuaLibEnv { public Win32LuaLibraries( + LuaFileList scriptList, + LuaFunctionList registeredFuncList, IEmulatorServiceProvider serviceProvider, MainForm mainForm, IDisplayManagerForApi displayManager, @@ -47,6 +49,8 @@ namespace BizHawk.Client.EmuHawk _inputManager = inputManager; _mainForm = mainForm; LuaWait = new AutoResetEvent(false); + RegisteredFunctions = registeredFuncList; + ScriptList = scriptList; Docs.Clear(); _apiContainer = ApiManager.RestartLua(serviceProvider, LogToLuaConsole, _mainForm, _displayManager, _inputManager, _mainForm.MovieSession, _mainForm.Tools, config, emulator, game); @@ -137,7 +141,7 @@ namespace BizHawk.Client.EmuHawk private EventWaitHandle LuaWait; - public LuaFileList ScriptList { get; } = new LuaFileList(); + public LuaFileList ScriptList { get; } private static void LogToLuaConsole(object outputs) => _logToLuaConsoleCallback(new[] { outputs }); @@ -159,7 +163,7 @@ namespace BizHawk.Client.EmuHawk public bool FrameAdvanceRequested { get; private set; } - public LuaFunctionList RegisteredFunctions { get; } = new LuaFunctionList(); + public LuaFunctionList RegisteredFunctions { get; } public void CallSaveStateEvent(string name) {