Files
harmonia/Harmonia.WinUI/Views/PlaylistsView.xaml.cs

116 lines
3.9 KiB
C#

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;
}
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
}