factor/basis/ui/gadgets/grids/grids.factor

126 lines
3.3 KiB
Factor
Raw Normal View History

! Copyright (C) 2006, 2009 Slava Pestov.
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
USING: arrays kernel math math.order namespaces make sequences words io
2009-01-26 03:21:28 -05:00
math.vectors ui.gadgets columns accessors strings.tables
math.rectangles fry ;
2007-09-20 18:09:08 -04:00
IN: ui.gadgets.grids
TUPLE: grid < gadget
grid
{ gap initial: { 0 0 } }
{ fill? initial: t } ;
2007-09-20 18:09:08 -04:00
: new-grid ( children class -- grid )
new-gadget
2009-02-02 16:58:28 -05:00
swap [ >>grid ] [ concat add-gadgets ] bi ; inline
2007-09-20 18:09:08 -04:00
: <grid> ( children -- grid )
grid new-grid ;
2007-09-20 18:09:08 -04:00
<PRIVATE
: grid@ ( grid pair -- col# row )
swap [ first2 ] [ grid>> ] bi* nth ;
PRIVATE>
2007-09-20 18:09:08 -04:00
: grid-child ( grid pair -- gadget ) grid@ nth ;
2008-07-25 13:24:43 -04:00
: grid-add ( grid child pair -- grid )
[ nip grid-child unparent ] [ drop add-gadget ] [ swapd grid@ set-nth ] 3tri ;
: grid-remove ( grid pair -- grid ) [ <gadget> ] dip grid-add ;
2007-09-20 18:09:08 -04:00
<PRIVATE
2007-09-20 18:09:08 -04:00
: cross-zip ( seq1 seq2 -- seq1xseq2 )
[ [ 2array ] with map ] curry map ;
2007-09-20 18:09:08 -04:00
TUPLE: cell pref-dim baseline ;
2007-09-20 18:09:08 -04:00
: <cell> ( gadget -- cell ) [ pref-dim ] [ baseline ] bi cell boa ;
2007-09-20 18:09:08 -04:00
M: cell baseline baseline>> ;
2007-09-20 18:09:08 -04:00
TUPLE: grid-layout grid gap fill? row-heights column-widths ;
2007-09-20 18:09:08 -04:00
: iterate-cell-dims ( cells quot -- seq )
'[ [ pref-dim>> @ ] [ max ] map-reduce ] map ; inline
2007-09-20 18:09:08 -04:00
: row-heights ( grid-layout -- heights )
[ grid>> ] [ fill?>> ] bi
[ [ second ] iterate-cell-dims ]
[ [ dup [ pref-dim>> ] map baseline-metrics + ] map ]
if ;
: column-widths ( grid-layout -- widths )
grid>> flip [ first ] iterate-cell-dims ;
: <grid-layout> ( grid -- grid-layout )
\ grid-layout new
swap
[ grid>> [ [ <cell> ] map ] map >>grid ]
[ fill?>> >>fill? ]
[ gap>> >>gap ]
tri
dup row-heights >>row-heights
dup column-widths >>column-widths ;
2007-09-20 18:09:08 -04:00
: accumulate-cell-dims ( seq gap -- n ns )
dup '[ + _ + ] accumulate ;
2007-09-20 18:09:08 -04:00
: accumulate-cell-xs ( grid-layout -- x xs )
[ column-widths>> ] [ gap>> first ] bi
accumulate-cell-dims ;
2007-09-20 18:09:08 -04:00
: accumulate-cell-ys ( grid-layout -- y ys )
[ row-heights>> ] [ gap>> second ] bi
accumulate-cell-dims ;
2007-09-20 18:09:08 -04:00
: grid-pref-dim ( grid-layout -- dim )
[ accumulate-cell-xs drop ]
[ accumulate-cell-ys drop ]
bi 2array ;
M: grid pref-dim* <grid-layout> grid-pref-dim ;
: (compute-cell-locs) ( grid-layout -- locs )
[ accumulate-cell-xs nip ]
[ accumulate-cell-ys nip ]
bi cross-zip flip ;
: adjust-for-baseline ( row-locs row-cells -- row-locs' )
baseline-align [ 0 swap 2array v+ ] 2map ;
: cell-locs ( grid-layout -- locs )
dup fill?>>
[ (compute-cell-locs) ] [
[ (compute-cell-locs) ] [ grid>> ] bi
[ adjust-for-baseline ] 2map
2007-09-20 18:09:08 -04:00
] if ;
: cell-dims ( grid-layout -- dims )
dup fill?>>
[ [ column-widths>> ] [ row-heights>> ] bi cross-zip flip ]
[ grid>> [ [ pref-dim>> ] map ] map ]
if ;
2007-09-20 18:09:08 -04:00
: grid-layout ( children grid-layout -- )
[ cell-locs ] [ cell-dims ] bi
[ [ [ >>loc ] [ >>dim ] bi* drop ] 3each ] 3each ;
2007-09-20 18:09:08 -04:00
M: grid layout* [ grid>> ] [ <grid-layout> ] bi grid-layout ;
2007-09-20 18:09:08 -04:00
M: grid children-on ( rect gadget -- seq )
2009-02-02 16:58:28 -05:00
dup children>> empty? [ 2drop f ] [
{ 0 1 } swap grid>>
2007-09-20 18:09:08 -04:00
[ 0 <column> fast-children-on ] keep
<slice> concat
2009-02-02 16:58:28 -05:00
] if ;
2007-09-20 18:09:08 -04:00
M: grid gadget-text*
grid>>
2007-09-20 18:09:08 -04:00
[ [ gadget-text ] map ] map format-table
[ CHAR: \n , ] [ % ] interleave ;
PRIVATE>