Files
Wino-Mail/Wino.Mail/Behaviors/BindableCommandBarBehavior.cs

199 lines
6.3 KiB
C#
Raw Normal View History

2024-04-26 01:47:46 +02:00
using System.Collections;
2024-04-18 01:44:37 +02:00
using System.Collections.Specialized;
using System.Windows.Input;
using CommunityToolkit.WinUI;
using Microsoft.Extensions.DependencyInjection;
2024-04-26 01:47:46 +02:00
using Microsoft.Xaml.Interactivity;
2024-04-18 01:44:37 +02:00
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Wino.Core.Domain.Interfaces;
2024-04-18 01:44:37 +02:00
using Wino.Core.Domain.Models.Menus;
using Wino.Core.UWP.Controls;
2024-04-18 01:44:37 +02:00
using Wino.Helpers;
2025-02-16 11:54:23 +01:00
namespace Wino.Behaviors;
public partial class BindableCommandBarBehavior : Behavior<CommandBar>
2024-04-18 01:44:37 +02:00
{
private readonly IPreferencesService _preferencesService = App.Current.Services.GetService<IPreferencesService>();
2025-02-16 11:54:23 +01:00
public static readonly DependencyProperty PrimaryCommandsProperty = DependencyProperty.Register(
"PrimaryCommands", typeof(object), typeof(BindableCommandBarBehavior),
new PropertyMetadata(null, UpdateCommands));
2024-04-18 01:44:37 +02:00
[GeneratedDependencyProperty]
public partial ICommand ItemClickedCommand { get; set; }
2024-04-18 01:44:37 +02:00
2025-02-16 11:54:23 +01:00
public object PrimaryCommands
{
get { return GetValue(PrimaryCommandsProperty); }
set { SetValue(PrimaryCommandsProperty, value); }
}
2024-04-18 01:44:37 +02:00
2025-02-16 11:54:23 +01:00
protected override void OnDetaching()
{
base.OnDetaching();
2025-02-16 11:54:23 +01:00
AttachChanges(false);
2025-02-16 11:54:23 +01:00
if (PrimaryCommands is IEnumerable enumerable)
{
foreach (var item in enumerable)
2024-04-18 01:44:37 +02:00
{
2025-02-16 11:54:23 +01:00
if (item is ButtonBase button)
2024-04-18 01:44:37 +02:00
{
2025-02-16 11:54:23 +01:00
button.Click -= Button_Click;
2024-04-18 01:44:37 +02:00
}
}
}
2025-02-16 11:54:23 +01:00
}
2024-04-18 01:44:37 +02:00
2025-02-16 11:54:23 +01:00
private void UpdatePrimaryCommands()
{
if (AssociatedObject == null)
return;
2024-04-18 01:44:37 +02:00
2025-02-16 11:54:23 +01:00
if (PrimaryCommands == null)
return;
2024-04-18 01:44:37 +02:00
2025-02-16 11:54:23 +01:00
if (AssociatedObject.PrimaryCommands is IEnumerable enumerableObjects)
{
foreach (var item in enumerableObjects)
2024-04-18 01:44:37 +02:00
{
2025-02-16 11:54:23 +01:00
if (item is ButtonBase button)
2024-04-18 01:44:37 +02:00
{
2025-02-16 11:54:23 +01:00
button.Click -= Button_Click;
2024-04-18 01:44:37 +02:00
}
}
2025-02-16 11:54:23 +01:00
}
2024-04-18 01:44:37 +02:00
2025-02-16 11:54:23 +01:00
if (AssociatedObject.SecondaryCommands is IEnumerable secondaryObject)
{
foreach (var item in secondaryObject)
2024-04-18 01:44:37 +02:00
{
2025-02-16 11:54:23 +01:00
if (item is ButtonBase button)
2024-04-18 01:44:37 +02:00
{
2025-02-16 11:54:23 +01:00
button.Click -= Button_Click;
2024-04-18 01:44:37 +02:00
}
}
2025-02-16 11:54:23 +01:00
}
2024-04-18 01:44:37 +02:00
2025-02-16 11:54:23 +01:00
AssociatedObject.PrimaryCommands.Clear();
AssociatedObject.SecondaryCommands.Clear();
2024-04-18 01:44:37 +02:00
if (PrimaryCommands is not IEnumerable enumerable) return;
2024-04-18 01:44:37 +02:00
2025-02-16 11:54:23 +01:00
foreach (var command in enumerable)
{
if (command is MailOperationMenuItem mailOperationMenuItem)
2024-04-18 01:44:37 +02:00
{
2025-02-16 11:54:23 +01:00
ICommandBarElement menuItem = null;
2025-02-16 11:35:43 +01:00
2025-02-16 11:54:23 +01:00
if (mailOperationMenuItem.Operation == Core.Domain.Enums.MailOperation.Seperator)
{
menuItem = new AppBarSeparator();
}
else
{
var label = XamlHelpers.GetOperationString(mailOperationMenuItem.Operation);
var labelPosition = string.IsNullOrWhiteSpace(label) || !_preferencesService.IsShowActionLabelsEnabled ?
CommandBarLabelPosition.Collapsed : CommandBarLabelPosition.Default;
2025-02-16 11:54:23 +01:00
menuItem = new AppBarButton
{
Width = double.NaN,
MinWidth = 40,
2025-02-16 11:54:23 +01:00
Icon = new WinoFontIcon() { Glyph = ControlConstants.WinoIconFontDictionary[XamlHelpers.GetWinoIconGlyph(mailOperationMenuItem.Operation)] },
Label = label,
LabelPosition = labelPosition,
2025-02-16 11:54:23 +01:00
DataContext = mailOperationMenuItem,
};
if (!string.IsNullOrWhiteSpace(label))
{
var toolTip = new ToolTip
{
Content = label
};
ToolTipService.SetToolTip((DependencyObject)menuItem, toolTip);
}
2025-02-16 11:54:23 +01:00
((AppBarButton)menuItem).Click -= Button_Click;
((AppBarButton)menuItem).Click += Button_Click;
2025-02-16 11:35:43 +01:00
}
2024-04-18 01:44:37 +02:00
2025-02-16 11:54:23 +01:00
if (mailOperationMenuItem.IsSecondaryMenuPreferred)
{
AssociatedObject.SecondaryCommands.Add(menuItem);
}
else
{
AssociatedObject.PrimaryCommands.Add(menuItem);
}
}
2024-04-26 01:47:46 +02:00
2025-02-16 11:54:23 +01:00
//if (dependencyObject is ICommandBarElement icommandBarElement)
//{
// if (dependencyObject is ButtonBase button)
// {
// button.Click -= Button_Click;
// button.Click += Button_Click;
// }
2024-04-18 01:44:37 +02:00
2025-02-16 11:54:23 +01:00
// if (command is MailOperationMenuItem mailOperationMenuItem)
// {
2024-04-18 01:44:37 +02:00
2025-02-16 11:54:23 +01:00
// }
//}
}
2025-02-16 11:54:23 +01:00
}
2024-04-18 01:44:37 +02:00
2025-02-16 11:54:23 +01:00
private void Button_Click(object sender, RoutedEventArgs e)
{
ItemClickedCommand?.Execute(((ButtonBase)sender).DataContext);
}
2024-04-18 01:44:37 +02:00
2025-02-16 11:54:23 +01:00
protected override void OnAttached()
{
base.OnAttached();
2024-04-18 01:44:37 +02:00
2025-02-16 11:54:23 +01:00
AttachChanges(true);
2024-04-18 01:44:37 +02:00
2025-02-16 11:54:23 +01:00
UpdatePrimaryCommands();
}
2024-04-18 01:44:37 +02:00
2025-02-16 11:54:23 +01:00
private void PrimaryCommandsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
UpdatePrimaryCommands();
}
2025-02-16 11:35:43 +01:00
2025-02-16 11:54:23 +01:00
private static void UpdateCommands(DependencyObject dependencyObject,
DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
if (dependencyObject is not BindableCommandBarBehavior behavior) return;
2025-02-16 11:54:23 +01:00
if (dependencyPropertyChangedEventArgs.OldValue is INotifyCollectionChanged oldList)
{
oldList.CollectionChanged -= behavior.PrimaryCommandsCollectionChanged;
}
2024-04-18 01:44:37 +02:00
2025-02-16 11:54:23 +01:00
behavior.AttachChanges(true);
behavior.UpdatePrimaryCommands();
}
private void AttachChanges(bool register)
{
if (PrimaryCommands is null) return;
2025-02-16 11:54:23 +01:00
if (PrimaryCommands is INotifyCollectionChanged collectionChanged)
{
if (register)
2024-04-18 01:44:37 +02:00
{
2025-02-16 11:54:23 +01:00
collectionChanged.CollectionChanged -= PrimaryCommandsCollectionChanged;
collectionChanged.CollectionChanged += PrimaryCommandsCollectionChanged;
2024-04-18 01:44:37 +02:00
}
2025-02-16 11:54:23 +01:00
else
collectionChanged.CollectionChanged -= PrimaryCommandsCollectionChanged;
2024-04-18 01:44:37 +02:00
}
}
}