]> gitweb.factorcode.org Git - factor.git/blob - basis/ui/gadgets/tracks/tracks.factor
Merge branch 'master' of git://factorcode.org/git/factor
[factor.git] / basis / ui / gadgets / tracks / tracks.factor
1 ! Copyright (C) 2006, 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors io kernel namespaces fry
4 math math.vectors math.geometry.rect math.order
5 sequences words ui.gadgets ui.gadgets.packs ;
6
7 IN: ui.gadgets.tracks
8
9 TUPLE: track < pack sizes ;
10
11 : normalized-sizes ( track -- seq )
12     sizes>> dup sift sum '[ dup [ _ / ] when ] map ;
13
14 : init-track ( track -- track )
15     init-gadget
16     V{ } clone >>sizes
17     1 >>fill ;
18
19 : new-track ( orientation class -- track )
20     new
21         init-track
22         swap >>orientation ;
23
24 : <track> ( orientation -- track ) track new-track ;
25
26 : alloted-dim ( track -- dim )
27     [ children>> ] [ sizes>> ] bi { 0 0 }
28     [ [ drop { 0 0 } ] [ pref-dim ] if v+ ] 2reduce ;
29
30 : gap-dim ( track -- dim )
31     [ gap>> ] [ children>> length 1 [-] ] bi v*n ;
32
33 : available-dim ( track -- dim )
34     [ dim>> ] [ alloted-dim ] bi v- ;
35
36 : track-layout ( track -- sizes )
37     [ [ available-dim ] [ gap-dim ] bi v- ]
38     [ children>> ] [ normalized-sizes ] tri
39     [ [ over n*v ] [ pref-dim ] ?if ] 2map nip ;
40
41 M: track layout* ( track -- ) dup track-layout pack-layout ;
42
43 : track-pref-dims-1 ( track -- dim )
44     children>> pref-dims max-dim ;
45
46 : track-pref-dims-2 ( track -- dim )
47     [
48         [ children>> pref-dims ] [ normalized-sizes ] bi
49         [ dup { 0 f } member? [ 2drop { 0 0 } ] [ v/n ] if ] 2map
50         max-dim [ >fixnum ] map
51     ] [ gap-dim ] bi v+ ;
52
53 M: track pref-dim* ( gadget -- dim )
54     [ track-pref-dims-1 ]
55     [ [ alloted-dim ] [ track-pref-dims-2 ] bi v+ ]
56     [ orientation>> ]
57     tri
58     set-axis ;
59
60 : track-add ( track gadget constraint -- track )
61     pick sizes>> push add-gadget ;
62
63 : track-remove ( track gadget -- track )
64     dupd dup [
65         [ swap children>> index ]
66         [ unparent sizes>> ] 2bi
67         delete-nth 
68     ] [ 2drop ] if ;
69
70 : clear-track ( track -- ) V{ } clone >>sizes clear-gadget ;