summaryrefslogtreecommitdiffhomepage
path: root/packages/tui/internal/layout
diff options
context:
space:
mode:
authoradamdottv <[email protected]>2025-06-13 11:18:46 -0500
committeradamdottv <[email protected]>2025-06-13 11:18:46 -0500
commit61396b93edd8e93ad45503ca785f94314d9cd4b5 (patch)
tree91b1db1d11712e212b1ecfa96880a1a3269131ad /packages/tui/internal/layout
parent62b9a30a9c70bd48768055f0049400d27a849c3e (diff)
downloadopencode-61396b93edd8e93ad45503ca785f94314d9cd4b5.tar.gz
opencode-61396b93edd8e93ad45503ca785f94314d9cd4b5.zip
wip: refactoring tui
Diffstat (limited to 'packages/tui/internal/layout')
-rw-r--r--packages/tui/internal/layout/container.go10
-rw-r--r--packages/tui/internal/layout/flex.go40
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...)