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	for _, me := range mes {
49		if me.Repo == "config" {
50			tmplConfig = b.config
51		}
52		rb := repo.NewBubble(b.repoSource, me.Repo, b.width, boxLeftWidth+12, b.height, 12, tmplConfig)
53		initCmd := rb.Init()
54		msg := initCmd()
55		switch msg := msg.(type) {
56		case repo.ErrMsg:
57			return errMsg{fmt.Errorf("missing %s: %s", me.Repo, msg.Error)}
58		}
59		me.bubble = rb
60		b.repoMenu = append(b.repoMenu, me)
61		rs = append(rs, me.Name)
62	}
63	b.repoSelect = selection.NewBubble(rs)
64	b.boxes[0] = b.repoSelect
65	b.commitsLog = commits.NewBubble(
66		b.height-verticalPadding-2,
67		boxRightWidth-horizontalPadding-2,
68		b.repoSource.GetCommits(200),
69	)
70	ir := -1
71	if b.initialRepo != "" {
72		for i, me := range b.repoMenu {
73			if me.Repo == b.initialRepo {
74				ir = i
75			}
76		}
77	}
78	if ir == -1 {
79		b.boxes[1] = b.repoMenu[0].bubble
80		b.activeBox = 0
81	} else {
82		b.boxes[1] = b.repoMenu[ir].bubble
83		b.repoSelect.SelectedItem = ir
84		b.activeBox = 1
85	}
86	b.state = loadedState
87	return nil
88}