Какую проблему решит эта фича?
Когда пользователь слушает длинный плейлист и переходит на экран «Очередь» (QueueView.axaml), у него часто возникает необходимость вернуться обратно к исходному плейлисту (чтобы посмотреть его описание, обложку, отредактировать список или запустить синхронизацию).
Сейчас для этого приходится:
- Переходить во вкладку «Библиотека» (Library).
- Искать нужный плейлист в списке вручную.
Это создает лишнее трение в UX, хотя плеер уже "под капотом" знает, из какого источника была запущена текущая сессия.
Описание предлагаемого решения
Предлагается добавить новую кнопку-иконку в блок действий хедера очереди (в том же стиле, рядом с кнопками перемешивания, загрузки, очистки и сохранения).
Поведение кнопки:
- Видимость/Активность: Кнопка должна быть видима/активна только тогда, когда плеер воспроизводит музыку из конкретного локального или облачного плейлиста (т.е. когда источник очереди — плейлист, а не рекомендации Home или поиск).
- Действие: При нажатии происходит мгновенная навигация на экран плейлиста (
PlaylistView.axaml) с передачей его идентификатора.
Техническая реализация (архитектура):
В нашем распоряжении уже есть готовая инфраструктура для реализации этой фичи без накладных расходов:
- Класс
PlayerControlService.cs уже отслеживает идентификатор активного плейлиста через BehaviorSubject:
private readonly BehaviorSubject<string?> _activePlaylistIdSubject = new(null);
public IObservable<string?> ActivePlaylistIdObservable => _activePlaylistIdSubject.AsObservable();
public string? ActivePlaylistId => _activePlaylistIdSubject.Value;
- В
QueueViewModel.cs можно внедрить зависимость PlayerControlService (зарегистрирован как Singleton в DI) и отслеживать это свойство:
[Reactive] public bool CanNavigateToPlaylist { get; private set; }
public string? ActivePlaylistId { get; private set; }
public ReactiveCommand<Unit, Unit> GoToPlaylistCommand { get; }
- Логика команды
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)));
Какую проблему решит эта фича?
Когда пользователь слушает длинный плейлист и переходит на экран «Очередь» (
QueueView.axaml), у него часто возникает необходимость вернуться обратно к исходному плейлисту (чтобы посмотреть его описание, обложку, отредактировать список или запустить синхронизацию).Сейчас для этого приходится:
Это создает лишнее трение в UX, хотя плеер уже "под капотом" знает, из какого источника была запущена текущая сессия.
Описание предлагаемого решения
Предлагается добавить новую кнопку-иконку в блок действий хедера очереди (в том же стиле, рядом с кнопками перемешивания, загрузки, очистки и сохранения).
Поведение кнопки:
PlaylistView.axaml) с передачей его идентификатора.Техническая реализация (архитектура):
В нашем распоряжении уже есть готовая инфраструктура для реализации этой фичи без накладных расходов:
PlayerControlService.csуже отслеживает идентификатор активного плейлиста черезBehaviorSubject:QueueViewModel.csможно внедрить зависимостьPlayerControlService(зарегистрирован как Singleton в DI) и отслеживать это свойство:GoToPlaylistCommandвызывает навигацию главного окна (черезMainWindowViewModelили координатор навигации):