Refactor TUI rendering handling and general cleanup
Improves render handling by moving the responsibility of laying out the whole UI from each view and into the main `tui` model. Our `ViewModel` interface has now diverged from bubbletea's `Model` and introduces individual `Header`, `Content`, and `Footer` methods for rendering those UI elements. Also moved away from using value receivers on our Update and View functions (as is common across Bubbletea) to pointer receivers, which cleaned up some of the weirder aspects of the code (e.g. before we essentially had no choice but to do our rendering in `Update` in order to calculate and update the final height of the main content's `viewport`).
This commit is contained in:
@@ -47,7 +47,7 @@ func (m *Model) updateContent() {
|
||||
}
|
||||
}
|
||||
|
||||
func (m Model) Update(msg tea.Msg) (shared.ViewModel, tea.Cmd) {
|
||||
func (m *Model) Update(msg tea.Msg) (shared.ViewModel, tea.Cmd) {
|
||||
inputHandled := false
|
||||
|
||||
var cmds []tea.Cmd
|
||||
@@ -169,8 +169,8 @@ func (m Model) Update(msg tea.Msg) (shared.ViewModel, tea.Cmd) {
|
||||
m.updateContent()
|
||||
case msgChatResponseError:
|
||||
m.state = idle
|
||||
m.ViewState.Err = error(msg)
|
||||
m.updateContent()
|
||||
return m, shared.WrapError(msg)
|
||||
case msgToolResults:
|
||||
last := len(m.App.Messages) - 1
|
||||
if last < 0 {
|
||||
@@ -249,24 +249,6 @@ func (m Model) Update(msg tea.Msg) (shared.ViewModel, tea.Cmd) {
|
||||
}
|
||||
}
|
||||
|
||||
// update views once window dimensions are known
|
||||
if m.Width > 0 {
|
||||
m.Header = m.headerView()
|
||||
m.Footer = m.footerView()
|
||||
m.Error = tuiutil.ErrorBanner(m.Err, m.Width)
|
||||
fixedHeight := tuiutil.Height(m.Header) + tuiutil.Height(m.Error) + tuiutil.Height(m.Footer)
|
||||
|
||||
// calculate clamped input height to accomodate input text
|
||||
// minimum 4 lines, maximum half of content area
|
||||
newHeight := max(4, min((m.Height-fixedHeight-1)/2, m.input.LineCount()))
|
||||
m.input.SetHeight(newHeight)
|
||||
m.Input = m.input.View()
|
||||
|
||||
// remaining height towards content
|
||||
m.content.Height = m.Height - fixedHeight - tuiutil.Height(m.Input)
|
||||
m.Content = m.content.View()
|
||||
}
|
||||
|
||||
// this is a pretty nasty hack to ensure the input area viewport doesn't
|
||||
// scroll below its content, which can happen when the input viewport
|
||||
// height has grown, or previously entered lines have been deleted
|
||||
|
||||
Reference in New Issue
Block a user