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