Correctly compute pref-dim of gadgets with baseline alignment
parent
a5116d0b5d
commit
3ed8d9ccce
|
@ -196,11 +196,17 @@ GENERIC: baseline ( gadget -- y )
|
||||||
|
|
||||||
M: gadget baseline pref-dim second ;
|
M: gadget baseline pref-dim second ;
|
||||||
|
|
||||||
|
: (baseline-align) ( baselines -- ys )
|
||||||
|
[ { } ] [ [ supremum ] keep [ - ] with map ] if-empty ;
|
||||||
|
|
||||||
: baseline-align ( gadgets -- ys )
|
: baseline-align ( gadgets -- ys )
|
||||||
[ { } ] [
|
[ baseline ] map (baseline-align) ;
|
||||||
[ baseline ] map [ supremum ] keep
|
|
||||||
[ - ] with map
|
: (baseline-metrics) ( baselines sizes -- ascent descent )
|
||||||
] if-empty ;
|
{ 0 0 } [ second over - 2array vmax ] 2reduce first2 ;
|
||||||
|
|
||||||
|
: baseline-metrics ( children sizes -- ascent descent )
|
||||||
|
[ [ baseline ] map ] dip (baseline-metrics) ;
|
||||||
|
|
||||||
GENERIC: layout* ( gadget -- )
|
GENERIC: layout* ( gadget -- )
|
||||||
|
|
||||||
|
|
|
@ -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
|
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 ] [
|
[ t ] [
|
||||||
{ 0 0 } { 100 100 } <rect> clip set
|
{ 0 0 } { 100 100 } <rect> clip set
|
||||||
|
@ -21,15 +20,6 @@ accessors ;
|
||||||
orient
|
orient
|
||||||
] unit-test
|
] 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
|
<shelf> +baseline+ >>align
|
||||||
5 { 10 10 } <baseline-gadget> add-gadget
|
5 { 10 10 } <baseline-gadget> add-gadget
|
||||||
10 { 10 10 } <baseline-gadget> add-gadget
|
10 { 10 10 } <baseline-gadget> add-gadget
|
||||||
|
|
|
@ -61,11 +61,15 @@ PRIVATE>
|
||||||
|
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
||||||
: gap-dims ( gadget sizes -- seeq )
|
: gap-dims ( pack sizes -- seeq )
|
||||||
[ gap>> ] [ [ length 1 [-] ] [ dim-sum ] bi ] bi* [ v*n ] dip v+ ;
|
[ gap>> ] [ [ length 1 [-] ] [ dim-sum ] bi ] bi* [ v*n ] dip v+ ;
|
||||||
|
|
||||||
: pack-pref-dim ( gadget sizes -- dim )
|
: max-pack-dim ( pack sizes -- dim )
|
||||||
[ nip max-dim ] [ gap-dims ] [ drop orientation>> ] 2tri set-axis ;
|
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*
|
M: pack pref-dim*
|
||||||
dup children>> pref-dims pack-pref-dim ;
|
dup children>> pref-dims pack-pref-dim ;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
IN: ui.gadgets.paragraphs.tests
|
IN: ui.gadgets.paragraphs.tests
|
||||||
USING: ui.gadgets.paragraphs ui.gadgets.paragraphs.private
|
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 ;
|
TUPLE: fake-break < gadget ;
|
||||||
|
|
||||||
|
@ -16,7 +17,7 @@ INSTANCE: fake-break word-break
|
||||||
<gadget> { 50 20 } >>dim dup "c" set add-gadget
|
<gadget> { 50 20 } >>dim dup "c" set add-gadget
|
||||||
"p" set
|
"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
|
[ { 85 50 } ] [ "p" get pref-dim ] unit-test
|
||||||
|
|
||||||
|
@ -29,3 +30,23 @@ INSTANCE: fake-break word-break
|
||||||
[ { 45 15 } ] [ "b" get loc>> ] unit-test
|
[ { 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
|
|
@ -29,17 +29,23 @@ 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 ascent descent ;
|
||||||
|
|
||||||
|
: <line> ( words -- line )
|
||||||
|
dup [ key>> ] map dup pref-dims baseline-metrics line boa ;
|
||||||
|
|
||||||
: wrap-paragraph ( paragraph -- wrapped-paragraph )
|
: 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 )
|
: line-width ( wrapped-line -- n )
|
||||||
[ break?>> ] trim-tail-slice [ width>> ] sigma ;
|
[ break?>> ] trim-tail-slice [ width>> ] sigma ;
|
||||||
|
|
||||||
: max-line-width ( wrapped-paragraph -- x )
|
: max-line-width ( wrapped-paragraph -- x )
|
||||||
[ line-width ] [ max ] map-reduce ;
|
[ words>> line-width ] [ max ] map-reduce ;
|
||||||
|
|
||||||
: line-height ( wrapped-line -- ys )
|
: line-height ( wrapped-line -- ys )
|
||||||
[ key>> pref-dim second ] [ max ] map-reduce ;
|
[ ascent>> ] [ descent>> ] bi + ;
|
||||||
|
|
||||||
: sum-line-heights ( wrapped-paragraph -- y )
|
: sum-line-heights ( wrapped-paragraph -- y )
|
||||||
[ line-height ] sigma ;
|
[ line-height ] sigma ;
|
||||||
|
@ -58,6 +64,7 @@ M: paragraph pref-dim*
|
||||||
|
|
||||||
: layout-line ( wrapped-line y -- )
|
: layout-line ( wrapped-line y -- )
|
||||||
[
|
[
|
||||||
|
words>>
|
||||||
[ ]
|
[ ]
|
||||||
[ word-x-coordinates ]
|
[ word-x-coordinates ]
|
||||||
[ [ key>> ] map baseline-align ] tri
|
[ [ key>> ] map baseline-align ] tri
|
||||||
|
|
Loading…
Reference in New Issue