! Copyright (C) 2006, 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: arrays kernel math namespaces sequences words io io.streams.string math.vectors ui.gadgets columns accessors math.geometry.rect ; IN: ui.gadgets.grids TUPLE: grid < gadget grid { gap initial: { 0 0 } } { fill? initial: t } ; : new-grid ( children class -- grid ) new-gadget [ (>>grid) ] [ >r concat r> swap add-gadgets drop ] [ nip ] 2tri ; inline : ( children -- grid ) grid new-grid ; : grid-child ( grid i j -- gadget ) rot grid>> nth nth ; : 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 ; : grid-remove ( grid i j -- grid ) -rot grid-add ; : pref-dim-grid ( grid -- dims ) grid>> [ [ pref-dim ] map ] map ; : (compute-grid) ( grid -- seq ) [ max-dim ] map ; : 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 ) [ [ (pair-up) ] curry map ] with map ; : add-gaps ( gap seq -- newseq ) [ v+ ] with map ; : gap-sum ( gap seq -- newseq ) dupd add-gaps dim-sum v+ ; M: grid pref-dim* dup gap>> swap compute-grid >r over r> gap-sum >r gap-sum r> (pair-up) ; : do-grid ( dims grid quot -- ) -rot grid>> [ [ pick call ] 2each ] 2each drop ; inline : grid-positions ( grid dims -- locs ) >r gap>> dup r> add-gaps swap [ v+ ] accumulate nip ; : position-grid ( grid horiz vert -- ) pick >r >r over r> grid-positions >r grid-positions r> pair-up r> [ (>>loc) ] do-grid ; : resize-grid ( grid horiz vert -- ) pick fill?>> [ pair-up swap [ (>>dim) ] do-grid ] [ 2drop grid>> [ [ prefer ] each ] each ] 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 ) dup children>> empty? [ 2drop f ] [ { 0 1 } swap grid>> [ 0 fast-children-on ] keep concat ] if ; M: grid gadget-text* grid>> [ [ gadget-text ] map ] map format-table [ CHAR: \n , ] [ % ] interleave ;