diff options
Diffstat (limited to 'packages/tui/internal/layout')
| -rw-r--r-- | packages/tui/internal/layout/container.go | 10 | ||||
| -rw-r--r-- | packages/tui/internal/layout/flex.go | 40 |
2 files changed, 49 insertions, 1 deletions
diff --git a/packages/tui/internal/layout/container.go b/packages/tui/internal/layout/container.go index 3fa844afc..c57b7bd7e 100644 --- a/packages/tui/internal/layout/container.go +++ b/packages/tui/internal/layout/container.go @@ -18,11 +18,14 @@ type Container interface { Blur() MaxWidth() int Alignment() lipgloss.Position + GetPosition() (x, y int) } type container struct { width int height int + x int + y int content ModelWithView @@ -140,7 +143,7 @@ func (c *container) SetSize(width, height int) tea.Cmd { } func (c *container) GetSize() (int, int) { - return c.width, c.height + return min(c.width, c.maxWidth), c.height } func (c *container) MaxWidth() int { @@ -169,6 +172,11 @@ func (c *container) Blur() { } } +// GetPosition returns the x, y coordinates of the container +func (c *container) GetPosition() (x, y int) { + return c.x, c.y +} + type ContainerOption func(*container) func NewContainer(content ModelWithView, options ...ContainerOption) Container { diff --git a/packages/tui/internal/layout/flex.go b/packages/tui/internal/layout/flex.go index dd04968d4..031dd970f 100644 --- a/packages/tui/internal/layout/flex.go +++ b/packages/tui/internal/layout/flex.go @@ -159,11 +159,51 @@ func (f *flexLayout) SetSize(width, height int) tea.Cmd { f.height = height var cmds []tea.Cmd + currentX, currentY := 0, 0 + for i, pane := range f.panes { if pane != nil { paneWidth, paneHeight := f.calculatePaneSize(i) + + // Calculate actual position based on alignment + actualX, actualY := currentX, currentY + + if f.direction == FlexDirectionHorizontal { + // In horizontal layout, vertical alignment affects Y position + // (lipgloss.Center is used for vertical alignment in JoinHorizontal) + actualY = (f.height - paneHeight) / 2 + } else { + // In vertical layout, horizontal alignment affects X position + contentWidth := paneWidth + if pane.MaxWidth() > 0 && contentWidth > pane.MaxWidth() { + contentWidth = pane.MaxWidth() + } + + switch pane.Alignment() { + case lipgloss.Center: + actualX = (f.width - contentWidth) / 2 + case lipgloss.Right: + actualX = f.width - contentWidth + case lipgloss.Left: + actualX = 0 + } + } + + // Set position if the pane is a *container + if c, ok := pane.(*container); ok { + c.x = actualX + c.y = actualY + } + cmd := pane.SetSize(paneWidth, paneHeight) cmds = append(cmds, cmd) + + // Update position for next pane + if f.direction == FlexDirectionHorizontal { + currentX += paneWidth + } else { + currentY += paneHeight + } } } return tea.Batch(cmds...) |
