2008-04-21 00:09:00 -04:00
|
|
|
! Copyright (C) 2005, 2008 Slava Pestov.
|
2007-09-20 18:09:08 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2008-04-21 00:09:00 -04:00
|
|
|
USING: accessors arrays ui.gadgets ui.gadgets.viewports
|
|
|
|
ui.gadgets.frames ui.gadgets.grids ui.gadgets.theme
|
|
|
|
ui.gadgets.sliders ui.gestures kernel math namespaces sequences
|
2008-07-04 18:58:37 -04:00
|
|
|
models models.range models.compose
|
2008-11-10 03:10:18 -05:00
|
|
|
combinators math.vectors classes.tuple math.geometry.rect
|
|
|
|
combinators.short-circuit ;
|
2007-09-20 18:09:08 -04:00
|
|
|
IN: ui.gadgets.scrollers
|
|
|
|
|
2008-07-10 21:32:17 -04:00
|
|
|
TUPLE: scroller < frame viewport x y follows ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: find-scroller ( gadget -- scroller/f )
|
2008-08-23 00:20:49 -04:00
|
|
|
[ scroller? ] find-parent ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-06-08 16:32:55 -04:00
|
|
|
: scroll-up-page ( scroller -- ) y>> -1 swap slide-by-page ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-06-08 16:32:55 -04:00
|
|
|
: scroll-down-page ( scroller -- ) y>> 1 swap slide-by-page ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-06-08 16:32:55 -04:00
|
|
|
: scroll-up-line ( scroller -- ) y>> -1 swap slide-by-line ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-06-08 16:32:55 -04:00
|
|
|
: scroll-down-line ( scroller -- ) y>> 1 swap slide-by-line ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: do-mouse-scroll ( scroller -- )
|
|
|
|
scroll-direction get-global first2
|
2008-08-31 02:42:30 -04:00
|
|
|
pick y>> slide-by-line
|
|
|
|
swap x>> slide-by-line ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
scroller H{
|
|
|
|
{ T{ mouse-scroll } [ do-mouse-scroll ] }
|
|
|
|
} set-gestures
|
|
|
|
|
|
|
|
: <scroller-model> ( -- model )
|
|
|
|
0 0 0 0 <range> 0 0 0 0 <range> 2array <compose> ;
|
|
|
|
|
2008-07-10 21:32:17 -04:00
|
|
|
: new-scroller ( gadget class -- scroller )
|
2008-09-27 15:36:04 -04:00
|
|
|
new-frame
|
|
|
|
t >>root?
|
|
|
|
<scroller-model> >>model
|
|
|
|
faint-boundary
|
2008-07-14 18:48:59 -04:00
|
|
|
|
2008-09-27 15:36:04 -04:00
|
|
|
dup model>> dependencies>> first <x-slider> >>x dup x>> @bottom grid-add
|
|
|
|
dup model>> dependencies>> second <y-slider> >>y dup y>> @right grid-add
|
|
|
|
|
2008-11-08 17:23:06 -05:00
|
|
|
tuck model>> <viewport> >>viewport
|
2008-11-19 18:13:39 -05:00
|
|
|
dup viewport>> @center grid-add ; inline
|
2008-07-14 18:48:59 -04:00
|
|
|
|
|
|
|
: <scroller> ( gadget -- scroller ) scroller new-scroller ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: scroll ( value scroller -- )
|
|
|
|
[
|
2008-08-31 02:42:30 -04:00
|
|
|
dup viewport>> rect-dim { 0 0 }
|
|
|
|
rot viewport>> viewport-dim 4array flip
|
2007-09-20 18:09:08 -04:00
|
|
|
] keep
|
|
|
|
2dup control-value = [ 2drop ] [ set-control-value ] if ;
|
|
|
|
|
2008-11-19 18:13:39 -05:00
|
|
|
: rect-min ( rect dim -- rect' )
|
|
|
|
[ [ loc>> ] [ dim>> ] bi ] dip vmin <rect> ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: (scroll>rect) ( rect scroller -- )
|
|
|
|
[
|
|
|
|
scroller-value vneg offset-rect
|
|
|
|
viewport-gap offset-rect
|
|
|
|
] keep
|
2008-11-19 18:13:39 -05:00
|
|
|
[ viewport>> dim>> rect-min ] keep
|
2007-09-20 18:09:08 -04:00
|
|
|
[
|
2008-08-31 02:42:30 -04:00
|
|
|
viewport>> 2rect-extent
|
2008-11-19 18:13:39 -05:00
|
|
|
[ v- { 1 1 } v- { 0 0 } vmin ] [ v- { 0 0 } vmax ] 2bi* v+
|
2007-09-20 18:09:08 -04:00
|
|
|
] keep dup scroller-value rot v+ swap scroll ;
|
|
|
|
|
|
|
|
: relative-scroll-rect ( rect gadget scroller -- newrect )
|
2008-07-11 16:19:54 -04:00
|
|
|
viewport>> gadget-child relative-loc offset-rect ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-11-10 03:10:18 -05:00
|
|
|
: find-scroller* ( gadget -- scroller/f )
|
|
|
|
dup find-scroller
|
2008-11-10 06:08:30 -05:00
|
|
|
{ [ nip ] [ viewport>> gadget-child swap child? ] [ nip ] }
|
2008-11-10 03:10:18 -05:00
|
|
|
2&& ;
|
2007-11-14 16:35:17 -05:00
|
|
|
|
|
|
|
: scroll>rect ( rect gadget -- )
|
|
|
|
dup find-scroller* dup [
|
2007-09-20 18:09:08 -04:00
|
|
|
[ relative-scroll-rect ] keep
|
2008-09-27 15:36:04 -04:00
|
|
|
swap >>follows
|
2007-09-20 18:09:08 -04:00
|
|
|
relayout
|
|
|
|
] [
|
|
|
|
3drop
|
|
|
|
] if ;
|
|
|
|
|
2007-11-22 01:40:17 -05:00
|
|
|
: (scroll>gadget) ( gadget scroller -- )
|
2007-09-20 18:09:08 -04:00
|
|
|
>r { 0 0 } over pref-dim <rect> swap r>
|
|
|
|
[ relative-scroll-rect ] keep
|
|
|
|
(scroll>rect) ;
|
|
|
|
|
|
|
|
: scroll>gadget ( gadget -- )
|
2007-11-14 16:35:17 -05:00
|
|
|
dup find-scroller* dup [
|
2008-09-27 15:36:04 -04:00
|
|
|
swap >>follows
|
2007-09-20 18:09:08 -04:00
|
|
|
relayout
|
|
|
|
] [
|
|
|
|
2drop
|
|
|
|
] if ;
|
|
|
|
|
|
|
|
: (scroll>bottom) ( scroller -- )
|
2008-08-31 02:42:30 -04:00
|
|
|
dup viewport>> viewport-dim { 0 1 } v* swap scroll ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: scroll>bottom ( gadget -- )
|
2008-09-27 15:36:04 -04:00
|
|
|
find-scroller [ t >>follows relayout-1 ] when* ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: scroll>top ( gadget -- )
|
|
|
|
<zero-rect> swap scroll>rect ;
|
|
|
|
|
2008-07-11 16:19:54 -04:00
|
|
|
GENERIC: update-scroller ( scroller follows -- )
|
|
|
|
|
|
|
|
M: t update-scroller drop (scroll>bottom) ;
|
|
|
|
|
|
|
|
M: gadget update-scroller swap (scroll>gadget) ;
|
|
|
|
|
|
|
|
M: rect update-scroller swap (scroll>rect) ;
|
|
|
|
|
|
|
|
M: f update-scroller drop dup scroller-value swap scroll ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
M: scroller layout*
|
2008-07-10 21:32:17 -04:00
|
|
|
dup call-next-method
|
2008-08-31 02:42:30 -04:00
|
|
|
dup follows>>
|
2008-09-27 17:45:20 -04:00
|
|
|
2dup update-scroller
|
|
|
|
>>follows drop ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
M: scroller focusable-child*
|
2008-08-31 02:42:30 -04:00
|
|
|
viewport>> ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
M: scroller model-changed
|
2008-09-27 17:45:20 -04:00
|
|
|
nip f >>follows drop ;
|
2008-04-21 00:09:00 -04:00
|
|
|
|
2008-07-10 21:32:17 -04:00
|
|
|
TUPLE: limited-scroller < scroller fixed-dim ;
|
2008-04-21 00:09:00 -04:00
|
|
|
|
2008-07-10 21:32:17 -04:00
|
|
|
: <limited-scroller> ( gadget dim -- scroller )
|
|
|
|
>r limited-scroller new-scroller r> >>fixed-dim ;
|
2008-04-21 00:09:00 -04:00
|
|
|
|
|
|
|
M: limited-scroller pref-dim*
|
2008-07-10 21:32:17 -04:00
|
|
|
fixed-dim>> ;
|