2005-03-22 21:20:58 -05:00
|
|
|
! Copyright (C) 2005 Slava Pestov.
|
|
|
|
! See http://factor.sf.net/license.txt for BSD license.
|
|
|
|
IN: gadgets
|
2005-05-14 17:18:45 -04:00
|
|
|
USING: gadgets generic kernel lists math namespaces sdl
|
2005-06-28 23:50:23 -04:00
|
|
|
sequences vectors words ;
|
2005-03-10 17:57:22 -05:00
|
|
|
|
|
|
|
! A frame arranges left/right/top/bottom gadgets around a
|
|
|
|
! center gadget, which gets any leftover space.
|
2005-03-10 22:52:55 -05:00
|
|
|
TUPLE: frame left right top bottom center ;
|
2005-03-10 17:57:22 -05:00
|
|
|
|
2005-03-10 22:52:55 -05:00
|
|
|
: add-center ( gadget frame -- )
|
|
|
|
dup frame-center unparent 2dup set-frame-center add-gadget ;
|
|
|
|
: add-left ( gadget frame -- )
|
|
|
|
dup frame-left unparent 2dup set-frame-left add-gadget ;
|
|
|
|
: add-right ( gadget frame -- )
|
|
|
|
dup frame-right unparent 2dup set-frame-right add-gadget ;
|
|
|
|
: add-top ( gadget frame -- )
|
|
|
|
dup frame-top unparent 2dup set-frame-top add-gadget ;
|
|
|
|
: add-bottom ( gadget frame -- )
|
|
|
|
dup frame-bottom unparent 2dup set-frame-bottom add-gadget ;
|
|
|
|
|
|
|
|
C: frame ( -- frame )
|
2005-07-13 21:03:34 -04:00
|
|
|
[ <gadget> swap set-delegate ] keep
|
|
|
|
[ <gadget> swap set-frame-center ] keep
|
|
|
|
[ <gadget> swap set-frame-left ] keep
|
|
|
|
[ <gadget> swap set-frame-right ] keep
|
|
|
|
[ <gadget> swap set-frame-top ] keep
|
|
|
|
[ <gadget> swap set-frame-bottom ] keep ;
|
2005-03-10 17:57:22 -05:00
|
|
|
|
2005-03-10 22:52:55 -05:00
|
|
|
: frame-major ( frame -- list )
|
2005-03-10 17:57:22 -05:00
|
|
|
[
|
|
|
|
dup frame-top , dup frame-center , frame-bottom ,
|
|
|
|
] make-list ;
|
|
|
|
|
2005-03-10 22:52:55 -05:00
|
|
|
: frame-minor ( frame -- list )
|
2005-03-10 17:57:22 -05:00
|
|
|
[
|
|
|
|
dup frame-left , dup frame-center , frame-right ,
|
|
|
|
] make-list ;
|
|
|
|
|
2005-06-29 20:04:13 -04:00
|
|
|
: pref-size pref-dim 3unseq drop ;
|
|
|
|
|
2005-03-10 17:57:22 -05:00
|
|
|
: max-h pref-size nip height [ max ] change ;
|
|
|
|
: max-w pref-size drop width [ max ] change ;
|
|
|
|
|
|
|
|
: add-h pref-size nip height [ + ] change ;
|
|
|
|
: add-w pref-size drop width [ + ] change ;
|
|
|
|
|
2005-07-06 03:29:42 -04:00
|
|
|
: with-pref-size ( quot -- )
|
|
|
|
[
|
|
|
|
0 width set 0 height set call width get height get
|
|
|
|
] with-scope ; inline
|
|
|
|
|
2005-06-28 23:50:23 -04:00
|
|
|
M: frame pref-dim ( glue -- dim )
|
2005-03-10 17:57:22 -05:00
|
|
|
[
|
|
|
|
dup frame-major [ max-w ] each
|
|
|
|
dup frame-minor [ max-h ] each
|
|
|
|
dup frame-left add-w
|
|
|
|
dup frame-right add-w
|
|
|
|
dup frame-top add-h
|
2005-03-10 22:52:55 -05:00
|
|
|
frame-bottom add-h
|
2005-06-28 23:50:23 -04:00
|
|
|
] with-pref-size 0 3vector ;
|
2005-03-10 17:57:22 -05:00
|
|
|
|
2005-03-10 22:52:55 -05:00
|
|
|
SYMBOL: frame-right-run
|
|
|
|
SYMBOL: frame-bottom-run
|
|
|
|
|
|
|
|
: var-frame-x [ execute pref-size drop ] keep set ; inline
|
|
|
|
: var-frame-y [ execute pref-size nip ] keep set ; inline
|
|
|
|
: var-frame-left \ frame-left var-frame-x ;
|
|
|
|
: var-frame-top \ frame-top var-frame-y ;
|
|
|
|
: var-frame-right
|
|
|
|
dup \ frame-right var-frame-x
|
|
|
|
swap shape-w \ frame-right [ - ] change
|
|
|
|
\ frame-right get \ frame-left get - frame-right-run set ;
|
|
|
|
: var-frame-bottom
|
|
|
|
dup \ frame-bottom var-frame-y
|
|
|
|
swap shape-h \ frame-bottom [ - ] change
|
|
|
|
\ frame-bottom get \ frame-top get - frame-bottom-run set ;
|
|
|
|
|
|
|
|
: setup-frame ( frame -- )
|
|
|
|
dup var-frame-left
|
|
|
|
dup var-frame-top
|
|
|
|
dup var-frame-right
|
|
|
|
var-frame-bottom ;
|
|
|
|
|
2005-07-12 20:30:05 -04:00
|
|
|
: move-gadget ( x y gadget -- )
|
|
|
|
>r 0 3vector r> set-shape-loc ;
|
|
|
|
|
2005-03-10 22:52:55 -05:00
|
|
|
: reshape-gadget ( x y w h gadget -- )
|
2005-07-08 01:32:29 -04:00
|
|
|
[ >r 0 3vector r> set-gadget-dim ] keep move-gadget ;
|
2005-03-10 22:52:55 -05:00
|
|
|
|
|
|
|
: pos-frame-center
|
|
|
|
>r \ frame-left get \ frame-top get
|
|
|
|
\ frame-right-run get \ frame-bottom-run get r>
|
|
|
|
reshape-gadget ;
|
|
|
|
|
|
|
|
: pos-frame-left
|
|
|
|
[
|
|
|
|
>r 0 \ frame-top get r> pref-size drop \ frame-bottom-run get
|
|
|
|
] keep reshape-gadget ;
|
|
|
|
|
|
|
|
: pos-frame-right
|
|
|
|
[
|
2005-03-22 21:20:58 -05:00
|
|
|
>r \ frame-right get \ frame-top get r> pref-size drop
|
2005-03-10 22:52:55 -05:00
|
|
|
\ frame-bottom-run get
|
|
|
|
] keep reshape-gadget ;
|
|
|
|
|
|
|
|
: pos-frame-top
|
|
|
|
[
|
|
|
|
>r \ frame-left get 0 \ frame-right get r> pref-size nip
|
|
|
|
] keep reshape-gadget ;
|
|
|
|
|
|
|
|
: pos-frame-bottom
|
|
|
|
[
|
2005-03-22 21:20:58 -05:00
|
|
|
>r \ frame-left get \ frame-bottom get \ frame-right get
|
2005-03-10 22:52:55 -05:00
|
|
|
r> pref-size nip
|
|
|
|
] keep reshape-gadget ;
|
|
|
|
|
|
|
|
: layout-frame ( frame -- )
|
|
|
|
dup frame-center pos-frame-center
|
|
|
|
dup frame-left pos-frame-left
|
|
|
|
dup frame-right pos-frame-right
|
|
|
|
dup frame-top pos-frame-top
|
|
|
|
frame-bottom pos-frame-bottom ;
|
2005-03-10 17:57:22 -05:00
|
|
|
|
2005-03-10 22:52:55 -05:00
|
|
|
M: frame layout* ( frame -- )
|
2005-06-29 19:40:44 -04:00
|
|
|
[ 0 x set 0 y set dup setup-frame layout-frame ] with-scope ;
|