diff --git a/ui/ui.go b/ui/ui.go index 3a0a0ac..40849fe 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -56,22 +56,35 @@ func (c *Container) Draw(s tcell.Screen) { func (c *Container) SetSize(x, y, h, w int) { c.x, c.y, c.h, c.w = x, y, h, w + carry := 0 if c.layoutMethod == LayoutVerticalEven { num := len(c.contents) + extra := c.h % num for r := range c.contents { w := c.w h := c.h / num x := c.x - y := c.y + (h * r) + y := c.y + (h * r) + carry + if extra > 0 { // distribute "extra" space to containers as we have some left + h++ + extra-- + carry++ + } c.contents[r].Container.SetSize(x, y, h, w) } } else if c.layoutMethod == LayoutHorizontalEven { num := len(c.contents) + extra := c.w % num for r := range c.contents { w := c.w / num h := c.h - x := c.x + (w * r) + x := c.x + (w * r) + carry y := c.y + if extra > 0 { // distribute "extra" space to containers as we have some left + w++ + extra-- + carry++ + } c.contents[r].Container.SetSize(x, y, h, w) } } else { diff --git a/ui/ui_test.go b/ui/ui_test.go index bafb5d9..90982bf 100644 --- a/ui/ui_test.go +++ b/ui/ui_test.go @@ -55,6 +55,32 @@ func TestContainerTwoBoxesHStack(t *testing.T) { t.Fail() } } +func TestContainerThreeBoxesUnevenHStack(t *testing.T) { + expect := `┌─ one ──┐┌─ two ──┐┌─ three +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +└────────┘└────────┘└───────┘ +` + m := &MockScreen{} + one := NewBox("one", nil, Contents{}) + two := NewBox("two", nil, Contents{}) + three := NewBox("three", nil, Contents{}) + container := NewContainer( + Contents{{Container: one}, {Container: two}, {Container: three}}, + LayoutHorizontalEven, + ) + m.Init() + m.Resize(0, 0, 5, 29) + container.SetSize(0, 0, 5, 29) + container.Draw(m) + result := m.DumpContents() + if result != expect { + fmt.Printf("expected:\n%+v", expect) + fmt.Printf("actual:\n%+v", result) + t.Fail() + } +} func TestContainerTwoBoxesVStack(t *testing.T) { expect := `┌─ one ──┐