2007-09-20 18:09:08 -04:00
|
|
|
! Copyright (C) 2005, 2007 Slava Pestov.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2008-06-18 23:30:54 -04:00
|
|
|
USING: accessors arrays ui.gestures ui.gadgets ui.gadgets.buttons
|
2008-04-26 00:17:08 -04:00
|
|
|
ui.gadgets.frames ui.gadgets.grids math.order
|
2007-09-20 18:09:08 -04:00
|
|
|
ui.gadgets.theme ui.render kernel math namespaces sequences
|
2008-07-04 18:58:37 -04:00
|
|
|
vectors models models.range math.vectors math.functions
|
2008-11-28 01:02:02 -05:00
|
|
|
quotations colors math.geometry.rect fry ;
|
2007-09-20 18:09:08 -04:00
|
|
|
IN: ui.gadgets.sliders
|
|
|
|
|
2008-07-10 21:32:17 -04:00
|
|
|
TUPLE: elevator < gadget direction ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-07-15 15:12:23 -04:00
|
|
|
: find-elevator ( gadget -- elevator/f ) [ elevator? ] find-parent ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-07-10 21:32:17 -04:00
|
|
|
TUPLE: slider < frame elevator thumb saved line ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-07-15 15:12:23 -04:00
|
|
|
: find-slider ( gadget -- slider/f ) [ slider? ] find-parent ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: elevator-length ( slider -- n )
|
2008-07-15 15:12:23 -04:00
|
|
|
[ elevator>> dim>> ] [ orientation>> ] bi v. ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: min-thumb-dim 15 ;
|
|
|
|
|
2008-08-30 17:31:42 -04:00
|
|
|
: slider-value ( gadget -- n ) model>> range-value >fixnum ;
|
|
|
|
: slider-page ( gadget -- n ) model>> range-page-value ;
|
|
|
|
: slider-max ( gadget -- n ) model>> range-max-value ;
|
|
|
|
: slider-max* ( gadget -- n ) model>> range-max-value* ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: thumb-dim ( slider -- h )
|
2008-11-30 18:47:29 -05:00
|
|
|
[
|
|
|
|
[ [ slider-page ] [ slider-max 1 max ] bi / 1 min ]
|
|
|
|
[ elevator-length ] bi * min-thumb-dim max
|
|
|
|
]
|
|
|
|
[ [ elevator>> dim>> ] [ orientation>> ] bi v. ] bi min ;
|
2007-09-20 18:09:08 -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 elevator-length over thumb-dim - 1 max
|
|
|
|
swap slider-max* 1 max / ;
|
|
|
|
|
2008-06-08 16:32:55 -04:00
|
|
|
: slider>screen ( m scale -- n ) slider-scale * ;
|
|
|
|
: screen>slider ( m scale -- n ) slider-scale / ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-08-31 02:42:30 -04:00
|
|
|
M: slider model-changed nip elevator>> relayout-1 ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-07-10 21:32:17 -04:00
|
|
|
TUPLE: thumb < gadget ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: begin-drag ( thumb -- )
|
2008-09-27 17:45:20 -04:00
|
|
|
find-slider dup slider-value >>saved drop ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: do-drag ( thumb -- )
|
2008-08-29 19:44:19 -04:00
|
|
|
find-slider drag-loc over orientation>> v.
|
2008-08-31 02:42:30 -04:00
|
|
|
over screen>slider swap [ saved>> + ] keep
|
2008-08-30 17:31:42 -04:00
|
|
|
model>> set-range-value ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
thumb H{
|
|
|
|
{ T{ button-down } [ begin-drag ] }
|
|
|
|
{ T{ button-up } [ drop ] }
|
|
|
|
{ T{ drag } [ do-drag ] }
|
|
|
|
} set-gestures
|
|
|
|
|
2008-06-18 23:30:54 -04:00
|
|
|
: thumb-theme ( thumb -- thumb )
|
|
|
|
plain-gradient >>interior
|
|
|
|
faint-boundary ; inline
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: <thumb> ( vector -- thumb )
|
2008-07-10 21:32:17 -04:00
|
|
|
thumb new-gadget
|
|
|
|
swap >>orientation
|
|
|
|
t >>root?
|
2008-06-18 23:30:54 -04:00
|
|
|
thumb-theme ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-08-30 17:31:42 -04:00
|
|
|
: slide-by ( amount slider -- ) model>> move-by ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-08-30 17:31:42 -04:00
|
|
|
: slide-by-page ( amount slider -- ) model>> move-by-page ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: compute-direction ( elevator -- -1/1 )
|
|
|
|
dup find-slider swap hand-click-rel
|
2008-08-29 19:44:19 -04:00
|
|
|
over orientation>> v.
|
2007-09-20 18:09:08 -04:00
|
|
|
over screen>slider
|
|
|
|
swap slider-value - sgn ;
|
|
|
|
|
|
|
|
: elevator-hold ( elevator -- )
|
2008-08-31 02:42:30 -04:00
|
|
|
dup direction>> swap find-slider slide-by-page ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: elevator-click ( elevator -- )
|
2008-09-27 15:36:04 -04:00
|
|
|
dup compute-direction >>direction
|
2007-09-20 18:09:08 -04:00
|
|
|
elevator-hold ;
|
|
|
|
|
|
|
|
elevator H{
|
|
|
|
{ T{ drag } [ elevator-hold ] }
|
|
|
|
{ T{ button-down } [ elevator-click ] }
|
|
|
|
} set-gestures
|
|
|
|
|
|
|
|
: <elevator> ( vector -- elevator )
|
2008-07-15 15:12:23 -04:00
|
|
|
elevator new-gadget
|
|
|
|
swap >>orientation
|
|
|
|
lowered-gradient >>interior ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: (layout-thumb) ( slider n -- n thumb )
|
2008-08-31 02:42:30 -04:00
|
|
|
over orientation>> n*v swap thumb>> ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: thumb-loc ( slider -- loc )
|
|
|
|
dup slider-value swap slider>screen ;
|
|
|
|
|
|
|
|
: layout-thumb-loc ( slider -- )
|
|
|
|
dup thumb-loc (layout-thumb)
|
2008-11-28 01:02:02 -05:00
|
|
|
[ [ floor ] map ] dip (>>loc) ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: layout-thumb-dim ( slider -- )
|
2008-11-28 01:02:02 -05:00
|
|
|
dup dup thumb-dim (layout-thumb)
|
|
|
|
[
|
2008-11-30 18:47:29 -05:00
|
|
|
[ [ rect-dim ] dip ] [ drop orientation>> ] 2bi set-axis
|
|
|
|
[ ceiling ] map
|
2008-11-28 01:02:02 -05:00
|
|
|
] dip (>>dim) ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: layout-thumb ( slider -- )
|
|
|
|
dup layout-thumb-loc layout-thumb-dim ;
|
|
|
|
|
|
|
|
M: elevator layout*
|
|
|
|
find-slider layout-thumb ;
|
|
|
|
|
2008-08-31 02:42:30 -04:00
|
|
|
: slide-by-line ( amount slider -- ) [ line>> * ] keep slide-by ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2007-11-16 01:19:13 -05:00
|
|
|
: <slide-button> ( vector polygon amount -- button )
|
2008-11-28 01:02:02 -05:00
|
|
|
[ gray swap <polygon-gadget> ] dip
|
|
|
|
'[ _ swap find-slider slide-by-line ] <repeat-button>
|
2008-09-27 15:36:04 -04:00
|
|
|
swap >>orientation ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-07-14 19:24:55 -04:00
|
|
|
: elevator, ( gadget orientation -- gadget )
|
2008-09-27 15:36:04 -04:00
|
|
|
tuck <elevator> >>elevator
|
2008-11-28 01:02:02 -05:00
|
|
|
swap <thumb> >>thumb
|
2008-09-27 15:36:04 -04:00
|
|
|
dup elevator>> over thumb>> add-gadget
|
|
|
|
@center grid-add ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-07-15 15:12:23 -04:00
|
|
|
: <left-button> ( -- button ) { 0 1 } arrow-left -1 <slide-button> ;
|
|
|
|
: <right-button> ( -- button ) { 0 1 } arrow-right 1 <slide-button> ;
|
|
|
|
: <up-button> ( -- button ) { 1 0 } arrow-up -1 <slide-button> ;
|
|
|
|
: <down-button> ( -- button ) { 1 0 } arrow-down 1 <slide-button> ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: <slider> ( range orientation -- slider )
|
2008-07-10 21:32:17 -04:00
|
|
|
slider new-frame
|
|
|
|
swap >>orientation
|
|
|
|
swap >>model
|
|
|
|
32 >>line ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: <x-slider> ( range -- slider )
|
2008-09-27 15:36:04 -04:00
|
|
|
{ 1 0 } <slider>
|
|
|
|
<left-button> @left grid-add
|
|
|
|
{ 0 1 } elevator,
|
|
|
|
<right-button> @right grid-add ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: <y-slider> ( range -- slider )
|
2008-09-27 15:36:04 -04:00
|
|
|
{ 0 1 } <slider>
|
|
|
|
<up-button> @top grid-add
|
|
|
|
{ 1 0 } elevator,
|
|
|
|
<down-button> @bottom grid-add ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
M: slider pref-dim*
|
2008-07-10 21:32:17 -04:00
|
|
|
dup call-next-method
|
2008-08-29 19:44:19 -04:00
|
|
|
swap orientation>> [ 40 v*n ] keep
|
2007-09-20 18:09:08 -04:00
|
|
|
set-axis ;
|