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