factor/library/ui/scrolling.factor

136 lines
3.7 KiB
Factor
Raw Normal View History

2005-02-26 00:57:53 -05:00
IN: gadgets
USING: kernel lists math namespaces threads ;
! A viewport can be scrolled.
TUPLE: viewport x y delegate ;
: viewport-h ( viewport -- h ) gadget-children max-height ;
: viewport-w ( viewport -- w ) gadget-children max-width ;
2005-02-26 02:11:25 -05:00
: adjust-scroll ( y viewport -- y )
#! Make sure we don't scroll above the first line, or beyond
#! the end of the document.
dup shape-h swap viewport-h - max 0 min ;
2005-02-26 00:57:53 -05:00
: scroll-viewport ( y viewport -- )
#! y is a number between 0 and 1.
[ viewport-h * >fixnum ] keep
2005-02-26 02:11:25 -05:00
[ adjust-scroll ] keep
2005-02-26 00:57:53 -05:00
[ set-viewport-y ] keep
relayout ;
2005-02-27 16:51:12 -05:00
: scroll>bottom ( viewport -- )
1 swap scroll-viewport ;
: viewport-actions ( viewport -- )
{{
[[ [ scroll>bottom ] [ scroll>bottom ] ]]
}} clone swap set-gadget-gestures ;
C: viewport ( content -- viewport )
[ <empty-gadget> swap set-viewport-delegate ] keep
[ add-gadget ] keep
0 over set-viewport-x
0 over set-viewport-y
dup viewport-actions
640 480 pick resize-gadget ;
M: viewport layout* ( viewport -- )
dup gadget-children [
2005-02-27 23:17:41 -05:00
2dup
>r dup viewport-x swap viewport-y r> move-gadget
[ dup shape-h >r swap shape-w swap shape-w max r> ] keep
resize-gadget
2005-02-27 16:51:12 -05:00
] each-with ;
: scroll>bottom ( viewport -- )
dup viewport-h swap scroll-viewport ;
2005-02-26 00:57:53 -05:00
! A slider scrolls a viewport.
2005-02-26 02:11:25 -05:00
! The offset slot is the y co-ordinate of the mouse relative to
! the thumb when it was clicked.
TUPLE: slider viewport thumb offset delegate ;
2005-02-26 00:57:53 -05:00
2005-02-27 22:28:09 -05:00
TUPLE: thumb offset delegate ;
2005-02-26 00:57:53 -05:00
2005-02-26 02:11:25 -05:00
: hand-y ( gadget -- y )
#! Vertical offset of hand from gadget.
my-hand swap relative shape-y ;
2005-02-27 22:28:09 -05:00
: thumb-click ( thumb -- )
[ hand-y ] keep set-thumb-offset ;
2005-02-26 02:11:25 -05:00
2005-02-27 22:28:09 -05:00
: thumb-drag ( thumb -- y )
[ gadget-parent hand-y ] keep thumb-offset - ;
2005-02-26 02:11:25 -05:00
2005-02-27 22:28:09 -05:00
: thumb-motion ( thumb -- )
dup thumb-drag over gadget-parent shape-h /
over gadget-parent slider-viewport scroll-viewport
relayout ;
: thumb-actions ( thumb -- )
dup
[ thumb-click ] [ button-down 1 ] set-action
[ thumb-motion ] [ drag ] set-action ;
C: thumb ( -- thumb )
2005-03-01 18:55:25 -05:00
0 0 0 0 <plain-rect> <gadget> over set-thumb-delegate
dup t reverse-video set-paint-property
2005-02-27 22:28:09 -05:00
dup thumb-actions ;
: add-thumb ( thumb slider -- )
2dup add-gadget set-slider-thumb ;
: slider-size 20 ;
: slider-click ( slider -- )
[ dup hand-y swap shape-h / ] keep
[ slider-viewport scroll-viewport ] keep
relayout ;
2005-02-26 00:57:53 -05:00
: slider-actions ( slider -- )
2005-02-27 22:28:09 -05:00
[ slider-click ] [ button-down 1 ] set-action ;
2005-02-26 00:57:53 -05:00
C: slider ( viewport -- slider )
[ set-slider-viewport ] keep
[
2005-03-01 18:55:25 -05:00
f line-border
2005-02-27 23:17:41 -05:00
slider-size 200 pick resize-gadget
2005-02-26 00:57:53 -05:00
swap set-slider-delegate
] keep
[ <thumb> swap add-thumb ] keep
[ slider-actions ] keep ;
2005-02-27 22:28:09 -05:00
: visible-portion ( viewport -- rational )
2005-02-26 02:11:25 -05:00
#! Visible portion, between 0 and 1.
2005-02-27 22:28:09 -05:00
[ shape-h ] keep viewport-h 1 max / 1 min ;
2005-02-26 00:57:53 -05:00
: >thumb ( slider y -- y )
#! Convert a y co-ordinate in the viewport to a thumb
#! position.
swap slider-viewport visible-portion * >fixnum ;
: thumb-height ( slider -- h )
dup shape-h [ >thumb slider-size max ] keep min ;
2005-02-27 22:28:09 -05:00
: thumb-y ( slider -- y )
dup slider-viewport viewport-y neg >thumb ;
2005-02-26 00:57:53 -05:00
M: slider layout* ( slider -- )
dup slider-viewport layout*
dup shape-w over thumb-height pick slider-thumb resize-gadget
0 over thumb-y rot slider-thumb move-gadget ;
2005-02-27 16:00:55 -05:00
TUPLE: scroller viewport slider delegate ;
: add-viewport 2dup set-scroller-viewport add-gadget ;
: add-slider 2dup set-scroller-slider add-gadget ;
C: scroller ( gadget -- scroller )
#! Wrap a scrolling pane around the gadget.
2005-02-27 23:17:41 -05:00
[ <line-shelf> swap set-scroller-delegate ] keep
2005-02-27 16:00:55 -05:00
[ >r <viewport> r> add-viewport ] keep
[ dup scroller-viewport <slider> swap add-slider ] keep ;