diff --git a/widget/splitcontainer.go b/widget/splitcontainer.go index 9f8ea1fcdf..e47bd68042 100644 --- a/widget/splitcontainer.go +++ b/widget/splitcontainer.go @@ -222,8 +222,20 @@ func (d *divider) DragEnd() { func (d *divider) Dragged(event *fyne.DragEvent) { offset := d.split.Offset if d.split.Horizontal { + if leadingRatio := float64(d.split.Leading.Size().Width) / float64(d.split.Size().Width); offset < leadingRatio { + offset = leadingRatio + } + if trailingRatio := 1. - (float64(d.split.Trailing.Size().Width) / float64(d.split.Size().Width)); offset > trailingRatio { + offset = trailingRatio + } offset += float64(event.Dragged.DX) / float64(d.split.Size().Width) } else { + if leadingRatio := float64(d.split.Leading.Size().Height) / float64(d.split.Size().Height); offset < leadingRatio { + offset = leadingRatio + } + if trailingRatio := 1. - (float64(d.split.Trailing.Size().Height) / float64(d.split.Size().Height)); offset > trailingRatio { + offset = trailingRatio + } offset += float64(event.Dragged.DY) / float64(d.split.Size().Height) } d.split.SetOffset(offset) diff --git a/widget/splitcontainer_test.go b/widget/splitcontainer_test.go index b340d61758..a3dd45aba1 100644 --- a/widget/splitcontainer_test.go +++ b/widget/splitcontainer_test.go @@ -278,6 +278,64 @@ func TestSplitContainer_divider_drag(t *testing.T) { }) } +func TestSplitContainer_divider_drag_StartOffsetLessThanMinSize(t *testing.T) { + size := fyne.NewSize(30, 30) + objA := canvas.NewRectangle(color.NRGBA{0, 0, 0, 0}) + objA.SetMinSize(size) + objB := canvas.NewRectangle(color.NRGBA{0, 0, 0, 0}) + objB.SetMinSize(size) + t.Run("Horizontal", func(t *testing.T) { + split := NewHSplitContainer(objA, objB) + split.Resize(fyne.NewSize(100, 100)) + divider := newDivider(split) + t.Run("Leading", func(t *testing.T) { + split.SetOffset(0.1) + + divider.Dragged(&fyne.DragEvent{ + Dragged: fyne.NewDelta(10, 0), + }) + divider.DragEnd() + + assert.Equal(t, 0.4, split.Offset) + }) + t.Run("Trailing", func(t *testing.T) { + split.SetOffset(0.9) + + divider.Dragged(&fyne.DragEvent{ + Dragged: fyne.NewDelta(-10, 0), + }) + divider.DragEnd() + + assert.Equal(t, 0.6, split.Offset) + }) + }) + t.Run("Vertical", func(t *testing.T) { + split := NewVSplitContainer(objA, objB) + split.Resize(fyne.NewSize(100, 100)) + divider := newDivider(split) + t.Run("Leading", func(t *testing.T) { + split.SetOffset(0.1) + + divider.Dragged(&fyne.DragEvent{ + Dragged: fyne.NewDelta(0, 10), + }) + divider.DragEnd() + + assert.Equal(t, 0.4, split.Offset) + }) + t.Run("Trailing", func(t *testing.T) { + split.SetOffset(0.9) + + divider.Dragged(&fyne.DragEvent{ + Dragged: fyne.NewDelta(0, -10), + }) + divider.DragEnd() + + assert.Equal(t, 0.6, split.Offset) + }) + }) +} + func TestSplitContainer_divider_hover(t *testing.T) { t.Run("Horizontal", func(t *testing.T) { divider := newDivider(&SplitContainer{Horizontal: true})