diff --git a/osu.Game/Overlays/DragBar.cs b/osu.Game/Overlays/DragBar.cs deleted file mode 100644 index 89bb81c70b..0000000000 --- a/osu.Game/Overlays/DragBar.cs +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright (c) 2007-2017 ppy Pty Ltd . -// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE - -using System; -using osu.Framework.Graphics; -using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Transforms; -using osu.Framework.Input; -using OpenTK; -using osu.Framework.Graphics.Shapes; - -namespace osu.Game.Overlays -{ - public class DragBar : Container - { - protected readonly Container Fill; - - public Action SeekRequested; - - public bool IsSeeking { get; private set; } - - private bool enabled = true; - public bool IsEnabled - { - get { return enabled; } - set - { - enabled = value; - if (!enabled) - Fill.Width = 0; - } - } - - public DragBar() - { - RelativeSizeAxes = Axes.X; - - Children = new Drawable[] - { - Fill = new Container - { - Name = "FillContainer", - Origin = Anchor.BottomLeft, - Anchor = Anchor.BottomLeft, - RelativeSizeAxes = Axes.Both, - Width = 0, - Children = new Drawable[] - { - new Box - { - RelativeSizeAxes = Axes.Both - } - } - } - }; - } - - public void UpdatePosition(float position) - { - if (IsSeeking || !IsEnabled) return; - - updatePosition(position, false); - } - - private void seek(InputState state) - { - float seekLocation = state.Mouse.Position.X / DrawWidth; - - if (!IsEnabled) return; - - SeekRequested?.Invoke(seekLocation); - updatePosition(seekLocation); - } - - private void updatePosition(float position, bool easing = true) - { - position = MathHelper.Clamp(position, 0, 1); - Fill.TransformTo(position, easing ? 200 : 0, EasingTypes.OutQuint, new TransformSeek()); - } - - protected override bool OnMouseDown(InputState state, MouseDownEventArgs args) - { - seek(state); - return true; - } - - protected override bool OnDrag(InputState state) - { - seek(state); - return true; - } - - protected override bool OnDragStart(InputState state) => IsSeeking = true; - - protected override bool OnDragEnd(InputState state) - { - IsSeeking = false; - return true; - } - - private class TransformSeek : TransformFloat - { - public override void Apply(Drawable d) => d.Width = CurrentValue; - public override void ReadIntoStartValue(Drawable d) => StartValue = d.Width; - } - } -} diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs index baf58ae26c..0da425652a 100644 --- a/osu.Game/Overlays/MusicController.cs +++ b/osu.Game/Overlays/MusicController.cs @@ -14,6 +14,7 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Textures; +using osu.Framework.Graphics.UserInterface; using osu.Framework.Input; using osu.Framework.Localisation; using osu.Game.Beatmaps; @@ -39,7 +40,7 @@ namespace osu.Game.Overlays private const float bottom_black_area_height = 55; private Drawable currentBackground; - private DragBar progressBar; + private ProgressBar progressBar; private IconButton playButton; private IconButton playlistButton; @@ -187,13 +188,13 @@ namespace osu.Game.Overlays }, } }, - progressBar = new DragBar + progressBar = new ProgressBar { Origin = Anchor.BottomCentre, Anchor = Anchor.BottomCentre, Height = progress_height, - Colour = colours.Yellow, - SeekRequested = seek + FillColour = colours.Yellow, + OnSeek = progress => current?.Track.Seek(progress) } }, }, @@ -228,7 +229,9 @@ namespace osu.Game.Overlays { var track = current.Track; - progressBar.UpdatePosition(track.Length == 0 ? 0 : (float)(track.CurrentTime / track.Length)); + progressBar.EndTime = track.Length; + progressBar.CurrentTime = track.CurrentTime; + playButton.Icon = track.IsRunning ? FontAwesome.fa_pause_circle_o : FontAwesome.fa_play_circle_o; if (track.HasCompleted && !track.Looping) next(); @@ -274,13 +277,11 @@ namespace osu.Game.Overlays private void beatmapChanged(WorkingBeatmap beatmap) { - progressBar.IsEnabled = beatmap != null; - TransformDirection direction = TransformDirection.None; if (current != null) { - bool audioEquals = beatmapBacking.Value?.BeatmapInfo?.AudioEquals(current.BeatmapInfo) ?? false; + bool audioEquals = beatmap?.BeatmapInfo?.AudioEquals(current.BeatmapInfo) ?? false; if (audioEquals) direction = TransformDirection.None; @@ -293,15 +294,18 @@ namespace osu.Game.Overlays { //figure out the best direction based on order in playlist. var last = playlist.BeatmapSets.TakeWhile(b => b.ID != current.BeatmapSetInfo.ID).Count(); - var next = beatmapBacking.Value == null ? -1 : playlist.BeatmapSets.TakeWhile(b => b.ID != beatmapBacking.Value.BeatmapSetInfo.ID).Count(); + var next = beatmap == null ? -1 : playlist.BeatmapSets.TakeWhile(b => b.ID != beatmap.BeatmapSetInfo.ID).Count(); direction = last > next ? TransformDirection.Prev : TransformDirection.Next; } } - current = beatmapBacking.Value; + current = beatmap; + + progressBar.CurrentTime = 0; + + updateDisplay(current, direction); - updateDisplay(beatmapBacking, direction); queuedDirection = null; } @@ -360,12 +364,6 @@ namespace osu.Game.Overlays }); } - private void seek(float position) - { - var track = current?.Track; - track?.Seek(track.Length * position); - } - protected override void PopIn() { base.PopIn(); @@ -426,5 +424,49 @@ namespace osu.Game.Overlays sprite.Texture = beatmap?.Background ?? textures.Get(@"Backgrounds/bg4"); } } + + private class ProgressBar : SliderBar + { + public Action OnSeek; + + private readonly Box fill; + + public Color4 FillColour + { + set { fill.Colour = value; } + } + + public double EndTime + { + set { CurrentNumber.MaxValue = value; } + } + + public double CurrentTime + { + set { CurrentNumber.Value = value; } + } + + public ProgressBar() + { + CurrentNumber.MinValue = 0; + CurrentNumber.MaxValue = 1; + RelativeSizeAxes = Axes.X; + + Children = new Drawable[] + { + fill = new Box + { + RelativeSizeAxes = Axes.Y + } + }; + } + + protected override void UpdateValue(float value) + { + fill.Width = value * UsableWidth; + } + + protected override void OnUserChange() => OnSeek?.Invoke(Current); + } } } diff --git a/osu.Game/Screens/Play/SongProgress.cs b/osu.Game/Screens/Play/SongProgress.cs index e5b18292ab..ea91089aa4 100644 --- a/osu.Game/Screens/Play/SongProgress.cs +++ b/osu.Game/Screens/Play/SongProgress.cs @@ -12,7 +12,6 @@ using System.Linq; using osu.Framework.Timing; using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Objects.Types; - namespace osu.Game.Screens.Play { public class SongProgress : OverlayContainer @@ -50,6 +49,9 @@ namespace osu.Game.Screens.Play info.StartTime = firstHitTime; info.EndTime = lastHitTime; + + bar.StartTime = firstHitTime; + bar.EndTime = lastHitTime; } } @@ -89,10 +91,7 @@ namespace osu.Game.Screens.Play Alpha = 0, Anchor = Anchor.BottomLeft, Origin = Anchor.BottomLeft, - SeekRequested = delegate (float position) - { - OnSeek?.Invoke(firstHitTime + position * (lastHitTime - firstHitTime)); - }, + OnSeek = position => OnSeek?.Invoke(position), }, }; } @@ -144,11 +143,12 @@ namespace osu.Game.Screens.Play if (objects == null) return; - double progress = ((audioClock?.CurrentTime ?? Time.Current) - firstHitTime) / (lastHitTime - firstHitTime); + double position = audioClock?.CurrentTime ?? Time.Current; + double progress = (position - firstHitTime) / (lastHitTime - firstHitTime); if (progress < 1) { - bar.UpdatePosition((float)progress); + bar.CurrentTime = position; graph.Progress = (int)(graph.ColumnCount * progress); } } diff --git a/osu.Game/Screens/Play/SongProgressBar.cs b/osu.Game/Screens/Play/SongProgressBar.cs index 730cf471da..7fabf2e80e 100644 --- a/osu.Game/Screens/Play/SongProgressBar.cs +++ b/osu.Game/Screens/Play/SongProgressBar.cs @@ -1,74 +1,117 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE +using System; using OpenTK; using OpenTK.Graphics; -using osu.Game.Overlays; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics; using osu.Framework.Graphics.Shapes; +using osu.Framework.Graphics.UserInterface; namespace osu.Game.Screens.Play { - public class SongProgressBar : DragBar + public class SongProgressBar : SliderBar { + public Action OnSeek; + + private readonly Box fill; + private readonly Container handleBase; + public Color4 FillColour { - get { return Fill.Colour; } - set { Fill.Colour = value; } + set { fill.Colour = value; } + } + + public double StartTime + { + set { CurrentNumber.MinValue = value; } + } + + public double EndTime + { + set { CurrentNumber.MaxValue = value; } + } + + public double CurrentTime + { + set { CurrentNumber.Value = value; } } public SongProgressBar(float barHeight, float handleBarHeight, Vector2 handleSize) { + CurrentNumber.MinValue = 0; + CurrentNumber.MaxValue = 1; + + RelativeSizeAxes = Axes.X; Height = barHeight + handleBarHeight + handleSize.Y; - Fill.RelativeSizeAxes = Axes.X; - Fill.Height = barHeight; - - Add(new Box + Children = new Drawable[] { - Name = "Background", - Anchor = Anchor.BottomLeft, - Origin = Anchor.BottomLeft, - RelativeSizeAxes = Axes.X, - Height = barHeight, - Colour = Color4.Black, - Alpha = 0.5f, - Depth = 1 - }); - - Fill.Add(new Container - { - Origin = Anchor.BottomRight, - Anchor = Anchor.BottomRight, - Width = 2, - Height = barHeight + handleBarHeight, - Colour = Color4.White, - Position = new Vector2(2, 0), - Children = new Drawable[] + new Box { - new Box + Name = "Background", + Anchor = Anchor.BottomLeft, + Origin = Anchor.BottomLeft, + RelativeSizeAxes = Axes.X, + Height = barHeight, + Colour = Color4.Black, + Alpha = 0.5f, + Depth = 1, + }, + fill = new Box + { + Name = "Fill", + Anchor = Anchor.BottomLeft, + Origin = Anchor.BottomLeft, + Height = barHeight, + }, + handleBase = new Container + { + Name = "HandleBar container", + Origin = Anchor.BottomLeft, + Anchor = Anchor.BottomLeft, + Width = 2, + Height = barHeight + handleBarHeight, + Colour = Color4.White, + Position = new Vector2(2, 0), + Children = new Drawable[] { - RelativeSizeAxes = Axes.Both, - }, - new Container - { - Origin = Anchor.BottomCentre, - Anchor = Anchor.TopCentre, - Size = handleSize, - CornerRadius = 5, - Masking = true, - Children = new Drawable[] + new Box { - new Box + Name = "HandleBar box", + RelativeSizeAxes = Axes.Both, + }, + new Container + { + Name = "Handle container", + Origin = Anchor.BottomCentre, + Anchor = Anchor.TopCentre, + Size = handleSize, + CornerRadius = 5, + Masking = true, + Children = new Drawable[] { - RelativeSizeAxes = Axes.Both, - Colour = Color4.White + new Box + { + Name = "Handle box", + RelativeSizeAxes = Axes.Both, + Colour = Color4.White + } } } } } - }); + }; } + + protected override void UpdateValue(float value) + { + var xFill = value * UsableWidth; + fill.Width = xFill; + handleBase.MoveToX(xFill); + } + + protected override void OnUserChange() => OnSeek?.Invoke(Current); } } diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj index 55b0ee3348..42b5765a6d 100644 --- a/osu.Game/osu.Game.csproj +++ b/osu.Game/osu.Game.csproj @@ -230,7 +230,6 @@ - @@ -539,4 +538,4 @@ --> - \ No newline at end of file +