diff options
Diffstat (limited to 'gui/widget/focus.go')
| -rw-r--r-- | gui/widget/focus.go | 84 |
1 files changed, 56 insertions, 28 deletions
diff --git a/gui/widget/focus.go b/gui/widget/focus.go index e2d1074..f1bc06e 100644 --- a/gui/widget/focus.go +++ b/gui/widget/focus.go @@ -1,70 +1,98 @@ package widget -import "image" +import ( + "image" + "sync" +) -// Focus keeps track of the currently selected widget. -// A widget receives true when it gains focus and false when it loses focus. -type Focus struct { - Widgets [][]chan bool - p image.Point // coordinates of currently focused widget +type FocusMaster struct { + slaves [][]chan bool + mu sync.Mutex + p image.Point // coordinates of currently focused slave } -func NewFocus(rows []int) Focus { - f := Focus{ +type FocusSlave struct { + Focus <-chan bool + Mu *sync.Mutex +} + +func NewFocusMaster(rows []int) FocusMaster { + f := FocusMaster{ make([][]chan bool, len(rows)), + sync.Mutex{}, image.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) + for i := range f.slaves { + f.slaves[i] = make([]chan bool, rows[i]) + for j := range f.slaves[i] { + f.slaves[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 *FocusMaster) Slave(y, x int) FocusSlave { + return FocusSlave{f.slaves[y][x], &f.mu} +} + +func (f *FocusMaster) Close() { + for i := range f.slaves { + for j := range f.slaves[i] { + close(f.slaves[i][j]) } } } -func (f *Focus) Focus(focus bool) { - f.Widgets[f.p.Y][f.p.X] <- focus +func (f *FocusMaster) Focus(focus bool) { + f.slaves[f.p.Y][f.p.X] <- focus } -func (f *Focus) Left() { +func (f *FocusMaster) TryLeft() { + if !f.mu.TryLock() { + return + } + defer f.mu.Unlock() f.Focus(false) if f.p.X <= 0 { - f.p.X = len(f.Widgets[f.p.Y]) - 1 + f.p.X = len(f.slaves[f.p.Y]) - 1 } else { f.p.X-- } f.Focus(true) } -func (f *Focus) Right() { +func (f *FocusMaster) TryRight() { + if !f.mu.TryLock() { + return + } + defer f.mu.Unlock() f.Focus(false) - f.p.X = (f.p.X + 1) % len(f.Widgets[f.p.Y]) + f.p.X = (f.p.X + 1) % len(f.slaves[f.p.Y]) f.Focus(true) } -func (f *Focus) Up() { +func (f *FocusMaster) TryUp() { + if !f.mu.TryLock() { + return + } + defer f.mu.Unlock() f.Focus(false) if f.p.Y <= 0 { - f.p.Y = len(f.Widgets) - 1 + f.p.Y = len(f.slaves) - 1 } else { f.p.Y-- } - f.p.X = min(f.p.X, len(f.Widgets[f.p.Y])-1) + f.p.X = min(f.p.X, len(f.slaves[f.p.Y])-1) f.Focus(true) } -func (f *Focus) Down() { +func (f *FocusMaster) TryDown() { + if !f.mu.TryLock() { + return + } + defer f.mu.Unlock() f.Focus(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.p.Y = (f.p.Y + 1) % len(f.slaves) + f.p.X = min(f.p.X, len(f.slaves[f.p.Y])-1) f.Focus(true) } |