summaryrefslogtreecommitdiff
path: root/internal/switcher/switcher.go
diff options
context:
space:
mode:
authorBenjamin Chausse <benjamin@chausse.xyz>2024-11-23 18:12:03 -0500
committerBenjamin Chausse <benjamin@chausse.xyz>2024-11-23 18:12:03 -0500
commit89094fecf4cb1c018f15c976641cd18c255eac28 (patch)
tree9f6e32c38013bc526399ab324891e0b3269e50dc /internal/switcher/switcher.go
Semi-working POC
Diffstat (limited to 'internal/switcher/switcher.go')
-rw-r--r--internal/switcher/switcher.go89
1 files changed, 89 insertions, 0 deletions
diff --git a/internal/switcher/switcher.go b/internal/switcher/switcher.go
new file mode 100644
index 0000000..d542df1
--- /dev/null
+++ b/internal/switcher/switcher.go
@@ -0,0 +1,89 @@
+package switcher
+
+import (
+ "fmt"
+
+ "github.com/charmbracelet/bubbles/key"
+ tea "github.com/charmbracelet/bubbletea"
+ "github.com/charmbracelet/bubbletea-app-template/internal/picker"
+ "github.com/charmbracelet/bubbletea-app-template/internal/quit"
+)
+
+type Model struct {
+ active int
+ pickers []picker.Model
+}
+
+func New(pickers []picker.Model) Model {
+ return Model{
+ active: 0,
+ pickers: pickers,
+ }
+}
+
+func (m Model) fixSel(val int) int {
+ size := len(m.pickers)
+ return (val%size + size) % size
+}
+
+func (m *Model) Next() int {
+ m.active = m.fixSel(m.active + 1)
+ return m.active
+}
+
+func (m *Model) Prev() int {
+ m.active = m.fixSel(m.active - 1)
+ return m.active
+}
+
+func (m Model) Init() tea.Cmd {
+ cmds := []tea.Cmd{}
+ for _, p := range m.pickers {
+ cmds = append(cmds, p.Init())
+ }
+ return tea.Batch(cmds...)
+}
+
+func (m Model) View() string {
+ v := "|"
+ for i, p := range m.pickers {
+ if i == m.active {
+ v += fmt.Sprintf(">%s<|", p.Title())
+ } else {
+ v += fmt.Sprintf(" %s |", p.Title())
+ }
+ }
+ return fmt.Sprintf("%s\n%s", v, m.pickers[m.active].View())
+}
+
+func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
+ keys := newKeybinds()
+ cmds := []tea.Cmd{}
+ switch msg := msg.(type) {
+ case tea.KeyMsg:
+ switch {
+ case key.Matches(msg, keys.next):
+ cs := m.pickers[m.active].GetColor()
+ m.Next()
+ m.pickers[m.active].SetColor(cs)
+ case key.Matches(msg, keys.prev):
+ cs := m.pickers[m.active].GetColor()
+ m.Prev()
+ m.pickers[m.active].SetColor(cs)
+ case key.Matches(msg, keys.quit):
+ return quit.Model{}, tea.Quit
+ // return m, tea.Quit
+ default:
+ newActive, cmd := m.pickers[m.active].Update(msg)
+ m.pickers[m.active] = newActive.(picker.Model)
+ cmds = append(cmds, cmd)
+ return m, tea.Batch(cmds...)
+ }
+ }
+ for i, p := range m.pickers {
+ newActive, cmd := p.Update(msg)
+ m.pickers[i] = newActive.(picker.Model)
+ cmds = append(cmds, cmd)
+ }
+ return m, tea.Batch(cmds...)
+}