osukey/osu.Game/Graphics/UserInterface/HoverClickSounds.cs
Bartłomiej Dach 658e0edc3e Handle other button clicks in HoverClickSounds
As suggested in review, remove previously introduced HoverMouseUpSounds
and instead change effect playing logic in HoverClickSounds by moving it
out of OnClick() to OnMouseUp().

Users of the class can either use the existing constructor to play
the effect only on left click or use the newly introduced constructor
with the MouseButton[] parameter to specify which button clicks should
trigger the sound.
2019-08-31 20:16:16 +02:00

62 lines
2.2 KiB
C#

// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. 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
{
/// <summary>
/// Adds hover and click sounds to a drawable.
/// Does not draw anything.
/// </summary>
public class HoverClickSounds : HoverSounds
{
private SampleChannel sampleClick;
private readonly MouseButton[] buttons;
/// <summary>
/// Creates an instance that adds sounds on hover and left click only.
/// </summary>
/// <param name="sampleSet">Set of click samples to play.</param>
public HoverClickSounds(HoverSampleSet sampleSet = HoverSampleSet.Normal)
: this(new[] { MouseButton.Left }, sampleSet)
{
}
/// <summary>
/// Creates an instance that adds sounds on hover and on click for any of the buttons specified.
/// </summary>
/// <param name="buttons">Array of button codes which should trigger the click sound.</param>
/// <param name="sampleSet">Set of click samples to play.</param>
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()}");
}
}
}