aboutsummaryrefslogtreecommitdiffstats
path: root/focus.go
diff options
context:
space:
mode:
authorSam Anthony <sam@samanthony.xyz>2024-01-19 23:37:45 -0500
committerSam Anthony <sam@samanthony.xyz>2024-01-19 23:37:45 -0500
commit4f6384f449b50a95255837b1fc394b4ebe14caaf (patch)
tree7e17524b87d11f921d1e8d370480fe5634f00537 /focus.go
parentcb4343f838b008e3f4da2bf85937ed86cd1805e1 (diff)
downloadvolute-4f6384f449b50a95255837b1fc394b4ebe14caaf.zip
2d navigation
Diffstat (limited to 'focus.go')
-rw-r--r--focus.go59
1 files changed, 42 insertions, 17 deletions
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
}