diff --git a/osu.Game/Graphics/UserInterface/OsuSliderBar.cs b/osu.Game/Graphics/UserInterface/OsuSliderBar.cs
index 333ae4f832..21c8dfcfa4 100644
--- a/osu.Game/Graphics/UserInterface/OsuSliderBar.cs
+++ b/osu.Game/Graphics/UserInterface/OsuSliderBar.cs
@@ -148,7 +148,7 @@ namespace osu.Game.Graphics.UserInterface
protected override void LoadComplete()
{
base.LoadComplete();
- CurrentNumber.BindValueChanged(current => updateTooltipText(current.NewValue), true);
+ CurrentNumber.BindValueChanged(current => TooltipText = getTooltipText(current.NewValue), true);
}
protected override bool OnHover(HoverEvent e)
@@ -178,7 +178,7 @@ namespace osu.Game.Graphics.UserInterface
{
base.OnUserChange(value);
playSample(value);
- updateTooltipText(value);
+ TooltipText = getTooltipText(value);
}
private void playSample(T value)
@@ -203,28 +203,22 @@ namespace osu.Game.Graphics.UserInterface
channel.Play();
}
- private void updateTooltipText(T value)
+ private LocalisableString getTooltipText(T value)
{
if (CurrentNumber.IsInteger)
- TooltipText = value.ToInt32(NumberFormatInfo.InvariantInfo).ToString("N0");
- else
- {
- double floatValue = value.ToDouble(NumberFormatInfo.InvariantInfo);
+ return value.ToInt32(NumberFormatInfo.InvariantInfo).ToString("N0");
- if (DisplayAsPercentage)
- {
- TooltipText = floatValue.ToString("0%");
- }
- else
- {
- decimal decimalPrecision = normalise(CurrentNumber.Precision.ToDecimal(NumberFormatInfo.InvariantInfo), max_decimal_digits);
+ double floatValue = value.ToDouble(NumberFormatInfo.InvariantInfo);
- // Find the number of significant digits (we could have less than 5 after normalize())
- int significantDigits = FormatUtils.FindPrecision(decimalPrecision);
+ if (DisplayAsPercentage)
+ return floatValue.ToString("0%");
- TooltipText = floatValue.ToString($"N{significantDigits}");
- }
- }
+ decimal decimalPrecision = normalise(CurrentNumber.Precision.ToDecimal(NumberFormatInfo.InvariantInfo), max_decimal_digits);
+
+ // Find the number of significant digits (we could have less than 5 after normalize())
+ int significantDigits = FormatUtils.FindPrecision(decimalPrecision);
+
+ return floatValue.ToString($"N{significantDigits}");
}
protected override void UpdateAfterChildren()
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 8253c2e38e..bb8dcf566d 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;
@@ -72,7 +74,7 @@ namespace osu.Game.Screens.Play.PlayerSettings
Spacing = new Vector2(10),
Children = new Drawable[]
{
- new PlayerSliderBar
+ new OffsetSliderBar
{
KeyboardStep = 5,
LabelText = BeatmapOffsetControlStrings.BeatmapOffset,
@@ -89,6 +91,28 @@ namespace osu.Game.Screens.Play.PlayerSettings
};
}
+ public class OffsetSliderBar : PlayerSliderBar
+ {
+ protected override Drawable CreateControl() => new CustomSliderBar();
+
+ protected class CustomSliderBar : SliderBar
+ {
+ public override LocalisableString TooltipText =>
+ Current.Value == 0
+ ? new TranslatableString("_", @"{0} ms", base.TooltipText)
+ : new TranslatableString("_", @"{0} ms {1}", base.TooltipText, getEarlyLateText(Current.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)
{