2006-05-26 02:29:44 -04:00
|
|
|
! Copyright (C) 2005, 2006 Slava Pestov.
|
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2005-08-31 21:06:13 -04:00
|
|
|
IN: gadgets-scrolling
|
2006-11-26 21:13:03 -05:00
|
|
|
USING: arrays gadgets gadgets-theme gadgets-viewports
|
|
|
|
|
gadgets-sliders generic kernel math namespaces sequences
|
|
|
|
|
models ;
|
2005-06-22 02:32:17 -04:00
|
|
|
|
2006-11-26 21:13:03 -05:00
|
|
|
TUPLE: scroller viewport x y follows model ;
|
2005-08-29 18:18:10 -04:00
|
|
|
|
2006-12-14 01:30:50 -05:00
|
|
|
: find-scroller ( gadget -- scroller/f )
|
|
|
|
|
[ scroller? ] find-parent ;
|
2005-06-22 02:32:17 -04:00
|
|
|
|
2006-10-09 17:04:08 -04:00
|
|
|
: scroll-up-page scroller-y -1 swap slide-by-page ;
|
|
|
|
|
|
|
|
|
|
: scroll-down-page scroller-y 1 swap slide-by-page ;
|
|
|
|
|
|
2006-05-24 03:23:45 -04:00
|
|
|
: scroll-up-line scroller-y -1 swap slide-by-line ;
|
|
|
|
|
|
|
|
|
|
: scroll-down-line scroller-y 1 swap slide-by-line ;
|
2005-06-22 02:32:17 -04:00
|
|
|
|
2006-10-09 17:04:08 -04:00
|
|
|
: do-mouse-scroll ( scroller -- )
|
|
|
|
|
scroll-direction get-global first2
|
|
|
|
|
pick scroller-y slide-by-line
|
|
|
|
|
swap scroller-x slide-by-line ;
|
2006-09-20 03:22:26 -04:00
|
|
|
|
2006-07-19 17:00:57 -04:00
|
|
|
scroller H{
|
2006-10-09 17:04:08 -04:00
|
|
|
{ T{ mouse-scroll } [ do-mouse-scroll ] }
|
2006-07-19 17:00:57 -04:00
|
|
|
} set-gestures
|
2005-02-27 16:51:12 -05:00
|
|
|
|
2006-11-26 21:19:40 -05:00
|
|
|
: init-scroller-model ( scroller -- )
|
2006-11-26 21:13:03 -05:00
|
|
|
dup scroller-x control-model
|
|
|
|
|
over scroller-y control-model
|
|
|
|
|
2array <compose> swap set-scroller-model ;
|
|
|
|
|
|
2006-12-14 01:30:50 -05:00
|
|
|
: scroller-value ( scroller -- loc )
|
|
|
|
|
scroller-model model-value ;
|
2006-11-26 21:13:03 -05:00
|
|
|
|
2006-05-24 03:23:45 -04:00
|
|
|
C: scroller ( gadget -- scroller )
|
|
|
|
|
{
|
2006-11-26 21:13:03 -05:00
|
|
|
{ [ <x-slider> ] set-scroller-x f @bottom }
|
|
|
|
|
{ [ <y-slider> ] set-scroller-y f @right }
|
|
|
|
|
{
|
|
|
|
|
[
|
|
|
|
|
gadget get
|
|
|
|
|
dup init-scroller-model
|
|
|
|
|
scroller-model <viewport>
|
|
|
|
|
]
|
|
|
|
|
set-scroller-viewport f @center
|
|
|
|
|
}
|
2006-05-24 20:28:49 -04:00
|
|
|
} make-frame*
|
2006-06-12 03:21:08 -04:00
|
|
|
t over set-gadget-root?
|
|
|
|
|
dup faint-boundary ;
|
2005-03-07 23:15:00 -05:00
|
|
|
|
2005-08-29 18:18:10 -04:00
|
|
|
: update-slider ( scroller value slider -- )
|
2006-05-24 03:23:45 -04:00
|
|
|
>r swap scroller-viewport dup rect-dim swap viewport-dim
|
|
|
|
|
r> set-slider ;
|
2005-06-23 03:15:44 -04:00
|
|
|
|
2005-08-29 18:18:10 -04:00
|
|
|
: scroll ( scroller value -- )
|
2006-11-26 21:13:03 -05:00
|
|
|
2dup
|
|
|
|
|
over scroller-x update-slider
|
|
|
|
|
over scroller-y update-slider ;
|
2005-02-27 16:00:55 -05:00
|
|
|
|
2006-08-04 00:01:18 -04:00
|
|
|
: (scroll>rect) ( rect scroller -- )
|
2006-09-29 18:56:09 -04:00
|
|
|
[
|
2006-11-26 21:13:03 -05:00
|
|
|
scroller-value vneg offset-rect
|
2006-09-29 18:56:09 -04:00
|
|
|
viewport-gap offset-rect
|
|
|
|
|
] keep
|
2006-08-03 16:25:20 -04:00
|
|
|
[
|
2006-08-04 00:01:18 -04:00
|
|
|
scroller-viewport 2rect-extent
|
|
|
|
|
>r >r v- { 0 0 } vmin r> r> v- { 0 0 } vmax v+
|
2006-11-26 21:13:03 -05:00
|
|
|
] keep dup scroller-value rot v+ scroll ;
|
2006-08-03 16:25:20 -04:00
|
|
|
|
2006-12-14 01:30:50 -05:00
|
|
|
: relative-scroll-rect ( rect gadget scroller -- newrect )
|
2006-11-21 18:04:40 -05:00
|
|
|
scroller-viewport gadget-child relative-loc offset-rect ;
|
|
|
|
|
|
2006-08-03 17:17:22 -04:00
|
|
|
: scroll>rect ( rect gadget -- )
|
2006-11-21 18:04:40 -05:00
|
|
|
dup find-scroller dup [
|
|
|
|
|
[ relative-scroll-rect ] keep
|
|
|
|
|
[ set-scroller-follows ] keep
|
|
|
|
|
relayout
|
2006-08-31 22:16:59 -04:00
|
|
|
] [
|
2006-11-21 18:04:40 -05:00
|
|
|
3drop
|
2006-08-31 22:16:59 -04:00
|
|
|
] if ;
|
2006-08-03 16:25:20 -04:00
|
|
|
|
2006-11-21 18:04:40 -05:00
|
|
|
: scroll>bottom ( gadget -- )
|
|
|
|
|
find-scroller [
|
2006-11-26 21:13:03 -05:00
|
|
|
t over set-scroller-follows relayout
|
2006-11-21 18:04:40 -05:00
|
|
|
] when* ;
|
2006-08-03 17:17:22 -04:00
|
|
|
|
|
|
|
|
: (scroll>bottom) ( scroller -- )
|
|
|
|
|
dup scroller-viewport viewport-dim { 0 1 } v* scroll ;
|
2005-10-23 16:18:07 -04:00
|
|
|
|
2006-11-10 15:45:06 -05:00
|
|
|
: scroll>top ( gadget -- )
|
|
|
|
|
<zero-rect> swap scroll>rect ;
|
|
|
|
|
|
2005-10-23 16:18:07 -04:00
|
|
|
: update-scroller ( scroller -- )
|
2006-08-03 20:05:54 -04:00
|
|
|
dup scroller-follows [
|
|
|
|
|
dup scroller-follows t eq? [
|
|
|
|
|
dup (scroll>bottom)
|
2006-08-03 17:17:22 -04:00
|
|
|
] [
|
2006-08-03 20:05:54 -04:00
|
|
|
dup scroller-follows over (scroll>rect)
|
2006-08-03 17:17:22 -04:00
|
|
|
] if
|
2006-08-03 20:05:54 -04:00
|
|
|
f swap set-scroller-follows
|
2006-06-25 18:21:18 -04:00
|
|
|
] [
|
2006-11-26 21:13:03 -05:00
|
|
|
dup scroller-value scroll
|
2006-08-03 17:17:22 -04:00
|
|
|
] if ;
|
2006-05-20 02:13:44 -04:00
|
|
|
|
2006-08-15 03:01:24 -04:00
|
|
|
M: scroller layout*
|
2006-05-24 03:23:45 -04:00
|
|
|
dup delegate layout*
|
|
|
|
|
dup layout-children
|
2006-06-25 18:21:18 -04:00
|
|
|
update-scroller ;
|
2005-07-04 18:36:07 -04:00
|
|
|
|
2006-08-15 03:01:24 -04:00
|
|
|
M: scroller focusable-child*
|
2005-07-04 18:36:07 -04:00
|
|
|
scroller-viewport ;
|