diff --git a/osu.Game/Localisation/BeatmapOffsetControlStrings.cs b/osu.Game/Localisation/BeatmapOffsetControlStrings.cs
index 7b2a9e50b2..632a1ad0ea 100644
--- a/osu.Game/Localisation/BeatmapOffsetControlStrings.cs
+++ b/osu.Game/Localisation/BeatmapOffsetControlStrings.cs
@@ -29,6 +29,16 @@ namespace osu.Game.Localisation
///
public static LocalisableString CalibrateUsingLastPlay => new TranslatableString(getKey(@"calibrate_using_last_play"), @"Calibrate using last play");
+ ///
+ /// "(hit objects appear later)"
+ ///
+ public static LocalisableString HitObjectsAppearLater => new TranslatableString(getKey(@"hit_objects_appear_later"), @"(hit objects appear later)");
+
+ ///
+ /// "(hit objects appear earlier)"
+ ///
+ public static LocalisableString HitObjectsAppearEarlier => new TranslatableString(getKey(@"hit_objects_appear_earlier"), @"(hit objects appear earlier)");
+
private static string getKey(string key) => $@"{prefix}:{key}";
}
-}
\ No newline at end of file
+}
diff --git a/osu.Game/Screens/Play/PlayerSettings/BeatmapOffsetControl.cs b/osu.Game/Screens/Play/PlayerSettings/BeatmapOffsetControl.cs
index dc3e80d695..201e431367 100644
--- a/osu.Game/Screens/Play/PlayerSettings/BeatmapOffsetControl.cs
+++ b/osu.Game/Screens/Play/PlayerSettings/BeatmapOffsetControl.cs
@@ -3,12 +3,14 @@
using System;
using System.ComponentModel;
+using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using osu.Framework.Allocation;
using osu.Framework.Bindables;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
+using osu.Framework.Localisation;
using osu.Framework.Utils;
using osu.Game.Beatmaps;
using osu.Game.Database;
@@ -71,7 +73,7 @@ namespace osu.Game.Screens.Play.PlayerSettings
Spacing = new Vector2(10),
Children = new Drawable[]
{
- new PlayerSliderBar
+ new OffsetSliderBar
{
KeyboardStep = 5,
LabelText = BeatmapOffsetControlStrings.BeatmapOffset,
@@ -88,6 +90,30 @@ namespace osu.Game.Screens.Play.PlayerSettings
};
}
+ public class OffsetSliderBar : PlayerSliderBar
+ {
+ protected override Drawable CreateControl() => new CustomSliderBar();
+
+ protected class CustomSliderBar : SliderBar
+ {
+ protected override LocalisableString GetTooltipText(double value)
+ {
+ return value == 0
+ ? new TranslatableString("_", @"{0} ms", base.GetTooltipText(value))
+ : new TranslatableString("_", @"{0} ms {1}", base.GetTooltipText(value), getEarlyLateText(value));
+ }
+
+ private LocalisableString getEarlyLateText(double value)
+ {
+ Debug.Assert(value != 0);
+
+ return value > 0
+ ? BeatmapOffsetControlStrings.HitObjectsAppearLater
+ : BeatmapOffsetControlStrings.HitObjectsAppearEarlier;
+ }
+ }
+ }
+
protected override void LoadComplete()
{
base.LoadComplete();
diff --git a/osu.Game/Screens/Play/PlayerSettings/PlayerSliderBar.cs b/osu.Game/Screens/Play/PlayerSettings/PlayerSliderBar.cs
index 57ffe16f76..3f1a5bc0ac 100644
--- a/osu.Game/Screens/Play/PlayerSettings/PlayerSliderBar.cs
+++ b/osu.Game/Screens/Play/PlayerSettings/PlayerSliderBar.cs
@@ -15,13 +15,15 @@ namespace osu.Game.Screens.Play.PlayerSettings
{
public OsuSliderBar Bar => (OsuSliderBar)Control;
- protected override Drawable CreateControl() => new SliderBar
- {
- RelativeSizeAxes = Axes.X
- };
+ protected override Drawable CreateControl() => new SliderBar();
- private class SliderBar : OsuSliderBar
+ protected class SliderBar : OsuSliderBar
{
+ public SliderBar()
+ {
+ RelativeSizeAxes = Axes.X;
+ }
+
[BackgroundDependencyLoader]
private void load(OsuColour colours)
{