tinybox

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

examples/window/main.go

package main

import (
	"log"

	tb "github.com/nyangkosense/tinybox/pkg"
)

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