1// Based on the implementation by @trashhalo at:
2// https://github.com/trashhalo/imgcat
3package image
4
5import (
6 "context"
7 "fmt"
8 _ "image/jpeg"
9 _ "image/png"
10
11 tea "github.com/charmbracelet/bubbletea/v2"
12)
13
14type Model struct {
15 url string
16 image string
17 width uint
18 height uint
19 err error
20
21 cancelAnimation context.CancelFunc
22}
23
24func New(width, height uint, url string) Model {
25 return Model{
26 width: width,
27 height: height,
28 url: url,
29 }
30}
31
32func (m Model) Init() tea.Cmd {
33 return nil
34}
35
36func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
37 switch msg := msg.(type) {
38 case errMsg:
39 m.err = msg
40 return m, nil
41 case rewdrawMsg:
42 m.width = msg.width
43 m.height = msg.height
44 m.url = msg.url
45 return m, loadUrl(m.url)
46 case loadMsg:
47 return handleLoadMsg(m, msg)
48 }
49 return m, nil
50}
51
52func (m Model) View() string {
53 if m.err != nil {
54 return fmt.Sprintf("couldn't load image(s): %v", m.err)
55 }
56 return m.image
57}
58
59type errMsg struct{ error }
60
61func (m Model) Redraw(width uint, height uint, url string) tea.Cmd {
62 return func() tea.Msg {
63 return rewdrawMsg{
64 width: width,
65 height: height,
66 url: url,
67 }
68 }
69}
70
71func (m Model) UpdateUrl(url string) tea.Cmd {
72 return func() tea.Msg {
73 return rewdrawMsg{
74 width: m.width,
75 height: m.height,
76 url: url,
77 }
78 }
79}
80
81type rewdrawMsg struct {
82 width uint
83 height uint
84 url string
85}
86
87func (m Model) IsLoading() bool {
88 return m.image == ""
89}