2005-06-23 03:15:44 -04:00
|
|
|
! Copyright (C) 2005 Slava Pestov.
|
|
|
|
! See http://factor.sf.net/license.txt for BSD license.
|
|
|
|
IN: gadgets
|
2005-06-25 16:43:00 -04:00
|
|
|
USING: generic kernel lists matrices namespaces sequences ;
|
2005-06-23 03:15:44 -04:00
|
|
|
|
|
|
|
TUPLE: divider splitter ;
|
|
|
|
|
2005-06-25 16:43:00 -04:00
|
|
|
C: divider ( -- divider )
|
2005-06-23 03:15:44 -04:00
|
|
|
<plain-gadget> over set-delegate
|
|
|
|
dup t reverse-video set-paint-prop ;
|
|
|
|
|
2005-06-25 16:43:00 -04:00
|
|
|
: divider-size { 8 8 0 } ;
|
2005-06-23 03:15:44 -04:00
|
|
|
|
2005-06-25 16:43:00 -04:00
|
|
|
M: divider pref-size drop divider-size 3unseq drop ;
|
|
|
|
|
|
|
|
TUPLE: splitter vector split ;
|
2005-06-23 03:15:44 -04:00
|
|
|
|
2005-06-23 22:35:41 -04:00
|
|
|
M: splitter orientation splitter-vector ;
|
|
|
|
|
|
|
|
C: splitter ( first second vector -- splitter )
|
|
|
|
<empty-gadget> over set-delegate
|
2005-06-23 03:15:44 -04:00
|
|
|
[ set-splitter-vector ] keep
|
2005-06-25 16:43:00 -04:00
|
|
|
swapd
|
|
|
|
[ add-gadget ] keep
|
|
|
|
<divider> over add-gadget
|
|
|
|
[ add-gadget ] keep
|
2005-06-23 22:35:41 -04:00
|
|
|
1/2 over set-splitter-split ;
|
|
|
|
|
2005-06-25 16:43:00 -04:00
|
|
|
: <x-splitter> { 1 0 0 } <splitter> ;
|
2005-06-23 03:15:44 -04:00
|
|
|
|
2005-06-25 16:43:00 -04:00
|
|
|
: <y-splitter> { 0 1 0 } <splitter> ;
|
2005-06-23 03:15:44 -04:00
|
|
|
|
2005-06-25 16:43:00 -04:00
|
|
|
M: splitter pref-size
|
|
|
|
[
|
|
|
|
gadget-children [ pref-dim ] map
|
|
|
|
dup { 0 0 0 } swap [ vmax ] each
|
|
|
|
swap { 0 0 0 } swap [ v+ ] each
|
|
|
|
] keep orient 3unseq drop ;
|
2005-06-23 22:35:41 -04:00
|
|
|
|
2005-06-25 16:43:00 -04:00
|
|
|
: splitter-part ( splitter -- vec )
|
|
|
|
dup splitter-split swap shape-dim n*v divider-size 1/2 v*n v- ;
|
2005-06-23 22:35:41 -04:00
|
|
|
|
2005-06-25 16:43:00 -04:00
|
|
|
: splitter-layout ( splitter -- [ a b c ] )
|
2005-06-23 22:35:41 -04:00
|
|
|
[
|
2005-06-25 16:43:00 -04:00
|
|
|
dup splitter-part ,
|
|
|
|
divider-size ,
|
|
|
|
dup shape-dim swap splitter-part v- ,
|
|
|
|
] make-list ;
|
2005-06-23 22:35:41 -04:00
|
|
|
|
2005-06-25 16:43:00 -04:00
|
|
|
: layout-divider ( assoc -- )
|
|
|
|
[ uncons set-gadget-dim ] each ;
|
2005-06-23 03:15:44 -04:00
|
|
|
|
|
|
|
M: splitter layout* ( splitter -- )
|
2005-06-25 16:43:00 -04:00
|
|
|
[
|
|
|
|
dup splitter-layout [ nip ( { 0 0 0 } rot orient ) ] map-with
|
|
|
|
] keep gadget-children zip layout-divider ;
|