diff --git a/basis/ui/gadgets/gadgets.factor b/basis/ui/gadgets/gadgets.factor index a0c95c6410..b3c0601a32 100644 --- a/basis/ui/gadgets/gadgets.factor +++ b/basis/ui/gadgets/gadgets.factor @@ -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 -- ) diff --git a/basis/ui/gadgets/packs/packs-tests.factor b/basis/ui/gadgets/packs/packs-tests.factor index 90d9e776c3..2699f99083 100644 --- a/basis/ui/gadgets/packs/packs-tests.factor +++ b/basis/ui/gadgets/packs/packs-tests.factor @@ -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 } clip set @@ -21,15 +20,6 @@ accessors ; orient ] unit-test -TUPLE: baseline-gadget < gadget baseline ; - -M: baseline-gadget baseline baseline>> ; - -: ( baseline dim -- gadget ) - baseline-gadget new-gadget - swap >>dim - swap >>baseline ; - +baseline+ >>align 5 { 10 10 } add-gadget 10 { 10 10 } add-gadget diff --git a/basis/ui/gadgets/packs/packs.factor b/basis/ui/gadgets/packs/packs.factor index 521c74a08b..77740f8adf 100644 --- a/basis/ui/gadgets/packs/packs.factor +++ b/basis/ui/gadgets/packs/packs.factor @@ -61,11 +61,15 @@ PRIVATE> > ] [ [ 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 ; diff --git a/basis/ui/gadgets/paragraphs/paragraphs-tests.factor b/basis/ui/gadgets/paragraphs/paragraphs-tests.factor index 62c9c5d2d7..d0f9f325b2 100644 --- a/basis/ui/gadgets/paragraphs/paragraphs-tests.factor +++ b/basis/ui/gadgets/paragraphs/paragraphs-tests.factor @@ -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 { 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 \ No newline at end of file +[ { 0 30 } ] [ "c" get loc>> ] unit-test + +100 +15 { 40 30 } dup "a" set add-gadget + add-gadget +10 { 40 30 } dup "b" set add-gadget + add-gadget +20 { 40 30 } 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 \ No newline at end of file diff --git a/basis/ui/gadgets/paragraphs/paragraphs.factor b/basis/ui/gadgets/paragraphs/paragraphs.factor index 7a26a7b9b1..deea011b4f 100644 --- a/basis/ui/gadgets/paragraphs/paragraphs.factor +++ b/basis/ui/gadgets/paragraphs/paragraphs.factor @@ -29,17 +29,23 @@ TUPLE: paragraph < gadget margin ; : gadget>word ( gadget -- word ) [ ] [ pref-dim first ] [ word-break? ] tri ; +TUPLE: line words ascent descent ; + +: ( 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 + [ ] 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