From 4f6384f449b50a95255837b1fc394b4ebe14caaf Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Fri, 19 Jan 2024 23:37:45 -0500 Subject: 2d navigation --- focus.go | 59 ++++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 17 deletions(-) (limited to 'focus.go') diff --git a/focus.go b/focus.go index e6de390..331d232 100644 --- a/focus.go +++ b/focus.go @@ -1,33 +1,58 @@ package main type Focus struct { - widgets []chan bool - i int // index of focused widget + widgets [][]chan bool + p Point // currently focused widget } -func NewFocus(nWidgets int) Focus { - f := Focus{make([]chan bool, nWidgets), 0} +func NewFocus(rows []int) Focus { + f := Focus{ + make([][]chan bool, len(rows)), + Point{}, + } for i := range f.widgets { - f.widgets[i] = make(chan bool) + f.widgets[i] = make([]chan bool, rows[i]) + for j := range f.widgets[i] { + f.widgets[i][j] = make(chan bool) + } } return f } -func (f *Focus) Next() { - f.widgets[f.i] <- false - f.i = (f.i + 1) % len(f.widgets) - f.widgets[f.i] <- true +func (f *Focus) Left() { + f.widgets[f.p.Y][f.p.X] <- false + if f.p.X <= 0 { + f.p.X = len(f.widgets[f.p.Y]) - 1 + } else { + f.p.X-- + } + f.widgets[f.p.Y][f.p.X] <- true } -func (f *Focus) Prev() { - f.widgets[f.i] <- false - f.i = abs(f.i-1) % len(f.widgets) - f.widgets[f.i] <- true +func (f *Focus) Right() { + f.widgets[f.p.Y][f.p.X] <- false + f.p.X = (f.p.X + 1) % len(f.widgets[f.p.Y]) + f.widgets[f.p.Y][f.p.X] <- true } -func abs(n int) int { - if n < 0 { - return -n +func (f *Focus) Up() { + f.widgets[f.p.Y][f.p.X] <- false + if f.p.Y <= 0 { + f.p.Y = len(f.widgets) - 1 + } else { + f.p.Y-- } - return n + f.p.X = min(f.p.X, len(f.widgets[f.p.Y])-1) + f.widgets[f.p.Y][f.p.X] <- true +} + +func (f *Focus) Down() { + f.widgets[f.p.Y][f.p.X] <- false + f.p.Y = (f.p.Y + 1) % len(f.widgets) + f.p.X = min(f.p.X, len(f.widgets[f.p.Y])-1) + f.widgets[f.p.Y][f.p.X] <- true +} + +type Point struct { + X, Y int } -- cgit v1.2.3