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

93 lines
2.3 KiB
Factor
Raw Normal View History

! Copyright (C) 2006, 2008 Slava Pestov.
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
USING: arrays kernel math namespaces sequences words io
2008-07-11 19:34:43 -04:00
io.streams.string math.vectors ui.gadgets columns accessors
math.geometry.rect ;
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
2008-07-13 02:25:44 -04:00
[ (>>grid) ] [ >r concat r> swap add-gadgets drop ] [ nip ] 2tri ;
inline
2007-09-20 18:09:08 -04:00
: <grid> ( children -- grid )
grid new-grid ;
2007-09-20 18:09:08 -04:00
: grid-child ( grid i j -- gadget ) rot grid>> nth nth ;
2007-09-20 18:09:08 -04:00
2008-07-25 13:24:43 -04:00
: grid-add ( grid child i j -- grid )
>r >r dupd swap r> r>
>r >r 2dup swap add-gadget drop r> r>
3dup grid-child unparent rot grid>> nth set-nth ;
2008-07-25 13:37:09 -04:00
: grid-remove ( grid i j -- grid ) <gadget> -rot grid-add ;
2007-09-20 18:09:08 -04:00
: pref-dim-grid ( grid -- dims )
grid>> [ [ pref-dim ] map ] map ;
2007-09-20 18:09:08 -04:00
2008-06-08 16:32:55 -04:00
: (compute-grid) ( grid -- seq ) [ max-dim ] map ;
2007-09-20 18:09:08 -04:00
: compute-grid ( grid -- horiz vert )
pref-dim-grid dup flip (compute-grid) swap (compute-grid) ;
: (pair-up) ( horiz vert -- dim )
>r first r> second 2array ;
: pair-up ( horiz vert -- dims )
2008-01-09 17:36:30 -05:00
[ [ (pair-up) ] curry map ] with map ;
2007-09-20 18:09:08 -04:00
: add-gaps ( gap seq -- newseq )
2008-01-09 17:36:30 -05:00
[ v+ ] with map ;
2007-09-20 18:09:08 -04:00
: gap-sum ( gap seq -- newseq )
dupd add-gaps dim-sum v+ ;
M: grid pref-dim*
dup gap>> swap compute-grid >r over r>
2007-09-20 18:09:08 -04:00
gap-sum >r gap-sum r> (pair-up) ;
: do-grid ( dims grid quot -- )
-rot grid>>
2007-09-20 18:09:08 -04:00
[ [ pick call ] 2each ] 2each
drop ; inline
: grid-positions ( grid dims -- locs )
>r gap>> dup r> add-gaps swap [ v+ ] accumulate nip ;
2007-09-20 18:09:08 -04:00
: position-grid ( grid horiz vert -- )
pick >r
>r over r> grid-positions >r grid-positions r>
2008-09-01 23:43:40 -04:00
pair-up r> [ (>>loc) ] do-grid ;
2007-09-20 18:09:08 -04:00
: resize-grid ( grid horiz vert -- )
pick fill?>> [
pair-up swap [ (>>dim) ] do-grid
2007-09-20 18:09:08 -04:00
] [
2drop grid>> [ [ prefer ] each ] each
2007-09-20 18:09:08 -04:00
] if ;
: grid-layout ( grid horiz vert -- )
[ position-grid ] 3keep resize-grid ;
M: grid layout* dup compute-grid grid-layout ;
M: grid children-on ( rect gadget -- seq )
2008-08-29 19:44:19 -04: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
2008-08-29 19:44:19 -04: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 ;