factor/library/ui/scrolling.factor

147 lines
4.1 KiB
Factor
Raw Normal View History

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
USING: generic kernel lists math matrices namespaces sequences
2005-06-27 03:47:22 -04:00
threads vectors styles ;
2005-02-26 00:57:53 -05:00
! A viewport can be scrolled.
2005-07-17 00:21:10 -04:00
TUPLE: viewport origin bottom? ;
2005-07-17 00:21:10 -04:00
: viewport-dim gadget-child pref-dim ;
: fix-scroll ( origin viewport -- origin )
dup shape-dim swap viewport-dim v- vmax { 0 0 0 } vmin ;
: scroll ( origin viewport -- )
[ fix-scroll ] keep [ set-viewport-origin ] keep relayout ;
2005-02-26 02:11:25 -05:00
2005-02-27 16:51:12 -05:00
C: viewport ( content -- viewport )
2005-07-13 21:03:34 -04:00
<gadget> over set-delegate
2005-07-08 01:32:29 -04:00
t over set-gadget-root?
2005-02-27 16:51:12 -05:00
[ add-gadget ] keep
{ 0 0 0 } over set-viewport-origin ;
2005-02-27 16:51:12 -05:00
2005-06-28 23:50:23 -04:00
M: viewport pref-dim gadget-child pref-dim ;
2005-03-07 23:15:00 -05:00
2005-07-17 00:21:10 -04:00
: viewport-origin* ( viewport -- point )
dup viewport-bottom? [
f over set-viewport-bottom?
dup viewport-dim { 0 -1 0 } v* over fix-scroll
[ swap set-viewport-origin ] keep
] [
viewport-origin
] ifte ;
2005-02-27 16:51:12 -05:00
M: viewport layout* ( viewport -- )
2005-07-17 00:21:10 -04:00
dup gadget-child dup prefer
>r viewport-origin* r> set-shape-loc ;
M: viewport focusable-child* ( viewport -- gadget )
gadget-child ;
: visible-portion ( viewport -- vector )
dup shape-dim { 1 1 1 } vmax
swap viewport-dim { 1 1 1 } vmax
v/ { 1 1 1 } vmin ;
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.
TUPLE: slider viewport thumb vector ;
: >thumb ( pos slider -- pos )
slider-viewport visible-portion v* ;
2005-02-26 00:57:53 -05:00
: >viewport ( pos slider -- pos )
slider-viewport visible-portion v/ ;
2005-02-26 02:11:25 -05:00
2005-06-23 03:15:44 -04:00
: slider-current ( slider -- pos )
2005-07-17 00:21:10 -04:00
dup slider-viewport viewport-origin*
2005-06-23 03:15:44 -04:00
dup rot slider-vector v* v- ;
2005-02-26 02:11:25 -05:00
2005-06-23 03:15:44 -04:00
: slider-pos ( slider pos -- pos )
hand pick relative v+ over slider-vector v* swap >viewport ;
: slider-click ( slider pos -- )
dupd slider-pos over slider-current v+
over slider-viewport scroll relayout ;
2005-02-27 22:28:09 -05:00
2005-06-23 03:15:44 -04:00
: slider-motion ( slider -- )
hand hand-click-rel slider-click ;
2005-02-27 22:28:09 -05:00
: 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 )
2005-07-18 18:14:13 -04:00
<bevel-gadget>
2005-07-08 01:32:29 -04:00
t over set-gadget-root?
2005-07-18 18:14:13 -04:00
dup [ 192 192 192 ] background 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-02-26 00:57:53 -05:00
: slider-actions ( slider -- )
2005-06-23 03:15:44 -04:00
[ { 0 0 0 } slider-click ] [ button-down 1 ] set-action ;
2005-02-26 00:57:53 -05:00
C: slider ( viewport vector -- slider )
2005-07-18 18:14:13 -04:00
<plain-gadget> over set-delegate
dup [ 128 128 128 ] background set-paint-prop
[ set-slider-vector ] keep
2005-02-26 00:57:53 -05:00
[ set-slider-viewport ] keep
<thumb> over add-thumb
dup slider-actions ;
: <x-slider> ( viewport -- slider ) { 1 0 0 } <slider> ;
2005-02-26 00:57:53 -05:00
: <y-slider> ( viewport -- slider ) { 0 1 0 } <slider> ;
2005-02-26 00:57:53 -05:00
: thumb-loc ( slider -- loc )
2005-07-17 00:21:10 -04:00
dup slider-viewport viewport-origin* vneg swap >thumb ;
2005-02-26 00:57:53 -05:00
: slider-dim { 16 16 16 } ;
2005-02-26 00:57:53 -05:00
: thumb-dim ( slider -- h )
[ shape-dim dup ] keep >thumb slider-dim vmax vmin ;
2005-02-27 22:28:09 -05:00
2005-06-28 23:50:23 -04:00
M: slider pref-dim drop slider-dim ;
2005-02-26 00:57:53 -05:00
M: slider layout* ( slider -- )
dup thumb-loc over slider-vector v*
2005-07-08 01:32:29 -04:00
over slider-thumb set-shape-loc
dup thumb-dim over slider-vector v* slider-dim vmax
swap slider-thumb set-gadget-dim ;
2005-02-27 16:00:55 -05:00
TUPLE: scroller viewport x y ;
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-x-slider 2dup set-scroller-x add-bottom ;
: add-y-slider 2dup set-scroller-y add-right ;
2005-02-27 16:00:55 -05:00
2005-03-11 21:41:46 -05:00
: (scroll>bottom) ( scroller -- )
2005-07-17 00:21:10 -04:00
t over scroller-viewport set-viewport-bottom?
dup scroller-x relayout scroller-y 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
dup scroller-viewport <x-slider> over add-x-slider
dup scroller-viewport <y-slider> over add-y-slider
2005-03-10 17:57:22 -05:00
dup scroller-actions ;
M: scroller focusable-child* ( viewport -- gadget )
scroller-viewport ;