diff --git a/basis/ui/gadgets/paragraphs/paragraphs.factor b/basis/ui/gadgets/paragraphs/paragraphs.factor index 8002fba4ae..24af646562 100644 --- a/basis/ui/gadgets/paragraphs/paragraphs.factor +++ b/basis/ui/gadgets/paragraphs/paragraphs.factor @@ -18,7 +18,7 @@ M: word-break-gadget draw-gadget* drop ; INSTANCE: word-break-gadget word-break ! A gadget that arranges its children in a word-wrap style. -TUPLE: paragraph < gadget margin ; +TUPLE: paragraph < gadget margin wrapped ; : ( margin -- gadget ) paragraph new @@ -30,15 +30,19 @@ TUPLE: paragraph < gadget margin ; : gadget>word ( gadget -- word ) [ ] [ pref-dim first ] [ word-break? ] tri ; -TUPLE: line words height ; +TUPLE: line words height baseline ; : ( 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 ) [ children>> [ gadget>word ] map ] [ margin>> ] bi dup wrap-words [ ] map ; +M: paragraph children<< + [ call-next-method ] [ [ wrap-paragraph ] keep wrapped<< ] bi ; + : line-width ( wrapped-line -- n ) [ break?>> ] trim-tail-slice [ width>> ] map-sum ; @@ -49,7 +53,7 @@ TUPLE: line words height ; [ height>> ] map-sum ; 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 ) 0 [ height>> + ] accumulate nip ; @@ -69,17 +73,11 @@ M: paragraph pref-dim* ] dip '[ _ + layout-word ] 3each ; M: paragraph layout* - wrap-paragraph dup line-y-coordinates - [ layout-line ] 2each ; + wrapped>> dup line-y-coordinates [ layout-line ] 2each ; M: paragraph baseline - wrap-paragraph [ f ] [ - first words>> - [ key>> ] map - dup [ pref-dim ] map - measure-metrics drop - ] if-empty ; + wrapped>> [ f ] [ first baseline>> ] if-empty ; M: paragraph cap-height pack-cap-height ; - + PRIVATE>