2020-03-17 16:25:24 +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.
2021-04-20 16:25:12 +08:00
using System ;
2020-03-17 16:25:24 +08:00
using System.Globalization ;
using osu.Framework.Allocation ;
2021-04-20 16:25:12 +08:00
using osu.Framework.Bindables ;
2020-03-17 17:01:46 +08:00
using osu.Framework.Extensions.Color4Extensions ;
2020-03-17 16:25:24 +08:00
using osu.Framework.Graphics ;
2020-03-17 17:01:46 +08:00
using osu.Framework.Graphics.Colour ;
2020-03-17 16:25:24 +08:00
using osu.Framework.Graphics.Containers ;
using osu.Framework.Graphics.Shapes ;
using osu.Framework.Graphics.Sprites ;
using osu.Game.Beatmaps ;
using osu.Game.Graphics ;
using osu.Game.Graphics.Containers ;
using osuTK ;
using osuTK.Graphics ;
namespace osu.Game.Screens.Ranking.Expanded
{
2020-03-17 16:34:16 +08:00
/// <summary>
/// A pill that displays the star rating of a <see cref="BeatmapInfo"/>.
/// </summary>
2020-03-17 16:25:24 +08:00
public class StarRatingDisplay : CompositeDrawable
{
2021-04-20 16:25:12 +08:00
private CircularContainer colorContainer ;
private OsuTextFlowContainer textContainer ;
private readonly StarDifficulty starDifficulty ;
private readonly IBindable < StarDifficulty ? > bindableStarDifficulty ;
2020-10-22 01:05:14 +08:00
/// <summary>
/// Creates a new <see cref="StarRatingDisplay"/> using an already computed <see cref="StarDifficulty"/>.
/// </summary>
/// <param name="starDifficulty">The already computed <see cref="StarDifficulty"/> to display the star difficulty of.</param>
public StarRatingDisplay ( StarDifficulty starDifficulty )
{
2021-04-20 16:25:12 +08:00
this . starDifficulty = starDifficulty ;
2020-03-17 16:25:24 +08:00
}
2021-04-20 16:25:12 +08:00
/// <summary>
/// Creates a new <see cref="StarRatingDisplay"/> using a binded nullable <see cref="StarDifficulty"/>.
/// </summary>
/// <param name="starDifficulty">The binded nullable <see cref="StarDifficulty"/> to display the star difficulty of. If <c>null</c>, a new instance of <see cref="StarDifficulty"/> will be created </param>
public StarRatingDisplay ( IBindable < StarDifficulty ? > starDifficulty )
2020-03-17 16:25:24 +08:00
{
2021-04-20 16:25:12 +08:00
bindableStarDifficulty = starDifficulty ;
}
2020-10-22 01:05:14 +08:00
2021-04-20 16:25:12 +08:00
private void setDifficulty ( OsuColour colours )
{
var difficulty = bindableStarDifficulty = = null ? starDifficulty : bindableStarDifficulty . Value ? ? new StarDifficulty ( ) ;
2020-10-23 13:57:27 +08:00
var starRatingParts = difficulty . Stars . ToString ( "0.00" , CultureInfo . InvariantCulture ) . Split ( '.' ) ;
2020-03-17 16:25:24 +08:00
string wholePart = starRatingParts [ 0 ] ;
string fractionPart = starRatingParts [ 1 ] ;
string separator = CultureInfo . CurrentCulture . NumberFormat . NumberDecimalSeparator ;
2020-10-23 13:57:27 +08:00
ColourInfo backgroundColour = difficulty . DifficultyRating = = DifficultyRating . ExpertPlus
2020-03-17 17:01:46 +08:00
? ColourInfo . GradientVertical ( Color4Extensions . FromHex ( "#C1C1C1" ) , Color4Extensions . FromHex ( "#595959" ) )
2020-10-23 13:57:27 +08:00
: ( ColourInfo ) colours . ForDifficultyRating ( difficulty . DifficultyRating ) ;
2020-03-17 17:01:46 +08:00
2021-04-20 16:25:12 +08:00
colorContainer . Colour = backgroundColour ;
textContainer . Text = string . Empty ;
textContainer . With ( t = >
{
t . AddText ( $"{wholePart}" , s = >
{
s . Colour = Color4 . Black ;
s . Font = s . Font . With ( size : 14 ) ;
s . UseFullGlyphHeight = false ;
} ) ;
t . AddText ( $"{separator}{fractionPart}" , s = >
{
s . Colour = Color4 . Black ;
s . Font = s . Font . With ( size : 7 ) ;
s . UseFullGlyphHeight = false ;
} ) ;
} ) ;
}
[BackgroundDependencyLoader]
private void load ( OsuColour colours , BeatmapDifficultyCache difficultyCache )
{
AutoSizeAxes = Axes . Both ;
2020-03-17 16:25:24 +08:00
InternalChildren = new Drawable [ ]
{
2021-04-20 16:25:12 +08:00
colorContainer = new CircularContainer
2020-03-17 16:25:24 +08:00
{
RelativeSizeAxes = Axes . Both ,
Masking = true ,
Children = new Drawable [ ]
{
new Box
{
RelativeSizeAxes = Axes . Both ,
} ,
}
} ,
new FillFlowContainer
{
AutoSizeAxes = Axes . Both ,
Padding = new MarginPadding { Horizontal = 8 , Vertical = 4 } ,
Direction = FillDirection . Horizontal ,
Spacing = new Vector2 ( 2 , 0 ) ,
Children = new Drawable [ ]
{
new SpriteIcon
{
Anchor = Anchor . CentreLeft ,
Origin = Anchor . CentreLeft ,
Size = new Vector2 ( 7 ) ,
Icon = FontAwesome . Solid . Star ,
Colour = Color4 . Black
} ,
2021-04-20 16:25:12 +08:00
textContainer = new OsuTextFlowContainer ( s = > s . Font = OsuFont . Numeric . With ( weight : FontWeight . Black ) )
2020-03-17 16:25:24 +08:00
{
Anchor = Anchor . CentreLeft ,
Origin = Anchor . CentreLeft ,
AutoSizeAxes = Axes . Both ,
Direction = FillDirection . Horizontal ,
TextAnchor = Anchor . BottomLeft ,
2021-04-20 16:25:12 +08:00
} ,
2020-03-17 16:25:24 +08:00
}
}
} ;
2021-04-20 16:25:12 +08:00
if ( bindableStarDifficulty ! = null )
{
bindableStarDifficulty . BindValueChanged ( _ = > setDifficulty ( colours ) ) ;
}
setDifficulty ( colours ) ;
2020-03-17 16:25:24 +08:00
}
}
}