makepad_code_editor/
wrap.rs1use crate::{char::CharExt, layout::InlineElement, str::StrExt, Line};
2
3#[derive(Clone, Debug, Default, Eq, Hash, PartialEq)]
4pub struct WrapData {
5 pub wraps: Vec<usize>,
6 pub indent_column_count: usize,
7}
8
9pub fn compute_wrap_data(line: Line<'_>, wrap_column: usize) -> WrapData {
10 let indent_column_count: usize = line
11 .text
12 .indent()
13 .unwrap_or("")
14 .chars()
15 .map(|char| char.column_count())
16 .sum();
17 let mut byte_index = 0;
18 let mut column_index = 0;
19 let mut wraps = Vec::new();
20 for element in line.inline_elements() {
21 match element {
22 InlineElement::Text { text, .. } => {
23 for string in text.split_whitespace_boundaries() {
24 let column_count: usize = string.chars().map(|char| char.column_count()).sum();
25 if column_index + column_count > wrap_column {
26 column_index = indent_column_count;
27 wraps.push(byte_index);
28 }
29 column_index += column_count;
30 byte_index += string.len();
31 }
32 }
33 InlineElement::Widget(widget) => {
34 if column_index + widget.column_count > wrap_column {
35 column_index = indent_column_count;
36 wraps.push(byte_index);
37 }
38 column_index += widget.column_count;
39 byte_index += 1;
40 }
41 }
42 }
43 WrapData {
44 wraps,
45 indent_column_count,
46 }
47}