1package viewport
  2
  3import (
  4	"github.com/charmbracelet/bubbles/key"
  5	"github.com/charmbracelet/bubbles/viewport"
  6	tea "github.com/charmbracelet/bubbletea"
  7	"github.com/charmbracelet/soft-serve/ui/common"
  8)
  9
 10// Viewport represents a viewport component.
 11type Viewport struct {
 12	common common.Common
 13	*viewport.Model
 14}
 15
 16// New returns a new Viewport.
 17func New(c common.Common) *Viewport {
 18	vp := viewport.New(c.Width, c.Height)
 19	vp.MouseWheelEnabled = true
 20	vp.KeyMap = viewport.KeyMap{
 21		PageDown: key.NewBinding(
 22			key.WithKeys("pgdown", " ", "f"),
 23			key.WithHelp("f/pgdn", "page down"),
 24		),
 25		PageUp: key.NewBinding(
 26			key.WithKeys("pgup", "b"),
 27			key.WithHelp("b/pgup", "page up"),
 28		),
 29		HalfPageUp: key.NewBinding(
 30			key.WithKeys("u", "ctrl+u"),
 31			key.WithHelp("ctrl+u/u", "half page up"),
 32		),
 33		HalfPageDown: key.NewBinding(
 34			key.WithKeys("d", "ctrl+d"),
 35			key.WithHelp("ctrl+d/d", "half page down"),
 36		),
 37		Up: key.NewBinding(
 38			key.WithKeys("up", "k"),
 39			key.WithHelp("↑/k", "up"),
 40		),
 41		Down: key.NewBinding(
 42			key.WithKeys("down", "j"),
 43			key.WithHelp("↓/j", "down"),
 44		),
 45	}
 46	return &Viewport{
 47		common: c,
 48		Model:  &vp,
 49	}
 50}
 51
 52// SetSize implements common.Component.
 53func (v *Viewport) SetSize(width, height int) {
 54	v.common.SetSize(width, height)
 55	v.Model.Width = width
 56	v.Model.Height = height
 57}
 58
 59// Init implements tea.Model.
 60func (v *Viewport) Init() tea.Cmd {
 61	return nil
 62}
 63
 64// Update implements tea.Model.
 65func (v *Viewport) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 66	vp, cmd := v.Model.Update(msg)
 67	v.Model = &vp
 68	return v, cmd
 69}
 70
 71// View implements tea.Model.
 72func (v *Viewport) View() string {
 73	return v.Model.View()
 74}
 75
 76// SetContent sets the viewport's content.
 77func (v *Viewport) SetContent(content string) {
 78	v.Model.SetContent(content)
 79}
 80
 81// GotoTop moves the viewport to the top of the log.
 82func (v *Viewport) GotoTop() {
 83	v.Model.GotoTop()
 84}
 85
 86// GotoBottom moves the viewport to the bottom of the log.
 87func (v *Viewport) GotoBottom() {
 88	v.Model.GotoBottom()
 89}
 90
 91// HalfViewDown moves the viewport down by half the viewport height.
 92func (v *Viewport) HalfViewDown() {
 93	v.Model.HalfViewDown()
 94}
 95
 96// HalfViewUp moves the viewport up by half the viewport height.
 97func (v *Viewport) HalfViewUp() {
 98	v.Model.HalfViewUp()
 99}
100
101// ViewUp moves the viewport up by a page.
102func (v *Viewport) ViewUp() []string {
103	return v.Model.ViewUp()
104}
105
106// ViewDown moves the viewport down by a page.
107func (v *Viewport) ViewDown() []string {
108	return v.Model.ViewDown()
109}
110
111// LineUp moves the viewport up by the given number of lines.
112func (v *Viewport) LineUp(n int) []string {
113	return v.Model.LineUp(n)
114}
115
116// LineDown moves the viewport down by the given number of lines.
117func (v *Viewport) LineDown(n int) []string {
118	return v.Model.LineDown(n)
119}
120
121// ScrollPercent returns the viewport's scroll percentage.
122func (v *Viewport) ScrollPercent() float64 {
123	return v.Model.ScrollPercent()
124}