okami.mom/ultraviolet

git clone https://git.nkp.pet/okami.mom/ultraviolet

Ayman Bagabaschore(examples): update terminal initialization in examples03f41d2

main
1.5 KiB88 linesraw
1package main
2
3import (
4	"context"
5	"fmt"
6	"log"
7	"os"
8	"runtime/debug"
9	"time"
10
11	uv "github.com/charmbracelet/ultraviolet"
12	"github.com/charmbracelet/ultraviolet/screen"
13)
14
15type tickEvent struct{}
16
17func main() {
18	t := uv.DefaultTerminal()
19	scr := t.Screen()
20
21	if err := t.Start(); err != nil {
22		log.Fatalf("failed to start terminal: %v", err)
23	}
24
25	defer func() {
26		if r := recover(); r != nil {
27			_ = t.Stop()
28			fmt.Fprintf(os.Stderr, "\r\nrecovered from panic: %v", r)
29			debug.PrintStack()
30		}
31	}()
32
33	ctx, cancel := context.WithCancel(context.Background())
34	defer cancel()
35
36	counter := 5
37	ticker := time.NewTicker(time.Second)
38	go func() {
39		for {
40			select {
41			case <-ctx.Done():
42				return
43			case <-ticker.C:
44				t.SendEvent(tickEvent{})
45			}
46		}
47	}()
48
49	view := func(c int) string {
50		return fmt.Sprintf("Panicing after %d seconds...\nPress 'q' or 'Ctrl+C' to exit.", c)
51	}
52
53OUT:
54	for {
55		select {
56		case <-ctx.Done():
57			break OUT
58		case ev := <-t.Events():
59			switch e := ev.(type) {
60			case uv.WindowSizeEvent:
61				scr.Resize(e.Width, 2)
62			case uv.KeyPressEvent:
63				switch {
64				case e.MatchString("q", "ctrl+c"):
65					cancel()
66					break OUT
67				}
68			case tickEvent:
69				counter--
70				if counter < 0 {
71					panic("Time's up!\n")
72				}
73			}
74		}
75
76		ss := uv.NewStyledString(view(counter))
77		screen.Clear(scr)
78		scr.Display(ss)
79	}
80
81	ss := uv.NewStyledString(view(counter) + "\n")
82	screen.Clear(scr)
83	scr.Display(ss)
84
85	if err := t.Stop(); err != nil {
86		log.Fatalf("failed to stop terminal: %v", err)
87	}
88}