okami.mom/ultraviolet

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

Ayman Bagabasdocs: update README and tutorial5027f0c

upstream
1.6 KiB95 linesraw
1package main
2
3import (
4	"log"
5
6	uv "github.com/charmbracelet/ultraviolet"
7	"github.com/charmbracelet/ultraviolet/screen"
8)
9
10func main() {
11	// Create a new terminal screen
12	t := uv.DefaultTerminal()
13
14	if err := run(t); err != nil {
15		log.Fatalf("error: %v", err)
16	}
17}
18
19func run(t *uv.Terminal) error {
20	scr := t.Screen()
21
22	// Start in alternate screen mode
23	scr.EnterAltScreen()
24
25	if err := t.Start(); err != nil {
26		return err
27	}
28
29	defer t.Stop()
30
31	ctx := screen.NewContext(scr)
32	view := []string{
33		"Hello, World!",
34		"Press any key to exit.",
35	}
36	viewWidths := []int{
37		scr.StringWidth(view[0]),
38		scr.StringWidth(view[1]),
39	}
40
41	display := func() {
42		screen.Clear(scr)
43		bounds := scr.Bounds()
44		for i, line := range view {
45			x := (bounds.Dx() - viewWidths[i]) / 2
46			y := (bounds.Dy()-len(view))/2 + i
47			ctx.DrawString(line, x, y)
48		}
49		scr.Render()
50		scr.Flush()
51	}
52
53	// initial render
54	display()
55
56	// last render
57	defer display()
58
59	var physicalWidth, physicalHeight int
60	for ev := range t.Events() {
61		switch ev := ev.(type) {
62		case uv.WindowSizeEvent:
63			physicalWidth = ev.Width
64			physicalHeight = ev.Height
65			if scr.AltScreen() {
66				scr.Resize(physicalWidth, physicalHeight)
67			} else {
68				scr.Resize(physicalWidth, len(view))
69			}
70			display()
71		case uv.KeyPressEvent:
72			switch {
73			case ev.MatchString("space"):
74				if scr.AltScreen() {
75					scr.ExitAltScreen()
76					scr.Resize(physicalWidth, len(view))
77				} else {
78					scr.EnterAltScreen()
79					scr.Resize(physicalWidth, physicalHeight)
80				}
81				display()
82			case ev.MatchString("ctrl+z"):
83				_ = t.Stop()
84
85				uv.Suspend()
86
87				_ = t.Start()
88			default:
89				return nil
90			}
91		}
92	}
93
94	return nil
95}