diff --git a/src/PixiEditor/Helpers/Behaviours/SliderBindingBehavior.cs b/src/PixiEditor/Helpers/Behaviours/SliderBindingBehavior.cs new file mode 100644 index 000000000..a753442c4 --- /dev/null +++ b/src/PixiEditor/Helpers/Behaviours/SliderBindingBehavior.cs @@ -0,0 +1,83 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Controls.Primitives; +using Avalonia.Data; +using Avalonia.Xaml.Interactivity; + +namespace PixiEditor.Helpers.Behaviours; + +public class SliderBindingBehavior : Behavior +{ + public static readonly StyledProperty CanBindProperty = AvaloniaProperty.Register( + nameof(CanBind)); + + public static readonly StyledProperty ValueBindingProperty = AvaloniaProperty.Register( + nameof(ValueBinding)); + + [AssignBinding] + public IBinding? ValueBinding + { + get => GetValue(ValueBindingProperty); + set => SetValue(ValueBindingProperty, value); + } + + public bool CanBind + { + get => GetValue(CanBindProperty); + set => SetValue(CanBindProperty, value); + } + + static SliderBindingBehavior() + { + CanBindProperty.Changed.Subscribe(OnCanBindChanged); + ValueBindingProperty.Changed.Subscribe(OnBindingChanged); + } + + protected override void OnAttached() + { + base.OnAttached(); + if (AssociatedObject != null) + { + if (CanBind) + { + AssociatedObject.Bind( + RangeBase.ValueProperty, + ValueBinding); + } + } + } + + private static void OnCanBindChanged(AvaloniaPropertyChangedEventArgs e) + { + if (e.Sender is SliderBindingBehavior behavior && behavior.AssociatedObject != null) + { + if (e.NewValue.Value && behavior.ValueBinding != null) + { + behavior.AssociatedObject.Bind( + RangeBase.ValueProperty, + behavior.ValueBinding); + } + else + { + behavior.AssociatedObject.ClearValue(RangeBase.ValueProperty); + } + } + } + + private static void OnBindingChanged(AvaloniaPropertyChangedEventArgs e) + { + if (e.Sender is SliderBindingBehavior behavior && behavior.AssociatedObject != null) + { + if (behavior.CanBind && e.NewValue.Value != null) + { + behavior.AssociatedObject.Bind( + RangeBase.ValueProperty, + e.NewValue.Value); + } + else + { + behavior.AssociatedObject.ClearValue(RangeBase.ValueProperty); + } + } + } +} diff --git a/src/PixiEditor/Views/Nodes/Properties/DoublePropertyView.axaml b/src/PixiEditor/Views/Nodes/Properties/DoublePropertyView.axaml index 4dd628216..d51c6d9fb 100644 --- a/src/PixiEditor/Views/Nodes/Properties/DoublePropertyView.axaml +++ b/src/PixiEditor/Views/Nodes/Properties/DoublePropertyView.axaml @@ -43,10 +43,16 @@ Min="{Binding Min}" Max="{Binding Max}" Value="{Binding DoubleValue, Mode=TwoWay}" /> - + + +