okami.mom/ultraviolet
git clone https://git.nkp.pet/okami.mom/ultraviolet
6603726
upstream
1package main 2 3import ( 4"fmt" 5"log" 6 7 uv"github.com/charmbracelet/ultraviolet" 8"github.com/charmbracelet/ultraviolet/screen" 9"github.com/charmbracelet/x/ansi" 10) 11 12func main () { 13t := uv .DefaultTerminal () 14ws ,err := t .GetWinsize () 15if err != nil { 16log .Fatalf ("failed to get window size: %v" ,err ) 17 } 18scr := t .Screen () 19 20if err := t .Start ();err != nil { 21log .Fatalf ("failed to start program: %v" ,err ) 22 } 23 24defer t .Stop () 25 26scr .SetMouseMode (uv .MouseModeMotion ) 27scr .SetMouseEncoding (uv .MouseEncodingSGRPixel ) 28 29var lastBtn uv.MouseButton 30var lastX ,lastY int 31 32var width int 33 34display := func () { 35label := fmt .Sprintf (" Button: %-12s Position: (%d, %d)" ,lastBtn ,lastX ,lastY ) 36var st uv.Style 37st .Bg = ansi .BasicColor (4 ) 38st .Fg = ansi .Black 39bg := uv .EmptyCell 40bg .Style = st 41screen .FillArea (scr ,& bg ,uv .Rect (0 ,0 ,width ,1 )) 42for i ,r := range label { 43scr .SetCell (i ,0 ,& uv.Cell { 44Content :string (r ), 45Style :st , 46Width :1 , 47 }) 48 } 49scr .Render () 50scr .Flush () 51 } 52 53// initial render 54display () 55 56for ev := range t .Events () { 57switch ev := ev .(type ) { 58case uv.WindowSizeEvent : 59width = ev .Width 60ws .Col = uint16 (ev .Width ) 61ws .Row = uint16 (ev .Height ) 62scr .Resize (width ,1 ) 63 64// Query the pixel dimensions of the window in-case this platform 65// doesn't report them via Termios [uv.Terminal.GetWinsize]. 66_ ,_ = scr .WriteString (ansi .WindowOp (4 )) 67 68display () 69case uv.PixelSizeEvent : 70ws .Xpixel = uint16 (ev .Width ) 71ws .Ypixel = uint16 (ev .Height ) 72case uv.KeyPressEvent : 73switch { 74case ev .MatchString ("q" ,"ctrl+c" ): 75return 76 } 77case uv.MouseEvent : 78m := ev .Mouse () 79m = uv .MousePixelToCell (m ,ws ) 80lastX = m .X 81lastY = m .Y 82if m .Button != uv .MouseNone { 83lastBtn = m .Button 84 } 85scr .InsertAbove (fmt .Sprintf ("%-20s (%d, %d) %s" ,ev .String (),m .X ,m .Y ,m .Button )) 86display () 87 } 88 } 89}