2018-12-11 07:12:34 +00:00
using Microsoft.Xna.Framework ;
using Microsoft.Xna.Framework.Graphics ;
2019-01-15 23:33:55 +00:00
using RecrownedAthenaeum.SpecialTypes ;
2018-12-11 07:12:34 +00:00
using RecrownedAthenaeum.UI.Skin.Definitions ;
using System ;
using System.Collections.Generic ;
namespace RecrownedAthenaeum.UI.Skin
{
2019-01-14 06:34:35 +00:00
/// <summary>
/// A skin is used to group a theme which can then be applied to the UI via the use of modules.
/// </summary>
2018-12-11 07:12:34 +00:00
public class Skin
{
2019-01-14 06:34:35 +00:00
/// <summary>
/// Texture atlas containing the skins textures.
/// </summary>
2018-12-14 06:43:38 +00:00
public readonly TextureAtlas textureAtlas ;
2019-01-14 06:34:35 +00:00
/// <summary>
/// Colors stored in this skin.
/// </summary>
2018-12-14 06:43:38 +00:00
public readonly Dictionary < string , Color > colors ;
2019-01-16 01:34:02 +00:00
2019-01-15 23:03:17 +00:00
Dictionary < Type , Dictionary < string , ISkinDefinitionData > > definitions ;
2018-12-11 07:12:34 +00:00
2019-01-14 06:34:35 +00:00
/// <summary>
2019-01-14 07:26:46 +00:00
/// Creates a basic unfilled skin.
2019-01-14 06:34:35 +00:00
/// </summary>
2019-01-14 07:26:46 +00:00
/// <param name="textureAtlas">The texture atlas to use for this skin.</param>
2018-12-11 07:12:34 +00:00
public Skin ( TextureAtlas textureAtlas )
{
this . textureAtlas = textureAtlas ;
colors = new Dictionary < string , Color > ( ) ;
2019-01-15 23:03:17 +00:00
definitions = new Dictionary < Type , Dictionary < string , ISkinDefinitionData > > ( ) ;
2018-12-11 07:12:34 +00:00
}
2019-01-14 07:26:46 +00:00
/// <summary>
/// Draws a region from the texture atlas.
/// </summary>
/// <param name="regionName">Region to draw.</param>
/// <param name="color">The color to tint the region.</param>
/// <param name="batch">The batch to use.</param>
/// <param name="destination">The destination to draw to.</param>
/// <param name="rotation">The rotation to use in radians.</param>
/// <param name="origin">The origin for the rotation.</param>
public void Draw ( string regionName , string color , SpriteBatch batch , Rectangle destination , 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>
2019-01-15 23:03:17 +00:00
/// Returns an <see cref="ISkinDefinitionData"/> of the given name and type.
2018-12-14 06:43:38 +00:00
/// </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>
2019-01-15 23:03:17 +00:00
public ISkinDefinitionData ObtainDefinition ( string definitionName , Type type )
2018-12-12 02:03:35 +00:00
{
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>
2019-01-15 23:03:17 +00:00
/// Returns the default <see cref="ISkinDefinitionData"/> of the given parameters.
2018-12-14 06:43:38 +00:00
/// </summary>
/// <param name="type">The type of definition the default should be coming from.</param>
/// <returns>The default definition for the given type.</returns>
2019-01-15 23:03:17 +00:00
public ISkinDefinitionData 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>
2019-01-15 23:03:17 +00:00
public T ObtainDefinition < T > ( string definitionName , Type type ) where T : ISkinDefinitionData
2018-12-14 06:43:38 +00:00
{
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>
2019-01-15 23:03:17 +00:00
public T ObtainDefinition < T > ( Type type ) where T : ISkinDefinitionData
2018-12-14 06:43:38 +00:00
{
return ObtainDefinition < T > ( null , type ) ;
2018-12-11 07:12:34 +00:00
}
2019-01-14 07:26:46 +00:00
/// <summary>
/// Adds the definition.
/// </summary>
/// <param name="definitionName">The name of the definition.</param>
/// <param name="skinDefinition">The definition itself.</param>
2019-01-15 23:03:17 +00:00
public void AddDefinition ( string definitionName , ISkinDefinitionData skinDefinition )
2018-12-11 07:12:34 +00:00
{
if ( ! definitions . ContainsKey ( skinDefinition . UIModuleType ) )
{
2019-01-15 23:03:17 +00:00
definitions . Add ( skinDefinition . UIModuleType , new Dictionary < string , ISkinDefinitionData > ( ) ) ;
2018-12-11 07:12:34 +00:00
} else if ( definitions [ skinDefinition . UIModuleType ] . ContainsKey ( definitionName ) ) throw new ArgumentException ( "Type of definition with that name already exists!" ) ;
definitions [ skinDefinition . UIModuleType ] . Add ( definitionName , skinDefinition ) ;
}
2019-01-14 07:26:46 +00:00
/// <summary>
/// Removes the definition.
/// </summary>
/// <param name="definitionName">The name of the definition.</param>
/// <param name="definitionType">The type of the definition.</param>
2018-12-11 07:12:34 +00:00
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." ) ;
}
}
}
}