commands.go

 1package tui
 2
 3import (
 4	"fmt"
 5	"smoothie/tui/bubbles/repo"
 6	"smoothie/tui/bubbles/selection"
 7
 8	tea "github.com/charmbracelet/bubbletea"
 9	"github.com/charmbracelet/lipgloss"
10	"github.com/muesli/termenv"
11)
12
13type windowMsg struct{}
14type errMsg struct{ err error }
15
16func (e errMsg) Error() string {
17	return e.err.Error()
18}
19
20func (b *Bubble) windowChangesCmd() tea.Msg {
21	w := <-b.windowChanges
22	b.width = w.Width
23	b.height = w.Height
24	return windowMsg{}
25}
26
27func (b *Bubble) setupCmd() tea.Msg {
28	lipgloss.SetColorProfile(termenv.ANSI256)
29	b.repos = b.repoSource.AllRepos()
30	mes := make([]MenuEntry, 0)
31	rs := make([]string, 0)
32	for _, me := range b.config.Menu {
33		mes = append(mes, me)
34	}
35	if b.config.ShowAllRepos {
36	OUTER:
37		for _, r := range b.repos {
38			for _, me := range mes {
39				if r.Name == me.Repo {
40					continue OUTER
41				}
42			}
43			mes = append(mes, MenuEntry{Name: r.Name, Repo: r.Name})
44		}
45	}
46	var tmplConfig *Config
47	for _, me := range mes {
48		if me.Repo == "config" {
49			tmplConfig = b.config
50		}
51		width := b.width
52		boxLeftWidth := menuStyle.GetWidth() + menuStyle.GetHorizontalFrameSize()
53		// TODO: also send this along with a tea.WindowSizeMsg
54		var heightMargin = lipgloss.Height(b.headerView()) +
55			lipgloss.Height(b.footerView()) +
56			contentBoxStyle.GetVerticalFrameSize() +
57			appBoxStyle.GetVerticalMargins()
58		rb := repo.NewBubble(b.repoSource, me.Repo, width, boxLeftWidth, b.height, heightMargin, tmplConfig)
59		initCmd := rb.Init()
60		msg := initCmd()
61		switch msg := msg.(type) {
62		case repo.ErrMsg:
63			return errMsg{fmt.Errorf("missing %s: %s", me.Repo, msg.Error)}
64		}
65		me.bubble = rb
66		b.repoMenu = append(b.repoMenu, me)
67		rs = append(rs, me.Name)
68	}
69	b.repoSelect = selection.NewBubble(rs, menuItemStyle, selectedMenuItemStyle, menuCursor.String())
70	b.boxes[0] = b.repoSelect
71	/*
72		b.commitsLog = commits.NewBubble(
73			b.height-verticalPadding-2,
74			boxRightWidth-horizontalPadding-2,
75			b.repoSource.GetCommits(200),
76		)
77	*/
78	ir := -1
79	if b.initialRepo != "" {
80		for i, me := range b.repoMenu {
81			if me.Repo == b.initialRepo {
82				ir = i
83			}
84		}
85	}
86	if ir == -1 {
87		b.boxes[1] = b.repoMenu[0].bubble
88		b.activeBox = 0
89	} else {
90		b.boxes[1] = b.repoMenu[ir].bubble
91		b.repoSelect.SelectedItem = ir
92		b.activeBox = 1
93	}
94	b.state = loadedState
95	return nil
96}