Highlight active playlist. Various optimizations and fixes.
This commit is contained in:
@@ -1,12 +1,99 @@
|
||||
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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
ListViewItem listViewItem = (ListViewItem)PlaylistsListView.ContainerFromItem(_viewModel.ActivePlaylist);
|
||||
|
||||
if (listViewItem is null)
|
||||
return;
|
||||
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user