aboutsummaryrefslogtreecommitdiffstats
path: root/focus.go
diff options
context:
space:
mode:
Diffstat (limited to 'focus.go')
-rw-r--r--focus.go58
1 files changed, 58 insertions, 0 deletions
diff --git a/focus.go b/focus.go
new file mode 100644
index 0000000..331d232
--- /dev/null
+++ b/focus.go
@@ -0,0 +1,58 @@
+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) 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
+}