tui: add uiCache
Clean up/fix how we calculate the height of the content viewport
This commit is contained in:
parent
c51644e78e
commit
ef929da68c
@ -39,6 +39,14 @@ const (
|
|||||||
selectedMessage
|
selectedMessage
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type uiCache struct {
|
||||||
|
header string
|
||||||
|
content string
|
||||||
|
error string
|
||||||
|
input string
|
||||||
|
footer string
|
||||||
|
}
|
||||||
|
|
||||||
type model struct {
|
type model struct {
|
||||||
width int
|
width int
|
||||||
height int
|
height int
|
||||||
@ -69,6 +77,8 @@ type model struct {
|
|||||||
content viewport.Model
|
content viewport.Model
|
||||||
input textarea.Model
|
input textarea.Model
|
||||||
spinner spinner.Model
|
spinner spinner.Model
|
||||||
|
|
||||||
|
cache *uiCache
|
||||||
}
|
}
|
||||||
|
|
||||||
type message struct {
|
type message struct {
|
||||||
@ -181,7 +191,6 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
|||||||
m.width = msg.Width
|
m.width = msg.Width
|
||||||
m.height = msg.Height
|
m.height = msg.Height
|
||||||
m.content.Width = msg.Width
|
m.content.Width = msg.Width
|
||||||
m.content.Height = msg.Height - m.getFixedComponentHeight()
|
|
||||||
m.input.SetWidth(msg.Width - 1)
|
m.input.SetWidth(msg.Width - 1)
|
||||||
m.updateContent()
|
m.updateContent()
|
||||||
case msgConversationLoaded:
|
case msgConversationLoaded:
|
||||||
@ -284,9 +293,26 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if m.width > 0 {
|
||||||
|
m.cache.header = m.headerView()
|
||||||
|
m.cache.footer = m.footerView()
|
||||||
|
m.cache.error = m.errorView()
|
||||||
|
m.cache.input = m.inputView()
|
||||||
|
fixedHeight := height(m.cache.header) + height(m.cache.error) + height(m.cache.input) + height(m.cache.footer)
|
||||||
|
m.content.Height = m.height - fixedHeight
|
||||||
|
m.cache.content = m.contentView()
|
||||||
|
}
|
||||||
|
|
||||||
return m, tea.Batch(cmds...)
|
return m, tea.Batch(cmds...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func height(str string) int {
|
||||||
|
if str == "" {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return strings.Count(str, "\n") + 1
|
||||||
|
}
|
||||||
|
|
||||||
func (m model) View() string {
|
func (m model) View() string {
|
||||||
if m.width == 0 {
|
if m.width == 0 {
|
||||||
// this is the case upon initial startup, but it's also a safe bet that
|
// this is the case upon initial startup, but it's also a safe bet that
|
||||||
@ -296,14 +322,13 @@ func (m model) View() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sections := make([]string, 0, 6)
|
sections := make([]string, 0, 6)
|
||||||
sections = append(sections, m.headerView())
|
sections = append(sections, m.cache.header)
|
||||||
sections = append(sections, m.contentView())
|
sections = append(sections, m.cache.content)
|
||||||
error := m.errorView()
|
if m.cache.error != "" {
|
||||||
if error != "" {
|
sections = append(sections, m.cache.error)
|
||||||
sections = append(sections, error)
|
|
||||||
}
|
}
|
||||||
sections = append(sections, m.inputView())
|
sections = append(sections, m.cache.input)
|
||||||
sections = append(sections, m.footerView())
|
sections = append(sections, m.cache.footer)
|
||||||
|
|
||||||
return lipgloss.JoinVertical(
|
return lipgloss.JoinVertical(
|
||||||
lipgloss.Left,
|
lipgloss.Left,
|
||||||
@ -311,20 +336,6 @@ func (m model) View() string {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns the total height of "fixed" components, which are those which don't
|
|
||||||
// change height dependent on window size.
|
|
||||||
func (m *model) getFixedComponentHeight() int {
|
|
||||||
h := 0
|
|
||||||
h += m.input.Height()
|
|
||||||
h += lipgloss.Height(m.headerView())
|
|
||||||
h += lipgloss.Height(m.footerView())
|
|
||||||
errorView := m.errorView()
|
|
||||||
if errorView != "" {
|
|
||||||
h += lipgloss.Height(errorView)
|
|
||||||
}
|
|
||||||
return h
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *model) headerView() string {
|
func (m *model) headerView() string {
|
||||||
titleStyle := lipgloss.NewStyle().
|
titleStyle := lipgloss.NewStyle().
|
||||||
PaddingLeft(1).
|
PaddingLeft(1).
|
||||||
@ -420,6 +431,8 @@ func initialModel(ctx *lmcli.Context, convShortname string) model {
|
|||||||
|
|
||||||
wrap: true,
|
wrap: true,
|
||||||
selectedMessage: -1,
|
selectedMessage: -1,
|
||||||
|
|
||||||
|
cache: &uiCache{},
|
||||||
}
|
}
|
||||||
|
|
||||||
m.content = viewport.New(0, 0)
|
m.content = viewport.New(0, 0)
|
||||||
|
Loading…
Reference in New Issue
Block a user