| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- using Content.Shared.Audio.Jukebox;
- using Robust.Client.Audio;
- using Robust.Client.AutoGenerated;
- using Robust.Client.UserInterface;
- using Robust.Client.UserInterface.Controls;
- using Robust.Client.UserInterface.XAML;
- using Robust.Shared.Audio.Components;
- using Robust.Shared.Input;
- using Robust.Shared.Prototypes;
- using Robust.Shared.Timing;
- using FancyWindow = Content.Client.UserInterface.Controls.FancyWindow;
- namespace Content.Client.Audio.Jukebox;
- [GenerateTypedNameReferences]
- public sealed partial class JukeboxMenu : FancyWindow
- {
- [Dependency] private readonly IEntityManager _entManager = default!;
- private AudioSystem _audioSystem;
- /// <summary>
- /// Are we currently 'playing' or paused for the play / pause button.
- /// </summary>
- private bool _playState;
- /// <summary>
- /// True if playing, false if paused.
- /// </summary>
- public event Action<bool>? OnPlayPressed;
- public event Action? OnStopPressed;
- public event Action<ProtoId<JukeboxPrototype>>? OnSongSelected;
- public event Action<float>? SetTime;
- private EntityUid? _audio;
- private float _lockTimer;
- public JukeboxMenu()
- {
- RobustXamlLoader.Load(this);
- IoCManager.InjectDependencies(this);
- _audioSystem = _entManager.System<AudioSystem>();
- MusicList.OnItemSelected += args =>
- {
- var entry = MusicList[args.ItemIndex];
- if (entry.Metadata is not string juke)
- return;
- OnSongSelected?.Invoke(juke);
- };
- PlayButton.OnPressed += args =>
- {
- OnPlayPressed?.Invoke(!_playState);
- };
- StopButton.OnPressed += args =>
- {
- OnStopPressed?.Invoke();
- };
- PlaybackSlider.OnReleased += PlaybackSliderKeyUp;
- SetPlayPauseButton(_audioSystem.IsPlaying(_audio), force: true);
- }
- public JukeboxMenu(AudioSystem audioSystem)
- {
- _audioSystem = audioSystem;
- }
- public void SetAudioStream(EntityUid? audio)
- {
- _audio = audio;
- }
- private void PlaybackSliderKeyUp(Slider args)
- {
- SetTime?.Invoke(PlaybackSlider.Value);
- _lockTimer = 0.5f;
- }
- /// <summary>
- /// Re-populates the list of jukebox prototypes available.
- /// </summary>
- public void Populate(IEnumerable<JukeboxPrototype> jukeboxProtos)
- {
- MusicList.Clear();
- foreach (var entry in jukeboxProtos)
- {
- MusicList.AddItem(entry.Name, metadata: entry.ID);
- }
- }
- public void SetPlayPauseButton(bool playing, bool force = false)
- {
- if (_playState == playing && !force)
- return;
- _playState = playing;
- if (playing)
- {
- PlayButton.Text = Loc.GetString("jukebox-menu-buttonpause");
- return;
- }
- PlayButton.Text = Loc.GetString("jukebox-menu-buttonplay");
- }
- public void SetSelectedSong(string name, float length)
- {
- SetSelectedSongText(name);
- PlaybackSlider.MaxValue = length;
- PlaybackSlider.SetValueWithoutEvent(0);
- }
- protected override void FrameUpdate(FrameEventArgs args)
- {
- base.FrameUpdate(args);
- if (_lockTimer > 0f)
- {
- _lockTimer -= args.DeltaSeconds;
- }
- PlaybackSlider.Disabled = _lockTimer > 0f;
- if (_entManager.TryGetComponent(_audio, out AudioComponent? audio))
- {
- DurationLabel.Text = $@"{TimeSpan.FromSeconds(audio.PlaybackPosition):mm\:ss} / {_audioSystem.GetAudioLength(audio.FileName):mm\:ss}";
- }
- else
- {
- DurationLabel.Text = $"00:00 / 00:00";
- }
- if (PlaybackSlider.Grabbed)
- return;
- if (audio != null || _entManager.TryGetComponent(_audio, out audio))
- {
- PlaybackSlider.SetValueWithoutEvent(audio.PlaybackPosition);
- }
- else
- {
- PlaybackSlider.SetValueWithoutEvent(0f);
- }
- SetPlayPauseButton(_audioSystem.IsPlaying(_audio, audio));
- }
- public void SetSelectedSongText(string? text)
- {
- if (!string.IsNullOrEmpty(text))
- {
- SongName.Text = text;
- }
- else
- {
- SongName.Text = "---";
- }
- }
- }
|