mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-05 17:35:36 +00:00
go.*,text,widget{,/material}: enable configurable line wrapping within words
This commit enables consumers of the text shaper to select a policy for how line breaking candidates will be chosen. The new default policy can break lines within "words" (UAX#14 segments) when words do not fit by themselves on a line. This ensures that text does not horizontally overflow its bounding box unless the available width is insufficient to display a single UAX#29 grapheme cluster. Fixes: https://todo.sr.ht/~eliasnaur/gio/467 Signed-off-by: Chris Waldon <christopher.waldon.dev@gmail.com>
This commit is contained in:
@@ -16,6 +16,27 @@ import (
|
||||
"golang.org/x/image/math/fixed"
|
||||
)
|
||||
|
||||
// WrapPolicy configures strategies for choosing where to break lines of text for line
|
||||
// wrapping.
|
||||
type WrapPolicy uint8
|
||||
|
||||
const (
|
||||
// WrapHeuristically tries to minimize breaking within words (UAX#14 text segments)
|
||||
// while also ensuring that text fits within the given MaxWidth. It will only break
|
||||
// a line within a word (on a UAX#29 grapheme cluster boundary) when that word cannot
|
||||
// fit on a line by itself. Additionally, when the final word of a line is being
|
||||
// truncated, this policy will preserve as many symbols of that word as
|
||||
// possible before the truncator.
|
||||
WrapHeuristically WrapPolicy = iota
|
||||
// WrapWords does not permit words (UAX#14 text segments) to be broken across lines.
|
||||
// This means that sometimes long words will exceed the MaxWidth they are wrapped with.
|
||||
WrapWords
|
||||
// WrapGraphemes will maximize the amount of text on each line at the expense of readability,
|
||||
// breaking any word across lines on UAX#29 grapheme cluster boundaries to maximize the number of
|
||||
// grapheme clusters on each line.
|
||||
WrapGraphemes
|
||||
)
|
||||
|
||||
// Parameters are static text shaping attributes applied to the entire shaped text.
|
||||
type Parameters struct {
|
||||
// Font describes the preferred typeface.
|
||||
@@ -32,6 +53,9 @@ type Parameters struct {
|
||||
// truncated.
|
||||
Truncator string
|
||||
|
||||
// WrapPolicy configures how line breaks will be chosen when wrapping text across lines.
|
||||
WrapPolicy WrapPolicy
|
||||
|
||||
// MinWidth and MaxWidth provide the minimum and maximum horizontal space constraints
|
||||
// for the shaped text.
|
||||
MinWidth, MaxWidth int
|
||||
@@ -318,6 +342,7 @@ func (l *Shaper) layoutParagraph(params Parameters, asStr string, asBytes []byte
|
||||
locale: params.Locale,
|
||||
font: params.Font,
|
||||
forceTruncate: params.forceTruncate,
|
||||
wrapPolicy: params.WrapPolicy,
|
||||
str: asStr,
|
||||
}
|
||||
if l, ok := l.layoutCache.Get(lk); ok {
|
||||
|
||||
Reference in New Issue
Block a user