tui/screen.go
2022-04-01 20:10:51 +02:00

76 lines
1.2 KiB
Go

package tui
import (
"errors"
"fmt"
"git.tordarus.net/Tordarus/buf2d"
"github.com/gdamore/tcell"
)
type Screen struct {
scr tcell.Screen
stopCh chan error
Root View
}
func NewScreen(root View) (*Screen, error) {
scr, err := tcell.NewScreen()
if err != nil {
return nil, err
}
s := &Screen{
Root: root,
scr: scr,
stopCh: make(chan error, 1),
}
go s.eventloop()
return s, nil
}
func (s *Screen) eventloop() {
for evt := s.scr.PollEvent(); evt != nil; evt = s.scr.PollEvent() {
switch event := evt.(type) {
case *tcell.EventResize:
go s.Redraw()
case *tcell.EventKey:
go func() {
s.Root.OnKeyPressed(event)
s.Redraw()
}()
default:
s.StopWithError(errors.New(fmt.Sprintf("%#v", event)))
}
}
s.StopWithError(errors.New("unknown error occured"))
}
func (s *Screen) Start() error {
err := s.scr.Init()
if err != nil {
return err
}
defer s.scr.Fini()
s.Redraw()
return <-s.stopCh
}
func (s *Screen) Stop() {
s.StopWithError(nil)
}
func (s *Screen) StopWithError(err error) {
s.stopCh <- err
}
func (s *Screen) Redraw() {
w, h := s.scr.Size()
buf := buf2d.NewBuffer(w, h, DefaultRune)
s.Root.Draw(buf)
drawBuffer(s.scr, buf)
}