From ce2242a979e900b19e7e3394f8ed2d4f02af9d11 Mon Sep 17 00:00:00 2001 From: Jai Sharma Date: Thu, 22 Jun 2017 16:32:50 +0100 Subject: [PATCH 1/8] Removed dragbar from MusicController --- osu.Game/Overlays/MusicController.cs | 73 +++++++++++++++++++++++----- 1 file changed, 60 insertions(+), 13 deletions(-) diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs index e1e920ec0f..35a683d1d4 100644 --- a/osu.Game/Overlays/MusicController.cs +++ b/osu.Game/Overlays/MusicController.cs @@ -8,12 +8,14 @@ using System.Threading.Tasks; using OpenTK; using OpenTK.Graphics; using osu.Framework.Allocation; +using osu.Framework.Audio.Track; using osu.Framework.Configuration; using osu.Framework.Extensions.Color4Extensions; 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; @@ -38,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; @@ -183,13 +185,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) } }, }, @@ -224,7 +226,7 @@ namespace osu.Game.Overlays { var track = current.Track; - progressBar.UpdatePosition(track.Length == 0 ? 0 : (float)(track.CurrentTime / track.Length)); + progressBar.Progress = track.CurrentTime; playButton.Icon = track.IsRunning ? FontAwesome.fa_pause_circle_o : FontAwesome.fa_play_circle_o; if (track.HasCompleted && !track.Looping) next(); @@ -266,8 +268,6 @@ namespace osu.Game.Overlays private void beatmapChanged(WorkingBeatmap beatmap) { - progressBar.IsEnabled = beatmap != null; - TransformDirection direction = TransformDirection.None; if (current != null) @@ -293,10 +293,19 @@ namespace osu.Game.Overlays current = beatmapBacking.Value; + updateProgressBar(current?.Track); updateDisplay(beatmapBacking, direction); queuedDirection = null; } + private void updateProgressBar(Track t) + { + if (t?.IsLoaded ?? false) + progressBar.EndTime = t.Length; + else if (t != null) + t.OnLoaded += loadedTrack => progressBar.EndTime = loadedTrack.Length; + } + private ScheduledDelegate pendingBeatmapSwitch; private void updateDisplay(WorkingBeatmap beatmap, TransformDirection direction) @@ -352,12 +361,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(); @@ -417,5 +420,49 @@ namespace osu.Game.Overlays sprite.Texture = beatmap?.Background ?? textures.Get(@"Backgrounds/bg4"); } } + + private class ProgressBar : SliderBar + { + public Action OnSeek; + + private Box fill; + + public Color4 FillColour + { + set { fill.Colour = value; } + } + + public double EndTime + { + set { CurrentNumber.MaxValue = value; } + } + + public double Progress + { + 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); + } } } From 73c004fb71e9334ba6b6512b09098edac2350f8b Mon Sep 17 00:00:00 2001 From: Jai Sharma Date: Thu, 22 Jun 2017 17:42:29 +0100 Subject: [PATCH 2/8] Removed DragBar from song progress --- osu.Game/Overlays/DragBar.cs | 110 ------------------- osu.Game/Overlays/MusicController.cs | 6 +- osu.Game/Screens/Play/SongProgress.cs | 13 +-- osu.Game/Screens/Play/SongProgressBar.cs | 128 +++++++++++++++-------- osu.Game/osu.Game.csproj | 3 +- 5 files changed, 97 insertions(+), 163 deletions(-) delete mode 100644 osu.Game/Overlays/DragBar.cs diff --git a/osu.Game/Overlays/DragBar.cs b/osu.Game/Overlays/DragBar.cs deleted file mode 100644 index 07e0c76396..0000000000 --- a/osu.Game/Overlays/DragBar.cs +++ /dev/null @@ -1,110 +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(() => Fill.Width, 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) - { - base.Apply(d); - d.Width = CurrentValue; - } - } - } -} diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs index 35a683d1d4..8e9ac22925 100644 --- a/osu.Game/Overlays/MusicController.cs +++ b/osu.Game/Overlays/MusicController.cs @@ -226,7 +226,7 @@ namespace osu.Game.Overlays { var track = current.Track; - progressBar.Progress = track.CurrentTime; + progressBar.CurrentTime = track.CurrentTime; playButton.Icon = track.IsRunning ? FontAwesome.fa_pause_circle_o : FontAwesome.fa_play_circle_o; if (track.HasCompleted && !track.Looping) next(); @@ -437,7 +437,7 @@ namespace osu.Game.Overlays set { CurrentNumber.MaxValue = value; } } - public double Progress + public double CurrentTime { set { CurrentNumber.Value = value; } } @@ -445,7 +445,7 @@ namespace osu.Game.Overlays public ProgressBar() { CurrentNumber.MinValue = 0; - CurrentNumber.MaxValue = 1; + CurrentNumber.MinValue = 1; RelativeSizeAxes = Axes.X; Children = new Drawable[] diff --git a/osu.Game/Screens/Play/SongProgress.cs b/osu.Game/Screens/Play/SongProgress.cs index e5b18292ab..5fc83eddb4 100644 --- a/osu.Game/Screens/Play/SongProgress.cs +++ b/osu.Game/Screens/Play/SongProgress.cs @@ -50,6 +50,9 @@ namespace osu.Game.Screens.Play info.StartTime = firstHitTime; info.EndTime = lastHitTime; + + bar.StartTime = firstHitTime; + bar.EndTime = lastHitTime; } } @@ -89,10 +92,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 => this.OnSeek?.Invoke(position), }, }; } @@ -144,11 +144,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..84928f437a 100644 --- a/osu.Game/Screens/Play/SongProgressBar.cs +++ b/osu.Game/Screens/Play/SongProgressBar.cs @@ -1,74 +1,118 @@ // 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 Box fill; + private Box background; + private 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[] + background = 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 45dc47f842..4646eeb79d 100644 --- a/osu.Game/osu.Game.csproj +++ b/osu.Game/osu.Game.csproj @@ -214,7 +214,6 @@ - @@ -517,4 +516,4 @@ --> - \ No newline at end of file + From 62aae899fa6333c906d302cf23d115d98a705518 Mon Sep 17 00:00:00 2001 From: Jai Sharma Date: Thu, 22 Jun 2017 19:03:31 +0100 Subject: [PATCH 3/8] Fixed non-assigned MaxValue --- osu.Game/Overlays/MusicController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs index 8e9ac22925..aec5e03b8f 100644 --- a/osu.Game/Overlays/MusicController.cs +++ b/osu.Game/Overlays/MusicController.cs @@ -445,7 +445,7 @@ namespace osu.Game.Overlays public ProgressBar() { CurrentNumber.MinValue = 0; - CurrentNumber.MinValue = 1; + CurrentNumber.MaxValue = 1; RelativeSizeAxes = Axes.X; Children = new Drawable[] From a327f49d68b72c8dd5fe322244c450a3a2721e66 Mon Sep 17 00:00:00 2001 From: Jai Sharma Date: Fri, 23 Jun 2017 18:24:46 +0100 Subject: [PATCH 4/8] Updating progressBar.EndTime is more thread safe --- osu.Game/Overlays/MusicController.cs | 15 ++++++++++----- osu.Game/Screens/Play/SongProgress.cs | 3 +-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs index aec5e03b8f..c9bbb97032 100644 --- a/osu.Game/Overlays/MusicController.cs +++ b/osu.Game/Overlays/MusicController.cs @@ -293,17 +293,22 @@ namespace osu.Game.Overlays current = beatmapBacking.Value; - updateProgressBar(current?.Track); + updateProgressBarLimit(current?.Track); updateDisplay(beatmapBacking, direction); queuedDirection = null; } - private void updateProgressBar(Track t) + private void updateProgressBarLimit(Track t) { - if (t?.IsLoaded ?? false) - progressBar.EndTime = t.Length; - else if (t != null) + if (t != null) + { t.OnLoaded += loadedTrack => progressBar.EndTime = loadedTrack.Length; + if (t.IsLoaded) + { + progressBar.EndTime = t.Length; + t.OnLoaded = null; + } + } } private ScheduledDelegate pendingBeatmapSwitch; diff --git a/osu.Game/Screens/Play/SongProgress.cs b/osu.Game/Screens/Play/SongProgress.cs index 5fc83eddb4..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 @@ -92,7 +91,7 @@ namespace osu.Game.Screens.Play Alpha = 0, Anchor = Anchor.BottomLeft, Origin = Anchor.BottomLeft, - OnSeek = position => this.OnSeek?.Invoke(position), + OnSeek = position => OnSeek?.Invoke(position), }, }; } From e16b646014e41262a797a4cdcad17e7d76aea3ab Mon Sep 17 00:00:00 2001 From: Jai Sharma Date: Sat, 24 Jun 2017 09:14:55 +0100 Subject: [PATCH 5/8] Add readonly to fill --- osu.Game/Overlays/MusicController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs index c9bbb97032..72e2e3a36a 100644 --- a/osu.Game/Overlays/MusicController.cs +++ b/osu.Game/Overlays/MusicController.cs @@ -430,7 +430,7 @@ namespace osu.Game.Overlays { public Action OnSeek; - private Box fill; + private readonly Box fill; public Color4 FillColour { From a0262e32b1fb2a4fadf96da3c87d158619562f34 Mon Sep 17 00:00:00 2001 From: Jai Sharma Date: Sat, 24 Jun 2017 09:15:53 +0100 Subject: [PATCH 6/8] CI Fixes --- osu.Game/Screens/Play/SongProgressBar.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/osu.Game/Screens/Play/SongProgressBar.cs b/osu.Game/Screens/Play/SongProgressBar.cs index 84928f437a..7fabf2e80e 100644 --- a/osu.Game/Screens/Play/SongProgressBar.cs +++ b/osu.Game/Screens/Play/SongProgressBar.cs @@ -15,9 +15,8 @@ namespace osu.Game.Screens.Play { public Action OnSeek; - private Box fill; - private Box background; - private Container handleBase; + private readonly Box fill; + private readonly Container handleBase; public Color4 FillColour { @@ -49,7 +48,7 @@ namespace osu.Game.Screens.Play Children = new Drawable[] { - background = new Box + new Box { Name = "Background", Anchor = Anchor.BottomLeft, From 82217be9886beff7bd8bf2ae7eb0b5928eb05464 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 18 Jul 2017 15:24:45 +0900 Subject: [PATCH 7/8] Fix dodgy event clearing Also use local ariables where possible. --- osu.Game/Overlays/MusicController.cs | 33 +++++++++++++--------------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs index 2149be09dd..47d305aecd 100644 --- a/osu.Game/Overlays/MusicController.cs +++ b/osu.Game/Overlays/MusicController.cs @@ -8,7 +8,6 @@ using System.Threading.Tasks; using OpenTK; using OpenTK.Graphics; using osu.Framework.Allocation; -using osu.Framework.Audio.Track; using osu.Framework.Configuration; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; @@ -280,7 +279,7 @@ namespace osu.Game.Overlays 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,30 +292,28 @@ 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; - updateProgressBarLimit(current?.Track); - updateDisplay(beatmapBacking, direction); - queuedDirection = null; - } - - private void updateProgressBarLimit(Track t) - { - if (t != null) + var track = current?.Track; + if (track != null) { - t.OnLoaded += loadedTrack => progressBar.EndTime = loadedTrack.Length; - if (t.IsLoaded) - { - progressBar.EndTime = t.Length; - t.OnLoaded = null; - } + // the track may not be loaded at this point + track.OnLoaded += loadedTrack => Schedule(() => progressBar.EndTime = loadedTrack.Length); + + if (track.IsLoaded) + // but it also may be. + progressBar.EndTime = track.Length; } + + updateDisplay(beatmap, direction); + + queuedDirection = null; } private ScheduledDelegate pendingBeatmapSwitch; From 4b4b03756a1a8ee0b40f4d647b108ae9bcd53cd2 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 18 Jul 2017 15:36:05 +0900 Subject: [PATCH 8/8] Don't use dodgy OnLoaded "event" --- osu.Game/Overlays/MusicController.cs | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs index 47d305aecd..0da425652a 100644 --- a/osu.Game/Overlays/MusicController.cs +++ b/osu.Game/Overlays/MusicController.cs @@ -229,7 +229,9 @@ namespace osu.Game.Overlays { var track = current.Track; + 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(); @@ -300,18 +302,9 @@ namespace osu.Game.Overlays current = beatmap; - var track = current?.Track; - if (track != null) - { - // the track may not be loaded at this point - track.OnLoaded += loadedTrack => Schedule(() => progressBar.EndTime = loadedTrack.Length); + progressBar.CurrentTime = 0; - if (track.IsLoaded) - // but it also may be. - progressBar.EndTime = track.Length; - } - - updateDisplay(beatmap, direction); + updateDisplay(current, direction); queuedDirection = null; }