diff --git a/container/split.go b/container/split.go index 7d1e3244e4..bd064e3a48 100644 --- a/container/split.go +++ b/container/split.go @@ -20,6 +20,11 @@ type Split struct { Horizontal bool Leading fyne.CanvasObject Trailing fyne.CanvasObject + + // to communicate to the renderer that the next refresh + // is just an offset update (ie a resize and move only) + // cleared by renderer in Refresh() + offsetUpdated bool } // NewHSplit creates a horizontally arranged container with the specified leading and trailing elements. @@ -76,6 +81,7 @@ func (s *Split) SetOffset(offset float64) { return } s.Offset = offset + s.offsetUpdated = true s.Refresh() } @@ -147,6 +153,12 @@ func (r *splitContainerRenderer) Objects() []fyne.CanvasObject { } func (r *splitContainerRenderer) Refresh() { + if r.split.offsetUpdated { + r.Layout(r.split.Size()) + r.split.offsetUpdated = false + return + } + r.objects[0] = r.split.Leading // [1] is divider which doesn't change r.objects[2] = r.split.Trailing diff --git a/container/split_test.go b/container/split_test.go index 4a2d776dee..21577bd576 100644 --- a/container/split_test.go +++ b/container/split_test.go @@ -9,6 +9,7 @@ import ( "fyne.io/fyne/v2/driver/desktop" "fyne.io/fyne/v2/test" "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" "github.com/stretchr/testify/assert" ) @@ -521,3 +522,31 @@ func TestSplitContainer_Hidden(t *testing.T) { assert.Equal(t, float32(0), sc.Trailing.Size().Height) }) } + +func TestSplitContainer_UpdateOffsetDoesNotRefreshContent(t *testing.T) { + objA := &refreshCountingWidget{} + objB := &refreshCountingWidget{} + split := NewHSplit(objA, objB) + split.SetOffset(0.4) + assert.Equal(t, 0, objA.refreshCount) + assert.Equal(t, 0, objB.refreshCount) + + split.Refresh() + assert.Equal(t, 1, objA.refreshCount) + assert.Equal(t, 1, objB.refreshCount) +} + +type refreshCountingWidget struct { + widget.BaseWidget + + refreshCount int +} + +func (r *refreshCountingWidget) CreateRenderer() fyne.WidgetRenderer { + return widget.NewSimpleRenderer(canvas.NewRectangle(color.Transparent)) +} + +func (r *refreshCountingWidget) Refresh() { + r.refreshCount += 1 + r.BaseWidget.Refresh() +}