diff --git a/osu.Android.props b/osu.Android.props
index 526ce959a6..5b26b8f36e 100644
--- a/osu.Android.props
+++ b/osu.Android.props
@@ -51,8 +51,8 @@
-
-
+
+
diff --git a/osu.Game.Rulesets.Mania/ManiaSettingsSubsection.cs b/osu.Game.Rulesets.Mania/ManiaSettingsSubsection.cs
index 36fa336d0c..bd3b8c3b10 100644
--- a/osu.Game.Rulesets.Mania/ManiaSettingsSubsection.cs
+++ b/osu.Game.Rulesets.Mania/ManiaSettingsSubsection.cs
@@ -45,10 +45,5 @@ namespace osu.Game.Rulesets.Mania
}
};
}
-
- private class TimeSlider : OsuSliderBar
- {
- public override LocalisableString TooltipText => Current.Value.ToString(@"N0") + "ms";
- }
}
}
diff --git a/osu.Game/Configuration/OsuConfigManager.cs b/osu.Game/Configuration/OsuConfigManager.cs
index 5f9cd0470c..c279ce1220 100644
--- a/osu.Game/Configuration/OsuConfigManager.cs
+++ b/osu.Game/Configuration/OsuConfigManager.cs
@@ -140,7 +140,7 @@ namespace osu.Game.Configuration
SetDefault(OsuSetting.UIScale, 1f, 0.8f, 1.6f, 0.01f);
- SetDefault(OsuSetting.UIHoldActivationDelay, 200f, 0f, 500f, 50f);
+ SetDefault(OsuSetting.UIHoldActivationDelay, 200.0, 0.0, 500.0, 50.0);
SetDefault(OsuSetting.IntroSequence, IntroSequence.Triangles);
@@ -240,9 +240,9 @@ namespace osu.Game.Configuration
};
}
- public Func LookupSkinName { private get; set; }
+ public Func LookupSkinName { private get; set; } = _ => @"unknown";
- public Func LookupKeyBindings { get; set; }
+ public Func LookupKeyBindings { get; set; } = _ => @"unknown";
}
// IMPORTANT: These are used in user configuration files.
diff --git a/osu.Game/Graphics/Containers/HoldToConfirmContainer.cs b/osu.Game/Graphics/Containers/HoldToConfirmContainer.cs
index fcf445a878..999dd183aa 100644
--- a/osu.Game/Graphics/Containers/HoldToConfirmContainer.cs
+++ b/osu.Game/Graphics/Containers/HoldToConfirmContainer.cs
@@ -30,12 +30,12 @@ namespace osu.Game.Graphics.Containers
public Bindable Progress = new BindableDouble();
- private Bindable holdActivationDelay;
+ private Bindable holdActivationDelay;
[BackgroundDependencyLoader]
private void load(OsuConfigManager config)
{
- holdActivationDelay = config.GetBindable(OsuSetting.UIHoldActivationDelay);
+ holdActivationDelay = config.GetBindable(OsuSetting.UIHoldActivationDelay);
}
protected void BeginConfirm()
diff --git a/osu.Game/Graphics/Cursor/MenuCursor.cs b/osu.Game/Graphics/Cursor/MenuCursor.cs
index 0cc751ea21..03fad00e41 100644
--- a/osu.Game/Graphics/Cursor/MenuCursor.cs
+++ b/osu.Game/Graphics/Cursor/MenuCursor.cs
@@ -140,6 +140,7 @@ namespace osu.Game.Graphics.Cursor
// Scale to [-0.75, 0.75] so that the sample isn't fully panned left or right (sounds weird)
channel.Balance.Value = ((activeCursor.X / DrawWidth) * 2 - 1) * 0.75;
channel.Frequency.Value = baseFrequency - (random_range / 2f) + RNG.NextDouble(random_range);
+ channel.Volume.Value = baseFrequency;
channel.Play();
}
diff --git a/osu.Game/Graphics/UserInterface/OsuSliderBar.cs b/osu.Game/Graphics/UserInterface/OsuSliderBar.cs
index a5bc02246d..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 => TooltipText = GetTooltipText(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);
- TooltipText = GetTooltipText(value);
+ TooltipText = getTooltipText(value);
}
private void playSample(T value)
@@ -203,7 +203,7 @@ namespace osu.Game.Graphics.UserInterface
channel.Play();
}
- protected virtual LocalisableString GetTooltipText(T value)
+ private LocalisableString getTooltipText(T value)
{
if (CurrentNumber.IsInteger)
return value.ToInt32(NumberFormatInfo.InvariantInfo).ToString("N0");
diff --git a/osu.Game/Graphics/UserInterface/TimeSlider.cs b/osu.Game/Graphics/UserInterface/TimeSlider.cs
new file mode 100644
index 0000000000..82b02f1b48
--- /dev/null
+++ b/osu.Game/Graphics/UserInterface/TimeSlider.cs
@@ -0,0 +1,15 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Framework.Localisation;
+
+namespace osu.Game.Graphics.UserInterface
+{
+ ///
+ /// A slider bar which displays a millisecond time value.
+ ///
+ public class TimeSlider : OsuSliderBar
+ {
+ public override LocalisableString TooltipText => $"{Current.Value:N0} ms";
+ }
+}
diff --git a/osu.Game/Localisation/GraphicsSettingsStrings.cs b/osu.Game/Localisation/GraphicsSettingsStrings.cs
index 996a1350eb..1c9aa64df5 100644
--- a/osu.Game/Localisation/GraphicsSettingsStrings.cs
+++ b/osu.Game/Localisation/GraphicsSettingsStrings.cs
@@ -54,6 +54,11 @@ namespace osu.Game.Localisation
///
public static LocalisableString Resolution => new TranslatableString(getKey(@"resolution"), @"Resolution");
+ ///
+ /// "Display"
+ ///
+ public static LocalisableString Display => new TranslatableString(getKey(@"display"), @"Display");
+
///
/// "UI scaling"
///
diff --git a/osu.Game/Online/API/Requests/GetWikiRequest.cs b/osu.Game/Online/API/Requests/GetWikiRequest.cs
index 248fcc03e3..09571ab0a8 100644
--- a/osu.Game/Online/API/Requests/GetWikiRequest.cs
+++ b/osu.Game/Online/API/Requests/GetWikiRequest.cs
@@ -1,6 +1,8 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using osu.Game.Extensions;
+using osu.Game.Localisation;
using osu.Game.Online.API.Requests.Responses;
namespace osu.Game.Online.API.Requests
@@ -8,14 +10,14 @@ namespace osu.Game.Online.API.Requests
public class GetWikiRequest : APIRequest
{
private readonly string path;
- private readonly string locale;
+ private readonly Language language;
- public GetWikiRequest(string path, string locale = "en")
+ public GetWikiRequest(string path, Language language = Language.en)
{
this.path = path;
- this.locale = locale;
+ this.language = language;
}
- protected override string Target => $"wiki/{locale}/{path}";
+ protected override string Target => $"wiki/{language.ToCultureCode()}/{path}";
}
}
diff --git a/osu.Game/Overlays/Profile/Header/MedalHeaderContainer.cs b/osu.Game/Overlays/Profile/Header/MedalHeaderContainer.cs
index 5f513582e5..922f3832e4 100644
--- a/osu.Game/Overlays/Profile/Header/MedalHeaderContainer.cs
+++ b/osu.Game/Overlays/Profile/Header/MedalHeaderContainer.cs
@@ -1,6 +1,7 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System.Threading;
using osu.Framework.Allocation;
using osu.Framework.Bindables;
using osu.Framework.Extensions.Color4Extensions;
@@ -63,11 +64,17 @@ namespace osu.Game.Overlays.Profile.Header
};
}
+ private CancellationTokenSource cancellationTokenSource;
+
private void updateDisplay(APIUser user)
{
- var badges = user.Badges;
+ cancellationTokenSource?.Cancel();
+ cancellationTokenSource = new CancellationTokenSource();
+
badgeFlowContainer.Clear();
+ var badges = user.Badges;
+
if (badges?.Length > 0)
{
Show();
@@ -79,7 +86,7 @@ namespace osu.Game.Overlays.Profile.Header
{
// load in stable order regardless of async load order.
badgeFlowContainer.Insert(displayIndex, asyncBadge);
- });
+ }, cancellationTokenSource.Token);
}
}
else
@@ -87,5 +94,11 @@ namespace osu.Game.Overlays.Profile.Header
Hide();
}
}
+
+ protected override void Dispose(bool isDisposing)
+ {
+ cancellationTokenSource?.Cancel();
+ base.Dispose(isDisposing);
+ }
}
}
diff --git a/osu.Game/Overlays/Settings/Sections/Audio/OffsetSettings.cs b/osu.Game/Overlays/Settings/Sections/Audio/OffsetSettings.cs
index 9345d3fcc7..673252a99e 100644
--- a/osu.Game/Overlays/Settings/Sections/Audio/OffsetSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Audio/OffsetSettings.cs
@@ -23,7 +23,7 @@ namespace osu.Game.Overlays.Settings.Sections.Audio
{
Children = new Drawable[]
{
- new SettingsSlider
+ new SettingsSlider
{
LabelText = AudioSettingsStrings.AudioOffset,
Current = config.GetBindable(OsuSetting.AudioOffset),
@@ -35,10 +35,5 @@ namespace osu.Game.Overlays.Settings.Sections.Audio
}
};
}
-
- private class OffsetSlider : OsuSliderBar
- {
- public override LocalisableString TooltipText => Current.Value.ToString(@"0ms");
- }
}
}
diff --git a/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs b/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs
index adf1453d1a..602ace6dea 100644
--- a/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs
@@ -27,7 +27,7 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
private FillFlowContainer> scalingSettings;
- private readonly IBindable currentDisplay = new Bindable();
+ private readonly Bindable currentDisplay = new Bindable();
private readonly IBindableList windowModes = new BindableList();
private Bindable scalingMode;
@@ -39,6 +39,7 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
private OsuGameBase game { get; set; }
private SettingsDropdown resolutionDropdown;
+ private SettingsDropdown displayDropdown;
private SettingsDropdown windowModeDropdown;
private Bindable scalingPositionX;
@@ -72,6 +73,12 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
ItemSource = windowModes,
Current = config.GetBindable(FrameworkSetting.WindowMode),
},
+ displayDropdown = new DisplaySettingsDropdown
+ {
+ LabelText = GraphicsSettingsStrings.Display,
+ Items = host.Window?.Displays,
+ Current = currentDisplay,
+ },
resolutionDropdown = new ResolutionSettingsDropdown
{
LabelText = GraphicsSettingsStrings.Resolution,
@@ -142,7 +149,7 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
windowModeDropdown.Current.BindValueChanged(mode =>
{
- updateResolutionDropdown();
+ updateDisplayModeDropdowns();
windowModeDropdown.WarningText = mode.NewValue != WindowMode.Fullscreen ? GraphicsSettingsStrings.NotFullscreenNote : default;
}, true);
@@ -168,7 +175,7 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
.Distinct());
}
- updateResolutionDropdown();
+ updateDisplayModeDropdowns();
}), true);
scalingMode.BindValueChanged(mode =>
@@ -183,12 +190,17 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
// initial update bypasses transforms
updateScalingModeVisibility();
- void updateResolutionDropdown()
+ void updateDisplayModeDropdowns()
{
if (resolutions.Count > 1 && windowModeDropdown.Current.Value == WindowMode.Fullscreen)
resolutionDropdown.Show();
else
resolutionDropdown.Hide();
+
+ if (displayDropdown.Items.Count() > 1)
+ displayDropdown.Show();
+ else
+ displayDropdown.Hide();
}
void updateScalingModeVisibility()
@@ -243,6 +255,19 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
public override LocalisableString TooltipText => base.TooltipText + "x";
}
+ private class DisplaySettingsDropdown : SettingsDropdown
+ {
+ protected override OsuDropdown CreateDropdown() => new DisplaySettingsDropdownControl();
+
+ private class DisplaySettingsDropdownControl : DropdownControl
+ {
+ protected override LocalisableString GenerateItemText(Display item)
+ {
+ return $"{item.Index}: {item.Name} ({item.Bounds.Width}x{item.Bounds.Height})";
+ }
+ }
+ }
+
private class ResolutionSettingsDropdown : SettingsDropdown
{
protected override OsuDropdown CreateDropdown() => new ResolutionDropdownControl();
diff --git a/osu.Game/Overlays/Settings/Sections/UserInterface/GeneralSettings.cs b/osu.Game/Overlays/Settings/Sections/UserInterface/GeneralSettings.cs
index 0afbed5df5..59894cbcae 100644
--- a/osu.Game/Overlays/Settings/Sections/UserInterface/GeneralSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/UserInterface/GeneralSettings.cs
@@ -35,18 +35,13 @@ namespace osu.Game.Overlays.Settings.Sections.UserInterface
LabelText = UserInterfaceStrings.Parallax,
Current = config.GetBindable(OsuSetting.MenuParallax)
},
- new SettingsSlider
+ new SettingsSlider
{
LabelText = UserInterfaceStrings.HoldToConfirmActivationTime,
- Current = config.GetBindable(OsuSetting.UIHoldActivationDelay),
+ Current = config.GetBindable(OsuSetting.UIHoldActivationDelay),
KeyboardStep = 50
},
};
}
-
- private class TimeSlider : OsuSliderBar
- {
- public override LocalisableString TooltipText => Current.Value.ToString(@"N0") + "ms";
- }
}
}
diff --git a/osu.Game/Overlays/WikiOverlay.cs b/osu.Game/Overlays/WikiOverlay.cs
index 44713d637d..4015d8e196 100644
--- a/osu.Game/Overlays/WikiOverlay.cs
+++ b/osu.Game/Overlays/WikiOverlay.cs
@@ -7,6 +7,7 @@ using System.Threading;
using osu.Framework.Allocation;
using osu.Framework.Bindables;
using osu.Framework.Graphics;
+using osu.Game.Extensions;
using osu.Game.Online.API;
using osu.Game.Online.API.Requests;
using osu.Game.Online.API.Requests.Responses;
@@ -100,7 +101,12 @@ namespace osu.Game.Overlays
cancellationToken?.Cancel();
request?.Cancel();
- request = new GetWikiRequest(e.NewValue);
+ string[] values = e.NewValue.Split('/', 2);
+
+ if (values.Length > 1 && LanguageExtensions.TryParseCultureCode(values[0], out var language))
+ request = new GetWikiRequest(values[1], language);
+ else
+ request = new GetWikiRequest(e.NewValue);
Loading.Show();
diff --git a/osu.Game/Screens/Menu/MainMenu.cs b/osu.Game/Screens/Menu/MainMenu.cs
index b0208a0ae8..e2d79b4015 100644
--- a/osu.Game/Screens/Menu/MainMenu.cs
+++ b/osu.Game/Screens/Menu/MainMenu.cs
@@ -66,7 +66,7 @@ namespace osu.Game.Screens.Menu
protected override BackgroundScreen CreateBackground() => background;
- private Bindable holdDelay;
+ private Bindable holdDelay;
private Bindable loginDisplayed;
private ExitConfirmOverlay exitConfirmOverlay;
@@ -77,7 +77,7 @@ namespace osu.Game.Screens.Menu
[BackgroundDependencyLoader(true)]
private void load(BeatmapListingOverlay beatmapListing, SettingsOverlay settings, OsuConfigManager config, SessionStatics statics)
{
- holdDelay = config.GetBindable(OsuSetting.UIHoldActivationDelay);
+ holdDelay = config.GetBindable(OsuSetting.UIHoldActivationDelay);
loginDisplayed = statics.GetBindable(Static.LoginOverlayDisplayed);
if (host.CanExit)
diff --git a/osu.Game/Screens/Play/HUD/HoldForMenuButton.cs b/osu.Game/Screens/Play/HUD/HoldForMenuButton.cs
index 430f001427..4087011933 100644
--- a/osu.Game/Screens/Play/HUD/HoldForMenuButton.cs
+++ b/osu.Game/Screens/Play/HUD/HoldForMenuButton.cs
@@ -63,11 +63,11 @@ namespace osu.Game.Screens.Play.HUD
[Resolved]
private OsuConfigManager config { get; set; }
- private Bindable activationDelay;
+ private Bindable activationDelay;
protected override void LoadComplete()
{
- activationDelay = config.GetBindable(OsuSetting.UIHoldActivationDelay);
+ activationDelay = config.GetBindable(OsuSetting.UIHoldActivationDelay);
activationDelay.BindValueChanged(v =>
{
text.Text = v.NewValue > 0
diff --git a/osu.Game/Screens/Play/PlayerSettings/BeatmapOffsetControl.cs b/osu.Game/Screens/Play/PlayerSettings/BeatmapOffsetControl.cs
index 4af2de6409..d7125bd2db 100644
--- a/osu.Game/Screens/Play/PlayerSettings/BeatmapOffsetControl.cs
+++ b/osu.Game/Screens/Play/PlayerSettings/BeatmapOffsetControl.cs
@@ -98,12 +98,10 @@ namespace osu.Game.Screens.Play.PlayerSettings
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));
- }
+ 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)
{
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index 7dfd099df1..d86fbc693e 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -36,8 +36,8 @@
runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
+
+
diff --git a/osu.iOS.props b/osu.iOS.props
index 80600655aa..c37692f0d8 100644
--- a/osu.iOS.props
+++ b/osu.iOS.props
@@ -61,8 +61,8 @@
-
-
+
+
@@ -84,7 +84,7 @@
-
+