Skip to content

Commit 7592813

Browse files
authored
Merge pull request #30910 from nekodex/improve-menu-sample-playback
Improve menu/context-menu sample playback
2 parents 3d6e766 + 6901455 commit 7592813

File tree

12 files changed

+107
-73
lines changed

12 files changed

+107
-73
lines changed

osu.Android.props

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<EmbedAssembliesIntoApk>true</EmbedAssembliesIntoApk>
1111
</PropertyGroup>
1212
<ItemGroup>
13-
<PackageReference Include="ppy.osu.Framework.Android" Version="2024.1128.0" />
13+
<PackageReference Include="ppy.osu.Framework.Android" Version="2024.1205.0" />
1414
</ItemGroup>
1515
<PropertyGroup>
1616
<!-- Fody does not handle Android build well, and warns when unchanged.

osu.Game.Tests/Visual/UserInterface/TestSceneContextMenu.cs

+10-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,16 @@ private static MenuItem[] makeMenu()
101101
}
102102
}
103103
}
104-
}
104+
},
105+
}
106+
},
107+
new OsuMenuItem(@"Another nested option")
108+
{
109+
Items = new MenuItem[]
110+
{
111+
new OsuMenuItem(@"Sub-One"),
112+
new OsuMenuItem(@"Sub-Two"),
113+
new OsuMenuItem(@"Sub-Three"),
105114
}
106115
},
107116
new OsuMenuItem(@"Choose me please"),

osu.Game/Graphics/Cursor/OsuContextMenuContainer.cs

-8
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,8 @@ namespace osu.Game.Graphics.Cursor
1111
[Cached(typeof(OsuContextMenuContainer))]
1212
public partial class OsuContextMenuContainer : ContextMenuContainer
1313
{
14-
[Cached]
15-
private OsuContextMenuSamples samples = new OsuContextMenuSamples();
16-
1714
private OsuContextMenu menu = null!;
1815

19-
public OsuContextMenuContainer()
20-
{
21-
AddInternal(samples);
22-
}
23-
2416
protected override Menu CreateMenu() => menu = new OsuContextMenu(true);
2517

2618
public void CloseMenu()

osu.Game/Graphics/UserInterface/HoverSampleSet.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ public enum HoverSampleSet
2323
DialogCancel,
2424

2525
[Description("dialog-ok")]
26-
DialogOk
26+
DialogOk,
27+
28+
[Description("menu-open")]
29+
MenuOpen,
2730
}
2831
}

osu.Game/Graphics/UserInterface/OsuContextMenu.cs

+7-8
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public partial class OsuContextMenu : OsuMenu
1515
private const int fade_duration = 250;
1616

1717
[Resolved]
18-
private OsuContextMenuSamples samples { get; set; } = null!;
18+
private OsuMenuSamples menuSamples { get; set; } = null!;
1919

2020
// todo: this shouldn't be required after https://github.com/ppy/osu-framework/issues/4519 is fixed.
2121
private bool wasOpened;
@@ -47,23 +47,22 @@ private void load(OsuColour colours)
4747

4848
protected override void AnimateOpen()
4949
{
50+
wasOpened = true;
5051
this.FadeIn(fade_duration, Easing.OutQuint);
5152

52-
if (playClickSample)
53-
samples.PlayClickSample();
54-
55-
if (!wasOpened)
56-
samples.PlayOpenSample();
53+
if (!playClickSample)
54+
return;
5755

58-
wasOpened = true;
56+
menuSamples.PlayClickSample();
57+
menuSamples.PlayOpenSample();
5958
}
6059

6160
protected override void AnimateClose()
6261
{
6362
this.FadeOut(fade_duration, Easing.OutQuint);
6463

6564
if (wasOpened)
66-
samples.PlayCloseSample();
65+
menuSamples.PlayCloseSample();
6766

6867
wasOpened = false;
6968
}

osu.Game/Graphics/UserInterface/OsuContextMenuSamples.cs

-37
This file was deleted.

osu.Game/Graphics/UserInterface/OsuMenu.cs

+6-13
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
#nullable disable
55

66
using osu.Framework.Allocation;
7-
using osu.Framework.Audio;
8-
using osu.Framework.Audio.Sample;
97
using osu.Framework.Extensions.Color4Extensions;
108
using osu.Framework.Graphics;
119
using osu.Framework.Graphics.Containers;
@@ -20,26 +18,21 @@ namespace osu.Game.Graphics.UserInterface
2018
{
2119
public partial class OsuMenu : Menu
2220
{
23-
private Sample sampleOpen;
24-
private Sample sampleClose;
25-
2621
// todo: this shouldn't be required after https://github.com/ppy/osu-framework/issues/4519 is fixed.
2722
private bool wasOpened;
2823

24+
[Resolved]
25+
private OsuMenuSamples menuSamples { get; set; } = null!;
26+
2927
public OsuMenu(Direction direction, bool topLevelMenu = false)
3028
: base(direction, topLevelMenu)
3129
{
3230
BackgroundColour = Color4.Black.Opacity(0.5f);
3331

3432
MaskingContainer.CornerRadius = 4;
3533
ItemsContainer.Padding = new MarginPadding(5);
36-
}
3734

38-
[BackgroundDependencyLoader]
39-
private void load(AudioManager audio)
40-
{
41-
sampleOpen = audio.Samples.Get(@"UI/dropdown-open");
42-
sampleClose = audio.Samples.Get(@"UI/dropdown-close");
35+
OnSubmenuOpen += _ => { menuSamples?.PlaySubOpenSample(); };
4336
}
4437

4538
protected override void Update()
@@ -64,7 +57,7 @@ protected override void Update()
6457
protected override void AnimateOpen()
6558
{
6659
if (!TopLevelMenu && !wasOpened)
67-
sampleOpen?.Play();
60+
menuSamples?.PlayOpenSample();
6861

6962
this.FadeIn(300, Easing.OutQuint);
7063
wasOpened = true;
@@ -73,7 +66,7 @@ protected override void AnimateOpen()
7366
protected override void AnimateClose()
7467
{
7568
if (!TopLevelMenu && wasOpened)
76-
sampleClose?.Play();
69+
menuSamples?.PlayCloseSample();
7770

7871
this.FadeOut(300, Easing.OutQuint);
7972
wasOpened = false;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// Copyright (c) ppy Pty Ltd <[email protected]>. Licensed under the MIT Licence.
2+
// See the LICENCE file in the repository root for full licence text.
3+
4+
#nullable disable
5+
6+
using osu.Framework.Allocation;
7+
using osu.Framework.Audio;
8+
using osu.Framework.Audio.Sample;
9+
using osu.Framework.Graphics;
10+
11+
namespace osu.Game.Graphics.UserInterface
12+
{
13+
public partial class OsuMenuSamples : Component
14+
{
15+
private Sample sampleClick;
16+
private Sample sampleOpen;
17+
private Sample sampleSubOpen;
18+
private Sample sampleClose;
19+
20+
private bool triggerOpen;
21+
private bool triggerSubOpen;
22+
private bool triggerClose;
23+
24+
[BackgroundDependencyLoader]
25+
private void load(AudioManager audio)
26+
{
27+
sampleClick = audio.Samples.Get(@"UI/menu-open-select");
28+
sampleOpen = audio.Samples.Get(@"UI/menu-open");
29+
sampleSubOpen = audio.Samples.Get(@"UI/menu-sub-open");
30+
sampleClose = audio.Samples.Get(@"UI/menu-close");
31+
}
32+
33+
public void PlayClickSample()
34+
{
35+
Scheduler.AddOnce(playClickSample);
36+
}
37+
38+
public void PlayOpenSample()
39+
{
40+
triggerOpen = true;
41+
Scheduler.AddOnce(resolvePlayback);
42+
}
43+
44+
public void PlaySubOpenSample()
45+
{
46+
triggerSubOpen = true;
47+
Scheduler.AddOnce(resolvePlayback);
48+
}
49+
50+
public void PlayCloseSample()
51+
{
52+
triggerClose = true;
53+
Scheduler.AddOnce(resolvePlayback);
54+
}
55+
56+
private void playClickSample() => sampleClick.Play();
57+
58+
private void resolvePlayback()
59+
{
60+
if (triggerSubOpen)
61+
sampleSubOpen?.Play();
62+
else if (triggerOpen)
63+
sampleOpen?.Play();
64+
else if (triggerClose)
65+
sampleClose?.Play();
66+
67+
triggerOpen = triggerSubOpen = triggerClose = false;
68+
}
69+
}
70+
}

osu.Game/OsuGameBase.cs

+5
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
using osu.Game.Extensions;
4242
using osu.Game.Graphics;
4343
using osu.Game.Graphics.Cursor;
44+
using osu.Game.Graphics.UserInterface;
4445
using osu.Game.Input;
4546
using osu.Game.Input.Bindings;
4647
using osu.Game.IO;
@@ -383,6 +384,10 @@ private void load(ReadableKeyCombinationProvider keyCombinationProvider, Framewo
383384

384385
GlobalActionContainer globalBindings;
385386

387+
OsuMenuSamples menuSamples;
388+
dependencies.Cache(menuSamples = new OsuMenuSamples());
389+
base.Content.Add(menuSamples);
390+
386391
base.Content.Add(SafeAreaContainer = new SafeAreaContainer
387392
{
388393
SafeAreaOverrideEdges = SafeAreaOverrideEdges,

osu.Game/Screens/Edit/Components/Menus/EditorMenuBar.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ private void load(OverlayColourProvider colourProvider)
9999
ForegroundColourHover = colourProvider.Content1;
100100
BackgroundColourHover = colourProvider.Background1;
101101

102-
AddInternal(hoverClickSounds = new HoverClickSounds());
102+
AddInternal(hoverClickSounds = new HoverClickSounds(HoverSampleSet.MenuOpen));
103103
}
104104

105105
protected override void LoadComplete()

osu.Game/osu.Game.csproj

+2-2
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@
3535
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
3636
</PackageReference>
3737
<PackageReference Include="Realm" Version="11.5.0" />
38-
<PackageReference Include="ppy.osu.Framework" Version="2024.1128.0" />
39-
<PackageReference Include="ppy.osu.Game.Resources" Version="2024.1106.0" />
38+
<PackageReference Include="ppy.osu.Framework" Version="2024.1205.0" />
39+
<PackageReference Include="ppy.osu.Game.Resources" Version="2024.1202.0" />
4040
<PackageReference Include="Sentry" Version="4.13.0" />
4141
<!-- Held back due to 0.34.0 failing AOT compilation on ZstdSharp.dll dependency. -->
4242
<PackageReference Include="SharpCompress" Version="0.38.0" />

osu.iOS.props

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@
1717
<MtouchInterpreter>-all</MtouchInterpreter>
1818
</PropertyGroup>
1919
<ItemGroup>
20-
<PackageReference Include="ppy.osu.Framework.iOS" Version="2024.1128.0" />
20+
<PackageReference Include="ppy.osu.Framework.iOS" Version="2024.1205.0" />
2121
</ItemGroup>
2222
</Project>

0 commit comments

Comments
 (0)