factor/extra/ui/gadgets/tracks/tracks.factor

72 lines
1.9 KiB
Factor
Raw Normal View History

! Copyright (C) 2006, 2008 Slava Pestov.
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
USING: accessors io kernel math namespaces
2008-07-11 19:34:43 -04:00
sequences words math.vectors ui.gadgets ui.gadgets.packs math.geometry.rect ;
2007-09-20 18:09:08 -04:00
IN: ui.gadgets.tracks
TUPLE: track < pack sizes ;
2007-09-20 18:09:08 -04:00
: normalized-sizes ( track -- seq )
track-sizes
2008-05-14 00:36:55 -04:00
[ sift sum ] keep [ dup [ over / ] when ] map nip ;
2007-09-20 18:09:08 -04:00
: new-track ( orientation class -- track )
new-gadget
swap >>orientation
V{ } clone >>sizes
1 >>fill ; inline
2007-09-20 18:09:08 -04:00
: <track> ( orientation -- track )
track new-track ;
2007-09-20 18:09:08 -04:00
: alloted-dim ( track -- dim )
dup gadget-children swap track-sizes { 0 0 }
[ [ drop { 0 0 } ] [ pref-dim ] if v+ ] 2reduce ;
: available-dim ( track -- dim )
dup rect-dim swap alloted-dim v- ;
: track-layout ( track -- sizes )
dup available-dim over gadget-children rot normalized-sizes
[ [ over n*v ] [ pref-dim ] ?if ] 2map nip ;
M: track layout*
dup track-layout pack-layout ;
: track-pref-dims-1 ( track -- dim )
gadget-children pref-dims max-dim ;
: track-pref-dims-2 ( track -- dim )
dup gadget-children pref-dims swap normalized-sizes
[ [ v/n ] when* ] 2map max-dim [ >fixnum ] map ;
M: track pref-dim*
dup track-pref-dims-1
over alloted-dim
pick track-pref-dims-2 v+
rot gadget-orientation set-axis ;
: track-add ( gadget track constraint -- )
2008-07-13 02:25:44 -04:00
over track-sizes push swap add-gadget drop ;
2007-09-20 18:09:08 -04:00
: track-add* ( track gadget constraint -- track )
pick sizes>> push
add-gadget ;
2007-09-20 18:09:08 -04:00
: track, ( gadget constraint -- )
2008-07-11 15:43:51 -04:00
gadget get swap track-add ;
2007-09-20 18:09:08 -04:00
: make-track ( quot orientation -- track )
2008-07-11 15:43:51 -04:00
<track> swap make-gadget ; inline
2007-09-20 18:09:08 -04:00
: track-remove ( gadget track -- )
over [
[ gadget-children index ] 2keep
swap unparent track-sizes delete-nth
] [
2drop
] if ;
: clear-track ( track -- )
V{ } clone over set-track-sizes clear-gadget ;