Browse Source

Merge pull request #966 from PixiEditor/fixes/11.06.2025

Fixed slider overriding value
Krzysztof Krysiński 2 months ago
parent
commit
259b51d78a

+ 83 - 0
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<Slider>
+{
+    public static readonly StyledProperty<bool> CanBindProperty = AvaloniaProperty.Register<SliderBindingBehavior, bool>(
+        nameof(CanBind));
+
+    public static readonly StyledProperty<IBinding?> ValueBindingProperty = AvaloniaProperty.Register<SliderBindingBehavior, IBinding?>(
+        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<bool> 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<IBinding> 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);
+            }
+        }
+    }
+}

+ 8 - 2
src/PixiEditor/Views/Nodes/Properties/DoublePropertyView.axaml

@@ -43,10 +43,16 @@
                                    Min="{Binding Min}" Max="{Binding Max}"
                                    Min="{Binding Min}" Max="{Binding Max}"
                                    Value="{Binding DoubleValue, Mode=TwoWay}" />
                                    Value="{Binding DoubleValue, Mode=TwoWay}" />
 
 
-                <Slider Value="{Binding DoubleValue, Mode=TwoWay}"
-                        Margin="5, 0"
+                <Slider
+                        Margin="5, 0" Name="slider"
                         Classes.colorSlider="{Binding SliderSettings.IsColorSlider}"
                         Classes.colorSlider="{Binding SliderSettings.IsColorSlider}"
                         Minimum="{Binding Min}" Maximum="{Binding Max}">
                         Minimum="{Binding Min}" Maximum="{Binding Max}">
+                    <Interaction.Behaviors>
+                        <behaviours:SliderBindingBehavior
+                            CanBind="{Binding NumberPickerMode,
+                                            Converter={converters:EnumBooleanConverter}, ConverterParameter=Slider}"
+                            ValueBinding="{Binding DoubleValue, Mode=TwoWay}"/>
+                    </Interaction.Behaviors>
                     <Slider.Styles>
                     <Slider.Styles>
                         <Style Selector="Slider.colorSlider Border#TrackBackground">
                         <Style Selector="Slider.colorSlider Border#TrackBackground">
                             <Setter Property="Background" Value="{Binding SliderSettings.BackgroundBrush}" />
                             <Setter Property="Background" Value="{Binding SliderSettings.BackgroundBrush}" />