home *** CD-ROM | disk | FTP | other *** search
- (in-package :oou)
- (oou-provide :kinesis-u)
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; kinesis-u.Lisp
- ;;
- ;; Copyright ⌐ 1992 Northwestern University Institute for the Learning Sciences
- ;; All Rights Reserved
- ;;
- ;; author: Michael S. Engber
- ;;
- ;; utilities for moving images around
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (oou-dependencies :screen-3buf
- :QuickDraw-u
- :GWorld-u)
-
- (export '(drag-region move-region))
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- ;;default drag over function
- (defun drag-over-p () (not (#_WaitMouseUp)))
-
- ;;default drag position function
- (defun drag-cur-pos ()
- (rlet ((pt_p :Point))
- (#_GetMouse pt_p)
- (#_LocalToGlobal pt_p)
- (%get-point pt_p)))
-
- (defun drag-region (drag-rgn start-pt
- &key
- (bounds-rect nil)
- (slop-rect nil)
- (drag-axis :both)
- (action-fn nil)
- (erase-at-start-p nil)
- (erase-at-end-p t)
- (border-size #@(50 50))
- (saved-bits-init-fn nil)
- (drag-over-p-fn #'drag-over-p)
- (drag-cur-pos-fn #'drag-cur-pos))
- (declare (dynamic-extent drag-rgn start-pt bounds-rect slop-rect drag-axis action-fn erase-at-start-p erase-at-end-p border-size saved-bits-init-fn))
- (let* ((rgn-pos (href drag-rgn :Region.rgnBBox.topLeft))
- (rgn-size (subtract-points (href drag-rgn :Region.rgnBBox.botRight)
- (href drag-rgn :Region.rgnBBox.topLeft)))
- (s3b (make-instance 'screen-3buf
- :s3buf-position (subtract-points rgn-pos border-size)
- :s3buf-size (add-points rgn-size (add-points border-size border-size))))
- (cur-pos start-pt)
- (last-pos start-pt)
- (s3b-tl (s3buf-position s3b))
- (s3b-br (add-points (s3buf-position s3b) (s3buf-size s3b)))
- (hidden-p nil))
- (declare (dynamic-extent rgn-pos rgn-size s3b last-pos s3b-tl s3b-br hidden-p))
-
- (rlet ((cached-r :Rect
- :topLeft (add-points s3b-tl (subtract-points start-pt rgn-pos))
- :botRight (add-points s3b-br (subtract-points start-pt (href drag-rgn :Region.rgnBBox.botRight))))
- (bounds-r :Rect
- :topLeft #@(-32767 -32767)
- :botRight #@(32767 32767))
- (slop-r :Rect))
-
- ;set up the bounds and slop rects
- (when (pointerp bounds-rect) (pset bounds-r :Rect bounds-rect))
- (pset slop-r :Rect (if (pointerp slop-rect) slop-rect bounds-r))
-
- (s3buf-alloc s3b)
-
- (unwind-protect
- (progn
- (when erase-at-start-p
- (erase-screen-buf-gWorld (saved-GW-view s3b) :region drag-rgn))
-
- (when saved-bits-init-fn
- (flet ((draw-fn (s3b r)
- (declare (ignore s3b))
- (funcall saved-bits-init-fn drag-rgn r)))
- (declare (dynamic-extent #'draw-fn))
- (s3buf-draw-to-saved s3b #'draw-fn)))
-
- (loop
- (when (funcall drag-over-p-fn) (return (values (subtract-points cur-pos start-pt) cur-pos)))
- (when action-fn (funcall action-fn))
- (setf cur-pos (ecase drag-axis
- (:both (funcall drag-cur-pos-fn))
- (:vertical (make-point (point-h start-pt)
- (point-v (funcall drag-cur-pos-fn))))
- (:horizontal (make-point (point-h (funcall drag-cur-pos-fn))
- (point-h start-pt)))))
- (if (#_PtInRect cur-pos slop-r)
- (unless (eql cur-pos last-pos)
- (let ((delta-rgn-pos (subtract-points (setf cur-pos (#_PinRect bounds-r cur-pos)) last-pos)))
- (declare (dynamic-extent delta-rgn-pos))
- (setf hidden-p nil)
- (setf rgn-pos (add-points rgn-pos delta-rgn-pos))
- (if (#_PtInRect cur-pos cached-r)
- (s3buf-reposition s3b s3b-tl s3b-br
- :restore-old-rgn-p nil
- :saved-xfer-mode :none
- :image-xfer-mode :move
- :image-sub-rgn drag-rgn
- :sub-rgn-new-pos rgn-pos)
-
- (let ((delta-buf-pos (subtract-points (subtract-points rgn-pos border-size) s3b-tl)))
- (declare (dynamic-extent delta-buf-pos))
- (setf s3b-tl (add-points s3b-tl delta-buf-pos))
- (setf s3b-br (add-points s3b-br delta-buf-pos))
- (s3buf-reposition s3b s3b-tl s3b-br
- :restore-old-rgn-p t
- :saved-xfer-mode :slip
- :image-sub-rgn drag-rgn
- :sub-rgn-new-pos rgn-pos)
- (#_OffsetRect :pointer cached-r :long delta-buf-pos)))
- (setf last-pos cur-pos)
- (s3buf-image-to-screen s3b)))
- (unless hidden-p
- (setf hidden-p t)
- (s3buf-saved-to-screen s3b)))))
- (when erase-at-end-p (s3buf-saved-to-screen s3b))
- (s3buf-dispose s3b)))))
-
-
-
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-
- (defun move-region (the-rgn point-list
- &key
- (erase-at-start-p nil)
- (erase-at-end-p t)
- (border-size #@(50 50))
- (saved-bits-init-fn nil))
- (declare (dynamic-extent the-rgn point-list erase-at-start-p erase-at-end-p border-size saved-bits-init-fn))
- (let* ((rgn-pos (href the-rgn :Region.rgnBBox.topLeft))
- (rgn-size (subtract-points (href the-rgn :Region.rgnBBox.botRight)
- (href the-rgn :Region.rgnBBox.topLeft)))
- (s3b (make-instance 'screen-3buf
- :s3buf-position (subtract-points rgn-pos border-size)
- :s3buf-size (add-points rgn-size (add-points border-size border-size))))
- (start-pt (first point-list))
- (last-pos start-pt)
- (s3b-tl (s3buf-position s3b))
- (s3b-br (add-points (s3buf-position s3b) (s3buf-size s3b))))
- (declare (dynamic-extent rgn-pos rgn-size s3b last-pos s3b-tl s3b-br))
- (rlet ((cached-r :Rect
- :topLeft (add-points s3b-tl (subtract-points last-pos rgn-pos))
- :botRight (add-points s3b-br (subtract-points last-pos (href the-rgn :Region.rgnBBox.botRight)))))
-
- (s3buf-alloc s3b)
-
- (unwind-protect
- (progn
- (when erase-at-start-p
- (erase-screen-buf-gWorld (saved-GW-view s3b) :region the-rgn))
-
- (when saved-bits-init-fn
- (flet ((draw-fn (s3b r)
- (declare (ignore s3b))
- (funcall saved-bits-init-fn the-rgn r)))
- (declare (dynamic-extent #'draw-fn))
- (s3buf-draw-to-saved s3b #'draw-fn)))
-
- (dolist (cur-pos point-list (values (subtract-points last-pos start-pt) last-pos))
- (setf rgn-pos (add-points rgn-pos (subtract-points cur-pos last-pos)))
- (if (#_PtInRect cur-pos cached-r)
- (s3buf-reposition s3b s3b-tl s3b-br
- :restore-old-rgn-p nil
- :saved-xfer-mode :none
- :image-xfer-mode :move
- :image-sub-rgn the-rgn
- :sub-rgn-new-pos rgn-pos)
- (let ((delta-buf-pos (subtract-points (subtract-points rgn-pos border-size) s3b-tl)))
- (declare (dynamic-extent delta-buf-pos))
- (setf s3b-tl (add-points s3b-tl delta-buf-pos))
- (setf s3b-br (add-points s3b-br delta-buf-pos))
- (s3buf-reposition s3b s3b-tl s3b-br
- :restore-old-rgn-p t
- :saved-xfer-mode :slip
- :image-sub-rgn the-rgn
- :sub-rgn-new-pos rgn-pos)
- (#_OffsetRect :pointer cached-r :long delta-buf-pos)))
- (setf last-pos cur-pos)
- (s3buf-image-to-screen s3b)))
- (when erase-at-end-p (s3buf-saved-to-screen s3b))
- (s3buf-dispose s3b)))))
-
- #|
-
- (oou-dependencies :simple-view-ce)
-
- (progn
- (defparameter *test-w* (make-instance 'window
- :view-position #@(5 40)
- :view-size #@(200 200)
- ;:color-p t
- ))
- (with-focused-view *test-w* (#_BackPat *light-gray-pattern*))
- ;(set-back-color *test-w* *red-color*)
- ;(set-fore-color *test-w* *blue-color*)
- (invalidate-view *test-w* t))
-
- (with-focused-view *test-w*
- (rlet ((r :Rect
- :topLeft #@(20 20)
- :botRight #@(150 150)))
- (with-macptrs ((rgn (#_NewRgn)))
- (#_OpenRgn)
- (#_FrameOval r)
- (#_InsetRect r 10 10)
- (#_FrameOval r)
- (#_InsetRect r 20 20)
- (#_OffsetRect r -10 -5)
- (#_FrameOval r)
- (#_OffsetRect r 20 0)
- (#_FrameOval r)
- (#_CloseRgn rgn)
- (#_FillRgn rgn *dark-gray-pattern*)
-
- ;convert region to global coords
- (move-region-to rgn (view-to-global *test-w* (href rgn :region.rgnBBox.topLeft)))
-
- (loop
- (when (mouse-down-p)
-
- (#_FlushEvents #$mDownMask 0)
- (let ((pt (view-mouse-position nil)))
- (rlet ((bounds-r :Rect
- :topLeft (view-position *test-w*)
- :botRight (add-points (view-position *test-w*) (view-size *test-w*)))
- (slop-r :Rect))
- (pset slop-r :Rect bounds-r)
- (incf (pref bounds-r :Rect.topLeft) (subtract-points pt (href rgn :region.rgnBBox.topLeft)))
- (incf (pref bounds-r :Rect.botRight) (subtract-points pt (href rgn :region.rgnBBox.botRight)))
- (#_InsetRect slop-r -20 -20)
- (return
- (multiple-value-bind (delta final)
- (drag-region rgn pt
- :border-size #@(50 50)
- :erase-at-start-p t
- ;:bounds-rect bounds-r
- ;:slop-rect slop-r
- )
- (#_DisposeRgn rgn)
- (values (point-string delta) (point-string final)))))))))))
-
-
- (with-focused-view *test-w*
- (rlet ((r :Rect
- :topLeft #@(20 20)
- :botRight #@(150 150)))
- (with-macptrs ((rgn (#_NewRgn)))
- (#_OpenRgn)
- (#_FrameOval r)
- (#_InsetRect r 10 10)
- (#_FrameOval r)
- (#_InsetRect r 20 20)
- (#_OffsetRect r -10 -5)
- (#_FrameOval r)
- (#_OffsetRect r 20 0)
- (#_FrameOval r)
- (#_CloseRgn rgn)
- (#_FillRgn rgn *dark-gray-pattern*)
-
- ;convert region to global coords
- (move-region-to rgn (view-to-global *test-w* (href rgn :region.rgnBBox.topLeft)))
-
- (let ((pt-list (list (href rgn :Region.rgnBBox.topLeft))))
- (dotimes (i 50)
- (push (make-point (+ 3 (point-h (first pt-list)))
- (+ 2 (point-v (first pt-list))))
- pt-list))
- (setf pt-list (nreverse pt-list))
- (move-region rgn pt-list
- :border-size #@(50 50)
- :erase-at-start-p t)
- (#_DisposeRgn rgn)
- ))))
- |#