2005-03-10 17:57:22 -05:00
|
|
|
! Copyright (C) 2005 Slava Pestov.
|
|
|
|
! See http://factor.sf.net/license.txt for BSD license.
|
2005-02-26 00:57:53 -05:00
|
|
|
IN: gadgets
|
2005-03-08 22:54:59 -05:00
|
|
|
USING: generic kernel lists math namespaces threads ;
|
2005-02-26 00:57:53 -05:00
|
|
|
|
|
|
|
! A viewport can be scrolled.
|
|
|
|
|
2005-03-08 22:54:59 -05:00
|
|
|
TUPLE: viewport x y ;
|
2005-02-26 00:57:53 -05:00
|
|
|
|
2005-03-08 22:54:59 -05:00
|
|
|
: viewport-h ( viewport -- h ) gadget-child pref-size nip ;
|
2005-02-26 00:57:53 -05:00
|
|
|
|
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 -- )
|
2005-03-11 21:41:46 -05:00
|
|
|
#! y is a number between -1 and 0..
|
2005-02-26 00:57:53 -05:00
|
|
|
[ 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
|
|
|
C: viewport ( content -- viewport )
|
2005-03-08 22:54:59 -05:00
|
|
|
[ <empty-gadget> swap set-delegate ] keep
|
2005-02-27 16:51:12 -05:00
|
|
|
[ add-gadget ] keep
|
|
|
|
0 over set-viewport-x
|
2005-03-10 17:57:22 -05:00
|
|
|
0 over set-viewport-y ;
|
2005-02-27 16:51:12 -05:00
|
|
|
|
2005-03-08 22:54:59 -05:00
|
|
|
M: viewport pref-size gadget-child pref-size ;
|
2005-03-07 23:15:00 -05:00
|
|
|
|
2005-02-27 16:51:12 -05:00
|
|
|
M: viewport layout* ( viewport -- )
|
2005-03-11 21:41:46 -05:00
|
|
|
dup gadget-child dup prefer
|
|
|
|
>r dup viewport-x swap viewport-y r> move-gadget ;
|
2005-02-27 16:51:12 -05:00
|
|
|
|
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.
|
2005-03-08 22:54:59 -05:00
|
|
|
TUPLE: slider viewport thumb ;
|
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.
|
2005-03-03 20:43:55 -05:00
|
|
|
hand swap relative shape-y ;
|
2005-02-26 02:11:25 -05:00
|
|
|
|
2005-03-06 19:46:29 -05:00
|
|
|
: slider-drag ( slider -- y )
|
|
|
|
hand-y hand hand-click-rel shape-y + ;
|
2005-02-26 02:11:25 -05:00
|
|
|
|
2005-03-06 19:46:29 -05:00
|
|
|
: slider-motion ( thumb -- )
|
|
|
|
dup slider-drag over shape-h /
|
|
|
|
over slider-viewport scroll-viewport
|
2005-02-27 22:28:09 -05:00
|
|
|
relayout ;
|
|
|
|
|
|
|
|
: thumb-actions ( thumb -- )
|
2005-03-06 19:46:29 -05:00
|
|
|
dup [ drop ] [ button-down 1 ] set-action
|
|
|
|
dup [ drop ] [ button-up 1 ] set-action
|
|
|
|
[ gadget-parent slider-motion ] [ drag 1 ] set-action ;
|
2005-02-27 22:28:09 -05:00
|
|
|
|
2005-03-06 19:46:29 -05:00
|
|
|
: <thumb> ( -- thumb )
|
|
|
|
0 0 0 0 <plain-rect> <gadget>
|
|
|
|
dup t reverse-video set-paint-prop
|
2005-02-27 22:28:09 -05:00
|
|
|
dup thumb-actions ;
|
|
|
|
|
|
|
|
: add-thumb ( thumb slider -- )
|
|
|
|
2dup add-gadget set-slider-thumb ;
|
|
|
|
|
2005-03-06 19:46:29 -05:00
|
|
|
: slider-size 16 ;
|
2005-02-27 22:28:09 -05:00
|
|
|
|
|
|
|
: 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-08 22:54:59 -05:00
|
|
|
[ f line-border swap set-delegate ] keep
|
2005-02-26 00:57:53 -05:00
|
|
|
[ <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-05-03 19:00:52 -04:00
|
|
|
M: slider pref-size drop slider-size dup ;
|
2005-03-08 22:54:59 -05:00
|
|
|
|
2005-02-26 00:57:53 -05:00
|
|
|
M: slider layout* ( slider -- )
|
|
|
|
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
|
|
|
|
2005-03-08 22:54:59 -05:00
|
|
|
TUPLE: scroller viewport slider ;
|
2005-02-27 16:00:55 -05:00
|
|
|
|
2005-03-10 22:52:55 -05:00
|
|
|
: add-viewport 2dup set-scroller-viewport add-center ;
|
|
|
|
: add-slider 2dup set-scroller-slider add-right ;
|
2005-02-27 16:00:55 -05:00
|
|
|
|
2005-03-11 21:41:46 -05:00
|
|
|
: viewport>bottom -1 swap scroll-viewport ;
|
|
|
|
: (scroll>bottom) ( scroller -- )
|
|
|
|
dup scroller-viewport viewport>bottom
|
|
|
|
scroller-slider relayout ;
|
2005-03-10 17:57:22 -05:00
|
|
|
|
2005-03-11 21:41:46 -05:00
|
|
|
: scroll>bottom ( gadget -- )
|
|
|
|
[ scroll>bottom ] swap handle-gesture drop ;
|
2005-03-10 17:57:22 -05:00
|
|
|
|
2005-03-12 16:16:40 -05:00
|
|
|
: scroller-actions ( scroller -- )
|
|
|
|
[ (scroll>bottom) ] [ scroll>bottom ] set-action ;
|
|
|
|
|
2005-02-27 16:00:55 -05:00
|
|
|
C: scroller ( gadget -- scroller )
|
|
|
|
#! Wrap a scrolling pane around the gadget.
|
2005-03-10 22:52:55 -05:00
|
|
|
<frame> over set-delegate
|
2005-02-27 16:00:55 -05:00
|
|
|
[ >r <viewport> r> add-viewport ] keep
|
2005-03-10 17:57:22 -05:00
|
|
|
[ dup scroller-viewport <slider> swap add-slider ] keep
|
|
|
|
dup scroller-actions ;
|