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 ir := -1
73 if b.initialRepo != "" {
74 for i, me := range b.repoMenu {
75 if me.Repo == b.initialRepo {
76 ir = i
77 }
78 }
79 }
80 if ir == -1 {
81 b.boxes[1] = b.repoMenu[0].bubble
82 b.activeBox = 0
83 } else {
84 b.boxes[1] = b.repoMenu[ir].bubble
85 b.repoSelect.SelectedItem = ir
86 b.activeBox = 1
87 }
88 b.state = loadedState
89 return nil
90}