diff --git a/src/BizHawk.Client.EmuHawk/tools/ToolBox.cs b/src/BizHawk.Client.EmuHawk/tools/ToolBox.cs
index 15938d8f38..ba1cfd4fde 100644
--- a/src/BizHawk.Client.EmuHawk/tools/ToolBox.cs
+++ b/src/BizHawk.Client.EmuHawk/tools/ToolBox.cs
@@ -59,21 +59,21 @@ namespace BizHawk.Client.EmuHawk
foreach (var t in tools)
{
- var instance = Activator.CreateInstance(t);
-
+ var wasLoaded = Tools.Has(t);
+ var instance = (Form) Tools.Load(t, focus: false);
var tsb = new ToolStripButton
{
- Image = ((Form) instance).Icon.ToBitmap(),
- Text = ((Form) instance).Text,
- DisplayStyle = ((Form) instance).ShowIcon ? ToolStripItemDisplayStyle.Image : ToolStripItemDisplayStyle.Text
+ Image = instance.Icon.ToBitmap(),
+ Text = instance.Text,
+ DisplayStyle = instance.ShowIcon ? ToolStripItemDisplayStyle.Image : ToolStripItemDisplayStyle.Text
};
-
+ if (!wasLoaded) instance.Dispose();
tsb.Click += (o, e) =>
{
- Tools.Load(t);
+ if (wasLoaded) instance.Focus(); // instance refers to already opened tool, focus it
+ else Tools.Load(t); // instance was new and has been disposed by now
Close();
};
-
ToolBoxStrip.Items.Add(tsb);
}
}
diff --git a/src/BizHawk.Client.EmuHawk/tools/ToolManager.cs b/src/BizHawk.Client.EmuHawk/tools/ToolManager.cs
index 37363923f5..26deba23c4 100644
--- a/src/BizHawk.Client.EmuHawk/tools/ToolManager.cs
+++ b/src/BizHawk.Client.EmuHawk/tools/ToolManager.cs
@@ -487,6 +487,11 @@ namespace BizHawk.Client.EmuHawk
return _tools.Any(t => t is T && t.IsActive);
}
+ /// iff a tool of the given is active
+ public bool Has(Type toolType)
+ => typeof(IToolForm).IsAssignableFrom(toolType)
+ && _tools.Any(t => toolType.IsInstanceOfType(t) && t.IsActive);
+
///
/// Gets the instance of T, or creates and returns a new instance
///