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
+ }
+}