diff --git a/uiterm/label.go b/uiterm/label.go index 259c22d..39394ff 100644 --- a/uiterm/label.go +++ b/uiterm/label.go @@ -30,6 +30,9 @@ func (l *Label) uiSetBounds(x0, y0, x1, y1 int) { } func (l *Label) uiDraw() { + l.ui.beginDraw() + defer l.ui.endDraw() + reader := strings.NewReader(l.Text) for y := l.y0; y < l.y1; y++ { for x := l.x0; x < l.x1; x++ { diff --git a/uiterm/textbox.go b/uiterm/textbox.go index cda0c41..60c7ab2 100644 --- a/uiterm/textbox.go +++ b/uiterm/textbox.go @@ -35,6 +35,9 @@ func (t *Textbox) uiSetBounds(x0, y0, x1, y1 int) { } func (t *Textbox) uiDraw() { + t.ui.beginDraw() + defer t.ui.endDraw() + var setCursor = false reader := strings.NewReader(t.Text) for y := t.y0; y < t.y1; y++ { @@ -80,12 +83,10 @@ func (t *Textbox) uiKeyEvent(mod Modifier, key Key) { } if redraw { t.uiDraw() - termbox.Flush() } } func (t *Textbox) uiCharacterEvent(chr rune) { t.Text = t.Text + string(chr) t.uiDraw() - termbox.Flush() } diff --git a/uiterm/textview.go b/uiterm/textview.go index 395772e..f9cd0a9 100644 --- a/uiterm/textview.go +++ b/uiterm/textview.go @@ -103,6 +103,9 @@ func (t *Textview) Clear() { } func (t *Textview) uiDraw() { + t.ui.beginDraw() + defer t.ui.endDraw() + var reader *strings.Reader line := len(t.parsedLines) - 1 - t.CurrentLine if line < 0 { diff --git a/uiterm/tree.go b/uiterm/tree.go index c72a67f..ed6f45a 100644 --- a/uiterm/tree.go +++ b/uiterm/tree.go @@ -96,6 +96,9 @@ func (t *Tree) rebuild_rec(parent TreeItem, level int) []renderedTreeItem { } func (t *Tree) uiDraw() { + t.ui.beginDraw() + defer t.ui.endDraw() + if t.lines == nil { t.Rebuild() } diff --git a/uiterm/ui.go b/uiterm/ui.go index b9b1f8f..65fb6a9 100644 --- a/uiterm/ui.go +++ b/uiterm/ui.go @@ -2,6 +2,7 @@ package uiterm import ( "errors" + "sync/atomic" "github.com/nsf/termbox-go" ) @@ -20,6 +21,7 @@ type Ui struct { close chan bool manager UiManager + drawCount int32 elements map[string]*uiElement activeElement *uiElement @@ -50,11 +52,23 @@ func (ui *Ui) Close() { func (ui *Ui) Refresh() { if termbox.IsInit { + ui.beginDraw() + defer ui.endDraw() + termbox.Clear(termbox.Attribute(ui.Fg), termbox.Attribute(ui.Bg)) termbox.HideCursor() for _, element := range ui.elements { element.View.uiDraw() } + } +} + +func (ui *Ui) beginDraw() { + atomic.AddInt32(&ui.drawCount, 1) +} + +func (ui *Ui) endDraw() { + if count := atomic.AddInt32(&ui.drawCount, -1); count == 0 { termbox.Flush() } }