(&mut self)
| 3398 | } |
| 3399 | |
| 3400 | fn wrap_text(&mut self) { |
| 3401 | for text_idx in 0..self.text_element_data.len() { |
| 3402 | let elem_index = self.text_element_data[text_idx].element_index as usize; |
| 3403 | let text = self.text_element_data[text_idx].text.clone(); |
| 3404 | let preferred_dims = self.text_element_data[text_idx].preferred_dimensions; |
| 3405 | |
| 3406 | self.text_element_data[text_idx].wrapped_lines_start = self.wrapped_text_lines.len(); |
| 3407 | self.text_element_data[text_idx].wrapped_lines_length = 0; |
| 3408 | |
| 3409 | let container_width = self.layout_elements[elem_index].dimensions.width; |
| 3410 | |
| 3411 | // Find text config |
| 3412 | let text_config_idx = self |
| 3413 | .find_element_config_index(elem_index, ElementConfigType::Text) |
| 3414 | .unwrap_or(0); |
| 3415 | let text_config = self.text_element_configs[text_config_idx].clone(); |
| 3416 | |
| 3417 | let measured = self.measure_text_cached(&text, &text_config); |
| 3418 | |
| 3419 | let line_height = if text_config.line_height > 0 { |
| 3420 | text_config.line_height as f32 |
| 3421 | } else { |
| 3422 | preferred_dims.height |
| 3423 | }; |
| 3424 | |
| 3425 | if !measured.contains_newlines && preferred_dims.width <= container_width { |
| 3426 | // Single line |
| 3427 | self.wrapped_text_lines.push(WrappedTextLine { |
| 3428 | dimensions: self.layout_elements[elem_index].dimensions, |
| 3429 | start: 0, |
| 3430 | length: text.len(), |
| 3431 | }); |
| 3432 | self.text_element_data[text_idx].wrapped_lines_length = 1; |
| 3433 | continue; |
| 3434 | } |
| 3435 | |
| 3436 | // Multi-line wrapping |
| 3437 | let measure_fn = self.measure_text_fn.as_ref().unwrap(); |
| 3438 | let space_width = { |
| 3439 | let space_config = text_config.clone(); |
| 3440 | measure_fn(" ", &space_config).width |
| 3441 | }; |
| 3442 | |
| 3443 | let mut word_index = measured.measured_words_start_index; |
| 3444 | let mut line_width: f32 = 0.0; |
| 3445 | let mut line_length_chars: i32 = 0; |
| 3446 | let mut line_start_offset: i32 = 0; |
| 3447 | |
| 3448 | while word_index != -1 { |
| 3449 | let measured_word = self.measured_words[word_index as usize]; |
| 3450 | |
| 3451 | // Word doesn't fit but it's the only word on the line |
| 3452 | if line_length_chars == 0 && line_width + measured_word.width > container_width { |
| 3453 | self.wrapped_text_lines.push(WrappedTextLine { |
| 3454 | dimensions: Dimensions::new(measured_word.width, line_height), |
| 3455 | start: measured_word.start_offset as usize, |
| 3456 | length: measured_word.length as usize, |
| 3457 | }); |
no test coverage detected