2009-01-13 18:12:43 -05:00
|
|
|
! Copyright (C) 2006, 2009 Slava Pestov.
|
2007-09-20 18:09:08 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2009-02-04 01:50:04 -05:00
|
|
|
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
|
2009-02-05 04:28:41 -05:00
|
|
|
math.rectangles fry ;
|
2007-09-20 18:09:08 -04:00
|
|
|
IN: ui.gadgets.grids
|
|
|
|
|
2008-07-10 21:32:17 -04:00
|
|
|
TUPLE: grid < gadget
|
|
|
|
grid
|
|
|
|
{ gap initial: { 0 0 } }
|
2009-02-04 01:50:04 -05:00
|
|
|
{ fill? initial: t } ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-07-10 21:32:17 -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 )
|
2008-07-10 21:32:17 -04:00
|
|
|
grid new-grid ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-05 04:28:41 -05:00
|
|
|
<PRIVATE
|
|
|
|
|
|
|
|
: grid@ ( grid pair -- col# row )
|
|
|
|
swap [ first2 ] [ grid>> ] bi* nth ;
|
|
|
|
|
|
|
|
PRIVATE>
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-05 04:28:41 -05:00
|
|
|
: grid-child ( grid pair -- gadget ) grid@ nth ;
|
2008-07-25 13:24:43 -04:00
|
|
|
|
2009-02-05 04:28:41 -05: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
|
|
|
|
2009-02-04 01:50:04 -05:00
|
|
|
<PRIVATE
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-04 01:50:04 -05:00
|
|
|
: cross-zip ( seq1 seq2 -- seq1xseq2 )
|
|
|
|
[ [ 2array ] with map ] curry map ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-04 01:50:04 -05:00
|
|
|
TUPLE: cell pref-dim baseline ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-04 01:50:04 -05:00
|
|
|
: <cell> ( gadget -- cell ) [ pref-dim ] [ baseline ] bi cell boa ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-04 01:50:04 -05:00
|
|
|
M: cell baseline baseline>> ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-04 01:50:04 -05:00
|
|
|
TUPLE: grid-layout grid gap fill? row-heights column-widths ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-04 01:50:04 -05:00
|
|
|
: iterate-cell-dims ( cells quot -- seq )
|
|
|
|
'[ [ pref-dim>> @ ] [ max ] map-reduce ] map ; inline
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-04 01:50:04 -05: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 )
|
2009-02-05 04:28:41 -05:00
|
|
|
\ grid-layout new
|
2009-02-04 01:50:04 -05:00
|
|
|
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
|
|
|
|
2009-02-04 01:50:04 -05:00
|
|
|
: accumulate-cell-dims ( seq gap -- n ns )
|
|
|
|
dup '[ + _ + ] accumulate ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-04 01:50:04 -05:00
|
|
|
: accumulate-cell-xs ( grid-layout -- x xs )
|
|
|
|
[ column-widths>> ] [ gap>> first ] bi
|
|
|
|
accumulate-cell-dims ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-04 01:50:04 -05:00
|
|
|
: accumulate-cell-ys ( grid-layout -- y ys )
|
|
|
|
[ row-heights>> ] [ gap>> second ] bi
|
|
|
|
accumulate-cell-dims ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-05 04:28:41 -05:00
|
|
|
: grid-pref-dim ( grid-layout -- dim )
|
2009-02-04 01:50:04 -05:00
|
|
|
[ accumulate-cell-xs drop ]
|
|
|
|
[ accumulate-cell-ys drop ]
|
|
|
|
bi 2array ;
|
|
|
|
|
2009-02-05 04:28:41 -05:00
|
|
|
M: grid pref-dim* <grid-layout> grid-pref-dim ;
|
|
|
|
|
2009-02-04 01:50:04 -05:00
|
|
|
: (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 ;
|
|
|
|
|
2009-02-04 01:50:04 -05:00
|
|
|
: 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
|
|
|
|
2009-02-05 04:28:41 -05:00
|
|
|
: grid-layout ( children grid-layout -- )
|
|
|
|
[ cell-locs ] [ cell-dims ] bi
|
2009-02-04 01:50:04 -05:00
|
|
|
[ [ [ >>loc ] [ >>dim ] bi* drop ] 3each ] 3each ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-05 04:28:41 -05: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 ] [
|
2008-07-10 21:32:17 -04:00
|
|
|
{ 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*
|
2008-07-10 21:32:17 -04:00
|
|
|
grid>>
|
2007-09-20 18:09:08 -04:00
|
|
|
[ [ gadget-text ] map ] map format-table
|
|
|
|
[ CHAR: \n , ] [ % ] interleave ;
|
2009-02-04 01:50:04 -05:00
|
|
|
|
|
|
|
PRIVATE>
|