2009-02-02 04:32:13 -05:00
|
|
|
! Copyright (C) 2005, 2009 Slava Pestov
|
2007-09-20 18:09:08 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2015-01-29 14:41:18 -05:00
|
|
|
USING: accessors arrays fry kernel math math.order sequences
|
|
|
|
ui.baseline-alignment ui.gadgets ui.gadgets.labels
|
|
|
|
ui.gadgets.packs.private ui.render wrap.words ;
|
2007-09-20 18:09:08 -04:00
|
|
|
IN: ui.gadgets.paragraphs
|
|
|
|
|
2009-02-02 04:32:13 -05:00
|
|
|
MIXIN: word-break
|
|
|
|
|
2007-09-20 18:09:08 -04:00
|
|
|
! A word break gadget
|
2008-07-11 01:01:22 -04:00
|
|
|
TUPLE: word-break-gadget < label ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-07-11 01:01:22 -04:00
|
|
|
: <word-break-gadget> ( text -- gadget )
|
|
|
|
word-break-gadget new-label ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
M: word-break-gadget draw-gadget* drop ;
|
|
|
|
|
2009-02-02 04:32:13 -05:00
|
|
|
INSTANCE: word-break-gadget word-break
|
|
|
|
|
2007-09-20 18:09:08 -04:00
|
|
|
! A gadget that arranges its children in a word-wrap style.
|
2012-09-18 18:48:49 -04:00
|
|
|
TUPLE: paragraph < aligned-gadget margin wrapped ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: <paragraph> ( margin -- gadget )
|
2009-02-16 05:04:32 -05:00
|
|
|
paragraph new
|
2009-02-02 01:02:55 -05:00
|
|
|
horizontal >>orientation
|
2008-09-27 15:36:04 -04:00
|
|
|
swap >>margin ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-02 04:32:13 -05:00
|
|
|
<PRIVATE
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-02 04:32:13 -05:00
|
|
|
: gadget>word ( gadget -- word )
|
2015-07-20 04:11:05 -04:00
|
|
|
[ ] [ pref-dim first ] [ word-break? ] tri <wrapping-word> ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2012-09-24 21:29:17 -04:00
|
|
|
: line-width ( words -- n )
|
|
|
|
[ break?>> ] trim-tail-slice [ width>> ] map-sum ;
|
|
|
|
|
|
|
|
TUPLE: line words width height baseline ;
|
2009-02-02 16:14:46 -05:00
|
|
|
|
|
|
|
: <line> ( words -- line )
|
2012-09-24 21:29:17 -04:00
|
|
|
[ ] [ line-width ] [ [ key>> ] map dup pref-dims ] tri
|
2012-09-17 17:01:52 -04:00
|
|
|
[ measure-height ] [ measure-metrics drop ] 2bi line boa ;
|
2009-02-02 16:14:46 -05:00
|
|
|
|
2009-02-02 04:32:13 -05:00
|
|
|
: wrap-paragraph ( paragraph -- wrapped-paragraph )
|
2009-02-09 02:47:41 -05:00
|
|
|
[ children>> [ gadget>word ] map ] [ margin>> ] bi
|
2012-09-24 21:29:17 -04:00
|
|
|
dup wrap-words [ <line> ] map! ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2012-09-18 18:48:49 -04:00
|
|
|
: cached-wrapped ( paragraph -- wrapped-paragraph )
|
|
|
|
dup wrapped>>
|
2016-07-11 22:50:37 -04:00
|
|
|
[ ] [ [ wrap-paragraph dup ] keep wrapped<< ] ?if ;
|
2012-09-17 17:01:52 -04:00
|
|
|
|
2009-02-02 04:32:13 -05:00
|
|
|
: max-line-width ( wrapped-paragraph -- x )
|
2012-09-24 21:29:17 -04:00
|
|
|
[ width>> ] [ max ] map-reduce ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-02 04:32:13 -05:00
|
|
|
: sum-line-heights ( wrapped-paragraph -- y )
|
2009-10-29 15:34:31 -04:00
|
|
|
[ height>> ] map-sum ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-02 04:32:13 -05:00
|
|
|
M: paragraph pref-dim*
|
2015-09-20 12:45:05 -04:00
|
|
|
cached-wrapped [
|
|
|
|
{ 0 0 }
|
|
|
|
] [
|
|
|
|
[ max-line-width ] [ sum-line-heights ] bi 2array
|
|
|
|
] if-empty ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-02 04:32:13 -05:00
|
|
|
: line-y-coordinates ( wrapped-paragraph -- ys )
|
2009-02-12 17:52:24 -05:00
|
|
|
0 [ height>> + ] accumulate nip ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-02 04:32:13 -05:00
|
|
|
: word-x-coordinates ( wrapped-line -- xs )
|
|
|
|
0 [ width>> + ] accumulate nip ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-02 04:32:13 -05:00
|
|
|
: layout-word ( word x y -- )
|
|
|
|
[ key>> ] 2dip 2array >>loc prefer ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-02 04:32:13 -05:00
|
|
|
: layout-line ( wrapped-line y -- )
|
2009-02-02 14:45:06 -05:00
|
|
|
[
|
2009-02-02 16:14:46 -05:00
|
|
|
words>>
|
2009-02-02 14:45:06 -05:00
|
|
|
[ ]
|
|
|
|
[ word-x-coordinates ]
|
2009-02-17 07:10:02 -05:00
|
|
|
[ [ key>> ] map align-baselines ] tri
|
2009-02-02 14:45:06 -05:00
|
|
|
] dip '[ _ + layout-word ] 3each ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
M: paragraph layout*
|
2012-09-18 18:48:49 -04:00
|
|
|
f >>wrapped
|
|
|
|
cached-wrapped dup line-y-coordinates [ layout-line ] 2each ;
|
2009-02-02 04:32:13 -05:00
|
|
|
|
2012-09-18 18:48:49 -04:00
|
|
|
M: paragraph baseline*
|
|
|
|
cached-wrapped [ f ] [ first baseline>> ] if-empty ;
|
2009-02-04 01:50:04 -05:00
|
|
|
|
2012-09-18 18:48:49 -04:00
|
|
|
M: paragraph cap-height* pack-cap-height ;
|
2012-09-17 17:01:52 -04:00
|
|
|
|
2009-10-29 15:34:04 -04:00
|
|
|
PRIVATE>
|