diff --git a/widget/slider.go b/widget/slider.go index 9623555f7a..0798939fa6 100644 --- a/widget/slider.go +++ b/widget/slider.go @@ -100,7 +100,14 @@ func (s *Slider) DragEnd() { func (s *Slider) Dragged(e *fyne.DragEvent) { ratio := s.getRatio(&(e.PointEvent)) + lastValue := s.Value + s.updateValue(ratio) + + if lastValue == s.Value { + return + } + s.Refresh() if s.OnChanged != nil { @@ -174,9 +181,15 @@ func (s *Slider) SetValue(value float64) { return } + lastValue := s.Value + s.Value = value s.clampValueToRange() + if lastValue == s.Value { + return + } + if s.OnChanged != nil { s.OnChanged(s.Value) } diff --git a/widget/slider_test.go b/widget/slider_test.go index 52292d76bc..67eb4e230c 100644 --- a/widget/slider_test.go +++ b/widget/slider_test.go @@ -118,7 +118,8 @@ func TestSlider_VerticalLayout(t *testing.T) { } func TestSlider_OnChanged(t *testing.T) { - slider := NewSlider(0, 1) + slider := NewSlider(0, 2) + slider.Resize(slider.MinSize()) assert.Empty(t, slider.OnChanged) changes := 0 @@ -130,9 +131,18 @@ func TestSlider_OnChanged(t *testing.T) { assert.Equal(t, 0, changes) slider.SetValue(0.5) + assert.Equal(t, 0, changes) + + drag := &fyne.DragEvent{} + drag.PointEvent.Position = fyne.NewPos(25, 2) + slider.Dragged(drag) + assert.Equal(t, 1, changes) + + drag.PointEvent.Position = fyne.NewPos(25, 2) + slider.Dragged(drag) assert.Equal(t, 1, changes) - drag := &fyne.DragEvent{Dragged: fyne.NewDelta(10, 2)} + drag.PointEvent.Position = fyne.NewPos(50, 2) slider.Dragged(drag) assert.Equal(t, 2, changes) }