diff options
author | Benjamin Chausse <benjamin@chausse.xyz> | 2024-11-23 18:12:03 -0500 |
---|---|---|
committer | Benjamin Chausse <benjamin@chausse.xyz> | 2024-11-23 18:12:03 -0500 |
commit | 89094fecf4cb1c018f15c976641cd18c255eac28 (patch) | |
tree | 9f6e32c38013bc526399ab324891e0b3269e50dc /internal/slider/slider.go |
Semi-working POC
Diffstat (limited to 'internal/slider/slider.go')
-rw-r--r-- | internal/slider/slider.go | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/internal/slider/slider.go b/internal/slider/slider.go new file mode 100644 index 0000000..d726e7b --- /dev/null +++ b/internal/slider/slider.go @@ -0,0 +1,71 @@ +package slider + +import ( + "fmt" + + "github.com/charmbracelet/bubbles/key" + "github.com/charmbracelet/bubbles/progress" + tea "github.com/charmbracelet/bubbletea" +) + +type Model struct { + label byte + progress progress.Model + max int + current int + mappings keybinds +} + +func New(label byte, maxVal int, opts ...progress.Option) Model { + slider := Model{ + label: label, + progress: progress.New( + progress.WithoutPercentage(), + ), + max: maxVal, + current: maxVal / 2, + mappings: newKeybinds(), + } + for _, opt := range opts { + opt(&slider.progress) + } + return slider +} + +func (m Model) Title() string { return fmt.Sprintf("%c", m.label) } + +func (m Model) Init() tea.Cmd { + return nil +} + +func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + keys := newKeybinds() + switch msg := msg.(type) { + case tea.KeyMsg: + switch { + case key.Matches(msg, keys.incRegular): + m.IncPcnt(0.05) + case key.Matches(msg, keys.decRegular): + m.DecPcnt(0.05) + case key.Matches(msg, keys.incPrecise): + m.Inc(1) + case key.Matches(msg, keys.decPrecise): + m.Dec(1) + } + return m, m.progress.SetPercent(m.Pcnt()) + case progress.FrameMsg: + progressModel, cmd := m.progress.Update(msg) + m.progress = progressModel.(progress.Model) + return m, cmd + default: + return m, nil + } +} + +func (m Model) ViewValue(current int) string { + return fmt.Sprintf("(%3d/%d)", current, m.max) +} + +func (m Model) View() string { + return fmt.Sprintf("%v: %v %v", m.Title(), m.progress.View(), m.ViewValue(m.current)) +} |