1 ! Copyright (C) 2006, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors combinators fry kernel math math.vectors
4 sequences ui.gadgets ui.gadgets.packs ui.gadgets.packs.private ;
7 TUPLE: track < pack sizes ;
9 : new-track ( orientation class -- track )
13 swap >>orientation ; inline
15 : <track> ( orientation -- track ) track new-track ;
19 : normalized-sizes ( track -- seq )
20 sizes>> dup sift sum '[ dup [ _ / ] when ] map ;
22 : alloted-dim ( track -- dim )
23 [ children>> ] [ sizes>> ] bi { 0 0 }
24 [ [ drop ] [ pref-dim v+ ] if ] 2reduce ;
26 : available-dim ( track -- dim )
27 [ dim>> ] [ alloted-dim ] bi v- ;
29 : track-layout ( track -- sizes )
31 [ children>> pref-dims ]
33 [ [ available-dim ] [ gap-dim ] bi v- ]
36 '[ [ _ n*v _ set-axis ] when* ] 2map ;
38 M: track layout* ( track -- ) dup track-layout pack-layout ;
40 : track-pref-dims-1 ( track -- dim )
41 [ children>> pref-dims max-dims ]
42 [ pref-dim>> { 0 0 } or ] bi vmax ;
44 : track-pref-dims-2 ( track -- dim )
46 [ children>> pref-dims ] [ normalized-sizes ] bi
47 [ dup { 0 f } member? [ 2drop { 0 0 } ] [ v/n ] if ] 2map
48 max-dims [ >fixnum ] map
51 M: track pref-dim* ( gadget -- dim )
53 [ [ alloted-dim ] [ track-pref-dims-2 ] bi v+ ]
60 : track-add ( track gadget constraint -- track )
61 pick sizes>> push add-gadget ;
63 M: track remove-gadget
64 [ [ children>> index ] [ sizes>> ] bi remove-nth! drop ]
65 [ call-next-method ] 2bi ;
67 : clear-track ( track -- ) [ sizes>> delete-all ] [ clear-gadget ] bi ;