dup scroller-y swap update-slider ;
: scroll ( origin scroller -- )
- dup update-sliders
- scroller-viewport
- [ [ fix-scroll ] keep set-viewport-origin ] keep relayout ;
+ [
+ scroller-viewport [ fix-scroll ] keep
+ [ set-viewport-origin ] keep
+ relayout
+ ] keep update-sliders ;
: add-viewport 2dup set-scroller-viewport add-center ;
: scroll>bottom ( gadget -- )
[ scroll>bottom ] swap handle-gesture drop ;
-: scroll-by ( scroller amount -- )
- over scroller-viewport viewport-origin v+ swap scroll ;
+: scroll-by ( amount scroller -- )
+ [ scroller-viewport viewport-origin v+ ] keep scroll ;
-: scroll-up-line { 0 32 0 } scroll-by ;
+: scroll-up-line { 0 32 0 } swap scroll-by ;
-: scroll-down-line { 0 -32 0 } scroll-by ;
+: scroll-down-line { 0 -32 0 } swap scroll-by ;
: scroller-actions ( scroller -- )
dup [ (scroll>bottom) ] [ scroll>bottom ] set-action
: screen>slider slider-scale / ;
-: elevator-click ( elevator pos -- )
- 2drop ;
-
-: elevator-motion ( elevator -- )
- hand hand-click-rel elevator-click ;
+: elevator-drag ( elevator -- )
+ dup relayout
+ dup drag-loc >r find-slider r> over slider-vector v.
+ over screen>slider
+ swap set-slider-value ;
: thumb-actions ( thumb -- )
- [ find-elevator elevator-motion ] [ drag 1 ] set-action ;
+ dup [ drop ] [ button-up 1 ] set-action
+ dup [ drop ] [ button-down 1 ] set-action
+ [ find-elevator elevator-drag ] [ drag 1 ] set-action ;
: <thumb> ( -- thumb )
- <gadget> [ drop ] <button>
+ <bevel-gadget> dup button-theme
t over set-gadget-root?
dup thumb-actions ;
dup << solid f >> interior set-paint-prop
{ 128 128 128 } background set-paint-prop ;
+: slide-by ( amount gadget -- )
+ #! The gadget can be any child of a slider.
+ find-slider dup slider-elevator relayout
+ [ slider-value + ] keep set-slider-value ;
+
+: slide-by-page ( -1/1 gadget -- )
+ [ slider-page * ] keep slide-by ;
+
+: elevator-click ( elevator -- )
+ dup relayout
+ dup hand relative >r find-slider r>
+ over slider-vector v.
+ over screen>slider over slider-value - sgn
+ swap slide-by-page ;
+
: elevator-actions ( elevator -- )
- [ { 0 0 0 } elevator-click ] [ button-down 1 ] set-action ;
+ [ elevator-click ] [ button-down 1 ] set-action ;
C: elevator ( -- elevator )
<plain-gadget> over set-delegate
dup thumb-loc over slider-vector n*v
over slider-thumb set-rect-loc
dup thumb-dim over slider-vector n*v thumb-min vmax
- swap slider-thumb set-rect-dim ;
+ swap slider-thumb set-gadget-dim ;
M: elevator layout* ( elevator -- )
find-slider layout-thumb ;
M: elevator pref-dim drop thumb-min ;
-: <up-button> <gadget> [ drop ] <button> ;
+: slide-by-line ( -1/1 slider -- ) >r 32 * r> slide-by ;
+
+: <up-button>
+ <gadget> [ -1 swap slide-by-line ] <button> ;
: add-up { 1 1 1 } over slider-vector v- 2unseq set-frame-child ;
-: <down-button> <gadget> [ drop ] <button> ;
+: <down-button>
+ <gadget> [ 1 swap slide-by-line ] <button> ;
: add-down { 1 1 1 } over slider-vector v+ 2unseq set-frame-child ;