1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
package main
import (
"context"
"log"
"time"
uv "github.com/charmbracelet/ultraviolet"
"github.com/charmbracelet/ultraviolet/screen"
)
func main() {
t := uv.DefaultTerminal()
width, height, err := t.GetSize()
if err != nil {
log.Fatalf("failed to get terminal size: %v", err)
}
if err := t.Start(); err != nil {
log.Fatalf("failed to start program: %v", err)
}
ctx, stop := context.WithCancel(context.Background())
defer stop()
var altScreen bool
frameHeight := 2
updateViewport := func(altscreen bool) {
if altscreen {
frameHeight = height
t.EnterAltScreen()
} else {
frameHeight = 2
t.ExitAltScreen()
}
t.Resize(width, frameHeight)
}
help := "Press space to toggle screen mode or ctrl+c to exit."
display := func() {
updateViewport(altScreen)
var str string
if altScreen {
str = "This is using alternate screen mode.\n" + help
} else {
str = "This is using inline mode.\n" + help
}
ss := uv.NewStyledString(str)
screen.Clear(t)
t.Draw(ss)
t.Display()
}
var cursorHidden bool
LOOP:
for {
select {
case <-ctx.Done():
break LOOP
case ev := <-t.Events():
switch ev := ev.(type) {
case uv.WindowSizeEvent:
width, height = ev.Width, ev.Height
t.Erase()
display()
case uv.KeyPressEvent:
switch {
case ev.MatchString("ctrl+c", "q"):
altScreen = false
stop()
case ev.MatchString("space"):
altScreen = !altScreen
default:
if cursorHidden {
t.HideCursor()
} else {
t.ShowCursor()
}
cursorHidden = !cursorHidden
}
}
}
display()
}
var cancel context.CancelFunc
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := t.Shutdown(ctx); err != nil {
log.Fatalf("failed to shutdown program: %v", err)
}
}
|