using CommunityToolkit.WinUI; using Harmonia.WinUI.ViewModels; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using System.ComponentModel; namespace Harmonia.WinUI.Views; public sealed partial class PlaylistsView : UserControl { private readonly PlaylistsViewModel _viewModel; public PlaylistsView() { InitializeComponent(); _viewModel = (PlaylistsViewModel)DataContext; _viewModel.PropertyChanging += OnViewModelPropertyChanging; _viewModel.PropertyChanged += OnViewModelPropertyChanged; PlaylistsListView.ContainerContentChanging += OnContainerContentChanging; foreach (MenuFlyoutItemBase item in PlaylistListViewMenuFlyout.Items) { item.DataContext = _viewModel; } } private void PlaylistsListView_RightTapped(object sender, Microsoft.UI.Xaml.Input.RightTappedRoutedEventArgs e) { _viewModel.FlyoutPlaylist = (e.OriginalSource as FrameworkElement)?.DataContext as PlaylistItemViewModel; } private void OnContainerContentChanging(ListViewBase sender, ContainerContentChangingEventArgs args) { if (args.InRecycleQueue || args.ItemContainer is not ListViewItem listViewItem) return; PlaylistItemStyle style = ReferenceEquals(args.Item, _viewModel.ActivePlaylist) ? PlaylistItemStyle.Selected : PlaylistItemStyle.Normal; UpdateListViewItemStyle(listViewItem, style); } private void OnViewModelPropertyChanging(object? sender, PropertyChangingEventArgs e) { switch (e.PropertyName) { case nameof(_viewModel.ActivePlaylist): UpdateListViewItemStyle(PlaylistItemStyle.Normal); break; } } private void OnViewModelPropertyChanged(object? sender, PropertyChangedEventArgs e) { switch (e.PropertyName) { case nameof(_viewModel.ActivePlaylist): UpdateListViewItemStyle(PlaylistItemStyle.Selected); break; } } private void UpdateListViewItemStyle(PlaylistItemStyle style) { if (PlaylistsListView.ContainerFromItem(_viewModel.ActivePlaylist) is not ListViewItem listViewItem) return; UpdateListViewItemStyle(listViewItem, style); } private void UpdateListViewItemStyle(ListViewItem listViewItem, PlaylistItemStyle style) { FrameworkElement? frameworkElement = TryGetFrameworkElement(listViewItem, "PlaylistListViewItem"); if (frameworkElement == null) return; string playlistItemIconBrushName = style == PlaylistItemStyle.Selected ? "SelectedPlaylistIconPath" : "PlaylistIconPath"; string playlistItemTitleBrushName = style == PlaylistItemStyle.Selected ? "SelectedPlaylistTitleTextBlock" : "PlaylistTitleTextBlock"; string playlistItemSubtitleBrushName = style == PlaylistItemStyle.Selected ? "SelectedPlaylistSubtitleTextBlock" : "PlaylistSubtitleTextBlock"; UpdateElementStyle(frameworkElement, "MusicNoteListPathIcon", playlistItemIconBrushName); UpdateElementStyle(frameworkElement, "PlaylistTitleTextBlock", playlistItemTitleBrushName); UpdateElementStyle(frameworkElement, "PlaylistSubtitleTextBlock", playlistItemSubtitleBrushName); } private static FrameworkElement? TryGetFrameworkElement(ListViewItem listViewItem, string elementName) { if (listViewItem.Name == elementName) { return listViewItem; } else { if (listViewItem.FindDescendant(elementName) is not FrameworkElement frameworkElement) return null; return frameworkElement; } } private void UpdateElementStyle(FrameworkElement dependencyObject, string elementName, string resourceName) { if (dependencyObject.FindDescendant(elementName) is not FrameworkElement frameworkElement) return; Resources.TryGetValue(resourceName, out object? resource); if (resource == null) Application.Current.Resources.TryGetValue(resourceName, out resource); if (resource is not Style style) return; frameworkElement.Style = style; } } public enum PlaylistItemStyle { Normal, Selected }