factor/library/ui/scrolling.factor

88 lines
2.5 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-08-29 18:18:10 -04:00
TUPLE: viewport ;
! A scroller combines a viewport with two x and y sliders.
2005-08-27 15:12:37 -04:00
TUPLE: scroller viewport x y bottom? ;
2005-08-29 18:18:10 -04:00
: scroller-origin ( scroller -- { x y 0 } )
dup scroller-x slider-value
swap scroller-y slider-value
0 3vector ;
: find-scroller [ scroller? ] find-parent ;
2005-08-29 18:18:10 -04:00
: viewport-dim gadget-child pref-dim ;
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-08-29 18:18:10 -04:00
[ add-gadget ] keep ;
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-02-27 16:51:12 -05:00
M: viewport layout* ( viewport -- )
2005-08-29 18:18:10 -04:00
dup find-scroller scroller-origin vneg
2005-08-27 15:12:37 -04:00
swap gadget-child dup prefer
set-rect-loc ;
M: viewport focusable-child* ( viewport -- gadget )
gadget-child ;
2005-08-27 01:41:42 -04:00
: set-slider ( page max value slider -- )
#! page/max/value are 3-vectors.
[ [ slider-vector v. ] keep set-slider-value ] keep
[ [ slider-vector v. ] keep set-slider-max ] keep
[ [ slider-vector v. ] keep set-slider-page ] keep
fix-slider ;
2005-08-29 18:18:10 -04:00
: update-slider ( scroller value slider -- )
>r >r scroller-viewport dup rect-dim swap viewport-dim
r> r> set-slider ;
2005-06-23 03:15:44 -04:00
2005-08-29 18:18:10 -04:00
: scroll ( scroller value -- )
2dup
over scroller-x update-slider
over scroller-y update-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-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 ( gadget -- )
2005-08-29 18:18:10 -04:00
find-scroller
2005-08-27 15:12:37 -04:00
[ t over set-scroller-bottom? relayout ] when* ;
2005-03-10 17:57:22 -05:00
2005-08-27 15:12:37 -04:00
: scroll-up-line scroller-y -1 swap slide-by-line ;
2005-07-20 16:03:03 -04:00
2005-08-27 15:12:37 -04:00
: scroll-down-line scroller-y 1 swap slide-by-line ;
2005-03-12 16:16:40 -05:00
: scroller-actions ( scroller -- )
dup [ scroll-up-line ] [ button-down 4 ] set-action
2005-08-29 18:18:10 -04:00
dup [ scroll-down-line ] [ button-down 5 ] set-action
[ scroller-viewport relayout ] [ slider-changed ] set-action ;
2005-03-12 16:16:40 -05:00
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-07-20 16:03:03 -04:00
<x-slider> over add-x-slider
<y-slider> over add-y-slider
2005-03-10 17:57:22 -05:00
dup scroller-actions ;
2005-08-27 15:12:37 -04:00
M: scroller focusable-child* ( scroller -- viewport )
scroller-viewport ;
2005-08-27 15:12:37 -04:00
M: scroller layout* ( scroller -- )
dup scroller-bottom? [
f over set-scroller-bottom?
2005-08-29 18:18:10 -04:00
dup dup scroller-viewport viewport-dim scroll
2005-08-27 15:12:37 -04:00
] when delegate layout* ;