mirror of https://github.com/gizak/termui.git
This commit is contained in:
parent
a302a528a8
commit
ab87ad72d1
54
render.go
54
render.go
|
@ -5,6 +5,8 @@
|
||||||
package termui
|
package termui
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"image"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
tm "github.com/nsf/termbox-go"
|
tm "github.com/nsf/termbox-go"
|
||||||
|
@ -26,11 +28,7 @@ func Init() error {
|
||||||
go hookTermboxEvt()
|
go hookTermboxEvt()
|
||||||
|
|
||||||
renderJobs = make(chan []Bufferer)
|
renderJobs = make(chan []Bufferer)
|
||||||
go func() {
|
//renderLock = new(sync.RWMutex)
|
||||||
for bs := range renderJobs {
|
|
||||||
render(bs...)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
Body = NewGrid()
|
Body = NewGrid()
|
||||||
Body.X = 0
|
Body.X = 0
|
||||||
|
@ -51,6 +49,13 @@ func Init() error {
|
||||||
|
|
||||||
DefaultWgtMgr = NewWgtMgr()
|
DefaultWgtMgr = NewWgtMgr()
|
||||||
DefaultEvtStream.Hook(DefaultWgtMgr.WgtHandlersHook())
|
DefaultEvtStream.Hook(DefaultWgtMgr.WgtHandlersHook())
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
for bs := range renderJobs {
|
||||||
|
render(bs...)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,16 +65,24 @@ func Close() {
|
||||||
tm.Close()
|
tm.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var renderLock sync.Mutex
|
||||||
|
|
||||||
|
func termSync() {
|
||||||
|
renderLock.Lock()
|
||||||
|
tm.Sync()
|
||||||
|
renderLock.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
// TermWidth returns the current terminal's width.
|
// TermWidth returns the current terminal's width.
|
||||||
func TermWidth() int {
|
func TermWidth() int {
|
||||||
tm.Sync()
|
termSync()
|
||||||
w, _ := tm.Size()
|
w, _ := tm.Size()
|
||||||
return w
|
return w
|
||||||
}
|
}
|
||||||
|
|
||||||
// TermHeight returns the current terminal's height.
|
// TermHeight returns the current terminal's height.
|
||||||
func TermHeight() int {
|
func TermHeight() int {
|
||||||
tm.Sync()
|
termSync()
|
||||||
_, h := tm.Size()
|
_, h := tm.Size()
|
||||||
return h
|
return h
|
||||||
}
|
}
|
||||||
|
@ -77,8 +90,7 @@ func TermHeight() int {
|
||||||
// Render renders all Bufferer in the given order from left to right,
|
// Render renders all Bufferer in the given order from left to right,
|
||||||
// right could overlap on left ones.
|
// right could overlap on left ones.
|
||||||
func render(bs ...Bufferer) {
|
func render(bs ...Bufferer) {
|
||||||
// set tm bg
|
|
||||||
tm.Clear(tm.ColorDefault, toTmAttr(ThemeAttr("bg")))
|
|
||||||
for _, b := range bs {
|
for _, b := range bs {
|
||||||
buf := b.Buffer()
|
buf := b.Buffer()
|
||||||
// set cels in buf
|
// set cels in buf
|
||||||
|
@ -88,12 +100,34 @@ func render(bs ...Bufferer) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
renderLock.Lock()
|
||||||
// render
|
// render
|
||||||
tm.Flush()
|
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
|
var renderJobs chan []Bufferer
|
||||||
|
|
||||||
func Render(bs ...Bufferer) {
|
func Render(bs ...Bufferer) {
|
||||||
go func() { renderJobs <- bs }()
|
//go func() { renderJobs <- bs }()
|
||||||
|
renderJobs <- bs
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue