diff --git a/README.md b/README.md
index cf7ce35791..792e2d646a 100644
--- a/README.md
+++ b/README.md
@@ -50,7 +50,7 @@ Please make sure you have the following prerequisites:
- A desktop platform with the [.NET 6.0 SDK](https://dotnet.microsoft.com/download) installed.
-When working with the codebase, we recommend using an IDE with intelligent code completion and syntax highlighting, such as the latest version of [Visual Studio](https://visualstudio.microsoft.com/vs/), [JetBrains Rider](https://www.jetbrains.com/rider/) or [Visual Studio Code](https://code.visualstudio.com/).
+When working with the codebase, we recommend using an IDE with intelligent code completion and syntax highlighting, such as the latest version of [Visual Studio](https://visualstudio.microsoft.com/vs/), [JetBrains Rider](https://www.jetbrains.com/rider/), or [Visual Studio Code](https://code.visualstudio.com/) with the [EditorConfig](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig) and [C#](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp) plugin installed.
### Downloading the source code
diff --git a/osu.Game/Collections/ManageCollectionsDialog.cs b/osu.Game/Collections/ManageCollectionsDialog.cs
index 31016b807b..cc0f23d030 100644
--- a/osu.Game/Collections/ManageCollectionsDialog.cs
+++ b/osu.Game/Collections/ManageCollectionsDialog.cs
@@ -23,6 +23,9 @@ namespace osu.Game.Collections
private AudioFilter lowPassFilter = null!;
+ protected override string PopInSampleName => @"UI/overlay-big-pop-in";
+ protected override string PopOutSampleName => @"UI/overlay-big-pop-out";
+
public ManageCollectionsDialog()
{
Anchor = Anchor.Centre;
diff --git a/osu.Game/Graphics/Containers/OsuFocusedOverlayContainer.cs b/osu.Game/Graphics/Containers/OsuFocusedOverlayContainer.cs
index f92cfc2306..162c4b6a59 100644
--- a/osu.Game/Graphics/Containers/OsuFocusedOverlayContainer.cs
+++ b/osu.Game/Graphics/Containers/OsuFocusedOverlayContainer.cs
@@ -24,6 +24,7 @@ namespace osu.Game.Graphics.Containers
private Sample samplePopOut;
protected virtual string PopInSampleName => "UI/overlay-pop-in";
protected virtual string PopOutSampleName => "UI/overlay-pop-out";
+ protected virtual double PopInOutSampleBalance => 0;
protected override bool BlockNonPositionalInput => true;
@@ -133,15 +134,21 @@ namespace osu.Game.Graphics.Containers
return;
}
- if (didChange)
- samplePopIn?.Play();
+ if (didChange && samplePopIn != null)
+ {
+ samplePopIn.Balance.Value = PopInOutSampleBalance;
+ samplePopIn.Play();
+ }
if (BlockScreenWideMouse && DimMainContent) overlayManager?.ShowBlockingOverlay(this);
break;
case Visibility.Hidden:
- if (didChange)
- samplePopOut?.Play();
+ if (didChange && samplePopOut != null)
+ {
+ samplePopOut.Balance.Value = PopInOutSampleBalance;
+ samplePopOut.Play();
+ }
if (BlockScreenWideMouse) overlayManager?.HideBlockingOverlay(this);
break;
diff --git a/osu.Game/Graphics/Containers/WaveContainer.cs b/osu.Game/Graphics/Containers/WaveContainer.cs
index 9fd3d103c9..e84cb276a4 100644
--- a/osu.Game/Graphics/Containers/WaveContainer.cs
+++ b/osu.Game/Graphics/Containers/WaveContainer.cs
@@ -2,6 +2,9 @@
// See the LICENCE file in the repository root for full licence text.
using System;
+using osu.Framework.Allocation;
+using osu.Framework.Audio;
+using osu.Framework.Audio.Sample;
using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
@@ -32,6 +35,12 @@ namespace osu.Game.Graphics.Containers
protected override bool StartHidden => true;
+ private Sample? samplePopIn;
+ private Sample? samplePopOut;
+
+ // required due to LoadAsyncComplete() in `VisibilityContainer` calling PopOut() during load - similar workaround to `OsuDropdownMenu`
+ private bool wasShown;
+
public Color4 FirstWaveColour
{
get => firstWave.Colour;
@@ -56,6 +65,13 @@ namespace osu.Game.Graphics.Containers
set => fourthWave.Colour = value;
}
+ [BackgroundDependencyLoader(true)]
+ private void load(AudioManager audio)
+ {
+ samplePopIn = audio.Samples.Get("UI/wave-pop-in");
+ samplePopOut = audio.Samples.Get("UI/overlay-big-pop-out");
+ }
+
public WaveContainer()
{
Masking = true;
@@ -110,6 +126,8 @@ namespace osu.Game.Graphics.Containers
w.Show();
contentContainer.MoveToY(0, APPEAR_DURATION, Easing.OutQuint);
+ samplePopIn?.Play();
+ wasShown = true;
}
protected override void PopOut()
@@ -118,6 +136,9 @@ namespace osu.Game.Graphics.Containers
w.Hide();
contentContainer.MoveToY(2, DISAPPEAR_DURATION, Easing.In);
+
+ if (wasShown)
+ samplePopOut?.Play();
}
protected override void UpdateAfterChildren()
diff --git a/osu.Game/Graphics/UserInterface/OsuAnimatedButton.cs b/osu.Game/Graphics/UserInterface/OsuAnimatedButton.cs
index de4df96942..0eec04541c 100644
--- a/osu.Game/Graphics/UserInterface/OsuAnimatedButton.cs
+++ b/osu.Game/Graphics/UserInterface/OsuAnimatedButton.cs
@@ -46,8 +46,8 @@ namespace osu.Game.Graphics.UserInterface
private readonly Container content;
private readonly Box hover;
- public OsuAnimatedButton()
- : base(HoverSampleSet.Button)
+ public OsuAnimatedButton(HoverSampleSet sampleSet = HoverSampleSet.Button)
+ : base(sampleSet)
{
base.Content.Add(content = new Container
{
diff --git a/osu.Game/Graphics/UserInterface/ShearedToggleButton.cs b/osu.Game/Graphics/UserInterface/ShearedToggleButton.cs
index d5e0abe9d8..05ed531d02 100644
--- a/osu.Game/Graphics/UserInterface/ShearedToggleButton.cs
+++ b/osu.Game/Graphics/UserInterface/ShearedToggleButton.cs
@@ -14,6 +14,12 @@ namespace osu.Game.Graphics.UserInterface
private Sample? sampleOff;
private Sample? sampleOn;
+ ///
+ /// Sheared toggle buttons by default play two samples when toggled: a click and a toggle (on/off).
+ /// Sometimes this might be too much. Setting this to false will silence the toggle sound.
+ ///
+ protected virtual bool PlayToggleSamples => true;
+
///
/// Whether this button is currently toggled to an active state.
///
@@ -68,10 +74,13 @@ namespace osu.Game.Graphics.UserInterface
{
sampleClick?.Play();
- if (Active.Value)
- sampleOn?.Play();
- else
- sampleOff?.Play();
+ if (PlayToggleSamples)
+ {
+ if (Active.Value)
+ sampleOn?.Play();
+ else
+ sampleOff?.Play();
+ }
}
}
}
diff --git a/osu.Game/Graphics/UserInterfaceV2/OsuPopover.cs b/osu.Game/Graphics/UserInterfaceV2/OsuPopover.cs
index 381193d539..9b4689958c 100644
--- a/osu.Game/Graphics/UserInterfaceV2/OsuPopover.cs
+++ b/osu.Game/Graphics/UserInterfaceV2/OsuPopover.cs
@@ -2,6 +2,8 @@
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Allocation;
+using osu.Framework.Audio;
+using osu.Framework.Audio.Sample;
using osu.Framework.Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
@@ -21,6 +23,14 @@ namespace osu.Game.Graphics.UserInterfaceV2
private const float fade_duration = 250;
private const double scale_duration = 500;
+ private Sample? samplePopIn;
+ private Sample? samplePopOut;
+ protected virtual string PopInSampleName => "UI/overlay-pop-in";
+ protected virtual string PopOutSampleName => "UI/overlay-pop-out";
+
+ // required due to LoadAsyncComplete() in `VisibilityContainer` calling PopOut() during load - similar workaround to `OsuDropdownMenu`
+ private bool wasOpened;
+
public OsuPopover(bool withPadding = true)
{
Content.Padding = withPadding ? new MarginPadding(20) : new MarginPadding();
@@ -38,9 +48,11 @@ namespace osu.Game.Graphics.UserInterfaceV2
}
[BackgroundDependencyLoader(true)]
- private void load(OverlayColourProvider? colourProvider, OsuColour colours)
+ private void load(OverlayColourProvider? colourProvider, OsuColour colours, AudioManager audio)
{
Background.Colour = Arrow.Colour = colourProvider?.Background4 ?? colours.GreySeaFoamDarker;
+ samplePopIn = audio.Samples.Get(PopInSampleName);
+ samplePopOut = audio.Samples.Get(PopOutSampleName);
}
protected override Drawable CreateArrow() => Empty();
@@ -49,12 +61,18 @@ namespace osu.Game.Graphics.UserInterfaceV2
{
this.ScaleTo(1, scale_duration, Easing.OutElasticHalf);
this.FadeIn(fade_duration, Easing.OutQuint);
+
+ samplePopIn?.Play();
+ wasOpened = true;
}
protected override void PopOut()
{
this.ScaleTo(0.7f, scale_duration, Easing.OutQuint);
this.FadeOut(fade_duration, Easing.OutQuint);
+
+ if (wasOpened)
+ samplePopOut?.Play();
}
protected override bool OnKeyDown(KeyDownEvent e)
diff --git a/osu.Game/Overlays/ChatOverlay.cs b/osu.Game/Overlays/ChatOverlay.cs
index 87df08ceec..a47d10c565 100644
--- a/osu.Game/Overlays/ChatOverlay.cs
+++ b/osu.Game/Overlays/ChatOverlay.cs
@@ -55,6 +55,9 @@ namespace osu.Game.Overlays
private const float side_bar_width = 190;
private const float chat_bar_height = 60;
+ protected override string PopInSampleName => @"UI/overlay-big-pop-in";
+ protected override string PopOutSampleName => @"UI/overlay-big-pop-out";
+
[Resolved]
private OsuConfigManager config { get; set; } = null!;
diff --git a/osu.Game/Overlays/LoginOverlay.cs b/osu.Game/Overlays/LoginOverlay.cs
index a575253e71..8a4bda89d9 100644
--- a/osu.Game/Overlays/LoginOverlay.cs
+++ b/osu.Game/Overlays/LoginOverlay.cs
@@ -20,6 +20,8 @@ namespace osu.Game.Overlays
private const float transition_time = 400;
+ protected override double PopInOutSampleBalance => OsuGameBase.SFX_STEREO_STRENGTH;
+
[Cached]
private OverlayColourProvider colourProvider = new OverlayColourProvider(OverlayColourScheme.Purple);
diff --git a/osu.Game/Overlays/Mods/AddPresetButton.cs b/osu.Game/Overlays/Mods/AddPresetButton.cs
index 731079d1d9..276afd9bec 100644
--- a/osu.Game/Overlays/Mods/AddPresetButton.cs
+++ b/osu.Game/Overlays/Mods/AddPresetButton.cs
@@ -18,6 +18,8 @@ namespace osu.Game.Overlays.Mods
{
public partial class AddPresetButton : ShearedToggleButton, IHasPopover
{
+ protected override bool PlayToggleSamples => false;
+
[Resolved]
private OsuColour colours { get; set; } = null!;
diff --git a/osu.Game/Overlays/NotificationOverlay.cs b/osu.Game/Overlays/NotificationOverlay.cs
index b93d5f1e12..6e0ea23dd1 100644
--- a/osu.Game/Overlays/NotificationOverlay.cs
+++ b/osu.Game/Overlays/NotificationOverlay.cs
@@ -31,6 +31,8 @@ namespace osu.Game.Overlays
public LocalisableString Title => NotificationsStrings.HeaderTitle;
public LocalisableString Description => NotificationsStrings.HeaderDescription;
+ protected override double PopInOutSampleBalance => OsuGameBase.SFX_STEREO_STRENGTH;
+
public const float WIDTH = 320;
public const float TRANSITION_LENGTH = 600;
diff --git a/osu.Game/Overlays/SettingsPanel.cs b/osu.Game/Overlays/SettingsPanel.cs
index d7f39a9d8f..58c56a5514 100644
--- a/osu.Game/Overlays/SettingsPanel.cs
+++ b/osu.Game/Overlays/SettingsPanel.cs
@@ -56,6 +56,7 @@ namespace osu.Game.Overlays
private SeekLimitedSearchTextBox searchTextBox;
protected override string PopInSampleName => "UI/settings-pop-in";
+ protected override double PopInOutSampleBalance => -OsuGameBase.SFX_STEREO_STRENGTH;
private readonly bool showSidebar;
diff --git a/osu.Game/Overlays/WaveOverlayContainer.cs b/osu.Game/Overlays/WaveOverlayContainer.cs
index 153f7f5412..0295ff467a 100644
--- a/osu.Game/Overlays/WaveOverlayContainer.cs
+++ b/osu.Game/Overlays/WaveOverlayContainer.cs
@@ -18,7 +18,9 @@ namespace osu.Game.Overlays
protected override bool StartHidden => true;
- protected override string PopInSampleName => "UI/wave-pop-in";
+ // `WaveContainer` plays PopIn/PopOut samples, so we disable the overlay-level one as to not double-up sample playback.
+ protected override string PopInSampleName => string.Empty;
+ protected override string PopOutSampleName => string.Empty;
public const float HORIZONTAL_PADDING = 50;
diff --git a/osu.Game/Screens/Edit/Compose/Components/BeatDivisorControl.cs b/osu.Game/Screens/Edit/Compose/Components/BeatDivisorControl.cs
index 59b0bd1785..e36f1e9cad 100644
--- a/osu.Game/Screens/Edit/Compose/Components/BeatDivisorControl.cs
+++ b/osu.Game/Screens/Edit/Compose/Components/BeatDivisorControl.cs
@@ -262,6 +262,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
private readonly OsuSpriteText divisorText;
public DivisorDisplay()
+ : base(HoverSampleSet.Default)
{
Anchor = Anchor.Centre;
Origin = Anchor.Centre;
diff --git a/osu.Game/Screens/Edit/Setup/LabelledFileChooser.cs b/osu.Game/Screens/Edit/Setup/LabelledFileChooser.cs
index d14357e875..61f33c4bdc 100644
--- a/osu.Game/Screens/Edit/Setup/LabelledFileChooser.cs
+++ b/osu.Game/Screens/Edit/Setup/LabelledFileChooser.cs
@@ -114,6 +114,9 @@ namespace osu.Game.Screens.Edit.Setup
private partial class FileChooserPopover : OsuPopover
{
+ protected override string PopInSampleName => "UI/overlay-big-pop-in";
+ protected override string PopOutSampleName => "UI/overlay-big-pop-out";
+
public FileChooserPopover(string[] handledExtensions, Bindable currentFile, string? chooserPath)
{
Child = new Container
diff --git a/osu.Game/Screens/OnlinePlay/Lounge/DrawableLoungeRoom.cs b/osu.Game/Screens/OnlinePlay/Lounge/DrawableLoungeRoom.cs
index 70e4b2a589..5cf2f91ff4 100644
--- a/osu.Game/Screens/OnlinePlay/Lounge/DrawableLoungeRoom.cs
+++ b/osu.Game/Screens/OnlinePlay/Lounge/DrawableLoungeRoom.cs
@@ -170,7 +170,6 @@ namespace osu.Game.Screens.OnlinePlay.Lounge
if (Room.HasPassword.Value)
{
- sampleJoin?.Play();
this.ShowPopover();
return true;
}
diff --git a/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs b/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs
index 5753c268d9..7b631ebfea 100644
--- a/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs
+++ b/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs
@@ -32,6 +32,9 @@ namespace osu.Game.Screens.Select.Options
public override bool BlockScreenWideMouse => false;
+ protected override string PopInSampleName => "SongSelect/options-pop-in";
+ protected override string PopOutSampleName => "SongSelect/options-pop-out";
+
public BeatmapOptionsOverlay()
{
AutoSizeAxes = Axes.Y;
diff --git a/osu.sln.DotSettings b/osu.sln.DotSettings
index ef39c12768..c2778ca5b1 100644
--- a/osu.sln.DotSettings
+++ b/osu.sln.DotSettings
@@ -170,7 +170,7 @@
ERROR
WARNING
WARNING
- HINT
+ DO_NOT_SHOW
WARNING
WARNING
WARNING