MCPcopy Create free account
hub / github.com/TheRedDeveloper/ply-engine / wrap_text

Method wrap_text

src/engine.rs:3400–3515  ·  view source on GitHub ↗
(&mut self)

Source from the content-addressed store, hash-verified

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 });

Callers 1

Calls 3

cloneMethod · 0.80
measure_text_cachedMethod · 0.80

Tested by

no test coverage detected