okami.mom/ultraviolet

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

Ayman BagabasMerge pull request #112 from charmbracelet/mouse-pixel6603726

upstream
1.8 KiB89 linesraw
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() {
13	t := uv.DefaultTerminal()
14	ws, err := t.GetWinsize()
15	if err != nil {
16		log.Fatalf("failed to get window size: %v", err)
17	}
18	scr := t.Screen()
19
20	if err := t.Start(); err != nil {
21		log.Fatalf("failed to start program: %v", err)
22	}
23
24	defer t.Stop()
25
26	scr.SetMouseMode(uv.MouseModeMotion)
27	scr.SetMouseEncoding(uv.MouseEncodingSGRPixel)
28
29	var lastBtn uv.MouseButton
30	var lastX, lastY int
31
32	var width int
33
34	display := func() {
35		label := fmt.Sprintf(" Button: %-12s Position: (%d, %d)", lastBtn, lastX, lastY)
36		var st uv.Style
37		st.Bg = ansi.BasicColor(4)
38		st.Fg = ansi.Black
39		bg := uv.EmptyCell
40		bg.Style = st
41		screen.FillArea(scr, &bg, uv.Rect(0, 0, width, 1))
42		for i, r := range label {
43			scr.SetCell(i, 0, &uv.Cell{
44				Content: string(r),
45				Style:   st,
46				Width:   1,
47			})
48		}
49		scr.Render()
50		scr.Flush()
51	}
52
53	// initial render
54	display()
55
56	for ev := range t.Events() {
57		switch ev := ev.(type) {
58		case uv.WindowSizeEvent:
59			width = ev.Width
60			ws.Col = uint16(ev.Width)
61			ws.Row = uint16(ev.Height)
62			scr.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
68			display()
69		case uv.PixelSizeEvent:
70			ws.Xpixel = uint16(ev.Width)
71			ws.Ypixel = uint16(ev.Height)
72		case uv.KeyPressEvent:
73			switch {
74			case ev.MatchString("q", "ctrl+c"):
75				return
76			}
77		case uv.MouseEvent:
78			m := ev.Mouse()
79			m = uv.MousePixelToCell(m, ws)
80			lastX = m.X
81			lastY = m.Y
82			if m.Button != uv.MouseNone {
83				lastBtn = m.Button
84			}
85			scr.InsertAbove(fmt.Sprintf("%-20s (%d, %d) %s", ev.String(), m.X, m.Y, m.Button))
86			display()
87		}
88	}
89}