makepad_code_editor/
wrap.rs

1use 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}