1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
package main
import (
"os"
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/bubbles/viewport"
)
type TUIModel struct {
State *BrowserState
Viewport viewport.Model
inited bool
}
func NewTUIModel(state *BrowserState) *TUIModel {
return &TUIModel{State: state}
}
func (model *TUIModel) Init() tea.Cmd {
return nil
}
func (model *TUIModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
switch msg := msg.(type) {
case tea.KeyMsg:
switch msg.String() {
case "ctrl+c", "q":
return model, tea.Quit
case "g":
model.Viewport.GotoTop()
return model, nil
case "G":
model.Viewport.GotoBottom()
return model, nil
}
case tea.WindowSizeMsg:
model.inited = true
model.Viewport.Width = msg.Width
model.Viewport.Height = msg.Height - 1
}
var cmd tea.Cmd
model.Viewport, cmd = model.Viewport.Update(msg)
return model, cmd
}
func (model *TUIModel) View() string {
return model.Viewport.View()
}
func runTUI(state *BrowserState, args []string) {
model := NewTUIModel(state)
state.Printer = (*TUIPrinter)(model)
if len(args) > 0 {
if err := Go(state, args[0]); err != nil {
writeError(err.Error())
}
}
p := tea.NewProgram(model, tea.WithAltScreen())
if _, err := p.Run(); err != nil {
writeError(err.Error())
os.Exit(1)
}
}
type TUIPrinter TUIModel
func (p *TUIPrinter) PrintModal(state *BrowserState, contents []byte) error {
(*TUIModel)(p).Viewport.SetContent(string(contents))
return nil
}
func (p *TUIPrinter) PrintPage(state *BrowserState, body string) error {
(*TUIModel)(p).Viewport.SetContent(body)
return nil
}
|