aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/term/screen.go
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2023-03-10 00:15:37 +0900
committernsfisis <nsfisis@gmail.com>2023-03-10 00:15:37 +0900
commitf7f8ec295f568313312bc4243150cb472cfe8a12 (patch)
tree743947e3e3e602d4ab96d7e9308abc076e69fbc1 /internal/term/screen.go
parentd3bed78b099eba23f5c037d3de9561acddfc1ee1 (diff)
downloadterm-clock-f7f8ec295f568313312bc4243150cb472cfe8a12.tar.gz
term-clock-f7f8ec295f568313312bc4243150cb472cfe8a12.tar.zst
term-clock-f7f8ec295f568313312bc4243150cb472cfe8a12.zip
refactor: move common stuff to internal/term package
Diffstat (limited to 'internal/term/screen.go')
-rw-r--r--internal/term/screen.go70
1 files changed, 70 insertions, 0 deletions
diff --git a/internal/term/screen.go b/internal/term/screen.go
new file mode 100644
index 0000000..14bfcfb
--- /dev/null
+++ b/internal/term/screen.go
@@ -0,0 +1,70 @@
+package term
+
+import (
+ "github.com/gdamore/tcell/v2"
+)
+
+type Screen struct {
+ scr tcell.Screen
+ onResize func() bool
+ QuitC chan struct{}
+}
+
+func NewScreen() (*Screen, error) {
+ scr, err := tcell.NewScreen()
+ if err != nil{
+ return nil, err
+ }
+ err = scr.Init()
+ if err != nil{
+ return nil, err
+ }
+ return &Screen{
+ scr: scr,
+ QuitC: make(chan struct{}),
+ }, nil
+}
+
+func (scr *Screen) Close() {
+ scr.scr.Fini()
+}
+
+func (scr *Screen) Size() (int, int) {
+ return scr.scr.Size()
+}
+
+func (scr *Screen) Clear(style Style) {
+ scr.scr.SetStyle(tcell.Style(style))
+ scr.scr.Clear()
+}
+
+func (scr *Screen) OnResize(handler func() bool) {
+ scr.onResize = handler
+}
+
+func (scr *Screen) Show() {
+ scr.scr.Show()
+}
+
+func (scr *Screen) DoEventLoop() {
+ for {
+ scr.scr.Show()
+
+ ev := scr.scr.PollEvent()
+ switch ev := ev.(type) {
+ case *tcell.EventResize:
+ if scr.onResize != nil {
+ if quit := scr.onResize(); quit {
+ return
+ }
+ }
+ scr.scr.Sync()
+ case *tcell.EventKey:
+ if ev.Key() == tcell.KeyEscape || ev.Key() == tcell.KeyCtrlC || ev.Rune() == 'q' {
+ close(scr.QuitC)
+ return
+ }
+ scr.scr.Sync()
+ }
+ }
+}