diff --git a/osu.Game/Graphics/Containers/OsuScrollContainer.cs b/osu.Game/Graphics/Containers/OsuScrollContainer.cs
index 017ea6ec32..817b8409e6 100644
--- a/osu.Game/Graphics/Containers/OsuScrollContainer.cs
+++ b/osu.Game/Graphics/Containers/OsuScrollContainer.cs
@@ -3,6 +3,7 @@
#nullable enable
+using System;
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
@@ -57,6 +58,26 @@ namespace osu.Game.Graphics.Containers
{
}
+ ///
+ /// Scrolls a into view.
+ ///
+ /// The to scroll into view.
+ /// Whether to animate the movement.
+ /// An added amount to scroll beyond the requirement to bring the target into view.
+ public void ScrollIntoView(Drawable d, bool animated = true, float extraScroll = 0)
+ {
+ float childPos0 = GetChildPosInContent(d);
+ float childPos1 = GetChildPosInContent(d, d.DrawSize);
+
+ float minPos = Math.Min(childPos0, childPos1);
+ float maxPos = Math.Max(childPos0, childPos1);
+
+ if (minPos < Current || (minPos > Current && d.DrawSize[ScrollDim] > DisplayableContent))
+ ScrollTo(minPos - extraScroll, animated);
+ else if (maxPos > Current + DisplayableContent)
+ ScrollTo(maxPos - DisplayableContent + extraScroll, animated);
+ }
+
protected override bool OnMouseDown(MouseDownEvent e)
{
if (shouldPerformRightMouseScroll(e))
diff --git a/osu.Game/Overlays/Mods/ModSelectScreen.cs b/osu.Game/Overlays/Mods/ModSelectScreen.cs
index 03a66575c4..ffd6e9a52c 100644
--- a/osu.Game/Overlays/Mods/ModSelectScreen.cs
+++ b/osu.Game/Overlays/Mods/ModSelectScreen.cs
@@ -161,7 +161,7 @@ namespace osu.Game.Overlays.Mods
{
AutoSizeAxes = Axes.X,
RelativeSizeAxes = Axes.Y,
- RequestScroll = column => columnScroll.ScrollTo(Math.Clamp(column.DrawPosition.X - 70, 0, columnScroll.ScrollableExtent))
+ RequestScroll = column => columnScroll.ScrollIntoView(column, extraScroll: 140)
};
protected override void LoadComplete()