One annoying limitation of tk widgets is that only text and canvas support the commands required for scrollbars. So I made the `mk-scrollee' macro. Used in conjunction with a new type of canvas item I created `window-item', we can wrap any tk window in a canvas so that it can be scrolled.
I tried making :scroll-region a rule where the dimensions are derived from the wrapped window but got an assertion error in tk-create-event-handler-ex. Is that because it's trying to get the dimensions of a widget that's not been created yet? How could I get around this?
As always, feel free to import this stuff into celtk/cello if you want.
Cheers, Andy
(deftk window-item (item) () (:tk-spec window -anchor -height -width -state -tags -window ))
(defmacro mk-scrollee ((&key (height 500) (width 500)) &body body) "wraps any tk window inside a canvas so that it can be scrolled" `(make-kid 'canvas :scroll-region (list 0 0 ,width ,height) :gridding "-row 0 -column 0 -sticky news" :kids (c? (the-kids ,@body (mk-window-item :coords (list 0 0) :window (c? (path (kid1 .parent))) :anchor 'nw :height (c? (height (kid1 .parent))) :width (c? (width (kid1 .parent))))))))
;;; Usage (run-celtk-window 'window :kids (c? (the-kids (mk-scroller :packing (c?pack-self "-side top -fill both -expand 1") :canvas (c? (mk-scrollee (:height 1000 :width 500) (mk-stack () (loop for i from 0 to 30 collect (mk-label :text (format nil "hi ~a" i))))))))))