// Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using System.Collections.Generic; using System.Linq; using osu.Framework.Configuration; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.UserInterface; using osu.Game.Graphics.Sprites; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.UI; using OpenTK; namespace osu.Game.Screens.Play.HUD { public class ModDisplay : Container, IHasCurrentValue> { private readonly Bindable> mods = new Bindable>(); private bool showMods; public bool ShowMods { get { return showMods; } set { showMods = value; if (!showMods) Hide(); else Show(); } } public Bindable> Current => mods; private readonly FillFlowContainer iconsContainer; public ModDisplay() { Children = new Drawable[] { iconsContainer = new IconFlow { Anchor = Anchor.TopCentre, Origin = Anchor.TopCentre, AutoSizeAxes = Axes.Both, Direction = FillDirection.Horizontal, Margin = new MarginPadding { Left = 10, Right = 10 }, }, new OsuSpriteText { Anchor = Anchor.BottomCentre, Origin = Anchor.TopCentre, Text = @"/ UNRANKED /", Font = @"Venera", TextSize = 12, } }; mods.ValueChanged += mods => { iconsContainer.Clear(); foreach (Mod mod in mods) { iconsContainer.Add(new ModIcon(mod) { AutoSizeAxes = Axes.Both, Scale = new Vector2(0.6f), }); } if (IsLoaded) appearTransform(); }; } protected override void LoadComplete() { base.LoadComplete(); appearTransform(); } private void appearTransform() { iconsContainer.Flush(); iconsContainer.FadeInFromZero(1000, EasingTypes.OutQuint); iconsContainer.TransformSpacingTo(new Vector2(5, 0)); using (iconsContainer.BeginDelayedSequence(1200)) iconsContainer.TransformSpacingTo(new Vector2(-25, 0), 500, EasingTypes.OutQuint); } private class IconFlow : FillFlowContainer { // just reverses the depth of flow contents. protected override IComparer DepthComparer => new ReverseCreationOrderDepthComparer(); protected override IEnumerable FlowingChildren => base.FlowingChildren.Reverse(); } } }