Files
Speckle.Material.Icons.Aval…/Material.Icons.Avalonia.Demo/Controls/SelectionWrapper.cs
T
2021-02-06 20:49:15 +03:00

68 lines
2.5 KiB
C#

using System;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Metadata;
namespace Material.Icons.Avalonia.Demo.Controls {
[PseudoClasses("selectednow")]
public class SelectionWrapper : UserControl {
static SelectionWrapper() {
PointerPressedEvent.Raised.Subscribe(tuple => {
if (tuple.Item1 is SelectionWrapper selectionWrapper) {
selectionWrapper.CurrentSelected = selectionWrapper.DataSource;
}
});
CurrentSelectedProperty.Changed.Subscribe(args => {
if (args.Sender is SelectionWrapper selectionWrapper) {
selectionWrapper.UpdateSelectedNow();
}
});
SelectedNowProperty.Changed.Subscribe(args => {
if (args.Sender is SelectionWrapper selectionWrapper) {
if (args.NewValue.Value) {
selectionWrapper.PseudoClasses.Add(":selectednow");
}
else {
selectionWrapper.PseudoClasses.Remove(":selectednow");
}
}
});
}
protected override void OnDataContextEndUpdate() {
base.OnDataContextEndUpdate();
UpdateSelectedNow();
}
public void UpdateSelectedNow() {
SelectedNow = DataSource != null && DataSource == CurrentSelected;
}
public static readonly StyledProperty<object> DataSourceProperty = AvaloniaProperty.Register<SelectionWrapper, object>(nameof(DataSource));
public object DataSource {
get => GetValue(DataSourceProperty);
set => SetValue(DataSourceProperty, value);
}
public static readonly StyledProperty<object> CurrentSelectedProperty = AvaloniaProperty.Register<SelectionWrapper, object>(nameof(CurrentSelected));
public object CurrentSelected {
get => GetValue(CurrentSelectedProperty);
set => SetValue(CurrentSelectedProperty, value);
}
public static readonly DirectProperty<SelectionWrapper, bool> SelectedNowProperty = AvaloniaProperty.RegisterDirect<SelectionWrapper, bool>(
nameof(SelectedNow),
wrapper => wrapper.CurrentSelected == wrapper.DataSource);
private bool _selectedNow;
public bool SelectedNow {
get => _selectedNow;
private set => SetAndRaise(SelectedNowProperty, ref _selectedNow, value);
}
}
}