image.go

 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}