// 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.Allocation; using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Input.Bindings; using osu.Game.Beatmaps; using osu.Game.Input.Bindings; using osu.Game.Overlays.OSD; namespace osu.Game.Overlays.Music { /// /// Handles s related to music playback, and displays s via the global accordingly. /// public class MusicKeyBindingHandler : Component, IKeyBindingHandler { [Resolved] private IBindable beatmap { get; set; } [Resolved] private MusicController musicController { get; set; } [Resolved(canBeNull: true)] private OnScreenDisplay onScreenDisplay { get; set; } public bool OnPressed(GlobalAction action) { if (beatmap.Disabled) return false; switch (action) { case GlobalAction.MusicPlay: // use previous state as TogglePause may not update the track's state immediately (state update is run on the audio thread see https://github.com/ppy/osu/issues/9880#issuecomment-674668842) bool wasPlaying = musicController.IsPlaying; if (musicController.TogglePause()) onScreenDisplay?.Display(new MusicActionToast(wasPlaying ? "Pause track" : "Play track", action)); return true; case GlobalAction.MusicNext: musicController.NextTrack(() => onScreenDisplay?.Display(new MusicActionToast("Next track", action))); return true; case GlobalAction.MusicPrev: musicController.PreviousTrack(res => { switch (res) { case PreviousTrackResult.Restart: onScreenDisplay?.Display(new MusicActionToast("Restart track", action)); break; case PreviousTrackResult.Previous: onScreenDisplay?.Display(new MusicActionToast("Previous track", action)); break; } }); return true; } return false; } public void OnReleased(GlobalAction action) { } private class MusicActionToast : Toast { public MusicActionToast(string value, GlobalAction action) : base("Music Playback", value, action: action) { } } } }