factor/library/ui/gadgets/sliders.factor

174 lines
4.7 KiB
Factor
Raw Normal View History

2006-03-19 18:00:07 -05:00
! Copyright (C) 2005, 2006 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
IN: gadgets-scrolling
2006-06-07 23:51:28 -04:00
USING: arrays gadgets gadgets-buttons gadgets-frames
gadgets-grids gadgets-theme generic kernel math namespaces
sequences styles threads vectors ;
! An elevator has a thumb that may be moved up and down.
TUPLE: elevator ;
: find-elevator [ elevator? ] find-parent ;
! A slider scrolls a viewport.
2006-03-19 18:00:07 -05:00
TUPLE: slider elevator thumb value saved max page ;
: find-slider [ slider? ] find-parent ;
2006-05-24 03:23:45 -04:00
: elevator-length ( slider -- n )
dup slider-elevator rect-dim
swap gadget-orientation v. ;
: min-thumb-dim 30 ;
: thumb-dim ( slider -- h )
dup slider-page over slider-max 1 max / 1 min
2006-07-28 15:33:23 -04:00
over elevator-length * min-thumb-dim max
over slider-elevator rect-dim
rot gadget-orientation v. min ;
2006-05-24 03:23:45 -04:00
: slider-max* dup slider-max swap slider-page [-] ;
2006-05-24 03:23:45 -04:00
2005-08-26 23:06:56 -04:00
: slider-scale ( slider -- n )
#! A scaling factor such that if x is a slider co-ordinate,
#! x*n is the screen position of the thumb, and conversely
#! for x/n. The '1 max' calls avoid division by zero.
2006-05-24 03:23:45 -04:00
dup elevator-length over thumb-dim - 1 max
2006-05-31 17:17:31 -04:00
swap slider-max* 1 max / ;
2005-08-26 23:06:56 -04:00
: slider>screen slider-scale * ;
: screen>slider slider-scale / ;
2005-08-27 01:41:42 -04:00
: fix-slider-value ( n slider -- n )
2006-05-24 03:23:45 -04:00
slider-max* min 0 max >fixnum ;
2005-08-27 01:41:42 -04:00
2006-05-18 22:01:38 -04:00
TUPLE: slider-changed ;
2005-08-29 18:18:10 -04:00
2005-08-27 01:41:42 -04:00
: set-slider-value* ( value slider -- )
2006-03-19 18:00:07 -05:00
[ fix-slider-value ] keep 2dup slider-value = [
2006-03-18 01:57:57 -05:00
2drop
] [
2006-05-24 03:23:45 -04:00
[ set-slider-value ] keep
dup slider-elevator relayout-1
2006-06-03 02:55:57 -04:00
T{ slider-changed } swap handle-gesture drop
2006-03-18 01:57:57 -05:00
] if ;
2005-08-27 01:41:42 -04:00
2006-05-26 17:40:41 -04:00
TUPLE: thumb ;
2006-03-19 18:00:07 -05:00
: begin-drag ( thumb -- )
find-slider dup slider-value swap set-slider-saved ;
: do-drag ( thumb -- )
find-slider drag-loc over gadget-orientation v.
over screen>slider swap [ slider-saved + ] keep
set-slider-value* ;
thumb H{
{ T{ button-down } [ begin-drag ] }
{ T{ button-up } [ drop ] }
{ T{ drag } [ do-drag ] }
} set-gestures
2006-05-26 17:40:41 -04:00
C: thumb ( vector -- thumb )
dup delegate>gadget
2005-10-25 21:52:26 -04:00
t over set-gadget-root?
dup thumb-theme
2006-05-26 17:40:41 -04:00
[ set-gadget-orientation ] keep ;
2005-08-27 00:22:19 -04:00
: slide-by ( amount gadget -- )
#! The gadget can be any child of a slider.
2005-08-27 01:41:42 -04:00
find-slider [ slider-value + ] keep set-slider-value* ;
2005-08-27 00:22:19 -04:00
: slide-by-page ( -1/1 gadget -- )
[ slider-page * ] keep slide-by ;
2006-10-06 20:27:40 -04:00
: page-direction ( elevator -- -1/1 )
dup find-slider swap hand-click-rel
over gadget-orientation v.
2006-10-06 20:27:40 -04:00
over screen>slider
swap slider-value - sgn ;
: elevator-click ( elevator -- )
dup page-direction
[ swap find-slider slide-by-page ] curry
start-timer-gadget ;
2005-08-27 00:22:19 -04:00
elevator H{
2006-09-29 18:56:09 -04:00
{ T{ button-down } [ elevator-click ] }
{ T{ button-up } [ stop-timer-gadget ] }
} set-gestures
2005-10-13 00:23:17 -04:00
C: elevator ( vector -- elevator )
<gadget> <timer-gadget> over set-gadget-delegate
[ set-gadget-orientation ] keep
dup elevator-theme ;
2006-05-24 03:23:45 -04:00
: (layout-thumb) ( slider n -- n thumb )
2006-07-09 18:14:26 -04:00
over gadget-orientation n*v swap slider-thumb ;
2005-09-27 00:24:42 -04:00
2005-08-26 23:06:56 -04:00
: thumb-loc ( slider -- loc )
dup slider-value swap slider>screen ;
2005-09-27 00:24:42 -04:00
: layout-thumb-loc ( slider -- )
2006-07-09 18:14:26 -04:00
dup thumb-loc (layout-thumb)
>r [ floor ] map r> set-rect-loc ;
2005-09-27 00:24:42 -04:00
: layout-thumb-dim ( slider -- )
2006-07-09 18:14:26 -04:00
dup dup thumb-dim (layout-thumb) >r
>r dup rect-dim r>
rot gadget-orientation set-axis [ ceiling ] map
r> set-layout-dim ;
2005-09-27 00:24:42 -04:00
: layout-thumb ( slider -- )
2005-09-27 00:24:42 -04:00
dup layout-thumb-loc layout-thumb-dim ;
M: elevator layout*
find-slider layout-thumb ;
2005-08-27 00:22:19 -04:00
: slide-by-line ( -1/1 slider -- ) >r 32 * r> slide-by ;
2006-05-19 22:29:01 -04:00
: <slide-button> ( vector polygon amount -- )
2006-01-18 18:50:52 -05:00
>r { 0.5 0.5 0.5 1.0 } swap <polygon-gadget> r>
[ swap slide-by-line ] curry <repeat-button>
[ set-gadget-orientation ] keep ;
2005-09-28 23:29:00 -04:00
2006-06-23 00:06:53 -04:00
: <left-button> { 0 1 } arrow-left -1 <slide-button> ;
: <right-button> { 0 1 } arrow-right 1 <slide-button> ;
2006-05-19 22:29:01 -04:00
: build-x-slider ( slider -- slider )
{
2006-06-29 03:54:30 -04:00
{ [ <left-button> ] f f @left }
{ [ { 0 1 } <elevator> ] set-slider-elevator f @center }
{ [ <right-button> ] f f @right }
2006-06-07 23:04:37 -04:00
} build-grid ;
2006-06-23 00:06:53 -04:00
: <up-button> { 1 0 } arrow-up -1 <slide-button> ;
: <down-button> { 1 0 } arrow-down 1 <slide-button> ;
2006-05-19 22:29:01 -04:00
: build-y-slider ( slider -- slider )
{
2006-06-29 03:54:30 -04:00
{ [ <up-button> ] f f @top }
{ [ { 1 0 } <elevator> ] set-slider-elevator f @center }
{ [ <down-button> ] f f @bottom }
2006-06-07 23:04:37 -04:00
} build-grid ;
2006-05-19 22:29:01 -04:00
: add-thumb ( slider vector -- )
<thumb> swap 2dup slider-elevator add-gadget
set-slider-thumb ;
2005-10-13 00:23:17 -04:00
C: slider ( vector -- slider )
2005-10-09 21:27:14 -04:00
dup delegate>frame
[ set-gadget-orientation ] keep
0 over set-slider-value
0 over set-slider-page
2006-05-19 22:29:01 -04:00
0 over set-slider-max ;
2006-05-19 22:29:01 -04:00
: <x-slider> ( -- slider )
2006-06-23 00:06:53 -04:00
{ 1 0 } <slider> dup build-x-slider
dup { 0 1 } add-thumb ;
2006-05-19 22:29:01 -04:00
: <y-slider> ( -- slider )
2006-06-23 00:06:53 -04:00
{ 0 1 } <slider> dup build-y-slider
dup { 1 0 } add-thumb ;