74 lines
1.2 KiB
Go
74 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.Key())
|
||
|
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
|
||
|
}
|
||
|
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)
|
||
|
s.Root.Draw(buf)
|
||
|
drawBuffer(s.scr, buf)
|
||
|
}
|