1 ! Copyright (C) 2005, 2006 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
4 USING: arrays gadgets gadgets-frames gadgets-theme
5 gadgets-viewports generic kernel math namespaces sequences ;
7 ! A scroller combines a viewport with two x and y sliders.
8 ! The follows slot is a boolean, if true scroller will scroll
9 ! down on the next relayout.
10 TUPLE: scroller viewport x y follows ;
12 : scroller-origin ( scroller -- point )
13 dup scroller-x slider-value
14 swap scroller-y slider-value
17 : find-scroller [ scroller? ] find-parent ;
19 : scroll-up-page scroller-y -1 swap slide-by-page ;
21 : scroll-down-page scroller-y 1 swap slide-by-page ;
23 : scroll-up-line scroller-y -1 swap slide-by-line ;
25 : scroll-down-line scroller-y 1 swap slide-by-line ;
27 : do-mouse-scroll ( scroller -- )
28 scroll-direction get-global first2
29 pick scroller-y slide-by-line
30 swap scroller-x slide-by-line ;
33 { T{ mouse-scroll } [ do-mouse-scroll ] }
34 { T{ slider-changed } [ relayout-1 ] }
37 C: scroller ( gadget -- scroller )
38 #! Wrap a scrolling pane around the gadget.
40 { [ <viewport> ] set-scroller-viewport f @center }
41 { [ <x-slider> ] set-scroller-x f @bottom }
42 { [ <y-slider> ] set-scroller-y f @right }
44 t over set-gadget-root?
47 : set-slider ( value page max slider -- )
48 #! page/max/value are 3-vectors.
49 [ [ gadget-orientation v. ] keep set-slider-max ] keep
50 [ [ gadget-orientation v. ] keep set-slider-page ] keep
51 [ [ gadget-orientation v. ] keep set-slider-value* ] keep
52 slider-elevator relayout-1 ;
54 : update-slider ( scroller value slider -- )
55 >r swap scroller-viewport dup rect-dim swap viewport-dim
58 : position-viewport ( scroller -- )
59 dup scroller-origin vneg viewport-gap v+
60 swap scroller-viewport gadget-child
63 : scroll ( scroller value -- )
64 2dup over scroller-x update-slider
65 dupd over scroller-y update-slider
68 : (scroll>rect) ( rect scroller -- )
70 scroller-origin vneg offset-rect
71 viewport-gap offset-rect
74 scroller-viewport 2rect-extent
75 >r >r v- { 0 0 } vmin r> r> v- { 0 0 } vmax v+
76 ] keep dup scroller-origin rot v+ scroll ;
78 : scroll>rect ( rect gadget -- )
80 [ set-scroller-follows ] keep relayout
85 : scroll>bottom ( gadget -- ) t swap scroll>rect ;
87 : (scroll>bottom) ( scroller -- )
88 dup scroller-viewport viewport-dim { 0 1 } v* scroll ;
90 : update-scroller ( scroller -- )
91 dup scroller-follows [
92 dup scroller-follows t eq? [
95 dup scroller-follows over (scroll>rect)
97 f swap set-scroller-follows
99 dup scroller-origin scroll
107 M: scroller focusable-child*