: ceiling ( x -- y ) neg floor neg ; foldable
+: floor-to ( x step -- y )
+ dup zero? [ drop ] [ [ / floor ] [ * ] bi ] if ;
+
: lerp ( a b t -- a_t ) [ over - ] dip * + ; inline
tools.test models.range ;\r
\r
! Test <range> \r
-: setup-range ( -- range ) 0 0 0 255 <range> ;\r
+: setup-range ( -- range ) 0 0 0 255 1 <range> ;\r
+: setup-stepped-range ( -- range ) 0 0 0 255 2 <range> ;\r
\r
! clamp-value should not go past range ends\r
[ 0 ] [ -10 setup-range clamp-value ] unit-test\r
[ 255 ] [ 2000 setup-range clamp-value ] unit-test\r
[ 14 ] [ 14 setup-range clamp-value ] unit-test\r
\r
+! step-value\r
+[ 14 ] [ 15 setup-stepped-range step-value ] unit-test\r
+\r
! range min/max/page values should be correct\r
[ 0 ] [ setup-range range-page-value ] unit-test\r
[ 0 ] [ setup-range range-min-value ] unit-test\r
! Copyright (C) 2008 Slava Pestov.\r
! See http://factorcode.org/license.txt for BSD license.\r
USING: accessors kernel models arrays sequences math math.order\r
-models.product ;\r
+models.product generalizations math.functions ;\r
FROM: models.product => product ;\r
IN: models.range\r
\r
TUPLE: range < product ;\r
\r
-: <range> ( value page min max -- range )\r
- 4array [ <model> ] map range new-product ;\r
+: <range> ( value page min max step -- range )\r
+ 5 narray [ <model> ] map range new-product ;\r
\r
: range-model ( range -- model ) dependencies>> first ;\r
: range-page ( range -- model ) dependencies>> second ;\r
: range-min ( range -- model ) dependencies>> third ;\r
: range-max ( range -- model ) dependencies>> fourth ;\r
+: range-step ( range -- model ) dependencies>> 4 swap nth ;\r
+\r
+: step-value ( value range -- value' )\r
+ range-step value>> floor-to ;\r
\r
M: range range-value\r
- [ range-model value>> ] keep clamp-value ;\r
+ [ range-model value>> ] [ clamp-value ] [ step-value ] tri ;\r
\r
M: range range-page-value range-page value>> ;\r
\r
[ ] [
<gadget> dup "g" set
- 10 1 0 100 <range> 20 1 0 100 <range> 2array <product>
+ 10 1 0 100 1 <range> 20 1 0 100 1 <range> 2array <product>
<viewport> "v" set
] unit-test
} set-gestures
: <scroller-model> ( -- model )
- 0 0 0 0 <range> 0 0 0 0 <range> 2array <product> ;
+ 0 0 0 0 1 <range> 0 0 0 0 1 <range> 2array <product> ;
M: viewport pref-dim* gadget-child pref-viewport-dim ;
horizontal <slider> 1 >>line ;
: <color-sliders> ( -- gadget model )
- 3 [ 0 0 0 255 <range> ] replicate
+ 3 [ 0 0 0 255 1 <range> ] replicate
[ <filled-pile> { 5 5 } >>gap [ <color-slider> add-gadget ] reduce ]
[ [ range-model ] map <product> ]
bi ;