summaryrefslogtreecommitdiff
path: root/menu/model.go
diff options
context:
space:
mode:
authorewy <ewy0@protonmail.com>2026-04-14 16:37:17 +0200
committerewy <ewy0@protonmail.com>2026-04-14 16:37:17 +0200
commit45a297a8e526094e8fce6e2c5c0fd89b381d1765 (patch)
tree852ebc3a0112c94dc9726d0b27ab057bf6383660 /menu/model.go
i have to commit at some point!
Diffstat (limited to 'menu/model.go')
-rw-r--r--menu/model.go101
1 files changed, 101 insertions, 0 deletions
diff --git a/menu/model.go b/menu/model.go
new file mode 100644
index 0000000..ceeb861
--- /dev/null
+++ b/menu/model.go
@@ -0,0 +1,101 @@
+package menu
+
+import (
+ tea "github.com/charmbracelet/bubbletea"
+ "pik/model"
+ "pik/spool"
+)
+
+type Model struct {
+ *model.HydratedState
+ Index int
+ Indices map[int]model.HydratedTarget
+ SourceIndices map[int]*model.HydratedSource
+}
+
+func (m *Model) Init() tea.Cmd {
+ return nil
+}
+
+func (m *Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
+ var err error
+ var result tea.Cmd
+ switch mt := msg.(type) {
+ case tea.KeyMsg:
+ result, err = m.HandleInput(mt)
+ case tea.Cmd:
+ result, err = m.HandleSignal(mt)
+ }
+ if err != nil {
+ spool.Warn("%v\n", err)
+ }
+ return m, result
+}
+
+func (m *Model) HandleInput(msg tea.KeyMsg) (tea.Cmd, error) {
+ var cmd tea.Cmd
+ switch msg.String() {
+ case "up", "k":
+ m.Index--
+ case "down", "j":
+ m.Index++
+ case "q", "esc":
+ cmd = tea.Quit
+ case "space", " ", "enter":
+ cmd = tea.Quit
+ }
+
+ m.Validate()
+
+ return cmd, nil
+}
+
+func (m *Model) HandleSignal(cmd tea.Cmd) (tea.Cmd, error) {
+ return nil, nil
+}
+
+func (m *Model) View() string {
+ return m.State(m.HydratedState)
+}
+
+func (m *Model) Result() (*model.HydratedSource, model.HydratedTarget) {
+ return m.SourceIndices[m.Index], m.Indices[m.Index]
+}
+
+func (m *Model) Validate() {
+ if m.Index < 0 {
+ m.Index = 0
+ }
+ if m.Index > len(m.Indices)-1 {
+ m.Index = len(m.Indices) - 1
+ }
+}
+
+func NewModel(st *model.State, hydrators []model.Hydrator) *Model {
+ m := &Model{
+ HydratedState: Hydrate(st, hydrators),
+ Index: 0,
+ Indices: make(map[int]model.HydratedTarget),
+ SourceIndices: make(map[int]*model.HydratedSource),
+ }
+ idx := 0
+ for _, src := range st.Sources {
+ hydSrc := src.Hydrate(hydrators)
+ for _, target := range src.Targets {
+
+ if !target.Visible() {
+ continue
+ }
+
+ hydTarget, err := target.Hydrate(src)
+ m.Indices[idx] = hydTarget
+ if err != nil {
+ spool.Warn("%v\n", err)
+ }
+ m.SourceIndices[idx] = hydSrc
+
+ idx++
+ }
+ }
+ return m
+}