#!/usr/local/bin/newlisp
;;
;; mouse-demo.lsp - demonstrate mouse handlers and gs:delete-tag

;;;; initialization
(set-locale "C")
(load (append (env "NEWLISPDIR") "/guiserver.lsp")) 

(gs:init) 

(set 'colors (list gs:black gs:blue gs:cyan gs:darkGray gs:gray 
				gs:green gs:lightGray gs:magenta gs:orange gs:pink gs:red gs:yellow))

;;;; describe the GUI
(gs:frame 'MouseDemo 100 100 640 640 "Canvas Demo")
(gs:canvas 'MyCanvas 'MouseDemo)
(gs:add-to 'MouseDemo 'MyCanvas)
(gs:set-background 'MyCanvas gs:white)
(gs:mouse-pressed 'MyCanvas 'mouse-pressed-action true)
(gs:mouse-released 'MyCanvas 'mouse-released-action true)
(gs:mouse-clicked 'MyCanvas 'mouse-clicked-action true)
(gs:mouse-moved 'MyCanvas 'mouse-moved-action)
(gs:mouse-dragged 'MyCanvas 'mouse-dragged-action)
(gs:mouse-wheel 'MyCanvas 'mouse-wheel-action)
(gs:set-anti-aliasing true)
(println (time-of-day))
(for (row 0 620 20)
	(for (col 0 620 20)
		(let (r (rand (length colors)))
			(gs:fill-rect (string "R" r) col row 20 20 (colors r))
		)
	)
)
(println (time-of-day))
(gs:set-visible 'MouseDemo true)

;; define actions

(define (mouse-pressed-action x y button modifiers tags)
	(gs:set-text 'MouseDemo 
		(string "pressed row: " (/ y 20) " col:" (/ x 20) " button: " button " key:" modifiers " tags:" tags))
)

(define (mouse-released-action x y button modifiers tags)
	(gs:set-text 'MouseDemo 
		(string "released row: " (/ y 20) " col:" (/ x 20) " button: " button " key:" modifiers " tags:" tags))
)

(define (mouse-clicked-action x y button cnt modifiers tags)
	(gs:set-text 'MouseDemo 
		(string "clicked row: " (/ y 20) " col:" (/ x 20) 
			" button: " button " count:" cnt " key:" modifiers " tags:" tags))
	(if tags (gs:delete-tag (tags 0)))
)

(define (mouse-moved-action x y)
	(gs:set-text 'MouseDemo 
		(string "moved row: " (/ y 20) " col:" (/ x 20)))
)

(define (mouse-dragged-action x y button modifiers)
	(gs:set-text 'MouseDemo 
		(string "dragged row: " (/ y 20) " col:" (/ x 20) " button: " button " key:" modifiers))
)

(define (mouse-wheel-action x y wheel)
	(gs:set-text 'MouseDemo 
		(string "cursor row: " (/ y 20) " col:" (/ x 20) " wheel: " wheel))
)

;;;; listen for incoming action requests and dispatch
(gs:listen)

;; eof

