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
|
2005-06-22 02:32:17 -04:00
|
|
|
USING: generic kernel lists math matrices namespaces sequences
|
|
|
|
threads vectors ;
|
2005-02-26 00:57:53 -05:00
|
|
|
|
|
|
|
! A viewport can be scrolled.
|
|
|
|
|
2005-06-22 02:32:17 -04:00
|
|
|
TUPLE: viewport origin ;
|
|
|
|
|
|
|
|
: viewport-x viewport-origin first ;
|
|
|
|
: viewport-y viewport-origin second ;
|
|
|
|
: set-viewport-x [ viewport-y 0 3vector ] keep set-viewport-origin ;
|
|
|
|
: set-viewport-y [ viewport-x swap 0 3vector ] keep set-viewport-origin ;
|
2005-02-26 00:57:53 -05:00
|
|
|
|
2005-03-08 22:54:59 -05:00
|
|
|
: viewport-h ( viewport -- h ) gadget-child pref-size nip ;
|
2005-02-26 00:57:53 -05:00
|
|
|
|
2005-06-22 02:32:17 -04:00
|
|
|
: viewport-dim ( viewport -- h ) gadget-child pref-dim ;
|
|
|
|
|
|
|
|
: fix-scroll ( origin viewport -- origin )
|
|
|
|
dup shape-dim swap viewport-dim v- vmax { 0 0 0 } vmin ;
|
|
|
|
|
|
|
|
: scroll ( origin viewport -- )
|
|
|
|
[ fix-scroll ] keep [ set-viewport-origin ] keep relayout ;
|
2005-02-26 02:11:25 -05:00
|
|
|
|
2005-02-26 00:57:53 -05:00
|
|
|
: scroll-viewport ( y viewport -- )
|
2005-03-11 21:41:46 -05:00
|
|
|
#! y is a number between -1 and 0..
|
2005-02-26 00:57:53 -05:00
|
|
|
[ viewport-h * >fixnum ] keep
|
2005-06-22 02:32:17 -04:00
|
|
|
[ viewport-x swap 0 3vector ] keep
|
|
|
|
scroll ;
|
2005-02-26 00:57:53 -05:00
|
|
|
|
2005-02-27 16:51:12 -05:00
|
|
|
C: viewport ( content -- viewport )
|
2005-03-08 22:54:59 -05:00
|
|
|
[ <empty-gadget> swap set-delegate ] keep
|
2005-02-27 16:51:12 -05:00
|
|
|
[ add-gadget ] keep
|
2005-06-22 02:32:17 -04:00
|
|
|
{ 0 0 0 } over set-viewport-origin ;
|
2005-02-27 16:51:12 -05:00
|
|
|
|
2005-03-08 22:54:59 -05:00
|
|
|
M: viewport pref-size gadget-child pref-size ;
|
2005-03-07 23:15:00 -05:00
|
|
|
|
2005-02-27 16:51:12 -05:00
|
|
|
M: viewport layout* ( viewport -- )
|
2005-06-22 02:32:17 -04:00
|
|
|
dup viewport-origin
|
|
|
|
swap gadget-child dup prefer set-gadget-loc ;
|
|
|
|
|
|
|
|
: visible-portion ( viewport -- vector )
|
|
|
|
dup shape-dim { 1 1 1 } vmax
|
|
|
|
swap viewport-dim { 1 1 1 } vmax
|
|
|
|
v/ { 1 1 1 } vmin ;
|
2005-02-27 16:51:12 -05:00
|
|
|
|
2005-02-26 00:57:53 -05:00
|
|
|
! A slider scrolls a viewport.
|
|
|
|
|
2005-02-26 02:11:25 -05:00
|
|
|
! The offset slot is the y co-ordinate of the mouse relative to
|
|
|
|
! the thumb when it was clicked.
|
2005-06-22 02:32:17 -04:00
|
|
|
TUPLE: slider viewport thumb vector ;
|
|
|
|
|
|
|
|
: >thumb ( pos slider -- pos )
|
|
|
|
slider-viewport visible-portion v* ;
|
2005-02-26 00:57:53 -05:00
|
|
|
|
2005-06-22 02:32:17 -04:00
|
|
|
: >viewport ( pos slider -- pos )
|
|
|
|
slider-viewport visible-portion v/ ;
|
2005-02-26 02:11:25 -05:00
|
|
|
|
2005-06-22 02:32:17 -04:00
|
|
|
: slider-drag ( slider -- pos )
|
|
|
|
hand swap relative hand hand-click-rel v+ ;
|
2005-02-26 02:11:25 -05:00
|
|
|
|
2005-06-22 02:32:17 -04:00
|
|
|
: slider-motion ( slider -- )
|
|
|
|
dup slider-drag over >viewport
|
|
|
|
over slider-viewport scroll relayout ;
|
2005-02-27 22:28:09 -05:00
|
|
|
|
|
|
|
: thumb-actions ( thumb -- )
|
2005-03-06 19:46:29 -05:00
|
|
|
dup [ drop ] [ button-down 1 ] set-action
|
|
|
|
dup [ drop ] [ button-up 1 ] set-action
|
|
|
|
[ gadget-parent slider-motion ] [ drag 1 ] set-action ;
|
2005-02-27 22:28:09 -05:00
|
|
|
|
2005-03-06 19:46:29 -05:00
|
|
|
: <thumb> ( -- thumb )
|
|
|
|
0 0 0 0 <plain-rect> <gadget>
|
|
|
|
dup t reverse-video set-paint-prop
|
2005-02-27 22:28:09 -05:00
|
|
|
dup thumb-actions ;
|
|
|
|
|
|
|
|
: add-thumb ( thumb slider -- )
|
|
|
|
2dup add-gadget set-slider-thumb ;
|
|
|
|
|
2005-06-22 02:32:17 -04:00
|
|
|
: slider-current ( slider -- pos )
|
|
|
|
dup slider-viewport viewport-origin
|
|
|
|
dup rot slider-vector v* v- ;
|
|
|
|
|
|
|
|
: slider-pos ( slider -- pos )
|
|
|
|
hand over relative over slider-vector v* swap >viewport ;
|
2005-02-27 22:28:09 -05:00
|
|
|
|
|
|
|
: slider-click ( slider -- )
|
2005-06-22 02:32:17 -04:00
|
|
|
dup slider-pos over slider-current v+
|
|
|
|
swap slider-viewport scroll ;
|
2005-02-26 00:57:53 -05:00
|
|
|
|
|
|
|
: slider-actions ( slider -- )
|
2005-02-27 22:28:09 -05:00
|
|
|
[ slider-click ] [ button-down 1 ] set-action ;
|
2005-02-26 00:57:53 -05:00
|
|
|
|
2005-06-22 02:32:17 -04:00
|
|
|
C: slider ( viewport vector -- slider )
|
|
|
|
[ set-slider-vector ] keep
|
2005-02-26 00:57:53 -05:00
|
|
|
[ set-slider-viewport ] keep
|
2005-06-22 02:32:17 -04:00
|
|
|
f line-border over set-delegate
|
|
|
|
<thumb> over add-thumb
|
|
|
|
dup slider-actions ;
|
|
|
|
|
|
|
|
: <x-slider> ( viewport -- slider ) { 1 0 0 } <slider> ;
|
2005-02-26 00:57:53 -05:00
|
|
|
|
2005-06-22 02:32:17 -04:00
|
|
|
: <y-slider> ( viewport -- slider ) { 0 1 0 } <slider> ;
|
2005-02-26 00:57:53 -05:00
|
|
|
|
2005-06-22 02:32:17 -04:00
|
|
|
: thumb-loc ( slider -- loc )
|
|
|
|
dup slider-viewport viewport-origin vneg swap >thumb ;
|
2005-02-26 00:57:53 -05:00
|
|
|
|
2005-06-22 02:32:17 -04:00
|
|
|
: slider-dim { 16 16 16 } ;
|
2005-02-26 00:57:53 -05:00
|
|
|
|
2005-06-22 02:32:17 -04:00
|
|
|
: thumb-dim ( slider -- h )
|
|
|
|
[ shape-dim dup ] keep >thumb slider-dim vmax vmin ;
|
2005-02-27 22:28:09 -05:00
|
|
|
|
2005-06-22 02:32:17 -04:00
|
|
|
M: slider pref-size drop slider-dim 3unseq drop ;
|
2005-03-08 22:54:59 -05:00
|
|
|
|
2005-02-26 00:57:53 -05:00
|
|
|
M: slider layout* ( slider -- )
|
2005-06-22 02:32:17 -04:00
|
|
|
dup thumb-loc over slider-vector v*
|
|
|
|
over slider-thumb set-gadget-loc
|
|
|
|
dup thumb-dim over slider-vector v* slider-dim vmax
|
|
|
|
swap slider-thumb set-gadget-dim ;
|
2005-02-27 16:00:55 -05:00
|
|
|
|
2005-06-22 02:32:17 -04:00
|
|
|
TUPLE: scroller viewport x y ;
|
2005-02-27 16:00:55 -05:00
|
|
|
|
2005-03-10 22:52:55 -05:00
|
|
|
: add-viewport 2dup set-scroller-viewport add-center ;
|
2005-06-22 02:32:17 -04:00
|
|
|
|
|
|
|
: 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
|
|
|
: viewport>bottom -1 swap scroll-viewport ;
|
2005-06-22 02:32:17 -04:00
|
|
|
|
2005-03-11 21:41:46 -05:00
|
|
|
: (scroll>bottom) ( scroller -- )
|
|
|
|
dup scroller-viewport viewport>bottom
|
2005-06-22 02:32:17 -04:00
|
|
|
dup scroller-x relayout scroller-y relayout ;
|
2005-03-10 17:57:22 -05:00
|
|
|
|
2005-03-11 21:41:46 -05:00
|
|
|
: scroll>bottom ( gadget -- )
|
|
|
|
[ scroll>bottom ] swap handle-gesture drop ;
|
2005-03-10 17:57:22 -05:00
|
|
|
|
2005-03-12 16:16:40 -05:00
|
|
|
: scroller-actions ( scroller -- )
|
|
|
|
[ (scroll>bottom) ] [ scroll>bottom ] set-action ;
|
|
|
|
|
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-06-22 02:32:17 -04:00
|
|
|
dup scroller-viewport <x-slider> over add-x-slider
|
|
|
|
dup scroller-viewport <y-slider> over add-y-slider
|
2005-03-10 17:57:22 -05:00
|
|
|
dup scroller-actions ;
|