From 1548c0dc25d192b5c3faeb802f4b7f07f68bef9e Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 10 Nov 2020 07:27:27 +0900 Subject: [PATCH 01/13] Ensure graph hover state is updated after data changes --- .../Overlays/Profile/Header/Components/RankGraph.cs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/osu.Game/Overlays/Profile/Header/Components/RankGraph.cs b/osu.Game/Overlays/Profile/Header/Components/RankGraph.cs index ffc060b3f1..51a13a1231 100644 --- a/osu.Game/Overlays/Profile/Header/Components/RankGraph.cs +++ b/osu.Game/Overlays/Profile/Header/Components/RankGraph.cs @@ -94,13 +94,18 @@ namespace osu.Game.Overlays.Profile.Header.Components } graph.FadeTo(ranks.Length > 1 ? 1 : 0, fade_duration, Easing.Out); + + if (IsHovered) + graph.UpdateBallPosition(lastHoverPosition); } + private float lastHoverPosition; + protected override bool OnHover(HoverEvent e) { if (ranks?.Length > 1) { - graph.UpdateBallPosition(e.MousePosition.X); + graph.UpdateBallPosition(lastHoverPosition = e.MousePosition.X); graph.ShowBar(); } @@ -117,11 +122,7 @@ namespace osu.Game.Overlays.Profile.Header.Components protected override void OnHoverLost(HoverLostEvent e) { - if (ranks?.Length > 1) - { - graph.HideBar(); - } - + graph.HideBar(); base.OnHoverLost(e); } From 37feedae7a5226c41d2c4cf9ea27d37bce88d3f8 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 10 Nov 2020 07:27:38 +0900 Subject: [PATCH 02/13] Fix potential crash due to stale index --- .../Overlays/Profile/Header/Components/RankGraph.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/osu.Game/Overlays/Profile/Header/Components/RankGraph.cs b/osu.Game/Overlays/Profile/Header/Components/RankGraph.cs index 51a13a1231..ffa918e4e8 100644 --- a/osu.Game/Overlays/Profile/Header/Components/RankGraph.cs +++ b/osu.Game/Overlays/Profile/Header/Components/RankGraph.cs @@ -30,7 +30,7 @@ namespace osu.Game.Overlays.Profile.Header.Components private readonly OsuSpriteText placeholder; private KeyValuePair[] ranks; - private int dayIndex; + private int hoveredIndex = -1; public readonly Bindable Statistics = new Bindable(); public RankGraph() @@ -55,7 +55,7 @@ namespace osu.Game.Overlays.Profile.Header.Components } }; - graph.OnBallMove += i => dayIndex = i; + graph.OnBallMove += i => hoveredIndex = i; } [BackgroundDependencyLoader] @@ -74,6 +74,7 @@ namespace osu.Game.Overlays.Profile.Header.Components private void updateStatistics(UserStatistics statistics) { placeholder.FadeIn(fade_duration, Easing.Out); + hoveredIndex = -1; if (statistics?.Ranks.Global == null) { @@ -201,14 +202,14 @@ namespace osu.Game.Overlays.Profile.Header.Components { get { - if (Statistics.Value?.Ranks.Global == null) + if (ranks == null || hoveredIndex == -1) return null; - var days = ranked_days - ranks[dayIndex].Key + 1; + var days = ranked_days - ranks[hoveredIndex].Key + 1; return new TooltipDisplayContent { - Rank = $"#{ranks[dayIndex].Value:#,##0}", + Rank = $"#{ranks[hoveredIndex].Value:#,##0}", Time = days == 0 ? "now" : $"{days} days ago" }; } From a2ef3aa21a5aec1565347af57be37e4564acb5f3 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 10 Nov 2020 16:26:30 +0900 Subject: [PATCH 03/13] Force beatmap listing overlay's textbox back on screen when a key is pressed Not the cleanest solution, but works for now. Will eventually be replaced after the header is updated to reflect the latest designs (which keeps it on screen in all cases). Closes https://github.com/ppy/osu/issues/10703. --- .../BeatmapListingFilterControl.cs | 10 +++++++++- .../BeatmapListingSearchControl.cs | 19 +++++++++++++++++++ osu.Game/Overlays/BeatmapListingOverlay.cs | 7 +++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/osu.Game/Overlays/BeatmapListing/BeatmapListingFilterControl.cs b/osu.Game/Overlays/BeatmapListing/BeatmapListingFilterControl.cs index 3be38e3c1d..d991dcfcfb 100644 --- a/osu.Game/Overlays/BeatmapListing/BeatmapListingFilterControl.cs +++ b/osu.Game/Overlays/BeatmapListing/BeatmapListingFilterControl.cs @@ -32,6 +32,11 @@ namespace osu.Game.Overlays.BeatmapListing /// public Action SearchStarted; + /// + /// Any time the search text box receives key events (even while masked). + /// + public Action TypingStarted; + /// /// True when pagination has reached the end of available results. /// @@ -82,7 +87,10 @@ namespace osu.Game.Overlays.BeatmapListing Radius = 3, Offset = new Vector2(0f, 1f), }, - Child = searchControl = new BeatmapListingSearchControl(), + Child = searchControl = new BeatmapListingSearchControl + { + TypingStarted = () => TypingStarted?.Invoke() + } }, new Container { diff --git a/osu.Game/Overlays/BeatmapListing/BeatmapListingSearchControl.cs b/osu.Game/Overlays/BeatmapListing/BeatmapListingSearchControl.cs index 3694c9855e..758781bb7d 100644 --- a/osu.Game/Overlays/BeatmapListing/BeatmapListingSearchControl.cs +++ b/osu.Game/Overlays/BeatmapListing/BeatmapListingSearchControl.cs @@ -1,12 +1,14 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using System; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Shapes; using osuTK; using osu.Framework.Bindables; +using osu.Framework.Input.Events; using osu.Game.Beatmaps.Drawables; using osu.Game.Beatmaps; using osu.Game.Graphics.Containers; @@ -19,6 +21,11 @@ namespace osu.Game.Overlays.BeatmapListing { public class BeatmapListingSearchControl : CompositeDrawable { + /// + /// Any time the text box receives key events (even while masked). + /// + public Action TypingStarted; + public Bindable Query => textBox.Current; public Bindable Ruleset => modeFilter.Current; @@ -102,6 +109,7 @@ namespace osu.Game.Overlays.BeatmapListing textBox = new BeatmapSearchTextBox { RelativeSizeAxes = Axes.X, + TypingStarted = () => TypingStarted?.Invoke(), }, new ReverseChildIDFillFlowContainer { @@ -138,12 +146,23 @@ namespace osu.Game.Overlays.BeatmapListing private class BeatmapSearchTextBox : SearchTextBox { + /// + /// Any time the text box receives key events (even while masked). + /// + public Action TypingStarted; + protected override Color4 SelectionColour => Color4.Gray; public BeatmapSearchTextBox() { PlaceholderText = @"type in keywords..."; } + + protected override bool OnKeyDown(KeyDownEvent e) + { + TypingStarted?.Invoke(); + return base.OnKeyDown(e); + } } } } diff --git a/osu.Game/Overlays/BeatmapListingOverlay.cs b/osu.Game/Overlays/BeatmapListingOverlay.cs index 144af91145..1e29e713af 100644 --- a/osu.Game/Overlays/BeatmapListingOverlay.cs +++ b/osu.Game/Overlays/BeatmapListingOverlay.cs @@ -68,6 +68,7 @@ namespace osu.Game.Overlays Header, filterControl = new BeatmapListingFilterControl { + TypingStarted = onTypingStarted, SearchStarted = onSearchStarted, SearchFinished = onSearchFinished, }, @@ -102,6 +103,12 @@ namespace osu.Game.Overlays }; } + private void onTypingStarted() + { + // temporary until the textbox/header is updated to always stay on screen. + resultScrollContainer.ScrollToStart(); + } + protected override void OnFocus(FocusEvent e) { base.OnFocus(e); From 5221a34929719a84562ddafe8c24dc304a0cba90 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 10 Nov 2020 16:32:58 +0900 Subject: [PATCH 04/13] Only handle keys which create characters --- .../Overlays/BeatmapListing/BeatmapListingSearchControl.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/osu.Game/Overlays/BeatmapListing/BeatmapListingSearchControl.cs b/osu.Game/Overlays/BeatmapListing/BeatmapListingSearchControl.cs index 758781bb7d..e232bf045f 100644 --- a/osu.Game/Overlays/BeatmapListing/BeatmapListingSearchControl.cs +++ b/osu.Game/Overlays/BeatmapListing/BeatmapListingSearchControl.cs @@ -160,8 +160,11 @@ namespace osu.Game.Overlays.BeatmapListing protected override bool OnKeyDown(KeyDownEvent e) { + if (!base.OnKeyDown(e)) + return false; + TypingStarted?.Invoke(); - return base.OnKeyDown(e); + return true; } } } From 109abc0e2945adfa60c35a78e9ddde27d82066a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 10 Nov 2020 08:27:59 +0100 Subject: [PATCH 05/13] Always store standardised score when populating ScoreInfo --- osu.Game/Rulesets/Scoring/ScoreProcessor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Rulesets/Scoring/ScoreProcessor.cs b/osu.Game/Rulesets/Scoring/ScoreProcessor.cs index 33271d9689..499673619f 100644 --- a/osu.Game/Rulesets/Scoring/ScoreProcessor.cs +++ b/osu.Game/Rulesets/Scoring/ScoreProcessor.cs @@ -290,7 +290,7 @@ namespace osu.Game.Rulesets.Scoring /// public virtual void PopulateScore(ScoreInfo score) { - score.TotalScore = (long)Math.Round(TotalScore.Value); + score.TotalScore = (long)Math.Round(GetStandardisedScore()); score.Combo = Combo.Value; score.MaxCombo = HighestCombo.Value; score.Accuracy = Math.Round(Accuracy.Value, 4); From a012105dac4ca9af9f1d7d4548857eaba7c69892 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 10 Nov 2020 16:54:33 +0900 Subject: [PATCH 06/13] Fix editor quick delete being triggerable from left mouse button Closes https://github.com/ppy/osu/issues/10629. --- .../Edit/Compose/Components/BlueprintContainer.cs | 2 +- .../Edit/Compose/Components/SelectionHandler.cs | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs b/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs index e7da220946..d5306c3450 100644 --- a/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs +++ b/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs @@ -303,7 +303,7 @@ namespace osu.Game.Screens.Edit.Compose.Components { if (blueprint.IsHovered) { - selectedPerformed &= SelectionHandler.HandleSelectionRequested(blueprint, e.CurrentState); + selectedPerformed &= SelectionHandler.HandleSelectionRequested(blueprint, e); clickSelectionBegan = true; break; } diff --git a/osu.Game/Screens/Edit/Compose/Components/SelectionHandler.cs b/osu.Game/Screens/Edit/Compose/Components/SelectionHandler.cs index 0bbbfaf5e8..21810379cc 100644 --- a/osu.Game/Screens/Edit/Compose/Components/SelectionHandler.cs +++ b/osu.Game/Screens/Edit/Compose/Components/SelectionHandler.cs @@ -14,7 +14,7 @@ using osu.Framework.Graphics.Shapes; using osu.Framework.Graphics.UserInterface; using osu.Framework.Input; using osu.Framework.Input.Bindings; -using osu.Framework.Input.States; +using osu.Framework.Input.Events; using osu.Game.Audio; using osu.Game.Graphics; using osu.Game.Graphics.Sprites; @@ -218,17 +218,17 @@ namespace osu.Game.Screens.Edit.Compose.Components /// Handle a blueprint requesting selection. /// /// The blueprint. - /// The input state at the point of selection. + /// The mouse event responsible for selection. /// Whether a selection was performed. - internal bool HandleSelectionRequested(SelectionBlueprint blueprint, InputState state) + internal bool HandleSelectionRequested(SelectionBlueprint blueprint, MouseButtonEvent e) { - if (state.Keyboard.ShiftPressed && state.Mouse.IsPressed(MouseButton.Right)) + if (e.ShiftPressed && e.Button == MouseButton.Right) { handleQuickDeletion(blueprint); return false; } - if (state.Keyboard.ControlPressed && state.Mouse.IsPressed(MouseButton.Left)) + if (e.ControlPressed && e.Button == MouseButton.Left) blueprint.ToggleSelection(); else ensureSelected(blueprint); From de6fcd1792c6ed43b3e1e3945a0e244308259986 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 10 Nov 2020 17:16:28 +0900 Subject: [PATCH 07/13] Fix BlueprintContainer triggering assert when left and right mouse button are pressed together --- .../Compose/Components/BlueprintContainer.cs | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs b/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs index d5306c3450..b67f6a6ba6 100644 --- a/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs +++ b/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs @@ -295,21 +295,15 @@ namespace osu.Game.Screens.Edit.Compose.Components /// Whether a selection was performed. private bool beginClickSelection(MouseButtonEvent e) { - Debug.Assert(!clickSelectionBegan); - - bool selectedPerformed = true; - foreach (SelectionBlueprint blueprint in SelectionBlueprints.AliveChildren) { - if (blueprint.IsHovered) - { - selectedPerformed &= SelectionHandler.HandleSelectionRequested(blueprint, e); - clickSelectionBegan = true; - break; - } + if (!blueprint.IsHovered) continue; + + if (SelectionHandler.HandleSelectionRequested(blueprint, e)) + return clickSelectionBegan = true; } - return selectedPerformed; + return false; } /// From 28daff17164eef0ad7caa55ad0a479ed8d9e5d75 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 10 Nov 2020 17:57:57 +0900 Subject: [PATCH 08/13] Stop mod select overlay hotkeys handling input when control is pressed Closes https://github.com/ppy/osu/issues/10766 in about the best way we can for now. --- osu.Game/Overlays/Mods/ModSection.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/osu.Game/Overlays/Mods/ModSection.cs b/osu.Game/Overlays/Mods/ModSection.cs index 3701f9ecab..0107f94dcf 100644 --- a/osu.Game/Overlays/Mods/ModSection.cs +++ b/osu.Game/Overlays/Mods/ModSection.cs @@ -85,6 +85,8 @@ namespace osu.Game.Overlays.Mods protected override bool OnKeyDown(KeyDownEvent e) { + if (e.ControlPressed) return false; + if (ToggleKeys != null) { var index = Array.IndexOf(ToggleKeys, e.Key); From 833c0b223ef0a184314c46f9d756c2c3a6ca43d5 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 10 Nov 2020 18:08:12 +0900 Subject: [PATCH 09/13] Clamp index to valid bounds --- osu.Game/Overlays/Profile/Header/Components/RankGraph.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Overlays/Profile/Header/Components/RankGraph.cs b/osu.Game/Overlays/Profile/Header/Components/RankGraph.cs index ffa918e4e8..26126bca58 100644 --- a/osu.Game/Overlays/Profile/Header/Components/RankGraph.cs +++ b/osu.Game/Overlays/Profile/Header/Components/RankGraph.cs @@ -189,7 +189,7 @@ namespace osu.Game.Overlays.Profile.Header.Components public void HideBar() => bar.FadeOut(fade_duration); - private int calculateIndex(float mouseXPosition) => (int)MathF.Round(mouseXPosition / DrawWidth * (DefaultValueCount - 1)); + private int calculateIndex(float mouseXPosition) => (int)Math.Clamp(MathF.Round(mouseXPosition / DrawWidth * (DefaultValueCount - 1)), 0, DefaultValueCount - 1); private Vector2 calculateBallPosition(int index) { From 64460749767d4e3a6b3285aec060d3fc01132e44 Mon Sep 17 00:00:00 2001 From: cadon0 Date: Tue, 10 Nov 2020 01:52:26 +1300 Subject: [PATCH 10/13] Fix paths for storyboard animation sprites --- .../Drawables/DrawableStoryboardAnimation.cs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/osu.Game/Storyboards/Drawables/DrawableStoryboardAnimation.cs b/osu.Game/Storyboards/Drawables/DrawableStoryboardAnimation.cs index 97de239e4a..34120f4848 100644 --- a/osu.Game/Storyboards/Drawables/DrawableStoryboardAnimation.cs +++ b/osu.Game/Storyboards/Drawables/DrawableStoryboardAnimation.cs @@ -118,8 +118,24 @@ namespace osu.Game.Storyboards.Drawables for (int frame = 0; frame < Animation.FrameCount; frame++) { string framePath = Animation.Path.Replace(".", frame + "."); + Drawable sprite = storyboard.CreateSpriteFromResourcePath(framePath, textureStore); - AddFrame(storyboard.CreateSpriteFromResourcePath(framePath, textureStore), Animation.FrameDelay); + if (sprite != null) + { + AddFrame(sprite, Animation.FrameDelay); + continue; + } + + framePath = Animation.Path.Replace("0.", frame + "."); + sprite = storyboard.CreateSpriteFromResourcePath(framePath, textureStore); + + if (sprite != null) + { + AddFrame(sprite, Animation.FrameDelay); + } + + // todo: handle animation intentionally declared with more frames than sprites to cause a blinking effect + // e.g. beatmap 5381's "spr\play-skip.png" } Animation.ApplyTransforms(this); From 539806e9d6869b95f6b9ca0c3a51f45adc0e139c Mon Sep 17 00:00:00 2001 From: cadon0 Date: Tue, 10 Nov 2020 21:57:29 +1300 Subject: [PATCH 11/13] Rewrite - Add empty drawable whenever sprite not found --- .../Drawables/DrawableStoryboardAnimation.cs | 20 ++----------------- 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/osu.Game/Storyboards/Drawables/DrawableStoryboardAnimation.cs b/osu.Game/Storyboards/Drawables/DrawableStoryboardAnimation.cs index 34120f4848..a78d0bf4d7 100644 --- a/osu.Game/Storyboards/Drawables/DrawableStoryboardAnimation.cs +++ b/osu.Game/Storyboards/Drawables/DrawableStoryboardAnimation.cs @@ -118,24 +118,8 @@ namespace osu.Game.Storyboards.Drawables for (int frame = 0; frame < Animation.FrameCount; frame++) { string framePath = Animation.Path.Replace(".", frame + "."); - Drawable sprite = storyboard.CreateSpriteFromResourcePath(framePath, textureStore); - - if (sprite != null) - { - AddFrame(sprite, Animation.FrameDelay); - continue; - } - - framePath = Animation.Path.Replace("0.", frame + "."); - sprite = storyboard.CreateSpriteFromResourcePath(framePath, textureStore); - - if (sprite != null) - { - AddFrame(sprite, Animation.FrameDelay); - } - - // todo: handle animation intentionally declared with more frames than sprites to cause a blinking effect - // e.g. beatmap 5381's "spr\play-skip.png" + Drawable sprite = storyboard.CreateSpriteFromResourcePath(framePath, textureStore) ?? Drawable.Empty(); + AddFrame(sprite, Animation.FrameDelay); } Animation.ApplyTransforms(this); From ce837eaba0d6f6dc261614ddb66183b1bf56f4a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 10 Nov 2020 12:20:26 +0100 Subject: [PATCH 12/13] Rename variables --- .../Storyboards/Drawables/DrawableStoryboardAnimation.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/osu.Game/Storyboards/Drawables/DrawableStoryboardAnimation.cs b/osu.Game/Storyboards/Drawables/DrawableStoryboardAnimation.cs index a78d0bf4d7..644bb28457 100644 --- a/osu.Game/Storyboards/Drawables/DrawableStoryboardAnimation.cs +++ b/osu.Game/Storyboards/Drawables/DrawableStoryboardAnimation.cs @@ -115,11 +115,11 @@ namespace osu.Game.Storyboards.Drawables [BackgroundDependencyLoader] private void load(TextureStore textureStore, Storyboard storyboard) { - for (int frame = 0; frame < Animation.FrameCount; frame++) + for (int frameIndex = 0; frameIndex < Animation.FrameCount; frameIndex++) { - string framePath = Animation.Path.Replace(".", frame + "."); - Drawable sprite = storyboard.CreateSpriteFromResourcePath(framePath, textureStore) ?? Drawable.Empty(); - AddFrame(sprite, Animation.FrameDelay); + string framePath = Animation.Path.Replace(".", frameIndex + "."); + Drawable frame = storyboard.CreateSpriteFromResourcePath(framePath, textureStore) ?? Drawable.Empty(); + AddFrame(frame, Animation.FrameDelay); } Animation.ApplyTransforms(this); From 61093030ee4b66e8d22c58ed0a6cf4917f2b80eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 10 Nov 2020 12:20:49 +0100 Subject: [PATCH 13/13] Remove redundant class name qualifier --- osu.Game/Storyboards/Drawables/DrawableStoryboardAnimation.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Storyboards/Drawables/DrawableStoryboardAnimation.cs b/osu.Game/Storyboards/Drawables/DrawableStoryboardAnimation.cs index 644bb28457..7eac994e07 100644 --- a/osu.Game/Storyboards/Drawables/DrawableStoryboardAnimation.cs +++ b/osu.Game/Storyboards/Drawables/DrawableStoryboardAnimation.cs @@ -118,7 +118,7 @@ namespace osu.Game.Storyboards.Drawables for (int frameIndex = 0; frameIndex < Animation.FrameCount; frameIndex++) { string framePath = Animation.Path.Replace(".", frameIndex + "."); - Drawable frame = storyboard.CreateSpriteFromResourcePath(framePath, textureStore) ?? Drawable.Empty(); + Drawable frame = storyboard.CreateSpriteFromResourcePath(framePath, textureStore) ?? Empty(); AddFrame(frame, Animation.FrameDelay); }