Skip to content

Добавить кнопку перехода к играющему плейлисту в хедер очереди #38

@Scream034

Description

@Scream034

Какую проблему решит эта фича?

Когда пользователь слушает длинный плейлист и переходит на экран «Очередь» (QueueView.axaml), у него часто возникает необходимость вернуться обратно к исходному плейлисту (чтобы посмотреть его описание, обложку, отредактировать список или запустить синхронизацию).

Сейчас для этого приходится:

  1. Переходить во вкладку «Библиотека» (Library).
  2. Искать нужный плейлист в списке вручную.

Это создает лишнее трение в UX, хотя плеер уже "под капотом" знает, из какого источника была запущена текущая сессия.

Описание предлагаемого решения

Предлагается добавить новую кнопку-иконку в блок действий хедера очереди (в том же стиле, рядом с кнопками перемешивания, загрузки, очистки и сохранения).

Поведение кнопки:

  • Видимость/Активность: Кнопка должна быть видима/активна только тогда, когда плеер воспроизводит музыку из конкретного локального или облачного плейлиста (т.е. когда источник очереди — плейлист, а не рекомендации Home или поиск).
  • Действие: При нажатии происходит мгновенная навигация на экран плейлиста (PlaylistView.axaml) с передачей его идентификатора.

Техническая реализация (архитектура):

В нашем распоряжении уже есть готовая инфраструктура для реализации этой фичи без накладных расходов:

  1. Класс PlayerControlService.cs уже отслеживает идентификатор активного плейлиста через BehaviorSubject:
    private readonly BehaviorSubject<string?> _activePlaylistIdSubject = new(null);
    public IObservable<string?> ActivePlaylistIdObservable => _activePlaylistIdSubject.AsObservable();
    public string? ActivePlaylistId => _activePlaylistIdSubject.Value;
  2. В QueueViewModel.cs можно внедрить зависимость PlayerControlService (зарегистрирован как Singleton в DI) и отслеживать это свойство:
    [Reactive] public bool CanNavigateToPlaylist { get; private set; }
    public string? ActivePlaylistId { get; private set; }
    public ReactiveCommand<Unit, Unit> GoToPlaylistCommand { get; }
  3. Логика команды GoToPlaylistCommand вызывает навигацию главного окна (через MainWindowViewModel или координатор навигации):
    // В конструкторе QueueViewModel:
    this.WhenAnyValue(x => x.ActivePlaylistId, id => !string.IsNullOrEmpty(id))
        .ObserveOn(RxSchedulers.MainThreadScheduler)
        .BindTo(this, x => x.CanNavigateToPlaylist)
        .DisposeWith(Disposables);
    
    GoToPlaylistCommand = CreateCommand(ReactiveCommand.Create(() => 
    {
        if (!string.IsNullOrEmpty(ActivePlaylistId))
        {
            _mainWindow.NavigateToPlaylist(ActivePlaylistId);
        }
    }, this.WhenAnyValue(x => x.CanNavigateToPlaylist)));

Metadata

Metadata

Assignees

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions