[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Scroller's thumbs problem
- Subject: Scroller's thumbs problem
- From: "Mark A. Tapia" <markt@dgp.toronto.edu>
- Date: Wed, 26 May 1993 09:50:12 -0400
On Tue May 25 at 18:39:47 1993 Sheldon Shen writes:
> ;; I found a strange problem in the following situation.
> ;
> ;; A initial scroller size is setup as #@(184 184).
> ;; Resize the scrollable size to #@(400 400) by calling resize.
> ;; Click the window and the view size is changed correctly.
> ;; Now try to move (click) any of the scroller thumbs away from 0, and then
> move it back to 0.
> ;; (This problem only happens when the thumbs are moved away and back to 0)
> ;; Click the view again, and the view size is automatically set back to
#@(184 184).
> ;; But the view size at this point should still be #@(400 400).
;; (i.e., Moving the thumbs away and back to 0 triggers the view size change.)
(require 'scrollers)
(defclass myscroller (ccl::scroller) ())
(defmethod view-click-event-handler ((self myscroller) where)
(declare (ignore where))
(print (point-string (make-point (scroll-bar-max (ccl::h-scroller self))
(scroll-bar-max (ccl::v-scroller self)))))
(call-next-method))
(setq *w* (make-instance 'window
:view-size #@(200 200)
))
(setq *myscroller*
(make-instance 'myscroller
:view-container *w*
:track-thumb-p t
:view-size #@(184 184)
:view-position #@(0 0)
))
(defmethod resize ((self myscroller) x y)
(setf (scroll-bar-max (ccl::h-scroller self)) x)
(setf (scroll-bar-max (ccl::v-scroller self)) y)
)
(resize *myscroller* 400 400)
#|
;;The problem can be fixed by adding the following code.
;;But should this be necessary?
;;What is the intended behavior of moving thumbs away and back to 0.
(defmethod view-click-event-handler :after ((self ccl::scroll-bar-dialog-item)
where)
(declare (ignore where))
(if (eq 0 (ccl::scroll-bar-setting self)) (resize *myscroller* 400 400))
)
|#
Answer:
-> Although you didn't include it in you code, I assume you
-> executed the following (add-subviews *w* *myscroller*)
To avoid the problems, create a ccl::scrolling-window to handle the scrolling
view directly. The code in the examples folder in scrolling-window.lisp
includes code to handle window-zoom-event directly:
(defmethod window-zoom-event-handler ((self scrolling-window) message)
(declare (ignore message))
(without-interrupts
(call-next-method)
(let* ((new-size (subtract-points (view-size self) #@(15 15))))
(set-view-size (my-scroller self) new-size))))
The following code works correctly and is simpler:
(require 'scrolling-window "Examples:scrolling-window")
(setq *w* (make-instance 'ccl::scrolling-window
:view-size #@(200 200)
))
;(set-view-size *w* 400 400)
;(set-view-size *w* 100 100)
mark