]> gitweb.factorcode.org Git - factor.git/commitdiff
ui.gadgets.paragraphs: cache the wrapped paragraph for performance.
authorJohn Benediktsson <mrjbq7@gmail.com>
Mon, 17 Sep 2012 21:01:52 +0000 (14:01 -0700)
committerJohn Benediktsson <mrjbq7@gmail.com>
Mon, 17 Sep 2012 21:12:25 +0000 (14:12 -0700)
basis/ui/gadgets/paragraphs/paragraphs.factor

index 8002fba4aec9df753e497c284a97bf30a046e12b..24af646562a4d20c86420bf80c99d86d1833747c 100644 (file)
@@ -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 ;
 
 : <paragraph> ( margin -- gadget )
     paragraph new
@@ -30,15 +30,19 @@ TUPLE: paragraph < gadget margin ;
 : gadget>word ( gadget -- word )
     [ ] [ pref-dim first ] [ word-break? ] tri <word> ;
 
-TUPLE: line words height ;
+TUPLE: line words height baseline ;
 
 : <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 )
     [ children>> [ gadget>word ] map ] [ margin>> ] bi
     dup wrap-words [ <line> ] 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>