// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // 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; using osu.Framework.Input.Events; using osuTK.Input; namespace osu.Game.Graphics.UserInterface { /// /// Adds hover and click sounds to a drawable. /// Does not draw anything. /// public class HoverClickSounds : HoverSounds { private SampleChannel sampleClick; private readonly MouseButton[] buttons; /// /// Creates an instance that adds sounds on hover and left click only. /// /// Set of click samples to play. public HoverClickSounds(HoverSampleSet sampleSet = HoverSampleSet.Normal) : this(new[] { MouseButton.Left }, sampleSet) { } /// /// Creates an instance that adds sounds on hover and on click for any of the buttons specified. /// /// Array of button codes which should trigger the click sound. /// Set of click samples to play. public HoverClickSounds(MouseButton[] buttons, HoverSampleSet sampleSet = HoverSampleSet.Normal) : base(sampleSet) { this.buttons = buttons; } protected override bool OnMouseUp(MouseUpEvent e) { var index = Array.IndexOf(buttons, e.Button); bool shouldPlayEffect = index > -1 && index < buttons.Length; // examine the button pressed first for short-circuiting // in most usages it is more likely that another button was pressed than that the cursor left the drawable bounds if (shouldPlayEffect && Contains(e.ScreenSpaceMousePosition)) sampleClick?.Play(); return base.OnMouseUp(e); } [BackgroundDependencyLoader] private void load(AudioManager audio) { sampleClick = audio.Samples.Get($@"UI/generic-select{SampleSet.GetDescription()}"); } } }