Update of /project/mcclim/cvsroot/mcclim In directory clnet:/tmp/cvs-serv7169
Modified Files: panes.lisp Log Message: For mouse wheel scrolling, search upward through the pane hierarchy for a viewport to scroll. This fixes mouse wheel scrolling in Clouseau.
Assorted other minor changes.
--- /project/mcclim/cvsroot/mcclim/panes.lisp 2007/01/23 07:51:10 1.178 +++ /project/mcclim/cvsroot/mcclim/panes.lisp 2007/02/05 03:02:59 1.179 @@ -27,7 +27,7 @@ ;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;;; Boston, MA 02111-1307 USA.
-;;; $Id: panes.lisp,v 1.178 2007/01/23 07:51:10 ahefner Exp $ +;;; $Id: panes.lisp,v 1.179 2007/02/05 03:02:59 ahefner Exp $
(in-package :clim-internals)
@@ -496,7 +496,7 @@ ((:bottom) (+ y (- height child-height))) ((:expand) y) ))) ;; Actually layout the child - (move-sheet child child-x child-y) + (move-sheet child child-x child-y) (resize-sheet child child-width child-height) (allocate-space child child-width child-height)))
@@ -720,8 +720,8 @@ ;; call change-space-requirements on parent pane ;; call note-space-requirements-changed ;; -;; This is splitted into :before, primary and :after method to allow -;; for easy overriding of change-space-requirements without needing to +;; This is split into :before, primary and :after method to allow for +;; easy overriding of change-space-requirements without needing to ;; know the details of the space requirement cache and the ;; note-space-requirements-changed notifications. ;; @@ -1197,10 +1197,10 @@ (wanted (reduce #'+ allot)) (excess (- major wanted (* (1- (length children)) major-spacing)))) - (when *dump-allocate-space* - (format *trace-output* "~&;; ~S ~S~%" - 'box-layout-mixin/xically-allocate-space-aux* box) - (format *trace-output* "~&;; major = ~D, wanted = ~D, excess = ~D, allot = ~D.~%" + (when *dump-allocate-space* + (format *trace-output* "~&;; ~S ~S~%" + 'box-layout-mixin/xically-allocate-space-aux* box) + (format *trace-output* "~&;; major = ~D, wanted = ~D, excess = ~D, allot = ~D.~%" major wanted excess allot))
(let ((qvector @@ -1731,11 +1731,12 @@
(defmethod allocate-space ((pane spacing-pane) width height) (with-slots (border-width) pane - (let ((child (first (sheet-children pane)))) + (let ((child (first (sheet-children pane))) + (new-width (- width border-width border-width)) + (new-height (- height border-width border-width))) (layout-child child (pane-align-x pane) (pane-align-y pane) border-width border-width - (- width border-width border-width) - (- height border-width border-width))))) + new-width new-height))))
;;; OUTLINED PANE
@@ -2167,17 +2168,15 @@ ;;;; Accounting for changed space requirements
(defmethod change-space-requirements ((pane clim-extensions:viewport-pane) &rest ignore) - (declare (ignore ignore)) - (let ((client (first (sheet-children pane)))) - (resize-sheet client (max (bounding-rectangle-width pane) - (space-requirement-width (compose-space client))) - (max (bounding-rectangle-height pane) - (space-requirement-height (compose-space client)))) - (allocate-space client - (max (bounding-rectangle-width pane) - (space-requirement-width (compose-space client))) - (max (bounding-rectangle-height pane) - (space-requirement-height (compose-space client)))) + (declare (ignore ignore)) + (let* ((client (first (sheet-children pane))) + (sr (compose-space client)) + (width (max (bounding-rectangle-width pane) + (space-requirement-width sr))) + (height (max (bounding-rectangle-height pane) + (space-requirement-height sr)))) + (resize-sheet client width height) + (allocate-space client width height) (scroller-pane/update-scroll-bars (sheet-parent pane))))
;;;; @@ -2381,25 +2380,37 @@ (:documentation "Returns the number of pixels respresenting a 'line', used to computed distance to scroll in response to mouse wheel events."))
-(defmethod scroll-quantum (pane) 10) +(defmethod scroll-quantum (pane) 10) ; TODO: Connect this with the scroller-pane motion + +(defun find-viewport-for-scroll (pane) + "Find a viewport in the chain of parents which contains 'pane', + returning this viewport and the sheet immediately contained within." + (cond ((not (typep pane 'basic-pane)) + (values nil nil)) + ((pane-viewport pane) (values (pane-viewport pane) pane)) + (t (find-viewport-for-scroll (sheet-parent pane)))))
(defun scroll-sheet (sheet vertical horizontal) - (with-bounding-rectangle* (vx0 vy0 vx1 vy1) (pane-viewport-region sheet) - (with-bounding-rectangle* (sx0 sy0 sx1 sy1) (sheet-region sheet) - (let ((viewport-height (- vy1 vy0)) - (viewport-width (- vx1 vx0)) - (delta (* *mouse-scroll-distance* - (scroll-quantum sheet)))) - ;; The coordinates (x,y) of the new upper-left corner of the viewport - ;; must be "sx0 < x < sx1 - viewport-width" and - ;; "sy0 < y < sy1 - viewport-height" - (scroll-extent sheet - (max sx0 (min (- sx1 viewport-width) (+ vx0 (* delta horizontal)))) - (max sy0 (min (- sy1 viewport-height) (+ vy0 (* delta vertical))))))))) + (multiple-value-bind (viewport sheet) + (find-viewport-for-scroll sheet) + (declare (ignore viewport)) + (with-bounding-rectangle* (vx0 vy0 vx1 vy1) (pane-viewport-region sheet) + (with-bounding-rectangle* (sx0 sy0 sx1 sy1) (sheet-region sheet) + (let ((viewport-height (- vy1 vy0)) + (viewport-width (- vx1 vx0)) + (delta (* *mouse-scroll-distance* + (scroll-quantum sheet)))) + ;; The coordinates (x,y) of the new upper-left corner of the viewport + ;; must be "sx0 < x < sx1 - viewport-width" and + ;; "sy0 < y < sy1 - viewport-height" + (scroll-extent sheet + (max sx0 (min (- sx1 viewport-width) (+ vx0 (* delta horizontal)))) + (max sy0 (min (- sy1 viewport-height) (+ vy0 (* delta vertical))))))))))
+;; Note that handling this from dispatch-event is evil, and we shouldn't. (defmethod dispatch-event :around ((sheet mouse-wheel-scroll-mixin) (event pointer-button-press-event)) - (if (pane-viewport sheet) + (if (find-viewport-for-scroll sheet) (let ((button (pointer-event-button event))) (cond ((eq button +pointer-wheel-up+) (scroll-sheet sheet -1 0)) @@ -2862,5 +2873,6 @@ ; timer-event convenience
(defmethod schedule-timer-event ((pane pane) token delay) + (warn "Are you sure you want to use schedule-timer-event? It probably doesn't work.") (schedule-event pane (make-instance 'timer-event :token token :sheet pane) delay))