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..e232bf045f 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,26 @@ 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)
+ {
+ if (!base.OnKeyDown(e))
+ return false;
+
+ TypingStarted?.Invoke();
+ return true;
+ }
}
}
}
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);