diff options
Diffstat (limited to 'Godeps/_workspace/src/github.com/gizak/termui/render.go')
-rw-r--r-- | Godeps/_workspace/src/github.com/gizak/termui/render.go | 117 |
1 files changed, 96 insertions, 21 deletions
diff --git a/Godeps/_workspace/src/github.com/gizak/termui/render.go b/Godeps/_workspace/src/github.com/gizak/termui/render.go index d697d0aea..36544f063 100644 --- a/Godeps/_workspace/src/github.com/gizak/termui/render.go +++ b/Godeps/_workspace/src/github.com/gizak/termui/render.go @@ -1,29 +1,62 @@ -// Copyright 2015 Zack Guo <gizak@icloud.com>. All rights reserved. +// Copyright 2016 Zack Guo <gizak@icloud.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 tm "github.com/nsf/termbox-go" +import ( + "image" + "sync" + "time" + + tm "github.com/nsf/termbox-go" +) // Bufferer should be implemented by all renderable components. type Bufferer interface { - Buffer() []Point + Buffer() Buffer } // Init initializes termui library. This function should be called before any others. // After initialization, the library must be finalized by 'Close' function. func Init() error { + if err := tm.Init(); err != nil { + return err + } + + sysEvtChs = make([]chan Event, 0) + go hookTermboxEvt() + + renderJobs = make(chan []Bufferer) + //renderLock = new(sync.RWMutex) + Body = NewGrid() Body.X = 0 Body.Y = 0 - Body.BgColor = theme.BodyBg - defer func() { - w, _ := tm.Size() - Body.Width = w - evtListen() + Body.BgColor = ThemeAttr("bg") + Body.Width = TermWidth() + + DefaultEvtStream.Init() + DefaultEvtStream.Merge("termbox", NewSysEvtCh()) + DefaultEvtStream.Merge("timer", NewTimerCh(time.Second)) + DefaultEvtStream.Merge("custom", usrEvtCh) + + DefaultEvtStream.Handle("/", DefualtHandler) + DefaultEvtStream.Handle("/sys/wnd/resize", func(e Event) { + w := e.Data.(EvtWnd) + Body.Width = w.Width + }) + + DefaultWgtMgr = NewWgtMgr() + DefaultEvtStream.Hook(DefaultWgtMgr.WgtHandlersHook()) + + go func() { + for bs := range renderJobs { + render(bs...) + } }() - return tm.Init() + + return nil } // Close finalizes termui library, @@ -32,29 +65,71 @@ func Close() { tm.Close() } +var renderLock sync.Mutex + +func termSync() { + renderLock.Lock() + tm.Sync() + termWidth, termHeight = tm.Size() + renderLock.Unlock() +} + // TermWidth returns the current terminal's width. func TermWidth() int { - tm.Sync() - w, _ := tm.Size() - return w + termSync() + return termWidth } // TermHeight returns the current terminal's height. func TermHeight() int { - tm.Sync() - _, h := tm.Size() - return h + termSync() + return termHeight } // Render renders all Bufferer in the given order from left to right, // right could overlap on left ones. -func Render(rs ...Bufferer) { - tm.Clear(tm.ColorDefault, toTmAttr(theme.BodyBg)) - for _, r := range rs { - buf := r.Buffer() - for _, v := range buf { - tm.SetCell(v.X, v.Y, v.Ch, toTmAttr(v.Fg), toTmAttr(v.Bg)) +func render(bs ...Bufferer) { + + for _, b := range bs { + + buf := b.Buffer() + // set cels in buf + for p, c := range buf.CellMap { + if p.In(buf.Area) { + + tm.SetCell(p.X, p.Y, c.Ch, toTmAttr(c.Fg), toTmAttr(c.Bg)) + + } } + } + + renderLock.Lock() + // render tm.Flush() + renderLock.Unlock() +} + +func Clear() { + tm.Clear(tm.ColorDefault, toTmAttr(ThemeAttr("bg"))) +} + +func clearArea(r image.Rectangle, bg Attribute) { + for i := r.Min.X; i < r.Max.X; i++ { + for j := r.Min.Y; j < r.Max.Y; j++ { + tm.SetCell(i, j, ' ', tm.ColorDefault, toTmAttr(bg)) + } + } +} + +func ClearArea(r image.Rectangle, bg Attribute) { + clearArea(r, bg) + tm.Flush() +} + +var renderJobs chan []Bufferer + +func Render(bs ...Bufferer) { + //go func() { renderJobs <- bs }() + renderJobs <- bs } |