Correctly compute pref-dim of gadgets with baseline alignment

db4
Slava Pestov 2009-02-02 15:14:46 -06:00
parent a5116d0b5d
commit 3ed8d9ccce
5 changed files with 54 additions and 26 deletions

View File

@ -196,11 +196,17 @@ GENERIC: baseline ( gadget -- y )
M: gadget baseline pref-dim second ;
: (baseline-align) ( baselines -- ys )
[ { } ] [ [ supremum ] keep [ - ] with map ] if-empty ;
: baseline-align ( gadgets -- ys )
[ { } ] [
[ baseline ] map [ supremum ] keep
[ - ] with map
] if-empty ;
[ baseline ] map (baseline-align) ;
: (baseline-metrics) ( baselines sizes -- ascent descent )
{ 0 0 } [ second over - 2array vmax ] 2reduce first2 ;
: baseline-metrics ( children sizes -- ascent descent )
[ [ baseline ] map ] dip (baseline-metrics) ;
GENERIC: layout* ( gadget -- )

View File

@ -1,8 +1,7 @@
USING: ui.gadgets.packs ui.gadgets.packs.private ui.gadgets.labels
ui.gadgets ui.gadgets.debug ui.render kernel namespaces tools.test
math.parser sequences math.geometry.rect accessors ;
IN: ui.gadgets.packs.tests
USING: ui.gadgets.packs ui.gadgets.packs.private
ui.gadgets.labels ui.gadgets ui.render
kernel namespaces tools.test math.parser sequences math.geometry.rect
accessors ;
[ t ] [
{ 0 0 } { 100 100 } <rect> clip set
@ -21,15 +20,6 @@ accessors ;
orient
] unit-test
TUPLE: baseline-gadget < gadget baseline ;
M: baseline-gadget baseline baseline>> ;
: <baseline-gadget> ( baseline dim -- gadget )
baseline-gadget new-gadget
swap >>dim
swap >>baseline ;
<shelf> +baseline+ >>align
5 { 10 10 } <baseline-gadget> add-gadget
10 { 10 10 } <baseline-gadget> add-gadget

View File

@ -61,11 +61,15 @@ PRIVATE>
<PRIVATE
: gap-dims ( gadget sizes -- seeq )
: gap-dims ( pack sizes -- seeq )
[ gap>> ] [ [ length 1 [-] ] [ dim-sum ] bi ] bi* [ v*n ] dip v+ ;
: pack-pref-dim ( gadget sizes -- dim )
[ nip max-dim ] [ gap-dims ] [ drop orientation>> ] 2tri set-axis ;
: max-pack-dim ( pack sizes -- dim )
over align>> +baseline+ eq?
[ [ children>> ] dip baseline-metrics + 0 swap 2array ] [ nip max-dim ] if ;
: pack-pref-dim ( pack sizes -- dim )
[ max-pack-dim ] [ gap-dims ] [ drop orientation>> ] 2tri set-axis ;
M: pack pref-dim*
dup children>> pref-dims pack-pref-dim ;

View File

@ -1,6 +1,7 @@
IN: ui.gadgets.paragraphs.tests
USING: ui.gadgets.paragraphs ui.gadgets.paragraphs.private
ui.gadgets accessors tools.test namespaces sequences kernel ;
ui.gadgets ui.gadgets.debug accessors tools.test namespaces
sequences kernel ;
TUPLE: fake-break < gadget ;
@ -16,7 +17,7 @@ INSTANCE: fake-break word-break
<gadget> { 50 20 } >>dim dup "c" set add-gadget
"p" set
[ { 4 1 } ] [ "p" get wrap-paragraph [ length ] map ] unit-test
[ { 4 1 } ] [ "p" get wrap-paragraph [ words>> length ] map ] unit-test
[ { 85 50 } ] [ "p" get pref-dim ] unit-test
@ -28,4 +29,24 @@ INSTANCE: fake-break word-break
[ { 45 15 } ] [ "b" get loc>> ] unit-test
[ { 0 30 } ] [ "c" get loc>> ] unit-test
[ { 0 30 } ] [ "c" get loc>> ] unit-test
100 <paragraph>
15 { 40 30 } <baseline-gadget> dup "a" set add-gadget
<fake-break> add-gadget
10 { 40 30 } <baseline-gadget> dup "b" set add-gadget
<fake-break> add-gadget
20 { 40 30 } <baseline-gadget> dup "c" set add-gadget
"p" set
[ { 85 65 } ] [ "p" get pref-dim ] unit-test
[ ] [ "p" get prefer ] unit-test
[ ] [ "p" get layout ] unit-test
[ { 0 0 } ] [ "a" get loc>> ] unit-test
[ { 45 5 } ] [ "b" get loc>> ] unit-test
[ { 0 35 } ] [ "c" get loc>> ] unit-test

View File

@ -29,17 +29,23 @@ TUPLE: paragraph < gadget margin ;
: gadget>word ( gadget -- word )
[ ] [ pref-dim first ] [ word-break? ] tri <word> ;
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 ;
[ children>> [ gadget>word ] map ] [ margin>> ] bi wrap
[ <line> ] map ;
: line-width ( wrapped-line -- n )
[ break?>> ] trim-tail-slice [ width>> ] sigma ;
: max-line-width ( wrapped-paragraph -- x )
[ line-width ] [ max ] map-reduce ;
[ words>> line-width ] [ max ] map-reduce ;
: line-height ( wrapped-line -- ys )
[ key>> pref-dim second ] [ max ] map-reduce ;
[ ascent>> ] [ descent>> ] bi + ;
: sum-line-heights ( wrapped-paragraph -- y )
[ line-height ] sigma ;
@ -58,6 +64,7 @@ M: paragraph pref-dim*
: layout-line ( wrapped-line y -- )
[
words>>
[ ]
[ word-x-coordinates ]
[ [ key>> ] map baseline-align ] tri