: pref-dims ( gadget -- list )
gadget-children [ pref-dim ] map ;
-: packed-pref-dim ( gadget -- dim )
- #! The preferred size of the gadget, if all children are
- #! packed in the direction of the given axis.
- [
- pref-dims
- [ { 0 0 0 } [ vmax ] reduce ] keep
- { 0 0 0 } [ v+ ] reduce
- ] keep orientation set-axis ;
-
: orient ( gadget list1 list2 -- list )
zip >r orientation r> [ uncons rot set-axis ] map-with ;
M: pack alignment pack-align ;
-M: pack pref-dim packed-pref-dim ;
+M: pack pref-dim ( pack -- dim )
+ [
+ pref-dims
+ [ { 0 0 0 } [ vmax ] reduce ] keep
+ { 0 0 0 } [ v+ ] reduce
+ ] keep orientation set-axis ;
M: pack layout* ( pack -- )
dup pref-dims packed-layout ;
: <stack> ( list -- gadget )
#! A stack lays out all its children on top of each other.
- 0 1 { 0 0 1 } <pack>
- swap [ over add-gadget ] each ;
+ 0 1 { 0 0 1 } <pack> swap [ over add-gadget ] each ;
M: divider pref-dim drop divider-size ;
-TUPLE: splitter vector split ;
+TUPLE: splitter split ;
: hand>split ( splitter -- n )
hand relative hand hand-click-rel v- divider-size 1/2 v*n v+ ;
: divider-motion ( splitter -- )
dup hand>split
- over shape-dim { 1 1 1 } vmax v/ over splitter-vector v.
+ over shape-dim { 1 1 1 } vmax v/ over orientation v.
0 max 1 min over set-splitter-split relayout ;
: divider-actions ( thumb -- )
dup divider-actions ;
C: splitter ( first second vector -- splitter )
- <empty-gadget> over set-delegate
- [ set-splitter-vector ] keep
+ [ >r 0 1 rot <pack> r> set-delegate ] keep
swapd
[ add-gadget ] keep
<divider> over add-gadget
: <y-splitter> { 1 0 0 } <splitter> ;
-M: splitter orientation splitter-vector ;
-
-M: splitter filling drop 1 ;
-
-M: splitter alignment drop 0 ;
-
-M: splitter pref-dim packed-pref-dim ;
-
: splitter-part ( splitter -- vec )
dup splitter-split swap shape-dim n*v divider-size 1/2 v*n v- ;