2005-03-10 17:57:22 -05:00
|
|
|
! Copyright (C) 2005 Slava Pestov.
|
|
|
|
! See http://factor.sf.net/license.txt for BSD license.
|
2005-02-26 00:57:53 -05:00
|
|
|
IN: gadgets
|
2005-06-22 02:32:17 -04:00
|
|
|
USING: generic kernel lists math matrices namespaces sequences
|
2005-06-27 03:47:22 -04:00
|
|
|
threads vectors styles ;
|
2005-02-26 00:57:53 -05:00
|
|
|
|
|
|
|
! A viewport can be scrolled.
|
2005-07-17 00:21:10 -04:00
|
|
|
TUPLE: viewport origin bottom? ;
|
2005-06-22 02:32:17 -04:00
|
|
|
|
2005-07-20 18:04:29 -04:00
|
|
|
! A scroller combines a viewport with two x and y sliders.
|
|
|
|
TUPLE: scroller viewport x y ;
|
|
|
|
|
2005-07-17 00:21:10 -04:00
|
|
|
: viewport-dim gadget-child pref-dim ;
|
2005-06-22 02:32:17 -04:00
|
|
|
|
|
|
|
: fix-scroll ( origin viewport -- origin )
|
2005-08-23 23:28:54 -04:00
|
|
|
dup rect-dim swap viewport-dim v- vmax { 0 0 0 } vmin ;
|
2005-06-22 02:32:17 -04:00
|
|
|
|
2005-02-27 16:51:12 -05:00
|
|
|
C: viewport ( content -- viewport )
|
2005-07-13 21:03:34 -04:00
|
|
|
<gadget> over set-delegate
|
2005-07-08 01:32:29 -04:00
|
|
|
t over set-gadget-root?
|
2005-02-27 16:51:12 -05:00
|
|
|
[ add-gadget ] keep
|
2005-06-22 02:32:17 -04:00
|
|
|
{ 0 0 0 } over set-viewport-origin ;
|
2005-02-27 16:51:12 -05:00
|
|
|
|
2005-06-28 23:50:23 -04:00
|
|
|
M: viewport pref-dim gadget-child pref-dim ;
|
2005-03-07 23:15:00 -05:00
|
|
|
|
2005-07-17 00:21:10 -04:00
|
|
|
: viewport-origin* ( viewport -- point )
|
|
|
|
dup viewport-bottom? [
|
|
|
|
f over set-viewport-bottom?
|
2005-07-19 22:29:57 -04:00
|
|
|
dup viewport-dim { 0 -1 0 } v*
|
2005-07-17 00:21:10 -04:00
|
|
|
[ swap set-viewport-origin ] keep
|
|
|
|
] [
|
|
|
|
viewport-origin
|
|
|
|
] ifte ;
|
|
|
|
|
2005-02-27 16:51:12 -05:00
|
|
|
M: viewport layout* ( viewport -- )
|
2005-07-17 00:21:10 -04:00
|
|
|
dup gadget-child dup prefer
|
2005-07-19 22:29:57 -04:00
|
|
|
>r dup viewport-origin* swap fix-scroll r>
|
2005-08-23 23:28:54 -04:00
|
|
|
set-rect-loc ;
|
2005-06-22 02:32:17 -04:00
|
|
|
|
2005-07-04 18:36:07 -04:00
|
|
|
M: viewport focusable-child* ( viewport -- gadget )
|
|
|
|
gadget-child ;
|
|
|
|
|
2005-08-26 18:18:07 -04:00
|
|
|
: update-slider ( slider scroller -- )
|
|
|
|
dup rect-dim pick slider-vector v. pick set-slider-page
|
|
|
|
dup viewport-dim over rect-dim vmax pick slider-vector v. pick set-slider-max
|
|
|
|
slider-viewport dup viewport-origin over fix-scroll vneg pick slider-vector v. pick set-slider-value
|
|
|
|
drop slider-elevator relayout ;
|
2005-02-26 02:11:25 -05:00
|
|
|
|
2005-08-26 18:18:07 -04:00
|
|
|
: update-sliders ( scroller -- )
|
|
|
|
dup scroller-x over update-slider
|
|
|
|
dup scroller-y swap update-slider ;
|
2005-06-23 03:15:44 -04:00
|
|
|
|
2005-07-20 16:03:03 -04:00
|
|
|
: scroll ( origin scroller -- )
|
2005-08-26 18:18:07 -04:00
|
|
|
[
|
|
|
|
scroller-viewport [ fix-scroll ] keep
|
|
|
|
[ set-viewport-origin ] keep
|
|
|
|
] keep relayout ;
|
2005-02-27 16:00:55 -05:00
|
|
|
|
2005-03-10 22:52:55 -05:00
|
|
|
: add-viewport 2dup set-scroller-viewport add-center ;
|
2005-06-22 02:32:17 -04:00
|
|
|
|
|
|
|
: add-x-slider 2dup set-scroller-x add-bottom ;
|
|
|
|
|
|
|
|
: add-y-slider 2dup set-scroller-y add-right ;
|
2005-02-27 16:00:55 -05:00
|
|
|
|
2005-03-11 21:41:46 -05:00
|
|
|
: (scroll>bottom) ( scroller -- )
|
2005-08-26 18:18:07 -04:00
|
|
|
t swap scroller-viewport set-viewport-bottom? ;
|
2005-03-10 17:57:22 -05:00
|
|
|
|
2005-03-11 21:41:46 -05:00
|
|
|
: scroll>bottom ( gadget -- )
|
|
|
|
[ scroll>bottom ] swap handle-gesture drop ;
|
2005-03-10 17:57:22 -05:00
|
|
|
|
2005-07-20 16:03:03 -04:00
|
|
|
: scroll-by ( scroller amount -- )
|
|
|
|
over scroller-viewport viewport-origin v+ swap scroll ;
|
|
|
|
|
2005-08-26 18:18:07 -04:00
|
|
|
: scroll-up-line { 0 32 0 } scroll-by ;
|
|
|
|
|
|
|
|
: scroll-down-line { 0 -32 0 } scroll-by ;
|
|
|
|
|
2005-03-12 16:16:40 -05:00
|
|
|
: scroller-actions ( scroller -- )
|
2005-07-20 16:03:03 -04:00
|
|
|
dup [ (scroll>bottom) ] [ scroll>bottom ] set-action
|
2005-08-26 18:18:07 -04:00
|
|
|
dup [ scroll-up-line ] [ button-down 4 ] set-action
|
|
|
|
[ scroll-down-line ] [ button-down 5 ] set-action ;
|
2005-03-12 16:16:40 -05:00
|
|
|
|
2005-02-27 16:00:55 -05:00
|
|
|
C: scroller ( gadget -- scroller )
|
|
|
|
#! Wrap a scrolling pane around the gadget.
|
2005-03-10 22:52:55 -05:00
|
|
|
<frame> over set-delegate
|
2005-02-27 16:00:55 -05:00
|
|
|
[ >r <viewport> r> add-viewport ] keep
|
2005-07-20 16:03:03 -04:00
|
|
|
<x-slider> over add-x-slider
|
|
|
|
<y-slider> over add-y-slider
|
2005-03-10 17:57:22 -05:00
|
|
|
dup scroller-actions ;
|
2005-07-04 18:36:07 -04:00
|
|
|
|
|
|
|
M: scroller focusable-child* ( viewport -- gadget )
|
|
|
|
scroller-viewport ;
|
2005-08-26 18:18:07 -04:00
|
|
|
|
|
|
|
M: scroller layout* ( scroller -- )
|
|
|
|
dup update-sliders delegate layout* ;
|