factor/basis/ui/gadgets/scrollers/scrollers.factor

143 lines
3.8 KiB
Factor
Raw Normal View History

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-07-11 19:34:43 -04:00
combinators math.vectors classes.tuple math.geometry.rect ;
2007-09-20 18:09:08 -04:00
IN: ui.gadgets.scrollers
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
pick scroller-y slide-by-line
swap scroller-x slide-by-line ;
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> ;
: new-scroller ( gadget class -- scroller )
new-frame
t >>root?
<scroller-model> >>model
faint-boundary
dup model>> dependencies>> first <x-slider> >>x dup x>> @bottom grid-add
dup model>> dependencies>> second <y-slider> >>y dup y>> @right grid-add
swap over model>> <viewport> >>viewport
dup viewport>> @center grid-add ;
: <scroller> ( gadget -- scroller ) scroller new-scroller ;
2007-09-20 18:09:08 -04:00
: scroll ( value scroller -- )
[
dup scroller-viewport rect-dim { 0 0 }
rot scroller-viewport viewport-dim 4array flip
] keep
2dup control-value = [ 2drop ] [ set-control-value ] if ;
: rect-min ( rect1 rect2 -- rect )
2008-03-29 21:36:58 -04:00
>r [ rect-loc ] keep r> [ rect-dim ] bi@ vmin <rect> ;
2007-09-20 18:09:08 -04:00
: (scroll>rect) ( rect scroller -- )
[
scroller-value vneg offset-rect
viewport-gap offset-rect
] keep
[ scroller-viewport rect-min ] keep
[
scroller-viewport 2rect-extent
>r >r v- { 0 0 } vmin r> r> v- { 0 0 } vmax v+
] 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
2007-11-14 16:35:17 -05:00
: find-scroller* ( gadget -- scroller )
2007-09-20 18:09:08 -04:00
dup find-scroller dup [
2007-11-14 16:35:17 -05:00
2dup scroller-viewport gadget-child
swap child? [ nip ] [ 2drop f ] if
] [
2drop f
] if ;
: scroll>rect ( rect gadget -- )
dup find-scroller* dup [
2007-09-20 18:09:08 -04:00
[ relative-scroll-rect ] keep
[ set-scroller-follows ] keep
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 [
2007-09-20 18:09:08 -04:00
[ set-scroller-follows ] keep
relayout
] [
2drop
] if ;
: (scroll>bottom) ( scroller -- )
dup scroller-viewport viewport-dim { 0 1 } v* swap scroll ;
: scroll>bottom ( gadget -- )
2007-11-16 01:19:13 -05:00
find-scroller [
2007-09-20 18:09:08 -04:00
t over set-scroller-follows relayout-1
] when* ;
: 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*
dup call-next-method
2007-09-20 18:09:08 -04:00
dup scroller-follows
[ update-scroller ] 2keep
swap set-scroller-follows ;
M: scroller focusable-child*
scroller-viewport ;
M: scroller model-changed
nip f swap set-scroller-follows ;
2008-04-21 00:09:00 -04:00
TUPLE: limited-scroller < scroller fixed-dim ;
2008-04-21 00:09:00 -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*
fixed-dim>> ;