Matt Low
676aa7b004
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`).
63 lines
1.2 KiB
Go
63 lines
1.2 KiB
Go
package shared
|
|
|
|
import (
|
|
tea "github.com/charmbracelet/bubbletea"
|
|
)
|
|
|
|
// An analogue to tea.Model with support for checking if the model has been
|
|
// initialized before
|
|
type ViewModel interface {
|
|
Init() tea.Cmd
|
|
Update(tea.Msg) (ViewModel, tea.Cmd)
|
|
|
|
// View methods
|
|
Header(width int) string
|
|
// Render the view's main content into a container of the given dimensions
|
|
Content(width, height int) string
|
|
Footer(width int) string
|
|
}
|
|
|
|
type View int
|
|
|
|
const (
|
|
ViewChat View = iota
|
|
ViewConversations
|
|
//StateSettings
|
|
//StateHelp
|
|
)
|
|
|
|
type (
|
|
// send to change the current state
|
|
MsgViewChange View
|
|
// sent to a state when it is entered
|
|
MsgViewEnter struct{}
|
|
// sent when a recoverable error occurs (displayed to user)
|
|
MsgError error
|
|
// sent when the view has handled a key input
|
|
MsgKeyHandled tea.KeyMsg
|
|
)
|
|
|
|
func ViewEnter() tea.Cmd {
|
|
return func() tea.Msg {
|
|
return MsgViewEnter{}
|
|
}
|
|
}
|
|
|
|
func ChangeView(view View) tea.Cmd {
|
|
return func() tea.Msg {
|
|
return MsgViewChange(view)
|
|
}
|
|
}
|
|
|
|
func KeyHandled(key tea.KeyMsg) tea.Cmd {
|
|
return func() tea.Msg {
|
|
return MsgKeyHandled(key)
|
|
}
|
|
}
|
|
|
|
func WrapError(err error) tea.Cmd {
|
|
return func() tea.Msg {
|
|
return MsgError(err)
|
|
}
|
|
}
|