2019-01-24 16:43:03 +08:00
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
2018-04-13 17:19:50 +08:00
using System ;
using osu.Framework.Graphics ;
2018-11-20 15:51:59 +08:00
using osuTK ;
2018-04-13 17:19:50 +08:00
namespace osu.Game.Skinning
{
public class SkinnableDrawable : SkinnableDrawable < Drawable >
{
public SkinnableDrawable ( string name , Func < string , Drawable > defaultImplementation , Func < ISkinSource , bool > allowFallback = null , bool restrictSize = true )
: base ( name , defaultImplementation , allowFallback , restrictSize )
{
}
}
2019-06-24 14:25:01 +08:00
/// <summary>
/// A drawable which can be skinned via an <see cref="ISkinSource"/>.
/// </summary>
/// <typeparam name="T">The type of drawable.</typeparam>
2018-04-13 17:19:50 +08:00
public class SkinnableDrawable < T > : SkinReloadableDrawable
where T : Drawable
{
2018-09-27 16:33:27 +08:00
/// <summary>
/// The displayed component. May or may not be a type-<typeparamref name="T"/> member.
/// </summary>
2018-09-27 15:27:11 +08:00
protected Drawable Drawable { get ; private set ; }
2018-04-13 17:19:50 +08:00
private readonly string componentName ;
private readonly bool restrictSize ;
/// <summary>
2019-06-24 14:25:01 +08:00
/// Create a new skinnable drawable.
2018-04-13 17:19:50 +08:00
/// </summary>
/// <param name="name">The namespace-complete resource name for this skinnable element.</param>
/// <param name="defaultImplementation">A function to create the default skin implementation of this element.</param>
/// <param name="allowFallback">A conditional to decide whether to allow fallback to the default implementation if a skinned element is not present.</param>
/// <param name="restrictSize">Whether a user-skin drawable should be limited to the size of our parent.</param>
2018-09-27 15:27:11 +08:00
public SkinnableDrawable ( string name , Func < string , T > defaultImplementation , Func < ISkinSource , bool > allowFallback = null , bool restrictSize = true )
2019-06-24 13:39:20 +08:00
: this ( name , allowFallback , restrictSize )
{
createDefault = defaultImplementation ;
}
protected SkinnableDrawable ( string name , Func < ISkinSource , bool > allowFallback = null , bool restrictSize = true )
2018-09-27 15:27:11 +08:00
: base ( allowFallback )
2018-04-13 17:19:50 +08:00
{
componentName = name ;
this . restrictSize = restrictSize ;
RelativeSizeAxes = Axes . Both ;
}
2019-06-24 14:27:46 +08:00
private readonly Func < string , T > createDefault ;
protected virtual T CreateDefault ( string name ) = > createDefault ( name ) ;
2019-06-24 14:25:01 +08:00
/// <summary>
/// Whether to apply size restrictions (specified via <see cref="restrictSize"/>) to the default implementation.
/// </summary>
protected virtual bool ApplySizeRestrictionsToDefault = > false ;
2019-06-24 13:39:20 +08:00
2018-04-13 17:19:50 +08:00
protected override void SkinChanged ( ISkinSource skin , bool allowFallback )
{
2018-09-27 15:27:11 +08:00
Drawable = skin . GetDrawableComponent ( componentName ) ;
2019-06-24 13:39:20 +08:00
bool isDefault = false ;
if ( Drawable = = null & & allowFallback )
{
Drawable = CreateDefault ( componentName ) ;
isDefault = true ;
}
2018-09-27 15:27:11 +08:00
if ( Drawable ! = null )
2018-04-13 17:19:50 +08:00
{
2019-06-24 14:25:01 +08:00
if ( restrictSize & & ( ! isDefault | | ApplySizeRestrictionsToDefault ) )
2018-04-13 17:19:50 +08:00
{
2018-09-27 15:27:11 +08:00
Drawable . RelativeSizeAxes = Axes . Both ;
Drawable . Size = Vector2 . One ;
Drawable . Scale = Vector2 . One ;
Drawable . FillMode = FillMode . Fit ;
2018-04-13 17:19:50 +08:00
}
2018-09-27 15:27:11 +08:00
Drawable . Origin = Anchor . Centre ;
Drawable . Anchor = Anchor . Centre ;
2018-04-13 17:19:50 +08:00
2018-09-27 15:27:11 +08:00
InternalChild = Drawable ;
2018-04-13 17:19:50 +08:00
}
else
ClearInternal ( ) ;
}
}
}