factor/library/ui/sliders.factor

144 lines
4.2 KiB
Factor
Raw Normal View History

! Copyright (C) 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: gadgets-scrolling
2005-10-13 00:23:17 -04:00
USING: arrays gadgets gadgets-buttons gadgets-layouts
gadgets-theme generic kernel lists 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.
TUPLE: slider vector elevator thumb value max page ;
: find-slider [ slider? ] find-parent ;
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.
dup slider-elevator rect-dim over slider-vector v. 1 max
swap slider-max 1 max / ;
: slider>screen slider-scale * ;
: screen>slider slider-scale / ;
2005-08-27 01:41:42 -04:00
: fix-slider-value ( n slider -- n )
2005-10-01 01:44:49 -04:00
dup slider-max swap slider-page - min 0 max >fixnum ;
2005-08-27 01:41:42 -04:00
: fix-slider ( slider -- )
#! Call after changing slots, to relayout and do invariants:
#! - max <= page
#! - 0 <= value <= max-page
2005-09-25 20:41:49 -04:00
dup slider-elevator relayout-1
2005-08-27 01:41:42 -04:00
dup slider-max over slider-page max over set-slider-max
dup slider-value over fix-slider-value swap set-slider-value ;
2005-08-29 18:18:10 -04:00
SYMBOL: slider-changed
2005-08-27 01:41:42 -04:00
: set-slider-value* ( value slider -- )
2005-08-29 18:18:10 -04:00
[ set-slider-value ] keep [ fix-slider ] keep
[ slider-changed ] swap handle-gesture drop ;
2005-08-27 01:41:42 -04:00
2005-08-27 00:22:19 -04:00
: elevator-drag ( elevator -- )
dup drag-loc >r find-slider r> over slider-vector v.
over screen>slider
2005-08-27 01:41:42 -04:00
swap set-slider-value* ;
: thumb-actions ( thumb -- )
2005-08-27 00:22:19 -04:00
dup [ drop ] [ button-up 1 ] set-action
dup [ drop ] [ button-down 1 ] set-action
[ find-elevator elevator-drag ] [ drag 1 ] set-action ;
2005-10-13 00:23:17 -04:00
: <thumb> ( vector -- thumb )
<gadget> dup rot button-theme
t over set-gadget-root?
dup thumb-actions ;
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 ;
: elevator-click ( elevator -- )
2005-10-07 20:26:21 -04:00
dup hand get relative >r find-slider r>
2005-08-27 00:22:19 -04:00
over slider-vector v.
over screen>slider over slider-value - sgn
swap slide-by-page ;
: elevator-actions ( elevator -- )
2005-08-27 00:22:19 -04:00
[ elevator-click ] [ button-down 1 ] set-action ;
2005-10-13 00:23:17 -04:00
C: elevator ( vector -- elevator )
2005-10-09 21:27:14 -04:00
dup delegate>gadget
2005-10-13 00:23:17 -04:00
dup rot elevator-theme
2005-09-28 23:29:00 -04:00
dup elevator-actions ;
2005-09-27 00:24:42 -04:00
: (layout-thumb) ( slider n -- n )
over slider-vector n*v swap slider-thumb ;
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 -- )
dup thumb-loc (layout-thumb) set-rect-loc ;
2005-08-26 23:06:56 -04:00
: thumb-dim ( slider -- h )
dup slider-page swap slider>screen ;
2005-09-27 00:24:42 -04:00
: layout-thumb-dim ( slider -- )
dup dup thumb-dim (layout-thumb)
>r >r dup rect-dim r> rot slider-vector set-axis r>
set-gadget-dim ;
: layout-thumb ( slider -- )
2005-09-27 00:24:42 -04:00
dup layout-thumb-loc layout-thumb-dim ;
M: elevator layout* ( elevator -- )
find-slider layout-thumb ;
2005-08-27 00:22:19 -04:00
: slide-by-line ( -1/1 slider -- ) >r 32 * r> slide-by ;
2005-09-27 00:24:42 -04:00
: slider-vertical? slider-vector @{ 0 1 0 }@ = ;
2005-09-28 23:29:00 -04:00
: <slide-button> ( polygon amount -- )
>r <polygon-gadget> dup icon-theme r>
[ swap slide-by-line ] curry <repeat-button> ;
2005-09-27 00:24:42 -04:00
: <up-button> ( slider -- button )
2005-09-28 23:29:00 -04:00
slider-vertical? arrow-up arrow-left ? -1 <slide-button> ;
2005-09-27 14:12:17 -04:00
: add-up @{ 1 1 1 }@ over slider-vector v- first2 frame-add ;
2005-09-27 00:24:42 -04:00
: <down-button> ( slider -- button )
2005-09-28 23:29:00 -04:00
slider-vertical? arrow-down arrow-right ? 1 <slide-button> ;
2005-09-27 14:12:17 -04:00
: add-down @{ 1 1 1 }@ over slider-vector v+ first2 frame-add ;
2005-09-27 14:12:17 -04:00
: add-elevator 2dup set-slider-elevator @center frame-add ;
: add-thumb 2dup slider-elevator add-gadget set-slider-thumb ;
2005-10-13 00:23:17 -04:00
: slider-opposite ( slider -- vector )
slider-vector @{ 1 1 0 }@ swap v- ;
C: slider ( vector -- slider )
[ set-slider-vector ] keep
2005-10-09 21:27:14 -04:00
dup delegate>frame
0 over set-slider-value
0 over set-slider-page
0 over set-slider-max
2005-10-13 00:23:17 -04:00
dup slider-opposite <elevator> over add-elevator
2005-09-27 00:24:42 -04:00
dup <up-button> over add-up
dup <down-button> over add-down
2005-10-13 00:23:17 -04:00
dup slider-opposite <thumb> over add-thumb ;
: <x-slider> ( -- slider ) @{ 1 0 0 }@ <slider> ;
: <y-slider> ( -- slider ) @{ 0 1 0 }@ <slider> ;