diff --git a/src/UniGetUI/Controls/PackageItemContainer.cs b/src/UniGetUI/Controls/PackageItemContainer.cs index 988d9a59b..485cc662f 100644 --- a/src/UniGetUI/Controls/PackageItemContainer.cs +++ b/src/UniGetUI/Controls/PackageItemContainer.cs @@ -1,3 +1,6 @@ +using Microsoft.UI.Xaml.Automation; +using Microsoft.UI.Xaml.Automation.Peers; +using Microsoft.UI.Xaml.Automation.Provider; using Microsoft.UI.Xaml.Controls; using UniGetUI.PackageEngine.Interfaces; using UniGetUI.PackageEngine.PackageClasses; @@ -7,6 +10,78 @@ namespace UniGetUI.Interface.Widgets public partial class PackageItemContainer : ItemContainer { public IPackage? Package { get; set; } - public PackageWrapper Wrapper { get; set; } = null!; + + private PackageWrapper _wrapper = null!; + public PackageWrapper Wrapper + { + get => _wrapper; + set + { + if (_wrapper != null) + { + _wrapper.PropertyChanged -= Wrapper_PropertyChanged; + } + _wrapper = value; + if (_wrapper != null) + { + _wrapper.PropertyChanged += Wrapper_PropertyChanged; + } + } + } + + private void Wrapper_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(PackageWrapper.IsChecked)) + { + var peer = FrameworkElementAutomationPeer.FromElement(this) as PackageItemContainerAutomationPeer; + if (peer != null) + { + ToggleState oldState = !Wrapper.IsChecked ? ToggleState.On : ToggleState.Off; + ToggleState newState = Wrapper.IsChecked ? ToggleState.On : ToggleState.Off; + peer.RaiseToggleStatePropertyChanged(oldState, newState); + } + } + } + + protected override AutomationPeer OnCreateAutomationPeer() + { + return new PackageItemContainerAutomationPeer(this); + } + } + + public partial class PackageItemContainerAutomationPeer : FrameworkElementAutomationPeer, IToggleProvider + { + private readonly PackageItemContainer _owner; + + public PackageItemContainerAutomationPeer(PackageItemContainer owner) : base(owner) + { + _owner = owner; + } + + protected override AutomationControlType GetAutomationControlTypeCore() + { + return AutomationControlType.CheckBox; + } + + protected override object GetPatternCore(PatternInterface patternInterface) + { + if (patternInterface == PatternInterface.Toggle) + { + return this; + } + return base.GetPatternCore(patternInterface); + } + + public ToggleState ToggleState => (_owner.Wrapper != null && _owner.Wrapper.IsChecked) ? ToggleState.On : ToggleState.Off; + + public void Toggle() + { + _owner.Wrapper?.IsChecked = !_owner.Wrapper.IsChecked; + } + + public void RaiseToggleStatePropertyChanged(ToggleState oldValue, ToggleState newValue) + { + RaisePropertyChangedEvent(TogglePatternIdentifiers.ToggleStateProperty, oldValue, newValue); + } } } diff --git a/src/UniGetUI/Controls/PackageWrapper.cs b/src/UniGetUI/Controls/PackageWrapper.cs index aefd9c77e..659bb579b 100644 --- a/src/UniGetUI/Controls/PackageWrapper.cs +++ b/src/UniGetUI/Controls/PackageWrapper.cs @@ -31,10 +31,13 @@ public bool IsChecked { Package.IsChecked = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsChecked))); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(CheckedStatus))); _page.UpdatePackageCount(); } } + public string CheckedStatus => IsChecked ? CoreTools.Translate("Checked") : CoreTools.Translate("Unchecked"); + public bool IconWasLoaded; public bool AlternateIdIconVisible; public bool ShowCustomPackageIcon; diff --git a/src/UniGetUI/MainWindow.xaml b/src/UniGetUI/MainWindow.xaml index 27052a27a..87af24f38 100644 --- a/src/UniGetUI/MainWindow.xaml +++ b/src/UniGetUI/MainWindow.xaml @@ -36,6 +36,7 @@ PaneToggleRequested="TitleBar_PaneToggleRequested" SizeChanged="TitleBar_SizeChanged" Visibility="Collapsed" + IsTabStop="False" > @@ -285,6 +287,8 @@ HorizontalAlignment="Left" VerticalAlignment="Top" IsChecked="{x:Bind IsChecked, Mode=TwoWay}" + IsTabStop="False" + AutomationProperties.AccessibilityView="Raw" />