tinybox

Owner: IIIlllIIIllI URL: git@github.com:nyangkosense/tinybox.git

mouse demo code

Commit f8231b0315d8c04612da041b87a4c6e429cc4292 by SM <seb.michalk@gmail.com> on 2025-09-27 09:23:55 +0200
diff --git a/demo/drag/main.go b/demo/drag/main.go
new file mode 100644
index 0000000..56524e4
--- /dev/null
+++ b/demo/drag/main.go
@@ -0,0 +1,102 @@
+package main
+
+import (
+	"log"
+
+	tb "tinybox-example/tinybox"
+)
+
+const boxW, boxH = 18, 7
+
+type drag struct {
+	x, y     int
+	dx, dy   int
+	dragging bool
+}
+
+func main() {
+	if err := tb.Init(); err != nil {
+		log.Fatal(err)
+	}
+	defer tb.Close()
+
+	tb.EnableMouse()
+	tb.SetCursorVisible(true)
+
+	d := drag{x: 6, y: 4}
+	for {
+		draw(&d)
+		evt, err := tb.PollEvent()
+		if err != nil {
+			continue
+		}
+		if handle(&d, evt) {
+			break
+		}
+	}
+}
+
+func handle(d *drag, evt tb.Event) bool {
+	if evt.Type == tb.EventKey {
+		if evt.Key == tb.KeyCtrlC || evt.Key == tb.KeyEscape || evt.Ch == 'q' || evt.Ch == 'Q' {
+			return true
+		}
+		return false
+	}
+	if evt.Type != tb.EventMouse || evt.Button != tb.MouseLeft {
+		return false
+	}
+	if evt.Press {
+		if !d.dragging && evt.X >= d.x && evt.X < d.x+boxW && evt.Y >= d.y && evt.Y < d.y+boxH {
+			d.dragging = true
+			d.dx = evt.X - d.x
+			d.dy = evt.Y - d.y
+		}
+		if d.dragging {
+			d.x = evt.X - d.dx
+			d.y = evt.Y - d.dy
+			d.bound()
+		}
+		return false
+	}
+	if d.dragging {
+		d.dragging = false
+		d.bound()
+	}
+	return false
+}
+
+func draw(d *drag) {
+	tb.Clear()
+	tb.DrawTextLeft(0, "tinybox mouse demo", 14, 0)
+	tb.DrawTextRight(0, "esc/q to quit", 8, 0)
+	tb.DrawTextLeft(2, "Drag the box with the left mouse button", 15, 0)
+
+	tb.SetColor(13, 0)
+	tb.Box(d.x, d.y, boxW, boxH)
+	tb.PrintAt(d.x+(boxW-len("drag me"))/2, d.y+boxH/2, "drag me")
+
+	tb.Present()
+}
+
+func (d *drag) bound() {
+	w, h := tb.Size()
+	maxX := w - boxW
+	maxY := h - boxH
+	if maxX < 0 {
+		maxX = 0
+	}
+	if maxY < 0 {
+		maxY = 0
+	}
+	if d.x < 0 {
+		d.x = 0
+	} else if d.x > maxX {
+		d.x = maxX
+	}
+	if d.y < 0 {
+		d.y = 0
+	} else if d.y > maxY {
+		d.y = maxY
+	}
+}