1package tabs
 2
 3import (
 4	"strings"
 5
 6	tea "github.com/charmbracelet/bubbletea"
 7	"github.com/charmbracelet/soft-serve/ui/common"
 8)
 9
10type SelectTabMsg int
11
12type ActiveTabMsg int
13
14type Tabs struct {
15	common    common.Common
16	tabs      []string
17	activeTab int
18}
19
20func New(c common.Common, tabs []string) *Tabs {
21	r := &Tabs{
22		common:    c,
23		tabs:      tabs,
24		activeTab: 0,
25	}
26	return r
27}
28
29func (t *Tabs) SetSize(width, height int) {
30	t.common.SetSize(width, height)
31}
32
33func (t *Tabs) Init() tea.Cmd {
34	t.activeTab = 0
35	return nil
36}
37
38func (t *Tabs) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
39	cmds := make([]tea.Cmd, 0)
40	switch msg := msg.(type) {
41	case tea.KeyMsg:
42		switch msg.String() {
43		case "tab":
44			t.activeTab = (t.activeTab + 1) % len(t.tabs)
45			cmds = append(cmds, t.activeTabCmd)
46		case "shift+tab":
47			t.activeTab = (t.activeTab - 1 + len(t.tabs)) % len(t.tabs)
48			cmds = append(cmds, t.activeTabCmd)
49		}
50	case SelectTabMsg:
51		t.activeTab = int(msg)
52	}
53	return t, tea.Batch(cmds...)
54}
55
56func (t *Tabs) View() string {
57	s := strings.Builder{}
58	sep := t.common.Styles.TabSeparator
59	for i, tab := range t.tabs {
60		style := t.common.Styles.TabInactive.Copy()
61		if i == t.activeTab {
62			style = t.common.Styles.TabActive.Copy()
63		}
64		s.WriteString(style.Render(tab))
65		if i != len(t.tabs)-1 {
66			s.WriteString(sep.String())
67		}
68	}
69	return s.String()
70}
71
72func (t *Tabs) activeTabCmd() tea.Msg {
73	return ActiveTabMsg(t.activeTab)
74}
75
76func SelectTabCmd(tab int) tea.Cmd {
77	return func() tea.Msg {
78		return SelectTabMsg(tab)
79	}
80}