factor/library/ui/gadgets/paragraphs.factor

69 lines
1.6 KiB
Factor
Raw Normal View History

! Copyright (C) 2005, 2006 Slava Pestov
! See http://factorcode.org/license.txt for BSD license.
2006-06-09 21:55:37 -04:00
IN: gadgets-paragraphs
USING: arrays gadgets gadgets-labels generic kernel math
2005-12-16 21:12:35 -05:00
namespaces sequences ;
! A word break gadget
2005-12-28 20:25:17 -05:00
TUPLE: word-break-gadget ;
2005-12-16 21:12:35 -05:00
C: word-break-gadget ( gadget -- gadget )
[ set-delegate ] keep ;
2005-12-16 21:12:35 -05:00
M: word-break-gadget draw-gadget* drop ;
2006-06-23 02:25:08 -04:00
2005-12-16 21:12:35 -05:00
! A gadget that arranges its children in a word-wrap style.
TUPLE: paragraph margin ;
C: paragraph ( margin -- gadget )
[ set-paragraph-margin ] keep dup delegate>gadget ;
SYMBOL: x SYMBOL: max-x
SYMBOL: y SYMBOL: max-y
2006-06-09 21:55:37 -04:00
SYMBOL: line-height
2005-12-16 21:12:35 -05:00
SYMBOL: margin
: overrun? ( width -- ? ) x get + margin get >= ;
2006-06-09 21:55:37 -04:00
: wrap-line ( -- )
line-height get y +@
0 { x line-height } [ set ] each-with ;
2005-12-16 21:12:35 -05:00
2006-06-23 00:06:53 -04:00
: wrap-pos ( -- pos ) x get y get 2array ;
2005-12-16 21:12:35 -05:00
2006-06-09 21:55:37 -04:00
: advance-x ( x -- )
x +@
x get max-x [ max ] change ;
2005-12-16 21:12:35 -05:00
2006-06-09 21:55:37 -04:00
: advance-y ( y -- )
dup line-height [ max ] change
y get + max-y [ max ] change ;
2005-12-16 21:12:35 -05:00
2006-08-15 16:29:35 -04:00
: wrap-step ( quot child -- )
2005-12-16 21:12:35 -05:00
dup pref-dim [
2005-12-28 20:25:17 -05:00
over word-break-gadget? [
2006-06-09 21:55:37 -04:00
dup first overrun? [ wrap-line ] when
2005-12-16 21:12:35 -05:00
] unless drop wrap-pos rot call
] keep first2 advance-y advance-x ; inline
2006-06-23 00:06:53 -04:00
: wrap-dim ( -- dim ) max-x get max-y get 2array ;
2005-12-16 21:12:35 -05:00
: init-wrap ( paragraph -- )
paragraph-margin margin set
2006-06-09 21:55:37 -04:00
0 { x max-x y max-y line-height } [ set ] each-with ;
2005-12-16 21:12:35 -05:00
2006-08-15 16:29:35 -04:00
: do-wrap ( paragraph quot -- dim )
2005-12-16 21:12:35 -05:00
[
swap dup init-wrap
[ wrap-step ] each-child-with wrap-dim
] with-scope ; inline
2005-12-16 21:12:35 -05:00
M: paragraph pref-dim*
2005-12-16 21:12:35 -05:00
[ 2drop ] do-wrap ;
M: paragraph layout*
2005-12-16 21:12:35 -05:00
[ swap dup prefer set-rect-loc ] do-wrap drop ;