tinybox
mouse demo code
f8231b0315d8c04612da041b87a4c6e429cc4292
SM <seb.michalk@gmail.com>
2025-09-27 07:23:55 +0000
demo/drag/main.go | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) 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 + } +}