factor/library/ui/gadgets/grids.factor

78 lines
2.0 KiB
Factor
Raw Normal View History

2006-06-07 21:59:59 -04:00
! Copyright (C) 2006 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
2006-06-07 23:51:28 -04:00
IN: gadgets-grids
USING: arrays gadgets kernel math namespaces sequences words ;
2006-06-07 21:59:59 -04:00
2006-06-07 23:51:28 -04:00
TUPLE: grid children gap ;
2006-06-07 21:59:59 -04:00
: set-grid-children* ( children grid -- )
[ set-grid-children ] 2keep
2006-06-17 16:15:12 -04:00
>r concat [ ] subset r> add-gadgets ;
2006-06-07 21:59:59 -04:00
C: grid ( children -- grid )
2006-06-07 23:51:28 -04:00
dup delegate>gadget
[ set-grid-children* ] keep
2006-06-23 00:06:53 -04:00
{ 0 0 } over set-grid-gap ;
2006-06-07 21:59:59 -04:00
: grid-child ( grid i j -- gadget ) rot grid-children nth nth ;
: grid-add ( gadget grid i j -- )
>r >r over [ over add-gadget ] when* r> r>
3dup grid-child unparent rot grid-children nth set-nth ;
: grid-remove ( grid i j -- )
>r >r >r f r> r> r> grid-add ;
2006-08-26 17:13:24 -04:00
: ?pref-dim ( gadget/f -- dim )
[ pref-dim ] [ { 0 0 } ] if* ;
2006-06-07 23:51:28 -04:00
: pref-dim-grid ( -- dims )
2006-08-26 17:13:24 -04:00
grid get grid-children [ [ ?pref-dim ] map ] map ;
2006-06-07 21:59:59 -04:00
2006-06-07 23:51:28 -04:00
: compute-grid ( -- horiz vert )
pref-dim-grid
2006-06-17 16:15:12 -04:00
dup flip [ max-dim ] map swap [ max-dim ] map ;
2006-06-07 21:59:59 -04:00
2006-08-15 16:29:35 -04:00
: with-grid ( grid quot -- )
2006-06-07 23:51:28 -04:00
[ >r grid set compute-grid r> call ] with-scope ; inline
2006-06-07 21:59:59 -04:00
: gap grid get grid-gap ;
2006-06-07 23:51:28 -04:00
: (pair-up) ( horiz vert -- dim )
2006-06-23 00:06:53 -04:00
>r first r> second 2array ;
M: grid pref-dim*
[
2006-06-26 01:53:05 -04:00
[ gap [ v+ gap v+ ] reduce ] 2apply (pair-up)
] with-grid ;
2006-06-07 21:59:59 -04:00
2006-06-07 23:51:28 -04:00
: do-grid ( dims quot -- )
swap grid get grid-children [
2006-06-07 21:59:59 -04:00
[ dup [ pick call ] [ 2drop ] if ] 2each
] 2each drop ; inline
2006-06-26 01:53:05 -04:00
: pair-up ( horiz vert -- dims )
[ swap [ swap (pair-up) ] map-with ] map-with ;
: grid-positions ( dims -- locs )
gap [ v+ gap v+ ] accumulate nip ;
2006-06-26 01:53:05 -04:00
2006-06-07 23:51:28 -04:00
: position-grid ( horiz vert -- )
2006-06-26 01:53:05 -04:00
[ grid-positions ] 2apply
2006-06-07 21:59:59 -04:00
pair-up [ set-rect-loc ] do-grid ;
2006-06-07 23:51:28 -04:00
: resize-grid ( horiz vert -- )
2006-06-29 00:00:21 -04:00
pair-up [ set-layout-dim ] do-grid ;
2006-06-07 21:59:59 -04:00
2006-06-07 23:51:28 -04:00
: grid-layout ( horiz vert -- )
2dup position-grid resize-grid ;
2006-06-07 21:59:59 -04:00
M: grid layout*
2006-06-07 23:51:28 -04:00
[ grid-layout ] with-grid ;
2006-06-07 23:04:37 -04:00
: build-grid ( grid specs -- )
#! Specs is an array of quadruples { quot post setter loc }.
2006-06-07 23:04:37 -04:00
#! The setter has stack effect ( new gadget -- ),
#! the loc is @center, @top, etc.
swap [ [ grid-add ] build-spec ] with-gadget ; inline