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}