95 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// 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)
 | 
						|
}
 |