ui.gadgets.paragraphs: cache the wrapped paragraph for performance.
parent
d5900ba7ee
commit
8e3c79b841
|
@ -18,7 +18,7 @@ M: word-break-gadget draw-gadget* drop ;
|
||||||
INSTANCE: word-break-gadget word-break
|
INSTANCE: word-break-gadget word-break
|
||||||
|
|
||||||
! A gadget that arranges its children in a word-wrap style.
|
! A gadget that arranges its children in a word-wrap style.
|
||||||
TUPLE: paragraph < gadget margin ;
|
TUPLE: paragraph < gadget margin wrapped ;
|
||||||
|
|
||||||
: <paragraph> ( margin -- gadget )
|
: <paragraph> ( margin -- gadget )
|
||||||
paragraph new
|
paragraph new
|
||||||
|
@ -30,15 +30,19 @@ TUPLE: paragraph < gadget margin ;
|
||||||
: gadget>word ( gadget -- word )
|
: gadget>word ( gadget -- word )
|
||||||
[ ] [ pref-dim first ] [ word-break? ] tri <word> ;
|
[ ] [ pref-dim first ] [ word-break? ] tri <word> ;
|
||||||
|
|
||||||
TUPLE: line words height ;
|
TUPLE: line words height baseline ;
|
||||||
|
|
||||||
: <line> ( words -- line )
|
: <line> ( words -- line )
|
||||||
dup [ key>> ] map dup pref-dims measure-height line boa ;
|
dup [ key>> ] map dup pref-dims
|
||||||
|
[ measure-height ] [ measure-metrics drop ] 2bi line boa ;
|
||||||
|
|
||||||
: wrap-paragraph ( paragraph -- wrapped-paragraph )
|
: wrap-paragraph ( paragraph -- wrapped-paragraph )
|
||||||
[ children>> [ gadget>word ] map ] [ margin>> ] bi
|
[ children>> [ gadget>word ] map ] [ margin>> ] bi
|
||||||
dup wrap-words [ <line> ] map ;
|
dup wrap-words [ <line> ] map ;
|
||||||
|
|
||||||
|
M: paragraph children<<
|
||||||
|
[ call-next-method ] [ [ wrap-paragraph ] keep wrapped<< ] bi ;
|
||||||
|
|
||||||
: line-width ( wrapped-line -- n )
|
: line-width ( wrapped-line -- n )
|
||||||
[ break?>> ] trim-tail-slice [ width>> ] map-sum ;
|
[ break?>> ] trim-tail-slice [ width>> ] map-sum ;
|
||||||
|
|
||||||
|
@ -49,7 +53,7 @@ TUPLE: line words height ;
|
||||||
[ height>> ] map-sum ;
|
[ height>> ] map-sum ;
|
||||||
|
|
||||||
M: paragraph pref-dim*
|
M: paragraph pref-dim*
|
||||||
wrap-paragraph [ max-line-width ] [ sum-line-heights ] bi 2array ;
|
wrapped>> [ max-line-width ] [ sum-line-heights ] bi 2array ;
|
||||||
|
|
||||||
: line-y-coordinates ( wrapped-paragraph -- ys )
|
: line-y-coordinates ( wrapped-paragraph -- ys )
|
||||||
0 [ height>> + ] accumulate nip ;
|
0 [ height>> + ] accumulate nip ;
|
||||||
|
@ -69,17 +73,11 @@ M: paragraph pref-dim*
|
||||||
] dip '[ _ + layout-word ] 3each ;
|
] dip '[ _ + layout-word ] 3each ;
|
||||||
|
|
||||||
M: paragraph layout*
|
M: paragraph layout*
|
||||||
wrap-paragraph dup line-y-coordinates
|
wrapped>> dup line-y-coordinates [ layout-line ] 2each ;
|
||||||
[ layout-line ] 2each ;
|
|
||||||
|
|
||||||
M: paragraph baseline
|
M: paragraph baseline
|
||||||
wrap-paragraph [ f ] [
|
wrapped>> [ f ] [ first baseline>> ] if-empty ;
|
||||||
first words>>
|
|
||||||
[ key>> ] map
|
|
||||||
dup [ pref-dim ] map
|
|
||||||
measure-metrics drop
|
|
||||||
] if-empty ;
|
|
||||||
|
|
||||||
M: paragraph cap-height pack-cap-height ;
|
M: paragraph cap-height pack-cap-height ;
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
Loading…
Reference in New Issue