diff --git a/BizHawk.Client.EmuHawk/tools/ToolManager.cs b/BizHawk.Client.EmuHawk/tools/ToolManager.cs index edd74c8b74..69e49593c8 100644 --- a/BizHawk.Client.EmuHawk/tools/ToolManager.cs +++ b/BizHawk.Client.EmuHawk/tools/ToolManager.cs @@ -36,6 +36,10 @@ namespace BizHawk.Client.EmuHawk } var result = Get(); + + UpdateDependencies(result); + result.Restart(); + result.Show(); return result; } @@ -68,6 +72,19 @@ namespace BizHawk.Client.EmuHawk return attribute.Dependencies; } + /// + /// Feeds the tool its required services. + /// + private void UpdateDependencies(IToolForm tool) + { + var serviceSet = new Dictionary(); + + foreach (var service in GetDependencies(tool.GetType())) + serviceSet[service] = Global.Emulator.ServiceProvider.GetService(service); + + tool.EmulatorServices = serviceSet; + } + /// /// Determines whether a tool is available, considering its dependencies /// and the services provided by the emulator core. @@ -181,7 +198,26 @@ namespace BizHawk.Client.EmuHawk Global.CheatList.NewList(GenerateDefaultCheatFilename(), autosave: true); } - _tools.ForEach(x => x.Restart()); + var unavailable = new List(); + + foreach (var tool in _tools) + { + if (IsAvailable(tool.GetType())) + { + UpdateDependencies(tool); + tool.Restart(); + } + else + { + unavailable.Add(tool); + } + } + + foreach (var tool in unavailable) + { + tool.Close(); + _tools.Remove(tool); + } } ///