#!/usr/local/bin/newlisp
;;
;; drag-demo.lsp - demonstrate dragging of objects with the mouse
;;

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

(gs:init) 
;(gs:set-trace true)

;;;; describe the GUI
(gs:frame 'DragDemo  100 100 600 500 "Drag demo")
;(gs:set-resizable 'DragDemo nil)
(gs:canvas 'MyCanvas)
(gs:set-background 'MyCanvas gs:white)
(gs:add-to 'DragDemo 'MyCanvas) 
(gs:mouse-clicked 'MyCanvas 'mouse-clicked-action true)
(gs:mouse-pressed 'MyCanvas 'mouse-pressed-action true)
(gs:mouse-released 'MyCanvas 'mouse-released-action true)
(gs:mouse-dragged 'MyCanvas 'mouse-dragged-action)

;(gs:set-scale 0.5 0.5) ; only for testing, dragging would fail

(gs:set-font 'MyCanvas "Lucida Sans Oblique" 18 "plain")
(gs:draw-text 'T "Drag objects with the mouse, click right for popup menu" 20 250 gs:darkGray)
(gs:fill-circle 'C 100 100 50 gs:red)
(gs:fill-circle 'C 60 60 30 gs:black)
(gs:fill-circle 'C 140 60 30 gs:black)
(gs:fill-circle 'C 100 110 8 gs:yellow)


(gs:draw-polygon 'P '(300 200 400 50 500 200) gs:blue)

(gs:draw-image 'I "/local/newLISP128.png" 300 300 128 128)

(gs:menu-popup 'EditMenuPopup "Edit")
(gs:menu-item 'EditCut 'gs:no-action "Cut")
(gs:menu-item 'EditCopy 'gs:no-action "Copy")
(gs:menu-item 'EditPaste 'gs:no-action "Paste")
(gs:disable 'EditCut 'EditCopy 'EditPaste)
(gs:add-to 'EditMenuPopup 'EditCut 'EditCopy 'EditPaste)

; comment out to test reorder
;(gs:reorder-tags '(I P C T))

(gs:set-visible 'DragDemo true)

;(gs:update)

;; actions
(set 'mouse-down-tags '())

(define (mouse-clicked-action x y button cnt  modifiers tags)
	(gs:set-text 'DragDemo (string  x ":" y " "  button " " cnt " " tags))
	(if (or (= 3 button) (= modifiers 18)) ; check for ctrl-button1-click on Mac
		(gs:show-popup 'EditMenuPopup 'MyCanvas x y))	
)

(define (mouse-pressed-action x y button modifiers tags)
		(gs:set-text 'DragDemo (string  x ":" y " "  button " " modifiers " " tags))
		(set 'mouse-down-tags tags)
		(set 'mouse-old-x x)
		(set 'mouse-old-y y)
)

(define (mouse-released-action x y button modifiers tags)
		(gs:set-text 'DragDemo (string  x ":" y " "  button " " modifiers " " tags))
		(set 'mouse-down-tags '())
)

(define (mouse-dragged-action x y)
	(dolist (t mouse-down-tags)
		(gs:move-tag t (- x mouse-old-x) (- y mouse-old-y)))
	(set 'mouse-old-x x)
	(set 'mouse-old-y y)
)

(gs:listen)

;; eof

