blob: 5f19e6ca40cff36a8063e338a4b2a279c75cbeca (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
package main
type Focus struct {
widgets [][]chan bool
p Point // currently focused widget
}
func NewFocus(rows []int) Focus {
f := Focus{
make([][]chan bool, len(rows)),
Point{},
}
for i := range f.widgets {
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) Close() {
for i := range f.widgets {
for j := range f.widgets[i] {
close(f.widgets[i][j])
}
}
}
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) 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 (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--
}
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
}
|