1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- // Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.
- // Use of this source code is governed by a MIT license that can
- // be found in the LICENSE file.
- package termui
- import (
- "fmt"
- "sync"
- )
- // event mixins
- type WgtMgr map[string]WgtInfo
- type WgtInfo struct {
- Handlers map[string]func(Event)
- WgtRef Widget
- Id string
- }
- type Widget interface {
- Id() string
- }
- func NewWgtInfo(wgt Widget) WgtInfo {
- return WgtInfo{
- Handlers: make(map[string]func(Event)),
- WgtRef: wgt,
- Id: wgt.Id(),
- }
- }
- func NewWgtMgr() WgtMgr {
- wm := WgtMgr(make(map[string]WgtInfo))
- return wm
- }
- func (wm WgtMgr) AddWgt(wgt Widget) {
- wm[wgt.Id()] = NewWgtInfo(wgt)
- }
- func (wm WgtMgr) RmWgt(wgt Widget) {
- wm.RmWgtById(wgt.Id())
- }
- func (wm WgtMgr) RmWgtById(id string) {
- delete(wm, id)
- }
- func (wm WgtMgr) AddWgtHandler(id, path string, h func(Event)) {
- if w, ok := wm[id]; ok {
- w.Handlers[path] = h
- }
- }
- func (wm WgtMgr) RmWgtHandler(id, path string) {
- if w, ok := wm[id]; ok {
- delete(w.Handlers, path)
- }
- }
- var counter struct {
- sync.RWMutex
- count int
- }
- func GenId() string {
- counter.Lock()
- defer counter.Unlock()
- counter.count += 1
- return fmt.Sprintf("%d", counter.count)
- }
- func (wm WgtMgr) WgtHandlersHook() func(Event) {
- return func(e Event) {
- for _, v := range wm {
- if k := findMatch(v.Handlers, e.Path); k != "" {
- v.Handlers[k](e)
- }
- }
- }
- }
- var DefaultWgtMgr WgtMgr
- func (b *Block) Handle(path string, handler func(Event)) {
- if _, ok := DefaultWgtMgr[b.Id()]; !ok {
- DefaultWgtMgr.AddWgt(b)
- }
- DefaultWgtMgr.AddWgtHandler(b.Id(), path, handler)
- }
|