commands.go

 1package tui
 2
 3import (
 4	"fmt"
 5	"smoothie/tui/bubbles/commits"
 6	"smoothie/tui/bubbles/repo"
 7	"smoothie/tui/bubbles/selection"
 8
 9	tea "github.com/charmbracelet/bubbletea"
10	"github.com/charmbracelet/lipgloss"
11	"github.com/muesli/termenv"
12)
13
14type windowMsg struct{}
15type errMsg struct{ err error }
16
17func (e errMsg) Error() string {
18	return e.err.Error()
19}
20
21func (b *Bubble) windowChangesCmd() tea.Msg {
22	w := <-b.windowChanges
23	b.width = w.Width
24	b.height = w.Height
25	return windowMsg{}
26}
27
28func (b *Bubble) setupCmd() tea.Msg {
29	lipgloss.SetColorProfile(termenv.ANSI256)
30	b.repos = b.repoSource.AllRepos()
31	mes := make([]MenuEntry, 0)
32	rs := make([]string, 0)
33	for _, me := range b.config.Menu {
34		mes = append(mes, me)
35	}
36	if b.config.ShowAllRepos {
37	OUTER:
38		for _, r := range b.repos {
39			for _, me := range mes {
40				if r.Name == me.Repo {
41					continue OUTER
42				}
43			}
44			mes = append(mes, MenuEntry{Name: r.Name, Repo: r.Name})
45		}
46	}
47	var tmplConfig *Config
48	h := b.height - verticalPadding - viewportHeightConstant
49	w := boxRightWidth - 2
50	for _, me := range mes {
51		if me.Repo == "config" {
52			tmplConfig = b.config
53		}
54		rb := repo.NewBubble(b.repoSource, me.Repo, w, h, tmplConfig)
55		initCmd := rb.Init()
56		msg := initCmd()
57		switch msg := msg.(type) {
58		case repo.ErrMsg:
59			return errMsg{fmt.Errorf("missing %s: %s", me.Repo, msg.Error)}
60		}
61		me.bubble = rb
62		b.repoMenu = append(b.repoMenu, me)
63		rs = append(rs, me.Name)
64	}
65	b.repoSelect = selection.NewBubble(rs)
66	b.boxes[0] = b.repoSelect
67	b.commitsLog = commits.NewBubble(
68		b.height-verticalPadding-2,
69		boxRightWidth-horizontalPadding-2,
70		b.repoSource.GetCommits(200),
71	)
72	b.boxes[1] = b.repoMenu[0].bubble
73	b.activeBox = 0
74	b.state = loadedState
75	return nil
76}