diff --git a/internal/sqs-browse/ui/model.go b/internal/sqs-browse/ui/model.go index 637e053..8c724bb 100644 --- a/internal/sqs-browse/ui/model.go +++ b/internal/sqs-browse/ui/model.go @@ -5,13 +5,17 @@ import ( "github.com/charmbracelet/bubbles/viewport" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" + "log" + "strings" ) type uiModel struct { table table.Model viewport viewport.Model + ready bool tableRows []table.Row + message string } func NewModel() tea.Model { @@ -19,12 +23,10 @@ func NewModel() tea.Model { rows := make([]table.Row, 0) tbl.SetRows(rows) - vprt := viewport.New(100, 15) - model := uiModel{ table: tbl, - viewport: vprt, tableRows: rows, + message: "", } return model @@ -35,6 +37,14 @@ func (m uiModel) Init() tea.Cmd { } func (m *uiModel) updateViewportToSelectedMessage() { + if !m.ready { + return + } + + if len(m.tableRows) == 0 { + return + } + if message, ok := m.table.SelectedRow().(messageTableRow); ok { m.viewport.SetContent(message.Data) } else { @@ -51,6 +61,26 @@ func (m uiModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.table.SetRows(m.tableRows) m.updateViewportToSelectedMessage() + case tea.WindowSizeMsg: + footerHeight := lipgloss.Height(m.footerView()) + + if !m.ready { + tableHeight := msg.Height / 2 + + m.table.SetSize(msg.Width, tableHeight) + m.viewport = viewport.New(msg.Width, msg.Height-tableHeight-footerHeight) + m.viewport.SetContent("(no message selected)") + m.ready = true + log.Println("Viewport is now ready") + } else { + tableHeight := msg.Height / 2 + + m.table.SetSize(msg.Width, tableHeight) + m.viewport.Width = msg.Width + m.viewport.Height = msg.Height - tableHeight - footerHeight + //m.viewport.YPosition = tableHeight + } + case tea.KeyMsg: switch msg.String() { @@ -66,7 +96,7 @@ func (m uiModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } } - updatedTable, tableMsgs := m.table.Update(nil) + updatedTable, tableMsgs := m.table.Update(msg) updatedViewport, viewportMsgs := m.viewport.Update(msg) m.table = updatedTable @@ -76,5 +106,24 @@ func (m uiModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } func (m uiModel) View() string { - return lipgloss.JoinVertical(lipgloss.Top, m.table.View(), m.viewport.View()) + if !m.ready { + return "Initializing" + } + + log.Println("Returning full view") + return lipgloss.JoinVertical(lipgloss.Top, m.table.View(), m.viewport.View(), m.footerView()) + //return lipgloss.JoinVertical(lipgloss.Top, m.table.View(), m.footerView()) +} + +func (m uiModel) footerView() string { + title := m.message + line := strings.Repeat(" ", max(0, m.viewport.Width-lipgloss.Width(title))) + return lipgloss.JoinHorizontal(lipgloss.Left, title, line) +} + +func max(a, b int) int { + if a > b { + return a + } + return b }