Expand description

A model for text documents.

This model is thought as a backend for a text UI. TextDocument can’t be modified directly by the user, only for setting the whole document with set_plain_text(...). The user must use a TextCursor using document.create_cursor() to make any change.

Document structure

Elements

  • Frame: contains Block elements and other Frame elements, formatable with FrameFormat
  • Block: contains Text elements or Image elements, formatable with BlockFormat
  • Text: contains the actuel text, formatable with TextFormat
  • Image: represent the position of an image, formatable with ImageFormat

All these items are encapsulated in its corresponding Element for ease of storage.

The simpler plain text

Frame
|- Block
   |- Text
|- Block
   |- Text

The more complex rich text

Frame
|- Block
   |- Text  --> I really lo
   |- Text  --> ve (imagine it Formatted in bold)
   |- Text  --> Rust
   |- Image
   |- Text
|- Frame
   |- Block
      |- Text
      |- Text
      |- Text
   |- Block
      |- Text
      |- Text
      |- Text
|- Block
   |- Image

Signaling changes

Each modification is signaled using callbacks. TextDocument offers different ways to make your code aware of any change:

Examples

use text_document::{TextDocument, ChangeReason, MoveMode};

let mut document = TextDocument::new();

document.add_text_change_callback(|position, removed_characters, added_characters|{
  println!("position: {}, removed_characters: {}, added_characters: {}", position, removed_characters, added_characters);
} );

document.add_element_change_callback(|element, reason|{
  assert_eq!(element.uuid(), 0);
  assert_eq!(reason, ChangeReason::ChildrenChanged );
} );
document.set_plain_text("beginningend").unwrap();

let mut cursor = document.create_cursor();
cursor.set_position(9, MoveMode::MoveAnchor);
cursor.insert_plain_text("new\nplain_text\ntest");

Re-exports

pub use crate::text_document::*;
pub use block::*;
pub use frame::*;
pub use image::*;
pub use text::*;
pub use text_cursor::*;

Modules