diff --git a/internal/tui/model.go b/internal/tui/model.go index 58a80ae..5b40714 100644 --- a/internal/tui/model.go +++ b/internal/tui/model.go @@ -21,15 +21,22 @@ type Model struct { width int height int + + showEvents bool + showStd bool + showSearch bool } func NewModel(ch <-chan model.Event) Model { return Model{ - channel: ch, - events: make([]model.Event, 0, maxEvents), - requests: make([]model.Request, 0, maxRequests), - width: 100, - height: 28, + channel: ch, + events: make([]model.Event, 0, maxEvents), + requests: make([]model.Request, 0, maxRequests), + width: 0, + height: 0, + showEvents: false, + showStd: false, + showSearch: false, } } diff --git a/internal/tui/split.go b/internal/tui/split.go new file mode 100644 index 0000000..39c62f8 --- /dev/null +++ b/internal/tui/split.go @@ -0,0 +1,110 @@ +package tui + +import "strings" + +func (m Model) renderAppPane() string { + var ( + searchW int = m.width + searchH int = 1 + + reqW int = int(float64(m.width) * 0.6) + reqH int = m.height + + detW int = int(float64(m.width) * 0.4) + detH int = m.height + + eventW int = m.width + eventH int = int(float64(m.height) * 0.15) + + stdW int = m.width + stdH int = int(float64(m.height) * 0.2) + ) + + if m.showSearch { + reqH -= searchH + detH -= searchH + } + + if m.showEvents { + reqH -= eventH + detH -= eventH + } + + if m.showStd { + reqH -= stdH + detH -= stdH + } + + reqPane := m.renderRequestPane(reqW, reqH) + detPane := m.renderDetailsPane(detW, detH) + + if len(reqPane) != len(detPane) { + return "height of request and details did not match" + } + + var screen []string + if m.showSearch { + searchPane := m.renderSearchPane(searchW, searchH) + screen = append(screen, searchPane...) + } + + for i := range reqPane { + screen = append(screen, reqPane[i]+detPane[i]) + } + + if m.showEvents { + eventPane := m.renderEventsPane(eventW, eventH) + screen = append(screen, eventPane...) + } + + if m.showStd { + stdPane := m.renderStdPane(stdW, stdH) + screen = append(screen, stdPane...) + } + + if len(screen) != m.height { + return "height of screen does not match terminal height" + } + + return strings.Join(screen, ("\n")) +} + +func (m Model) renderSearchPane(w, h int) []string { + lines := make([]string, h) + for y := range lines { + lines[y] = strings.Repeat(" ", w) + } + return lines +} + +func (m Model) renderRequestPane(w, h int) []string { + lines := make([]string, h) + for y := range lines { + lines[y] = strings.Repeat(".", w) + } + return lines +} + +func (m Model) renderDetailsPane(w, h int) []string { + lines := make([]string, h) + for y := range lines { + lines[y] = strings.Repeat("^", w) + } + return lines +} + +func (m Model) renderEventsPane(w, h int) []string { + lines := make([]string, h) + for y := range lines { + lines[y] = strings.Repeat("~", w) + } + return lines +} + +func (m Model) renderStdPane(w, h int) []string { + lines := make([]string, h) + for y := range lines { + lines[y] = strings.Repeat(" ", w) + } + return lines +} diff --git a/internal/tui/update.go b/internal/tui/update.go index 3ff19c9..f92b520 100644 --- a/internal/tui/update.go +++ b/internal/tui/update.go @@ -14,10 +14,19 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.height = msg.Height return m, nil + // TODO: Abstract the keymaps case tea.KeyMsg: switch msg.String() { - case "ctrl+c", "q", "esc": + case "ctrl+c", "q": return m, tea.Quit + case "e": + m.showEvents = !m.showEvents + case "o": + m.showStd = !m.showStd + case "/": + m.showSearch = true + case "esc": + m.showSearch = false } return m, nil diff --git a/internal/tui/view.go b/internal/tui/view.go index ff88b6a..55c4d6c 100644 --- a/internal/tui/view.go +++ b/internal/tui/view.go @@ -9,20 +9,23 @@ import ( // TODO: This is all temporary func (m Model) View() string { - eventLines := m.renderEvents(8) - requestLines := m.renderRequests(12) + return m.renderAppPane() - return strings.Join([]string{ - "termtap - live session", - fmt.Sprintf("events=%d requests=%d", len(m.events), len(m.requests)), - "keys: q/esc/ctrl+c quit", - "", - "Recent events:", - eventLines, - "", - "Recent requests:", - requestLines, - }, "\n") + // eventLines := m.renderEvents(8) + // requestLines := m.renderRequests(12) + // + // return strings.Join([]string{ + // "termtap - live session", + // fmt.Sprintf("events=%d requests=%d", len(m.events), len(m.requests)), + // fmt.Sprintf("%dx%d", m.height, m.width), + // "keys: q/esc/ctrl+c quit", + // "", + // "Recent events:", + // eventLines, + // "", + // "Recent requests:", + // requestLines, + // }, "\n") } func (m Model) renderEvents(limit int) string {