on main help sign in
fix(tui): completions: reposition popup on window resize
28aac45Ayman Bagabas
internal/tui/components/chat/editor/editor.go+9
@@ -161,10 +161,19 @@ func (m *editorCmp) send() tea.Cmd {
161 )
161 )
162}
162}
163
163
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+
164func (m *editorCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
171func (m *editorCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
165 var cmd tea.Cmd
172 var cmd tea.Cmd
166 var cmds []tea.Cmd
173 var cmds []tea.Cmd
167 switch msg := msg.(type) {
174 switch msg := msg.(type) {
175+ case tea.WindowSizeMsg:
176+ return m, m.repositionCompletions
168 case filepicker.FilePickedMsg:
177 case filepicker.FilePickedMsg:
169 if len(m.attachments) >= maxAttachments {
178 if len(m.attachments) >= maxAttachments {
170 return m, util.ReportError(fmt.Errorf("cannot add more than %d images", maxAttachments))
179 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 {
29 Reopen bool
29 Reopen bool
30}
30}
31
31
32+type RepositionCompletionsMsg struct {
33+ X, Y int
34+}
35+
32type CompletionsClosedMsg struct{}
36type CompletionsClosedMsg struct{}
33
37
34type CompletionsOpenedMsg struct{}
38type CompletionsOpenedMsg struct{}
@@ -52,6 +56,7 @@ type Completions interface {
52
56
53type completionsCmp struct {
57type completionsCmp struct {
54 wWidth int // The window width
58 wWidth int // The window width
59+ wHeight int // The window height
55 width int
60 width int
56 lastWidth int
61 lastWidth int
57 height int // Height of the completions component`
62 height int // Height of the completions component`
@@ -88,7 +93,7 @@ func New() Completions {
88 )
93 )
89 return &completionsCmp{
94 return &completionsCmp{
90 width: 0,
95 width: 0,
91− height: 0,
96+ height: maxCompletionsHeight,
92 list: l,
97 list: l,
93 query: "",
98 query: "",
94 keyMap: completionsKeyMap,
99 keyMap: completionsKeyMap,
@@ -107,8 +112,7 @@ func (c *completionsCmp) Init() tea.Cmd {
107func (c *completionsCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
112func (c *completionsCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
108 switch msg := msg.(type) {
113 switch msg := msg.(type) {
109 case tea.WindowSizeMsg:
114 case tea.WindowSizeMsg:
110− c.wWidth = msg.Width
115+ c.wWidth, c.wHeight = msg.Width, msg.Height
111− c.height = min(msg.Height-c.y, 15)
112 return c, nil
116 return c, nil
113 case tea.KeyPressMsg:
117 case tea.KeyPressMsg:
114 switch {
118 switch {
@@ -159,6 +163,8 @@ func (c *completionsCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
159 case key.Matches(msg, c.keyMap.Cancel):
163 case key.Matches(msg, c.keyMap.Cancel):
160 return c, util.CmdHandler(CloseCompletionsMsg{})
164 return c, util.CmdHandler(CloseCompletionsMsg{})
161 }
165 }
166+ case RepositionCompletionsMsg:
167+ c.x, c.y = msg.X, msg.Y
162 case CloseCompletionsMsg:
168 case CloseCompletionsMsg:
163 c.open = false
169 c.open = false
164 return c, util.CmdHandler(CompletionsClosedMsg{})
170 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) {
165 p.keyboardEnhancements = msg
165 p.keyboardEnhancements = msg
166 return p, nil
166 return p, nil
167 case tea.WindowSizeMsg:
167 case tea.WindowSizeMsg:
168+ u, cmd := p.editor.Update(msg)
169+ p.editor = u.(editor.Editor)
168− return p, p.SetSize(msg.Width, msg.Height)
170+ return p, tea.Batch(p.SetSize(msg.Width, msg.Height), cmd)
169 case CancelTimerExpiredMsg:
171 case CancelTimerExpiredMsg:
170 p.isCanceling = false
172 p.isCanceling = false
171 return p, nil
173 return p, nil
internal/tui/tui.go+1−1
@@ -116,7 +116,7 @@ func (a *appModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
116 return a, a.handleWindowResize(msg.Width, msg.Height)
116 return a, a.handleWindowResize(msg.Width, msg.Height)
117
117
118 // Completions messages
118 // Completions messages
119− case completions.OpenCompletionsMsg, completions.FilterCompletionsMsg, completions.CloseCompletionsMsg:
119+ case completions.OpenCompletionsMsg, completions.FilterCompletionsMsg, completions.CloseCompletionsMsg, completions.RepositionCompletionsMsg:
120 u, completionCmd := a.completions.Update(msg)
120 u, completionCmd := a.completions.Update(msg)
121 a.completions = u.(completions.Completions)
121 a.completions = u.(completions.Completions)
122 return a, completionCmd
122 return a, completionCmd