Contextualization of external tools + Basic of ClientApi

We can now specify a context for external tools. Global, specific for a
type of emulator / system or specific for a game (If not specified, a
tool is global).  It should avoid loading something unwanted.

Also add ClientApi, a static class that can interract with EmuHawk
window (SetPadding is the only thing implemented currently).
This commit is contained in:
Hathor86 2016-03-16 23:06:53 +01:00
parent d05ddabf5f
commit c0f7219b06
9 changed files with 235 additions and 12 deletions

View File

@ -0,0 +1,72 @@
using System;
namespace BizHawk.Client.ApiHawk
{
/// <summary>
/// This class hold logic interraction for the BizHawkExternalToolUsageAttribute
/// This attribute helps ApiHawk to know how a tool can be enabled or not
/// </summary>
[AttributeUsage(AttributeTargets.Assembly)]
public sealed class BizHawkExternalToolUsageAttribute : Attribute
{
#region Fields
private BizHawkExternalToolUsage _ToolUsage;
private string _Parameter;
#endregion
#region cTor(s)
/// <summary>
/// Initialize a new instance of <see cref="BizHawkExternalToolUsageAttribute"/>
/// </summary>
/// <param name="usage"><see cref="BizHawkExternalToolUsage"/> i.e. what your external tool is for</param>
/// <param name="parameter">The parameter; either emulator type or game hash depending of what you want to do</param>
public BizHawkExternalToolUsageAttribute(BizHawkExternalToolUsage usage, string parameter)
{
_ToolUsage = usage;
if(usage != BizHawkExternalToolUsage.Global && parameter.Trim() == string.Empty)
{
throw new InvalidOperationException("You must specify the parameter. Either emulator type or game hash depending of what you want to do");
}
_Parameter = parameter;
}
/// <summary>
/// Initialize a new instance of <see cref="BizHawkExternalToolUsageAttribute"/>
/// </summary>
public BizHawkExternalToolUsageAttribute()
:this(BizHawkExternalToolUsage.Global, string.Empty)
{ }
#endregion
#region Properties
/// <summary>
/// Gets the tool usage
/// </summary>
public BizHawkExternalToolUsage ToolUsage
{
get
{
return _ToolUsage;
}
}
/// <summary>
/// Gets the parameter (Emulator or Game hash)
/// </summary>
public string Parameter
{
get
{
return _Parameter;
}
}
#endregion
}
}

View File

@ -96,7 +96,10 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Attributes\BizHawkExternalToolUsageAttribute.cs" />
<Compile Include="Attributes\ExternalToolAttribute.cs" />
<Compile Include="Classes\BizHawkExternalToolUsage.cs" />
<Compile Include="Classes\ClientApi.cs" />
<Compile Include="Classes\ExternalToolManager.cs" />
<Compile Include="Interfaces\IExternalToolForm.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />

View File

@ -0,0 +1,21 @@
namespace BizHawk.Client.ApiHawk
{
/// <summary>
/// This enum describe how an external tool is handled
/// </summary>
public enum BizHawkExternalToolUsage : short
{
/// <summary>
/// General usage, works even with null emulator
/// </summary>
Global = 0,
/// <summary>
/// Specific to an emulator (NES,SNES,etc...)
/// </summary>
EmulatorSpecific = 1,
/// <summary>
/// Specific to a Game
/// </summary>
GameSpecific = 2
}
}

View File

@ -0,0 +1,88 @@
using System;
using System.Reflection;
namespace BizHawk.Client.ApiHawk
{
/// <summary>
/// This class contains some methods that
/// interract with BizHawk client
/// </summary>
public static class ClientApi
{
#region Fields
private static readonly Assembly clientAssembly;
public static event EventHandler RomLoaded;
#endregion
#region cTor(s)
static ClientApi()
{
clientAssembly = Assembly.GetEntryAssembly();
}
#endregion
#region Methods
/// <summary>
/// Raise when a rom is successfully Loaded
/// </summary>
public static void OnRomLoaded()
{
if(RomLoaded != null)
{
RomLoaded(null, EventArgs.Empty);
}
}
/// <summary>
/// Sets the extra padding added to the 'native' surface so that you can draw HUD elements in predictable placements
/// </summary>
/// <param name="left">Left padding</param>
/// <param name="top">Top padding</param>
/// <param name="right">Right padding</param>
/// <param name="bottom">Bottom padding</param>
public static void SetExtraPadding(int left, int top, int right, int bottom)
{
Type emuLuaLib = clientAssembly.GetType("BizHawk.Client.EmuHawk.EmuHawkLuaLibrary");
MethodInfo paddingMethod = emuLuaLib.GetMethod("SetClientExtraPadding");
paddingMethod.Invoke(paddingMethod, new object[] { left, top, right, bottom });
}
/// <summary>
/// Sets the extra padding added to the 'native' surface so that you can draw HUD elements in predictable placements
/// </summary>
/// <param name="left">Left padding</param>
public static void SetExtraPadding(int left)
{
SetExtraPadding(left, 0, 0, 0);
}
/// <summary>
/// Sets the extra padding added to the 'native' surface so that you can draw HUD elements in predictable placements
/// </summary>
/// <param name="left">Left padding</param>
/// <param name="top">Top padding</param>
public static void SetExtraPadding(int left, int top)
{
SetExtraPadding(left, top, 0, 0);
}
/// <summary>
/// Sets the extra padding added to the 'native' surface so that you can draw HUD elements in predictable placements
/// </summary>
/// <param name="left">Left padding</param>
/// <param name="top">Top padding</param>
/// <param name="right">Right padding</param>
public static void SetExtraPadding(int left, int top, int right)
{
SetExtraPadding(left, top, right, 0);
}
#endregion
}
}

View File

@ -8,7 +8,6 @@ using System.Reflection;
using System.Windows.Forms;
using BizHawk.Client.Common;
using BizHawk.Client.EmuHawk;
namespace BizHawk.Client.ApiHawk
{
@ -42,6 +41,8 @@ namespace BizHawk.Client.ApiHawk
directoryMonitor.Created += new FileSystemEventHandler(DirectoryMonitor_Created);
directoryMonitor.EnableRaisingEvents = true;
ClientApi.RomLoaded += delegate { BuildToolStrip(); };
BuildToolStrip();
}
@ -105,6 +106,27 @@ namespace BizHawk.Client.ApiHawk
item.Enabled = false;
}
item.Tag = fileName;
attributes = externalToolFile.GetCustomAttributes(typeof(BizHawkExternalToolUsageAttribute), false);
if (attributes != null && attributes.Count() == 1)
{
BizHawkExternalToolUsageAttribute attribute2 = (BizHawkExternalToolUsageAttribute)attributes[0];
if(Global.Emulator.SystemId == "NULL" && attribute2.ToolUsage != BizHawkExternalToolUsage.Global)
{
item.ToolTipText = "This tool doesn't work if nothing is loaded";
item.Enabled = false;
}
else if(attribute2.ToolUsage == BizHawkExternalToolUsage.EmulatorSpecific && Global.Emulator.SystemId != attribute2.Parameter)
{
item.ToolTipText = "This tool doesn't work for current system";
item.Enabled = false;
}
else if (attribute2.ToolUsage == BizHawkExternalToolUsage.GameSpecific && Global.Game.Hash != attribute2.Parameter)
{
item.ToolTipText = "This tool doesn't work for current game";
item.Enabled = false;
}
}
}
else
{

View File

@ -1,16 +1,10 @@
using System;
using System.Windows.Forms;
namespace BizHawk.Client.EmuHawk
namespace BizHawk.Client.EmuHawk
{
/// <summary>
/// Interface to implements in order to make a custom tool
/// </summary>
public interface IExternalToolForm : IToolForm
{
/// <summary>
/// <see cref="FormClosedEventHandler"/>
/// </summary>
event FormClosedEventHandler FormClosed;
}
}

View File

@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyVersion("1.1.0.0")]
[assembly: AssemblyFileVersion("1.1.0.0")]

View File

@ -50,10 +50,24 @@
<FileName>Attributes\ExternalToolAttribute.cs</FileName>
</TypeIdentifier>
</Class>
<Class Name="BizHawk.Client.ApiHawk.ClientApi">
<Position X="4.75" Y="10" Width="4" />
<TypeIdentifier>
<HashCode>AAEAAAAAAAAAAAAAAAAAQAIAAAAAACAAAAAAAAAAAAA=</HashCode>
<FileName>Classes\ClientApi.cs</FileName>
</TypeIdentifier>
</Class>
<Class Name="BizHawk.Client.ApiHawk.BizHawkExternalToolUsageAttribute">
<Position X="11" Y="5.75" Width="5.75" />
<TypeIdentifier>
<HashCode>AIAAAAAAEAAAAAAAAAAAAAAAAAAQAACAAAAAAAAAAAA=</HashCode>
<FileName>Attributes\BizHawkExternalToolUsageAttribute.cs</FileName>
</TypeIdentifier>
</Class>
<Interface Name="BizHawk.Client.EmuHawk.IExternalToolForm">
<Position X="4.5" Y="4.5" Width="2.75" />
<TypeIdentifier>
<HashCode>gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
<HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
<FileName>Interfaces\IExternalToolForm.cs</FileName>
</TypeIdentifier>
</Interface>
@ -77,5 +91,12 @@
<Position X="28.5" Y="1" Width="1.5" />
<TypeIdentifier />
</Enum>
<Enum Name="BizHawk.Client.ApiHawk.BizHawkExternalToolUsage">
<Position X="28.25" Y="7.25" Width="2.25" />
<TypeIdentifier>
<HashCode>AAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAgAAAABAAA=</HashCode>
<FileName>Classes\BizHawkExternalToolUsage.cs</FileName>
</TypeIdentifier>
</Enum>
<Font Name="Segoe UI" Size="9" />
</ClassDiagram>

View File

@ -3492,6 +3492,7 @@ namespace BizHawk.Client.EmuHawk
Console.WriteLine(" {0} : {1}", f.FirmwareId, f.Hash);
}
}
ApiHawk.ClientApi.OnRomLoaded();
return true;
}
else
@ -3502,6 +3503,7 @@ namespace BizHawk.Client.EmuHawk
//The ROM has been loaded by a recursive invocation of the LoadROM method.
if (!(Global.Emulator is NullEmulator))
{
ApiHawk.ClientApi.OnRomLoaded();
return true;
}