2018-12-11 07:12:34 +00:00
using Microsoft.Xna.Framework ;
using Microsoft.Xna.Framework.Graphics ;
using RecrownedAthenaeum.DataTypes ;
using RecrownedAthenaeum.UI.Skin.Definitions ;
using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Text ;
using System.Threading.Tasks ;
namespace RecrownedAthenaeum.UI.Skin
{
public class Skin
{
2018-12-14 06:43:38 +00:00
public readonly TextureAtlas textureAtlas ;
public readonly Dictionary < string , Color > colors ;
public readonly Dictionary < string , SpriteFont > fonts ;
2018-12-11 07:12:34 +00:00
Dictionary < Type , Dictionary < string , ISkinDefinition > > definitions ;
public Skin ( TextureAtlas textureAtlas )
{
this . textureAtlas = textureAtlas ;
colors = new Dictionary < string , Color > ( ) ;
fonts = new Dictionary < string , SpriteFont > ( ) ;
definitions = new Dictionary < Type , Dictionary < string , ISkinDefinition > > ( ) ;
}
2018-12-12 02:03:35 +00:00
public void Draw ( string regionName , string color , SpriteBatch batch , Rectangle destination , Type type , float rotation = 0 , Vector2 origin = default ( Vector2 ) )
2018-12-11 07:12:34 +00:00
{
2018-12-12 02:03:35 +00:00
textureAtlas . Draw ( regionName , batch , destination , colors [ color ] , rotation , origin ) ;
}
2018-12-14 06:43:38 +00:00
/// <summary>
/// Returns an <see cref="ISkinDefinition"/> of the given name and type.
/// </summary>
/// <param name="definitionName">Name of definition of the <paramref name="type"/></param>
/// <param name="type">The UIModule the definition defines.</param>
/// <returns>The interface for the definition.</returns>
2018-12-12 02:03:35 +00:00
public ISkinDefinition ObtainDefinition ( string definitionName , Type type )
{
2018-12-14 06:43:38 +00:00
if ( definitionName = = null ) definitionName = "default" ;
if ( ! definitions . ContainsKey ( type ) | | ! definitions [ type ] . ContainsKey ( definitionName ) ) throw new ArgumentException ( "Could not find skin of type " + type . Name + " with name " + definitionName ) ;
2018-12-12 02:03:35 +00:00
return definitions [ type ] [ definitionName ] ;
}
2018-12-14 06:43:38 +00:00
/// <summary>
/// Returns the default <see cref="ISkinDefinition"/> of the given parameters.
/// </summary>
/// <param name="type">The type of definition the default should be coming from.</param>
/// <returns>The default definition for the given type.</returns>
public ISkinDefinition ObtainDefinition ( Type type )
2018-12-12 02:03:35 +00:00
{
2018-12-14 06:43:38 +00:00
return ObtainDefinition ( null , type ) ;
}
/// <summary>
/// Returns the proper definition for the given parameters or throws exception in the case the requested definition does not exist.
/// </summary>
/// <typeparam name="T">Convenience to cast to the needed definition type.</typeparam>
/// <param name="definitionName">The name of the definition.</param>
/// <param name="type">UIModule type the definition defines.</param>
/// <returns>The definition cast to T.</returns>
public T ObtainDefinition < T > ( string definitionName , Type type ) where T : ISkinDefinition
{
if ( definitionName = = null ) definitionName = "default" ;
return ( T ) ObtainDefinition ( definitionName , type ) ;
}
/// <summary>
/// Returns the default definition.
/// </summary>
/// <typeparam name="T">Convenience to cast to T.</typeparam>
/// <param name="type">The type of the UIModule to retrieve the default from.</param>
/// <returns>The default definition for the given type.</returns>
public T ObtainDefinition < T > ( Type type ) where T : ISkinDefinition
{
return ObtainDefinition < T > ( null , type ) ;
2018-12-11 07:12:34 +00:00
}
public void AddDefinition ( string definitionName , ISkinDefinition skinDefinition )
{
if ( ! definitions . ContainsKey ( skinDefinition . UIModuleType ) )
{
definitions . Add ( skinDefinition . UIModuleType , new Dictionary < string , ISkinDefinition > ( ) ) ;
} else if ( definitions [ skinDefinition . UIModuleType ] . ContainsKey ( definitionName ) ) throw new ArgumentException ( "Type of definition with that name already exists!" ) ;
definitions [ skinDefinition . UIModuleType ] . Add ( definitionName , skinDefinition ) ;
}
public void RemoveDefinition ( string definitionName , Type definitionType )
{
if ( definitions . ContainsKey ( definitionType ) & & definitions [ definitionType ] . ContainsKey ( definitionName ) )
{
definitions [ definitionType ] . Remove ( definitionName ) ;
} else
{
throw new ArgumentException ( "a definition of type " + definitionType . Name + " with a name of " + definitionName + " does not exist." ) ;
}
}
}
}