Files
Wino-Mail/Wino.Mail/MenuFlyouts/FilterMenuFlyout.cs
Aleh Khantsevich 2ec05ea7cc UWP .NET9 (#555)
* Ground work for NET9 UWP switch.

* Add launch settings for Wino.Mail

* Added new test WAP project

* fix platforms in slnx solution

* ManagePackageVersionsCentrally set default

* Fixing assets and couple issues with the new packaging project.

* Add back markdown

* Fix nuget warnings

* FIx error in WAP about build tools

* Add build.props with default language preview

* Some AOT compilation progress.

* More AOT stuff.

* Remove deprecated protocol auth activation handler.

* Fix remaining protocol handler for google auth.

* Even more AOT

* More more AOT fixes

* Fix a few more AOT warnings

* Fix signature editor AOT

* Fix composer and renderer AOT JSON

* Outlook Sync AOT

* Fixing bundle generation and package signing.

---------

Co-authored-by: Burak Kaan Köse <bkaankose@outlook.com>
2025-02-14 01:43:52 +01:00

222 lines
8.3 KiB
C#

using System.Collections.Generic;
using System.Linq;
using CommunityToolkit.Mvvm.Input;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Wino.Core.Domain.Models.Reader;
using Wino.Core.UWP.Controls;
using Wino.Helpers;
namespace Wino.MenuFlyouts
{
public partial class FilterMenuFlyout : MenuFlyout
{
public static readonly DependencyProperty SelectedFilterChangedCommandProperty = DependencyProperty.Register(nameof(SelectedFilterChangedCommand), typeof(IRelayCommand<FilterOption>), typeof(FilterMenuFlyout), new PropertyMetadata(null));
public static readonly DependencyProperty FilterOptionsProperty = DependencyProperty.Register(nameof(FilterOptions), typeof(List<FilterOption>), typeof(FilterMenuFlyout), new PropertyMetadata(null, new PropertyChangedCallback(OnOptionsChanged)));
public static readonly DependencyProperty SelectedFilterOptionProperty = DependencyProperty.Register(nameof(SelectedFilterOption), typeof(FilterOption), typeof(FilterMenuFlyout), new PropertyMetadata(null, OnSelectedFilterOptionChanged));
public static readonly DependencyProperty SelectedSortingOptionProperty = DependencyProperty.Register(nameof(SelectedSortingOption), typeof(SortingOption), typeof(FilterMenuFlyout), new PropertyMetadata(null, new PropertyChangedCallback(OnSelectedSortingOptionChanged)));
public static readonly DependencyProperty SortingOptionsProperty = DependencyProperty.Register(nameof(SortingOptions), typeof(List<SortingOption>), typeof(FilterMenuFlyout), new PropertyMetadata(null, new PropertyChangedCallback(OnOptionsChanged)));
public static readonly DependencyProperty SelectedSortingOptionChangedCommandProperty = DependencyProperty.Register(nameof(SelectedSortingOptionChangedCommand), typeof(IRelayCommand<SortingOption>), typeof(FilterMenuFlyout), new PropertyMetadata(null));
public IRelayCommand<FilterOption> SelectedFilterChangedCommand
{
get { return (IRelayCommand<FilterOption>)GetValue(SelectedFilterChangedCommandProperty); }
set { SetValue(SelectedFilterChangedCommandProperty, value); }
}
public IRelayCommand<SortingOption> SelectedSortingOptionChangedCommand
{
get { return (IRelayCommand<SortingOption>)GetValue(SelectedSortingOptionChangedCommandProperty); }
set { SetValue(SelectedSortingOptionChangedCommandProperty, value); }
}
public List<FilterOption> FilterOptions
{
get { return (List<FilterOption>)GetValue(FilterOptionsProperty); }
set { SetValue(FilterOptionsProperty, value); }
}
public List<SortingOption> SortingOptions
{
get { return (List<SortingOption>)GetValue(SortingOptionsProperty); }
set { SetValue(SortingOptionsProperty, value); }
}
public FilterOption SelectedFilterOption
{
get { return (FilterOption)GetValue(SelectedFilterOptionProperty); }
set { SetValue(SelectedFilterOptionProperty, value); }
}
public SortingOption SelectedSortingOption
{
get { return (SortingOption)GetValue(SelectedSortingOptionProperty); }
set { SetValue(SelectedSortingOptionProperty, value); }
}
private static void OnSelectedFilterOptionChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
if (obj is FilterMenuFlyout bar)
{
bar.SelectFilterOption(bar.SelectedFilterOption);
bar.SelectedFilterChangedCommand?.Execute(bar.SelectedFilterOption);
}
}
private static void OnSelectedSortingOptionChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
if (obj is FilterMenuFlyout bar)
{
bar.SelectSortingOption(bar.SelectedSortingOption);
bar.SelectedSortingOptionChangedCommand?.Execute(bar.SelectedSortingOption);
}
}
private ToggleMenuFlyoutItem CreateFilterToggleButton(FilterOption option)
{
var button = new ToggleMenuFlyoutItem()
{
Text = option.Title,
Tag = option,
Icon = new WinoFontIcon() { Icon = XamlHelpers.GetWinoIconGlyph(option.Type) },
IsChecked = option == SelectedFilterOption
};
button.Click += FilterToggleChecked;
return button;
}
private ToggleMenuFlyoutItem CreateSortingToggleButton(SortingOption option)
{
var button = new ToggleMenuFlyoutItem()
{
Text = option.Title,
Tag = option,
Icon = new WinoFontIcon() { Icon = XamlHelpers.GetWinoIconGlyph(option.Type)},
IsChecked = option == SelectedSortingOption
};
button.Click += SortingOptionChecked;
return button;
}
private void SortingOptionChecked(object sender, RoutedEventArgs e)
{
if (sender is ToggleMenuFlyoutItem button)
{
button.IsHitTestVisible = false;
var optionModel = button.Tag as SortingOption;
SelectSortingOption(optionModel);
}
}
private void FilterToggleChecked(object sender, RoutedEventArgs e)
{
if (sender is ToggleMenuFlyoutItem button)
{
button.IsHitTestVisible = false;
var optionModel = button.Tag as FilterOption;
SelectFilterOption(optionModel);
}
}
private void SelectFilterOption(FilterOption option)
{
SelectedFilterOption = option;
UncheckOtherFilterOptions();
}
private void SelectSortingOption(SortingOption option)
{
SelectedSortingOption = option;
UncheckOtherSortingOptions();
}
private void UnregisterCheckedHandler(ToggleMenuFlyoutItem button)
{
button.Click -= FilterToggleChecked;
}
private void UncheckOtherFilterOptions()
{
if (Items.Any())
{
foreach (var item in Items)
{
if (item is ToggleMenuFlyoutItem toggleButton && toggleButton.Tag is FilterOption option && option != SelectedFilterOption)
{
toggleButton.IsChecked = false;
toggleButton.IsHitTestVisible = true;
}
}
}
}
private void UncheckOtherSortingOptions()
{
if (Items.Any())
{
foreach (var item in Items)
{
if (item is ToggleMenuFlyoutItem toggleButton && toggleButton.Tag is SortingOption option && option != SelectedSortingOption)
{
toggleButton.IsChecked = false;
toggleButton.IsHitTestVisible = true;
}
}
}
}
public void Dispose()
{
foreach (var item in Items)
{
if (item is ToggleMenuFlyoutItem toggleButton)
{
UnregisterCheckedHandler(toggleButton);
}
}
}
private static void OnOptionsChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
if (obj is FilterMenuFlyout bar && bar.SortingOptions != null && bar.FilterOptions != null)
{
bar.Dispose();
bar.Items.Clear();
if (bar.FilterOptions != null)
{
foreach (var item in bar.FilterOptions)
{
bar.Items.Add(bar.CreateFilterToggleButton(item));
}
}
bar.Items.Add(new MenuFlyoutSeparator());
// Sorting options.
if (bar.SortingOptions != null)
{
foreach (var item in bar.SortingOptions)
{
bar.Items.Add(bar.CreateSortingToggleButton(item));
}
}
}
}
}
}