Adds a separate wrapping option to allow word to glyph fallback.

This commit is contained in:
dtzxporter 2024-02-01 21:51:36 -05:00 committed by Jeremy Soller
parent b7f150615d
commit cc75bb66b4
6 changed files with 23 additions and 14 deletions

View file

@ -104,8 +104,10 @@ pub enum Wrap {
None,
/// Wraps at a glyph level
Glyph,
/// Word Wrapping
/// Wraps at the word level
Word,
/// Wraps at the word level, or fallback to glyph level if a word can't fit on a line by itself
WordOrGlyph,
}
impl Display for Wrap {
@ -113,6 +115,7 @@ impl Display for Wrap {
match self {
Self::None => write!(f, "No Wrap"),
Self::Word => write!(f, "Word Wrap"),
Self::WordOrGlyph => write!(f, "Word Wrap or Character"),
Self::Glyph => write!(f, "Character"),
}
}

View file

@ -994,10 +994,13 @@ impl ShapeLine {
continue;
} else if wrap == Wrap::Glyph
// Make sure that the word is able to fit on it's own line, if not, fall back to Glyph wrapping.
|| word_width > line_width
|| (wrap == Wrap::WordOrGlyph && word_width > line_width)
{
// Commit the current line so that the word starts on the next line.
if word_range_width > 0. && word_width > line_width {
if word_range_width > 0.
&& wrap == Wrap::WordOrGlyph
&& word_width > line_width
{
add_to_visual_line(
&mut current_visual_line,
span_index,
@ -1041,7 +1044,7 @@ impl ShapeLine {
}
}
} else {
// Wrap::Word
// Wrap::Word, Wrap::WordOrGlyph
// TODO: What if the previous span ended with whitespace and the next
// span wraps a new line? Is that possible?
@ -1117,10 +1120,13 @@ impl ShapeLine {
continue;
} else if wrap == Wrap::Glyph
// Make sure that the word is able to fit on it's own line, if not, fall back to Glyph wrapping.
|| word_width > line_width
|| (wrap == Wrap::WordOrGlyph && word_width > line_width)
{
// Commit the current line so that the word starts on the next line.
if word_range_width > 0. && word_width > line_width {
if word_range_width > 0.
&& wrap == Wrap::WordOrGlyph
&& word_width > line_width
{
add_to_visual_line(
&mut current_visual_line,
span_index,
@ -1164,7 +1170,7 @@ impl ShapeLine {
}
}
} else {
// Wrap::Word
// Wrap::Word, Wrap::WordOrGlyph
// Current word causing a wrap is not whitespace, so we ignore the
// previous word if it's a whitespace