on main help sign in
fix(tui): completions: reposition popup on window resize
commit28aac45067eeab82a5abe887d285d2b2f915ce28 authorAyman Bagabas <ayman.bagabas@gmail.com> dateWed 23 Jul 2025, 18:23 (1 year ago) parent6dc3cf2
4 files changed+22−5
internal/tui/components/chat/editor/editor.go+9 internal/tui/components/completions/completions.go+9−3 internal/tui/page/chat/chat.go+3−1 internal/tui/tui.go+1−1
internal/tui/components/chat/editor/editor.go+9
@@ -161,10 +161,19 @@ func (m *editorCmp) send() tea.Cmd {
161161 )
162162}
163163
164+func (m *editorCmp) repositionCompletions() tea.Msg {
165+ cur := m.textarea.Cursor()
166+ x := cur.X + m.x // adjust for padding
167+ y := cur.Y + m.y + 1
168+ return completions.RepositionCompletionsMsg{X: x, Y: y}
169+}
170+
164171func (m *editorCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
165172 var cmd tea.Cmd
166173 var cmds []tea.Cmd
167174 switch msg := msg.(type) {
175+ case tea.WindowSizeMsg:
176+ return m, m.repositionCompletions
168177 case filepicker.FilePickedMsg:
169178 if len(m.attachments) >= maxAttachments {
170179 return m, util.ReportError(fmt.Errorf("cannot add more than %d images", maxAttachments))
internal/tui/components/completions/completions.go+9−3
@@ -29,6 +29,10 @@ type FilterCompletionsMsg struct {
2929 Reopen bool
3030}
3131
32+type RepositionCompletionsMsg struct {
33+ X, Y int
34+}
35+
3236type CompletionsClosedMsg struct{}
3337
3438type CompletionsOpenedMsg struct{}
@@ -52,6 +56,7 @@ type Completions interface {
5256
5357type completionsCmp struct {
5458 wWidth int // The window width
59+ wHeight int // The window height
5560 width int
5661 lastWidth int
5762 height int // Height of the completions component`
@@ -88,7 +93,7 @@ func New() Completions {
8893 )
8994 return &completionsCmp{
9095 width: 0,
91− height: 0,
96+ height: maxCompletionsHeight,
9297 list: l,
9398 query: "",
9499 keyMap: completionsKeyMap,
@@ -107,8 +112,7 @@ func (c *completionsCmp) Init() tea.Cmd {
107112func (c *completionsCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
108113 switch msg := msg.(type) {
109114 case tea.WindowSizeMsg:
110− c.wWidth = msg.Width
111− c.height = min(msg.Height-c.y, 15)
115+ c.wWidth, c.wHeight = msg.Width, msg.Height
112116 return c, nil
113117 case tea.KeyPressMsg:
114118 switch {
@@ -159,6 +163,8 @@ func (c *completionsCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
159163 case key.Matches(msg, c.keyMap.Cancel):
160164 return c, util.CmdHandler(CloseCompletionsMsg{})
161165 }
166+ case RepositionCompletionsMsg:
167+ c.x, c.y = msg.X, msg.Y
162168 case CloseCompletionsMsg:
163169 c.open = false
164170 return c, util.CmdHandler(CompletionsClosedMsg{})
internal/tui/page/chat/chat.go+3−1
@@ -165,7 +165,9 @@ func (p *chatPage) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
165165 p.keyboardEnhancements = msg
166166 return p, nil
167167 case tea.WindowSizeMsg:
168− return p, p.SetSize(msg.Width, msg.Height)
168+ u, cmd := p.editor.Update(msg)
169+ p.editor = u.(editor.Editor)
170+ return p, tea.Batch(p.SetSize(msg.Width, msg.Height), cmd)
169171 case CancelTimerExpiredMsg:
170172 p.isCanceling = false
171173 return p, nil
internal/tui/tui.go+1−1
@@ -116,7 +116,7 @@ func (a *appModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
116116 return a, a.handleWindowResize(msg.Width, msg.Height)
117117
118118 // Completions messages
119− case completions.OpenCompletionsMsg, completions.FilterCompletionsMsg, completions.CloseCompletionsMsg:
119+ case completions.OpenCompletionsMsg, completions.FilterCompletionsMsg, completions.CloseCompletionsMsg, completions.RepositionCompletionsMsg:
120120 u, completionCmd := a.completions.Update(msg)
121121 a.completions = u.(completions.Completions)
122122 return a, completionCmd