factor/extra/ui/frp/layout/layout.factor

69 lines
3.1 KiB
Factor
Raw Normal View History

2009-06-11 10:13:52 -04:00
USING: accessors arrays fry kernel lexer make math.parser models
models.product namespaces parser sequences ui.frp.gadgets
2009-06-11 10:13:52 -04:00
ui.gadgets ui.gadgets.books ui.gadgets.tracks vectors words
2009-06-14 12:42:31 -04:00
combinators ui.frp.signals ;
QUALIFIED: make
2009-05-24 10:36:24 -04:00
IN: ui.frp.layout
2009-06-11 10:13:52 -04:00
PREDICATE: true < word t = ;
SYMBOL: inserting
TUPLE: layout gadget size ; C: <layout> layout
TUPLE: placeholder < gadget ;
ERROR: no-models-in-books models ;
DEFER: insert-item
2009-06-11 10:13:52 -04:00
HOOK: , inserting ( uiitem -- )
M: f , make:, ;
M: placeholder , [ inserting get insert-item ] keep relayout ;
M: true , dup placeholder? [ inserting set ] [ "No location to add UI item" throw ] if ;
SYNTAX: UI[ parse-quotation '[ [ t inserting _ with-variable ] ] over push-all ;
2009-05-24 10:36:24 -04:00
2009-06-04 22:22:30 -04:00
SYNTAX: ,% scan string>number [ <layout> , ] curry over push-all ;
SYNTAX: ->% scan string>number '[ [ _ <layout> , ] [ output-model ] bi ] over push-all ;
2009-05-24 10:36:24 -04:00
GENERIC: -> ( uiitem -- model )
M: gadget -> dup , output-model ;
M: model -> dup , ;
2009-06-11 10:13:52 -04:00
: ,? ( uiitem -- ) inserting get parent>> children>> over
2009-06-14 12:42:31 -04:00
[ unique= ] curry find drop [ drop ] [ , ] if ;
2009-06-11 10:13:52 -04:00
: ->? ( uiitem -- model ) dup ,? output-model ;
2009-06-04 22:22:30 -04:00
: <spacer> ( -- ) <gadget> 1 <layout> , ;
: add-layout ( track layout -- track ) [ gadget>> ] [ size>> ] bi track-add ; inline
2009-06-07 18:03:32 -04:00
: layouts ( sized? gadgets -- layouts ) [ [ gadget? ] [ layout? ] bi or ] filter swap
2009-06-11 10:13:52 -04:00
[ [ dup layout? [ f <layout> ] unless ] map ]
[ [ dup gadget? [ gadget>> ] unless ] map ] if ;
: make-layout ( building sized? -- models layouts ) [ swap layouts ] curry
[ { } make [ [ model? ] filter ] ] dip bi ; inline
2009-05-24 10:36:24 -04:00
: <box> ( gadgets type -- track )
2009-06-07 18:03:32 -04:00
[ t make-layout ] dip <track>
swap [ add-layout ] each
2009-06-04 22:22:30 -04:00
swap [ <product> >>model ] unless-empty ; inline
2009-05-24 10:36:24 -04:00
: <hbox> ( gadgets -- track ) horizontal <box> ; inline
: <vbox> ( gadgets -- track ) vertical <box> ; inline
2009-05-30 11:58:32 -04:00
: make-book ( models gadgets model -- book ) <book> swap [ no-models-in-books ] unless-empty ;
: <frp-book> ( quot: ( -- model ) -- book ) f make-layout rot 0 >>value make-book ; inline
: <frp-book*> ( quot -- book ) f make-layout f make-book ; inline
2009-06-04 22:22:30 -04:00
SYNTAX: $ CREATE-WORD placeholder new
[ [ , ] curry (( -- )) define-declared "$" expect ]
[ [ , ] curry ] bi over push-all ;
2009-06-04 22:22:30 -04:00
2009-06-07 18:03:32 -04:00
: insert-gadget ( number parent gadget -- ) -rot [ but-last insert-nth ] change-children drop ;
2009-06-07 19:42:20 -04:00
: insert-size ( number parent size -- ) -rot [ but-last insert-nth ] change-sizes drop ;
: insertion-point ( gadget placeholder -- number parent gadget ) dup parent>> [ children>> index ] keep rot ;
2009-06-07 18:03:32 -04:00
2009-06-04 22:22:30 -04:00
GENERIC# insert-item 1 ( item location -- )
M: gadget insert-item dup parent>> track? [ [ f <layout> ] dip insert-item ]
[ insertion-point [ add-gadget ] keep insert-gadget ] if ;
M: layout insert-item insertion-point [ add-layout ] keep [ gadget>> insert-gadget ] [ size>> insert-size ] 3bi ;
2009-06-11 10:13:52 -04:00
M: model insert-item parent>> dup book? [ no-models-in-books ]
[ dup model>> dup product? [ nip swap add-connection ] [ drop [ 1array <product> ] dip (>>model) ] if ] if ;
2009-06-04 22:22:30 -04:00
: insert-items ( makelist -- ) f swap [ dup placeholder? [ nip ] [ over insert-item ] if ] each drop ;
2009-06-07 19:42:20 -04:00
: with-interface ( quot: ( -- gadget ) -- gadget ) { } make insert-items ; inline