factor/basis/ui/gadgets/paragraphs/paragraphs.factor

82 lines
2.1 KiB
Factor
Raw Normal View History

! Copyright (C) 2005, 2009 Slava Pestov
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
USING: accessors kernel math math.order sequences wrap arrays fry
ui.gadgets ui.gadgets.labels ui.render ;
2007-09-20 18:09:08 -04:00
IN: ui.gadgets.paragraphs
MIXIN: word-break
2007-09-20 18:09:08 -04:00
! A word break gadget
TUPLE: word-break-gadget < label ;
2007-09-20 18:09:08 -04:00
: <word-break-gadget> ( text -- gadget )
word-break-gadget new-label ;
2007-09-20 18:09:08 -04:00
M: word-break-gadget draw-gadget* drop ;
INSTANCE: word-break-gadget word-break
2007-09-20 18:09:08 -04:00
! A gadget that arranges its children in a word-wrap style.
TUPLE: paragraph < gadget margin ;
2007-09-20 18:09:08 -04:00
: <paragraph> ( margin -- gadget )
paragraph new-gadget
horizontal >>orientation
swap >>margin ;
2007-09-20 18:09:08 -04:00
<PRIVATE
2007-09-20 18:09:08 -04:00
: gadget>word ( gadget -- word )
[ ] [ pref-dim first ] [ word-break? ] tri <word> ;
2007-09-20 18:09:08 -04:00
TUPLE: line words ascent descent ;
: <line> ( words -- line )
dup [ key>> ] map dup pref-dims baseline-metrics line boa ;
: wrap-paragraph ( paragraph -- wrapped-paragraph )
[ children>> [ gadget>word ] map ] [ margin>> ] bi wrap
[ <line> ] map ;
2007-09-20 18:09:08 -04:00
: line-width ( wrapped-line -- n )
[ break?>> ] trim-tail-slice [ width>> ] sigma ;
2007-09-20 18:09:08 -04:00
: max-line-width ( wrapped-paragraph -- x )
[ words>> line-width ] [ max ] map-reduce ;
2007-09-20 18:09:08 -04:00
: line-height ( wrapped-line -- ys )
[ ascent>> ] [ descent>> ] bi + ;
2007-09-20 18:09:08 -04:00
: sum-line-heights ( wrapped-paragraph -- y )
[ line-height ] sigma ;
2007-09-20 18:09:08 -04:00
M: paragraph pref-dim*
wrap-paragraph [ max-line-width ] [ sum-line-heights ] bi 2array ;
2007-09-20 18:09:08 -04:00
: line-y-coordinates ( wrapped-paragraph -- ys )
0 [ line-height + ] accumulate nip ;
2007-09-20 18:09:08 -04:00
: word-x-coordinates ( wrapped-line -- xs )
0 [ width>> + ] accumulate nip ;
2007-09-20 18:09:08 -04:00
: layout-word ( word x y -- )
[ key>> ] 2dip 2array >>loc prefer ;
2007-09-20 18:09:08 -04:00
: layout-line ( wrapped-line y -- )
2009-02-02 14:45:06 -05:00
[
words>>
2009-02-02 14:45:06 -05:00
[ ]
[ word-x-coordinates ]
[ [ key>> ] map baseline-align ] tri
] dip '[ _ + layout-word ] 3each ;
2007-09-20 18:09:08 -04:00
M: paragraph layout*
wrap-paragraph dup line-y-coordinates
[ layout-line ] 2each ;
M: paragraph baseline
children>> [ 0 ] [
first [ loc>> second ] [ baseline ] bi +
] if-empty ;
PRIVATE>