// Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Timing; using osu.Game.Graphics; using osu.Game.Graphics.Sprites; using System; namespace osu.Game.Screens.Play { public class SongProgressInfo : Container { private OsuSpriteText timeCurrent; private OsuSpriteText timeLeft; private OsuSpriteText progress; private double startTime; private double endTime; private int? previousPercent; private int? previousSecond; private double songLength => endTime - startTime; private const int margin = 10; public IClock AudioClock; public double StartTime { set { startTime = value; } } public double EndTime { set { endTime = value; } } [BackgroundDependencyLoader] private void load(OsuColour colours) { Children = new Drawable[] { timeCurrent = new OsuSpriteText { Origin = Anchor.BottomLeft, Anchor = Anchor.BottomLeft, Colour = colours.BlueLighter, Font = @"Venera", Margin = new MarginPadding { Left = margin, }, }, progress = new OsuSpriteText { Origin = Anchor.BottomCentre, Anchor = Anchor.BottomCentre, Colour = colours.BlueLighter, Font = @"Venera", }, timeLeft = new OsuSpriteText { Origin = Anchor.BottomRight, Anchor = Anchor.BottomRight, Colour = colours.BlueLighter, Font = @"Venera", Margin = new MarginPadding { Right = margin, }, } }; } protected override void Update() { base.Update(); double songCurrentTime = AudioClock.CurrentTime - startTime; int currentPercent = Math.Max(0, Math.Min(100, (int)(songCurrentTime / songLength * 100))); int currentSecond = (int)Math.Floor(songCurrentTime / 1000.0); if (currentPercent != previousPercent) { progress.Text = currentPercent.ToString() + @"%"; previousPercent = currentPercent; } if (currentSecond != previousSecond && songCurrentTime < songLength) { timeCurrent.Text = TimeSpan.FromSeconds(currentSecond).ToString(songCurrentTime < 0 ? @"\-m\:ss" : @"m\:ss"); timeLeft.Text = TimeSpan.FromMilliseconds(endTime - AudioClock.CurrentTime).ToString(@"\-m\:ss"); previousSecond = currentSecond; } } } }