summaryrefslogtreecommitdiff
path: root/internal/slider/slider.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/slider/slider.go
Semi-working POC
Diffstat (limited to 'internal/slider/slider.go')
-rw-r--r--internal/slider/slider.go71
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))
+}