1use crate::block::Block;
2use crate::frame::Frame;
3use crate::image::Image;
4use crate::text::Text;
5use crate::text_cursor::TextCursor;
6use crate::text_document::Element::{BlockElement, FrameElement, ImageElement, TextElement};
7use array_tool::vec::Intersect;
8use std::cell::RefCell;
9use std::collections::{BTreeMap, HashMap};
10use std::rc::{Rc, Weak};
11use uuid::Uuid;
12
13use thiserror::Error;
17
18pub type ElementUuid = usize;
19
20#[derive(PartialEq, Clone)]
21pub struct TextDocument {
22 element_manager: Rc<ElementManager>,
24 uuid: Uuid,
25}
26
27impl Default for TextDocument {
28 fn default() -> Self {
29 Self::new()
30 }
31}
32
33impl TextDocument {
34 pub fn new() -> Self {
35 let element_manager = ElementManager::new_rc();
36 let document = Self {
40 element_manager: element_manager.clone(),
41 uuid: Uuid::new_v4(),
42 };
43 ElementManager::create_root_frame(element_manager);
45 document
46 }
47
48 pub fn block_list(&self) -> Vec<Weak<Block>> {
49 self.element_manager
50 .block_list()
51 .into_iter()
52 .map(|block| Rc::downgrade(&block))
53 .collect()
54 }
55
56 pub fn root_frame(&self) -> Weak<Frame> {
57 Rc::downgrade(&self.element_manager.root_frame())
58 }
59
60 pub fn character_count(&self) -> usize {
62 let mut counter: usize = 0;
63
64 self.element_manager
65 .block_list()
66 .into_iter()
67 .for_each(|block| {
68 counter += block.text_length();
69 });
70
71 counter
72 }
73
74 pub fn find_block(&self, position: usize) -> Option<Weak<Block>> {
75 self.element_manager
76 .find_block(position)
77 .map(|block| Rc::downgrade(&block))
78 }
79
80 pub fn first_block(&self) -> Weak<Block> {
81 Rc::downgrade(&self.element_manager.first_block().unwrap())
82 }
83
84 pub fn last_block(&self) -> Weak<Block> {
85 Rc::downgrade(&self.element_manager.last_block().unwrap())
86 }
87
88 pub fn block_count(&self) -> usize {
89 self.element_manager.block_count()
90 }
91
92 pub fn create_cursor(&self) -> TextCursor {
93 TextCursor::new(self.element_manager.clone())
94 }
95
96 pub fn set_plain_text<S: Into<String>>(&mut self, plain_text: S) -> Result<(), ModelError> {
97 let plain_text: String = plain_text.into();
98
99 self.element_manager.clear();
100
101 let frame = self.element_manager.create_empty_root_frame();
102
103 for text in plain_text.split('\n') {
104 let block = self
105 .element_manager
106 .insert_new_block(frame.uuid(), InsertMode::AsChild)?;
107 let text_rc = self
108 .element_manager
109 .insert_new_text(block.uuid(), InsertMode::AsChild)?;
110 text_rc.set_text(&text.to_string());
111 }
112
113 self.element_manager
115 .signal_for_text_change(0, 0, plain_text.len());
116 self.element_manager.signal_for_element_change(
117 self.element_manager.get(0).unwrap(),
118 ChangeReason::ChildrenChanged,
119 );
120
121 Ok(())
122 }
123
124 pub fn to_plain_text(&self) -> String {
125 let mut string_list = Vec::new();
126
127 self.element_manager
128 .list_all_children(0)
129 .iter()
130 .filter_map(|element| match element {
131 BlockElement(block) => Some(block.plain_text()),
132 _ => None,
133 })
134 .for_each(|string| string_list.push(string));
135
136 string_list.join("\n")
137 }
138
139 pub fn clear(&mut self) -> Result<(), ModelError> {
141 self.element_manager.clear();
142 let frame = self.element_manager.create_empty_root_frame();
143 let block = self
144 .element_manager
145 .insert_new_block(frame.uuid(), InsertMode::AsChild)?;
146 self.element_manager
147 .insert_new_text(block.uuid(), InsertMode::AsChild)?;
148
149 Ok(())
150 }
151
152 pub fn print_debug_elements(&self) {
153 self.element_manager.debug_elements();
154 }
155
156 pub fn add_text_change_callback(&self, callback: fn(usize, usize, usize)) {
158 self.element_manager.add_text_change_callback(callback);
159 }
160
161 pub fn add_element_change_callback(&self, callback: fn(Element, ChangeReason)) {
163 self.element_manager.add_element_change_callback(callback);
164 }
165}
166
167#[derive(Default, PartialEq, Clone, Debug)]
168pub struct TextDocumentOption {
169 pub tabs: Vec<Tab>,
170 pub text_direction: TextDirection,
171 pub wrap_mode: WrapMode,
172}
173
174#[derive(Default, Eq, PartialEq, Clone, Debug)]
175pub struct Tab {
176 pub position: usize,
177 pub tab_type: TabType,
178 pub delimiter: char,
179}
180
181#[derive(Eq, PartialEq, Clone, Copy, Debug)]
182pub enum TabType {
183 LeftTab,
184 RightTab,
185 CenterTab,
186 DelimiterTab,
187}
188
189impl Default for TabType {
190 fn default() -> Self {
191 TabType::LeftTab
192 }
193}
194
195#[derive(Eq, PartialEq, Clone, Copy, Debug)]
196pub enum TextDirection {
197 LeftToRight,
198 RightToLeft,
199}
200
201impl Default for TextDirection {
202 fn default() -> Self {
203 TextDirection::LeftToRight
204 }
205}
206
207#[derive(Eq, PartialEq, Clone, Copy, Debug)]
208pub enum WrapMode {
209 NoWrap,
210 WordWrap,
211 WrapAnywhere,
212 WrapAtWordBoundaryOrAnywhere,
213}
214
215impl Default for WrapMode {
216 fn default() -> Self {
217 WrapMode::WordWrap
218 }
219}
220
221pub(crate) enum InsertMode {
222 Before,
223 After,
224 AsChild,
225}
226
227type ElementChangeCallbacks = RefCell<Vec<fn(Element, ChangeReason)>>;
228type TextChangeCallbacks = RefCell<Vec<fn(usize, usize, usize)>>;
229
230#[derive(Clone, Debug)]
231pub(crate) struct ElementManager {
232 self_weak: RefCell<Weak<ElementManager>>,
233 text_change_callbacks: TextChangeCallbacks,
234 element_change_callbacks: ElementChangeCallbacks,
235 tree_model: RefCell<TreeModel>,
236}
237
238impl PartialEq for ElementManager {
239 fn eq(&self, other: &Self) -> bool {
240 self.tree_model == other.tree_model
241 }
242}
243
244impl ElementManager {
245 pub(crate) fn new_rc() -> Rc<Self> {
246 let rc = Rc::new(Self {
247 tree_model: Default::default(),
248 self_weak: RefCell::new(Weak::new()),
249 text_change_callbacks: Default::default(),
250 element_change_callbacks: Default::default(),
251 });
252 let new_self_weak = RefCell::new(Rc::downgrade(&rc));
253 rc.self_weak.swap(&new_self_weak);
254 rc
255 }
256
257 pub(crate) fn create_root_frame(element_manager: Rc<ElementManager>) -> Rc<Frame> {
259 let new_frame = Rc::new(Frame::new(Rc::downgrade(&element_manager)));
260
261 let new_element = Element::FrameElement(new_frame.clone());
262
263 let mut tree_model = element_manager.tree_model.borrow_mut();
264 tree_model.set_root_element(new_element);
265
266 let new_block = Rc::new(Block::new(Rc::downgrade(&element_manager)));
269
270 let new_block_element = Element::BlockElement(new_block);
271
272 let block_uuid = tree_model.insert_as_child(0, new_block_element).unwrap();
273
274 let new_text = Rc::new(Text::new(Rc::downgrade(&element_manager)));
277
278 let new_text_element = Element::TextElement(new_text);
279
280 tree_model
281 .insert_as_child(block_uuid, new_text_element)
282 .unwrap();
283
284 tree_model.recalculate_sort_order();
285
286 new_frame
287 }
288
289 fn create_empty_root_frame(&self) -> Rc<Frame> {
290 let new_frame = Rc::new(Frame::new(self.self_weak.borrow().clone()));
291
292 let new_element = Element::FrameElement(new_frame.clone());
293
294 self.tree_model.borrow_mut().set_root_element(new_element);
295 self.tree_model.borrow_mut().recalculate_sort_order();
296
297 new_frame
298 }
299
300 pub(crate) fn insert_new_frame(
301 &self,
302 target_uuid: usize,
303 insert_mode: InsertMode,
304 ) -> Result<Rc<Frame>, ModelError> {
305 let new_frame = Rc::new(Frame::new(self.self_weak.borrow().clone()));
306
307 let new_element = Element::FrameElement(new_frame.clone());
308
309 self.insert(new_element.clone(), target_uuid, insert_mode)?;
310 let parent_element = match self.get_parent_element(&new_element) {
312 Some(element) => element,
313 None => return Err(ModelError::ElementNotFound("No parent found".to_string())),
314 };
315 new_frame.verify_rule_with_parent(&parent_element)?;
316
317 self.tree_model.borrow_mut().recalculate_sort_order();
318
319 Ok(new_frame)
320 }
321
322 pub(crate) fn insert_new_block(
323 &self,
324 target_uuid: usize,
325 insert_mode: InsertMode,
326 ) -> Result<Rc<Block>, ModelError> {
327 let new_block = Rc::new(Block::new(self.self_weak.borrow().clone()));
328
329 let new_element = Element::BlockElement(new_block.clone());
330
331 self.insert(new_element.clone(), target_uuid, insert_mode)?;
332 let parent_element = match self.get_parent_element(&new_element) {
334 Some(element) => element,
335 None => return Err(ModelError::ElementNotFound("No parent found".to_string())),
336 };
337 new_block.verify_rule_with_parent(&parent_element)?;
338
339 self.tree_model.borrow_mut().recalculate_sort_order();
340
341 Ok(new_block)
342 }
343
344 pub(crate) fn insert_new_text(
345 &self,
346 target_uuid: usize,
347 insert_mode: InsertMode,
348 ) -> Result<Rc<Text>, ModelError> {
349 let new_text = Rc::new(Text::new(self.self_weak.borrow().clone()));
350
351 let new_element = Element::TextElement(new_text.clone());
352
353 self.insert(new_element.clone(), target_uuid, insert_mode)?;
354 let parent_element = match self.get_parent_element(&new_element) {
356 Some(element) => element,
357 None => return Err(ModelError::ElementNotFound("No parent found".to_string())),
358 };
359 new_text.verify_rule_with_parent(&parent_element)?;
360 self.tree_model.borrow_mut().recalculate_sort_order();
361
362 Ok(new_text)
363 }
364
365 pub(crate) fn insert_new_image(
366 &self,
367 target_uuid: usize,
368 insert_mode: InsertMode,
369 ) -> Result<Rc<Image>, ModelError> {
370 let new_image = Rc::new(Image::new(self.self_weak.borrow().clone()));
371
372 let new_element = Element::ImageElement(new_image.clone());
373
374 self.insert(new_element.clone(), target_uuid, insert_mode)?;
375 let parent_element = match self.get_parent_element(&new_element) {
377 Some(element) => element,
378 None => return Err(ModelError::ElementNotFound("No parent found".to_string())),
379 };
380 new_image.verify_rule_with_parent(&parent_element)?;
381 self.tree_model.borrow_mut().recalculate_sort_order();
382
383 Ok(new_image)
384 }
385
386 pub(crate) fn insert(
387 &self,
388 element: Element,
389 target_uuid: usize,
390 insert_mode: InsertMode,
391 ) -> Result<usize, ModelError> {
392 let mut tree_model = self.tree_model.borrow_mut();
393
394 match insert_mode {
395 InsertMode::Before => tree_model.insert_before(target_uuid, element),
396 InsertMode::After => tree_model.insert_after(target_uuid, element),
397 InsertMode::AsChild => tree_model.insert_as_child(target_uuid, element),
398 }
399 }
400
401 pub(crate) fn remove(&self, uuid_list: Vec<usize>) {
403 if uuid_list.contains(&0) {
404 self.clear();
405 } else {
406 let mut tree_model = self.tree_model.borrow_mut();
407 uuid_list.iter().for_each(|uuid| {
408 tree_model.remove_recursively(*uuid).unwrap_or_default();
409 });
410 }
411 }
412
413 pub(crate) fn block_count(&self) -> usize {
415 let mut counter = 0;
416 let tree_model = self.tree_model.borrow();
417 tree_model.iter().for_each(|element| {
418 counter += match element {
419 BlockElement(_) => 1,
420 _ => 0,
421 }
422 });
423 counter
424 }
425
426 pub(crate) fn block_list(&self) -> Vec<Rc<Block>> {
427 let tree_model = self.tree_model.borrow();
428
429 tree_model
430 .iter()
431 .filter_map(|x| match x {
432 BlockElement(block) => Some(block.clone()),
433 _ => None,
434 })
435 .collect()
436 }
437
438 pub(crate) fn find_common_ancestor(
440 &self,
441 first_element_uuid: usize,
442 second_element_uuid: usize,
443 ) -> ElementUuid {
444 let tree_model = self.tree_model.borrow();
445
446 tree_model.find_common_ancestor(first_element_uuid, second_element_uuid)
447 }
448
449 pub(crate) fn find_ancestor_of_first_which_is_sibling_of_second(
451 &self,
452 first_element_uuid: ElementUuid,
453 second_element_uuid: ElementUuid,
454 ) -> Option<ElementUuid> {
455 let tree_model = self.tree_model.borrow();
456
457 tree_model.find_ancestor_of_first_which_is_sibling_of_second(
458 first_element_uuid,
459 second_element_uuid,
460 )
461 }
462
463 pub(crate) fn root_frame(&self) -> Rc<Frame> {
464 let tree_model = self.tree_model.borrow();
465 let element = tree_model.get_root_element().unwrap();
466
467 if let Element::FrameElement(c) = element {
468 c.clone()
469 } else {
470 unreachable!()
471 }
472 }
473
474 pub(crate) fn find_block(&self, position: usize) -> Option<Rc<Block>> {
475 for rc_block in self.block_list() {
476 if (rc_block.position()..=rc_block.end()).contains(&position) {
477 return Some(rc_block);
478 }
479 }
480
481 None
482 }
483
484 pub(crate) fn get_parent_frame(&self, element: &Element) -> Option<Rc<Frame>> {
485 let child_uuid = self.get_element_uuid(element);
486
487 let tree_model = self.tree_model.borrow();
488 let parent_uuid = tree_model.get_parent_uuid(child_uuid)?;
489
490 let parent_element = tree_model.get(parent_uuid)?;
491
492 match parent_element {
493 FrameElement(frame_rc) => Some(frame_rc.clone()),
494 BlockElement(_) => None,
495 TextElement(_) => None,
496 ImageElement(_) => None,
497 }
498 }
499
500 pub(crate) fn get_parent_element(&self, element: &Element) -> Option<Element> {
501 let child_uuid = self.get_element_uuid(element);
502
503 self.get_parent_element_using_uuid(child_uuid)
504 }
505
506 pub(crate) fn get_parent_element_using_uuid(&self, uuid: ElementUuid) -> Option<Element> {
507 let tree_model = self.tree_model.borrow();
508 let parent_uuid = tree_model.get_parent_uuid(uuid)?;
509
510 tree_model.get(parent_uuid).cloned()
511 }
512
513 pub(crate) fn get_element_uuid(&self, element: &Element) -> usize {
515 match element {
516 FrameElement(frame_rc) => frame_rc.uuid(),
517 BlockElement(block_rc) => block_rc.uuid(),
518 TextElement(text_rc) => text_rc.uuid(),
519 ImageElement(image_rc) => image_rc.uuid(),
520 }
521 }
522
523 pub(crate) fn get_level(&self, uuid: usize) -> usize {
524 let tree_model = self.tree_model.borrow();
525 tree_model.get_level(uuid)
526 }
527 pub(crate) fn recalculate_sort_order(&self) {
528 let mut tree_model = self.tree_model.borrow_mut();
529 tree_model.recalculate_sort_order();
530 }
531
532 pub(crate) fn previous_element(&self, uuid: usize) -> Option<Element> {
533 let tree_model = self.tree_model.borrow();
534 tree_model
535 .iter()
536 .take_while(|element| element.uuid() != uuid)
537 .last()
538 .cloned()
539 }
540
541 pub(crate) fn next_element(&self, uuid: usize) -> Option<Element> {
542 let tree_model = self.tree_model.borrow();
543 tree_model
544 .iter()
545 .skip_while(|element| element.uuid() != uuid)
546 .nth(1)
547 .cloned()
548 }
549
550 pub(crate) fn get_element_order(&self, element: Element) -> Option<usize> {
552 let tree_model = self.tree_model.borrow();
553 let target_uuid = self.get_element_uuid(&element);
554
555 tree_model.get_sort_order(target_uuid)
556 }
557
558 pub(crate) fn get(&self, uuid: usize) -> Option<Element> {
560 let tree_model = self.tree_model.borrow();
561 tree_model.get(uuid).cloned()
562 }
563
564 pub(crate) fn find_frame(&self, position: usize) -> Option<Rc<Frame>> {
565 let block = self
566 .block_list()
567 .into_iter()
568 .find(|rc_block| (rc_block.position()..rc_block.end()).contains(&position));
569
570 match block {
571 Some(block_rc) => self.get_parent_frame(&BlockElement(block_rc)),
572 None => None,
573 }
574 }
575
576 pub(crate) fn last_block(&self) -> Option<Rc<Block>> {
577 self.block_list().last().cloned()
578 }
579
580 pub(crate) fn first_block(&self) -> Option<Rc<Block>> {
581 self.block_list().first().cloned()
582 }
583
584 pub(crate) fn list_all_children(&self, uuid: usize) -> Vec<Element> {
586 let tree_model = self.tree_model.borrow();
587 let children = tree_model.list_all_children(uuid);
588
589 children
590 .iter()
591 .filter_map(|element_uuid| self.get(*element_uuid))
592 .collect()
593 }
594
595 pub(crate) fn list_all_direct_children(&self, uuid: usize) -> Vec<Element> {
597 let tree_model = self.tree_model.borrow();
598 let children = tree_model.list_all_direct_children(uuid);
599
600 children
601 .iter()
602 .filter_map(|element_uuid| self.get(*element_uuid))
603 .collect()
604 }
605
606 pub(crate) fn clear(&self) {
608 {
609 let mut tree_model = self.tree_model.borrow_mut();
610 tree_model.clear();
611 }
612
613 ElementManager::create_root_frame(self.self_weak.borrow().upgrade().unwrap());
614 }
615
616 pub(crate) fn fill_empty_frames(&self) {
617 let tree_model = self.tree_model.borrow();
619 let empty_frames: Vec<ElementUuid> = tree_model
620 .iter()
621 .filter_map(|element| match element {
622 FrameElement(frame) => {
623 if !tree_model.has_children(frame.uuid()) {
624 Some(frame.uuid())
625 } else {
626 None
627 }
628 }
629 _ => None,
630 })
631 .collect();
632
633 for frame_uuid in empty_frames {
635 let block = self
636 .insert_new_block(frame_uuid, InsertMode::AsChild)
637 .unwrap();
638 self.insert_new_text(block.uuid(), InsertMode::AsChild)
639 .unwrap();
640 }
641 }
642
643 pub(crate) fn debug_elements(&self) {
644 let mut indent_with_string = vec![(0, 0, 0, "------------\n".to_string())];
645
646 println!("debug_elements");
647 let tree_model = self.tree_model.borrow();
648
649 tree_model.iter().for_each(|element| {
650 match element {
651 FrameElement(frame) => indent_with_string.push((
652 tree_model.get_level(frame.uuid()),
653 frame.uuid(),
654 tree_model.get_sort_order(frame.uuid()).unwrap(),
655 "frame".to_string(),
656 )),
657 BlockElement(block) => indent_with_string.push((
658 tree_model.get_level(block.uuid()),
659 block.uuid(),
660 tree_model.get_sort_order(block.uuid()).unwrap(),
661 "block".to_string(),
662 )),
663 TextElement(text) => indent_with_string.push((
664 tree_model.get_level(text.uuid()),
665 text.uuid(),
666 tree_model.get_sort_order(text.uuid()).unwrap(),
667 "text".to_string(),
668 )),
669 ImageElement(image) => indent_with_string.push((
670 tree_model.get_level(image.uuid()),
671 image.uuid(),
672 tree_model.get_sort_order(image.uuid()).unwrap(),
673 "[image]".to_string(),
674 )),
675 };
676 });
677
678 indent_with_string
679 .iter()
680 .for_each(|(indent, uuid, sort_order, string)| {
681 println!(
682 "{}{} {} \'{}\'",
683 " ".repeat(*indent),
684 *uuid,
685 *sort_order,
686 string.as_str()
687 )
688 });
689 indent_with_string.clear();
690
691 tree_model.iter().for_each(|element| {
692 match element {
693 FrameElement(frame) => indent_with_string.push((
694 tree_model.get_level(frame.uuid()),
695 frame.uuid(),
696 tree_model.get_sort_order(frame.uuid()).unwrap(),
697 "frame".to_string(),
698 )),
699 BlockElement(block) => indent_with_string.push((
700 tree_model.get_level(block.uuid()),
701 block.uuid(),
702 tree_model.get_sort_order(block.uuid()).unwrap(),
703 "block ".to_string() + &block.plain_text(),
704 )),
705 TextElement(text) => indent_with_string.push((
706 tree_model.get_level(text.uuid()),
707 text.uuid(),
708 tree_model.get_sort_order(text.uuid()).unwrap(),
709 "text ".to_string() + &text.plain_text(),
710 )),
711 ImageElement(image) => indent_with_string.push((
712 tree_model.get_level(image.uuid()),
713 image.uuid(),
714 tree_model.get_sort_order(image.uuid()).unwrap(),
715 "[image] ".to_string() + &image.plain_text(),
716 )),
717 };
718 });
719
720 indent_with_string
721 .iter()
722 .for_each(|(indent, uuid, sort_order, string)| {
723 println!(
724 "{}{} {} \'{}\'",
725 " ".repeat(*indent),
726 *uuid,
727 *sort_order,
728 string.as_str()
729 )
730 });
731 }
732
733 pub(crate) fn signal_for_text_change(
735 &self,
736 position: usize,
737 removed_characters: usize,
738 added_character: usize,
739 ) {
740 self.text_change_callbacks
741 .borrow()
742 .iter()
743 .for_each(|callback| callback(position, removed_characters, added_character));
744 }
745
746 pub(self) fn add_text_change_callback(&self, callback: fn(usize, usize, usize)) {
748 self.text_change_callbacks.borrow_mut().push(callback);
749 }
750
751 pub(crate) fn signal_for_element_change(&self, changed_element: Element, reason: ChangeReason) {
753 self.element_change_callbacks
754 .borrow()
755 .iter()
756 .for_each(|callback| callback(changed_element.clone(), reason));
757 }
758
759 pub(self) fn add_element_change_callback(&self, callback: fn(Element, ChangeReason)) {
761 self.element_change_callbacks.borrow_mut().push(callback);
762 }
763
764 pub(crate) fn move_while_changing_parent(
765 &self,
766 uuid_to_move: usize,
767 new_parent_uuid: usize,
768 ) -> Result<(), ModelError> {
769 let mut tree_model = self.tree_model.borrow_mut();
770 tree_model.move_while_changing_parent(uuid_to_move, new_parent_uuid)
771 }
772}
773
774#[derive(Default, PartialEq, Clone, Debug)]
775struct TreeModel {
776 id_with_element_hash: HashMap<usize, Element>,
777 order_with_id_map: BTreeMap<usize, usize>,
778 child_id_with_parent_id_hash: HashMap<usize, usize>,
779 id_counter: usize,
780}
781
782impl TreeModel {
783 const STEP: usize = 1000;
784
785 pub(crate) fn new() -> Self {
786 Self {
787 id_with_element_hash: Default::default(),
788 order_with_id_map: Default::default(),
789 child_id_with_parent_id_hash: Default::default(),
790 id_counter: Default::default(),
791 }
792 }
793 pub(crate) fn recalculate_sort_order(&mut self) {
795 let mut new_order = 0;
796
797 let mut new_map: BTreeMap<usize, usize> = BTreeMap::new();
798
799 for (_order, id) in self.order_with_id_map.iter() {
800 new_map.insert(new_order, *id);
801 new_order += Self::STEP;
802 }
803
804 self.order_with_id_map = new_map;
805 }
806
807 fn iter(&self) -> TreeIter {
808 TreeIter::new(self)
809 }
810
811 fn get_new_uuid(&mut self) -> usize {
812 self.id_counter += 1;
813 self.id_counter
814 }
815
816 fn number_of_ancestors(&self, child_id: &usize) -> usize {
817 let mut number_of_ancestors: usize = 0;
818 let mut loop_child_id = child_id;
819
820 loop {
821 match self.child_id_with_parent_id_hash.get(loop_child_id) {
822 Some(parent) => match parent {
823 0 => {
824 number_of_ancestors += 1;
825 break;
826 }
827
828 _ => {
829 number_of_ancestors += 1;
830 loop_child_id = parent;
831 }
832 },
833 None => unreachable!(),
834 }
835 }
836 number_of_ancestors
837 }
838
839 pub(self) fn set_root_element(&mut self, element: Element) {
840 self.clear();
841
842 self.id_with_element_hash.insert(0, element);
843 self.order_with_id_map.insert(0, 0);
844 self.child_id_with_parent_id_hash.insert(0, 0);
845
846 self.recalculate_sort_order();
847 }
848
849 pub(self) fn insert_after(
850 &mut self,
851 sibling_uuid: usize,
852 mut element: Element,
853 ) -> Result<usize, ModelError> {
854 if sibling_uuid == self.get_root_element().unwrap().uuid() {
855 return Err(ModelError::ForbiddenOperation(
856 "can't add by root element".to_string(),
857 ));
858 }
859 if self.get_parent_uuid(sibling_uuid).is_none() {
860 return Err(ModelError::ElementNotFound("no parent element".to_string()));
861 }
862 let parent_uuid = match self.get_parent_uuid(sibling_uuid) {
863 Some(parent_uuid) => parent_uuid,
864 None => unreachable!(),
865 };
866
867 let safe_sort_order = match self.get_next_sibling(sibling_uuid) {
870 Some(next_sibling_id) => match self.get_sort_order(next_sibling_id) {
871 Some(sort_order) => sort_order - 1,
872 None => unreachable!(),
873 },
874 None => {
876 let parent_level = self.get_level(parent_uuid);
877 let next_items: Vec<(&usize, &usize)> = self
878 .order_with_id_map
879 .iter()
880 .skip_while(|(&_order, &id)| parent_uuid != id)
882 .skip(1)
883 .skip_while(|(&_order, &id)| self.get_level(id) > parent_level)
884 .collect();
885 match next_items.first() {
886 Some(item) => {
887 if *item.0 == 0 {
888 usize::MAX - Self::STEP
889 } else {
890 item.0 - 1
891 }
892 }
893 None => usize::MAX - Self::STEP,
895 }
896 }
897 };
898
899 let new_uuid = self.get_new_uuid();
900 element.set_uuid(new_uuid);
901
902 self.id_with_element_hash.insert(new_uuid, element);
903 self.order_with_id_map.insert(safe_sort_order, new_uuid);
904 self.child_id_with_parent_id_hash
905 .insert(new_uuid, parent_uuid);
906
907 self.recalculate_sort_order();
908 Ok(new_uuid)
909 }
910
911 pub(self) fn insert_before(
912 &mut self,
913 sibling_uuid: usize,
914 mut element: Element,
915 ) -> Result<usize, ModelError> {
916 if sibling_uuid == self.get_root_element().unwrap().uuid() {
917 return Err(ModelError::ForbiddenOperation(
918 "can't add by root element".to_string(),
919 ));
920 }
921
922 if self.get_parent_uuid(sibling_uuid).is_none() {
923 return Err(ModelError::ElementNotFound("no parent element".to_string()));
924 }
925
926 let parent_uuid = match self.get_parent_uuid(sibling_uuid) {
927 Some(parent_uuid) => parent_uuid,
928 None => unreachable!(),
929 };
930
931 let safe_sort_order = match self.get_sort_order(sibling_uuid) {
932 Some(sort_order) => sort_order - 1,
933 None => unreachable!(),
934 };
935
936 let new_uuid = self.get_new_uuid();
937 element.set_uuid(new_uuid);
938
939 self.id_with_element_hash.insert(new_uuid, element);
940 self.order_with_id_map.insert(safe_sort_order, new_uuid);
941 self.child_id_with_parent_id_hash
942 .insert(new_uuid, parent_uuid);
943
944 self.recalculate_sort_order();
945 Ok(new_uuid)
946 }
947
948 pub(self) fn insert_as_child(
950 &mut self,
951 parent_uuid: usize,
952 mut element: Element,
953 ) -> Result<usize, ModelError> {
954 let safe_sort_order = match self.get_next_sibling(parent_uuid) {
957 Some(next_sibling_id) => match self.get_sort_order(next_sibling_id) {
958 Some(sort_order) => sort_order - 1,
959 None => unreachable!(),
960 },
961 None => {
963 let parent_level = self.get_level(parent_uuid);
964 let next_items: Vec<(&usize, &usize)> = self
965 .order_with_id_map
966 .iter()
967 .skip_while(|(_order, id)| parent_uuid != **id)
968 .skip_while(|(_order, id)| self.get_level(**id) >= parent_level)
969 .collect();
970 match next_items.first() {
971 Some(item) => item.0 - 1,
972 None => usize::MAX - Self::STEP,
974 }
975 }
976 };
977
978 let new_uuid = self.get_new_uuid();
979 element.set_uuid(new_uuid);
980
981 self.id_with_element_hash.insert(new_uuid, element);
982 self.order_with_id_map.insert(safe_sort_order, new_uuid);
983 self.child_id_with_parent_id_hash
984 .insert(new_uuid, parent_uuid);
985
986 self.recalculate_sort_order();
987 Ok(new_uuid)
988 }
989
990 fn get_next_sibling(&self, uuid: usize) -> Option<usize> {
991 let parent_uuid = self.get_parent_uuid(uuid)?;
992
993 let siblings: Vec<&usize> = self
994 .child_id_with_parent_id_hash
995 .iter()
996 .filter_map(|(child_id, parent_id)| {
997 if *parent_id == parent_uuid && uuid != *child_id && *child_id != 0 {
998 Some(child_id)
999 } else {
1000 None
1001 }
1002 })
1003 .collect();
1004
1005 if siblings.is_empty() {
1006 return None;
1007 }
1008
1009 let next_sibling = self
1010 .order_with_id_map
1011 .iter()
1012 .skip_while(|(_order, id)| *id != &uuid)
1013 .skip(1)
1014 .find(|(_order, id)| siblings.contains(&id))?;
1015
1016 Some(next_sibling.1.to_owned())
1017 }
1018
1019 pub(self) fn remove_recursively(
1024 &mut self,
1025 uuid: ElementUuid,
1026 ) -> Result<Vec<ElementUuid>, ModelError> {
1027 let mut uuids_to_remove = self.list_all_children(uuid);
1028 uuids_to_remove.push(uuid);
1029
1030 for element_uuid in &uuids_to_remove {
1031 self.remove(*element_uuid)?;
1032 }
1033
1034 Ok(uuids_to_remove)
1035 }
1036
1037 fn remove(&mut self, uuid: ElementUuid) -> Result<ElementUuid, ModelError> {
1038 let id = self
1039 .order_with_id_map
1040 .remove_entry(
1041 &self
1042 .get_sort_order(uuid)
1043 .ok_or_else(|| ModelError::ElementNotFound(uuid.to_string()))?,
1044 )
1045 .ok_or_else(|| ModelError::ElementNotFound(uuid.to_string()))?
1046 .1;
1047
1048 self.child_id_with_parent_id_hash
1049 .remove_entry(&uuid)
1050 .ok_or_else(|| ModelError::ElementNotFound(uuid.to_string()))?;
1051
1052 self.id_with_element_hash
1053 .remove_entry(&uuid)
1054 .ok_or_else(|| ModelError::ElementNotFound(uuid.to_string()))?;
1055
1056 Ok(id)
1057 }
1058
1059 pub(self) fn list_all_children(&self, uuid: usize) -> Vec<usize> {
1060 let element_level = self.get_level(uuid);
1061
1062 self.iter()
1063 .skip_while(|element| element.uuid() != uuid)
1064 .skip(1)
1066 .take_while(|element| element_level < self.get_level(element.uuid()))
1068 .map(|element| element.uuid())
1069 .collect()
1070 }
1071
1072 pub(self) fn list_all_direct_children(&self, uuid: usize) -> Vec<usize> {
1073 let unordered_child_list: Vec<usize> = self
1074 .child_id_with_parent_id_hash
1075 .iter()
1076 .filter_map(|(child_id, parent_id)| {
1077 if *parent_id == uuid && *child_id != 0 {
1078 Some(*child_id)
1079 } else {
1080 None
1081 }
1082 })
1083 .collect();
1084
1085 let ordered_child_list: Vec<usize> = self
1086 .order_with_id_map
1087 .iter()
1088 .filter_map(|(_order, id)| {
1089 if unordered_child_list.contains(id) {
1090 Some(*id)
1091 } else {
1092 None
1093 }
1094 })
1095 .collect();
1096
1097 ordered_child_list
1098 }
1099
1100 fn get_parent_uuid(&self, uuid: usize) -> Option<usize> {
1101 if uuid == 0 {
1103 return None;
1104 }
1105
1106 self.child_id_with_parent_id_hash.get(&uuid).copied()
1107 }
1108
1109 fn get_level(&self, uuid: usize) -> usize {
1110 let mut child_id = uuid;
1111 let mut level = 0;
1112
1113 while let Some(&parent_id) = self.child_id_with_parent_id_hash.get(&child_id) {
1114 if child_id == 0 {
1115 break;
1116 }
1117
1118 child_id = parent_id;
1119 level += 1;
1120 }
1121
1122 level
1123 }
1124
1125 pub(self) fn find_ancestor_of_first_which_is_sibling_of_second(
1127 &self,
1128 first_element_uuid: ElementUuid,
1129 second_element_uuid: ElementUuid,
1130 ) -> Option<ElementUuid> {
1131 let mut ancestors_of_first_element: Vec<usize> = Vec::new();
1132
1133 let mut child_id = first_element_uuid;
1134
1135 while let Some(&parent_id) = self.child_id_with_parent_id_hash.get(&child_id) {
1137 if child_id == 0 {
1138 break;
1139 }
1140 ancestors_of_first_element.push(parent_id);
1141
1142 child_id = parent_id;
1143 }
1144
1145 let second_element_all_siblings = self.get_all_siblings(second_element_uuid);
1148
1149 let sibling = ancestors_of_first_element.intersect(second_element_all_siblings);
1150
1151 sibling.first().copied()
1152 }
1153
1154 pub(self) fn get_all_siblings(&self, uuid: ElementUuid) -> Vec<ElementUuid> {
1155 let parent_uuid = match self.get_parent_uuid(uuid) {
1156 Some(parent_uuid) => parent_uuid,
1157 None => return Vec::new(),
1158 };
1159
1160 self.child_id_with_parent_id_hash
1161 .iter()
1162 .filter_map(|(child_id, parent_id)| {
1163 match *parent_id == parent_uuid && *child_id != uuid {
1164 true => Some(*child_id),
1165 false => None,
1166 }
1167 })
1168 .collect()
1169 }
1170
1171 pub(self) fn find_common_ancestor(
1173 &self,
1174 first_element_uuid: ElementUuid,
1175 second_element_uuid: ElementUuid,
1176 ) -> ElementUuid {
1177 let mut ancestors_of_first_element: Vec<usize> = Vec::new();
1178
1179 let mut child_id = first_element_uuid;
1180
1181 while let Some(&parent_id) = self.child_id_with_parent_id_hash.get(&child_id) {
1183 if child_id == 0 {
1184 break;
1185 }
1186 ancestors_of_first_element.push(parent_id);
1187
1188 child_id = parent_id;
1189 }
1190
1191 let mut ancestors_of_second_element: Vec<usize> = Vec::new();
1193 child_id = second_element_uuid;
1194
1195 while let Some(&parent_id) = self.child_id_with_parent_id_hash.get(&child_id) {
1196 if child_id == 0 {
1197 break;
1198 }
1199 ancestors_of_second_element.push(parent_id);
1200
1201 child_id = parent_id;
1202 }
1203
1204 let common_ancestors = ancestors_of_first_element.intersect(ancestors_of_second_element);
1207
1208 *common_ancestors.first().unwrap()
1209 }
1210
1211 pub(self) fn move_while_changing_parent(
1213 &mut self,
1214 uuid_to_move: usize,
1215 new_parent_uuid: usize,
1216 ) -> Result<(), ModelError> {
1217 self.child_id_with_parent_id_hash
1219 .iter_mut()
1220 .find_map(|(child_id, parent_id)| {
1221 if *child_id == uuid_to_move {
1222 *parent_id = new_parent_uuid;
1223 Some(parent_id)
1224 } else {
1225 None
1226 }
1227 });
1228
1229 let old_order = *self
1232 .order_with_id_map
1233 .iter()
1234 .find(|(&_order, &iter_uuid)| iter_uuid == uuid_to_move)
1235 .ok_or_else(|| ModelError::ElementNotFound("parent not found".to_string()))?
1236 .0;
1237
1238 let new_order = self
1239 .order_with_id_map
1240 .iter()
1241 .find(|(&_order, &iter_uuid)| iter_uuid == new_parent_uuid)
1242 .ok_or_else(|| ModelError::ElementNotFound("parent not found".to_string()))?
1243 .0
1244 + 1;
1245
1246 self.order_with_id_map.remove(&old_order);
1247
1248 self.order_with_id_map.insert(new_order, uuid_to_move);
1249
1250 self.recalculate_sort_order();
1251
1252 Ok(())
1253 }
1254
1255 pub(self) fn get(&self, uuid: usize) -> Option<&Element> {
1256 self.id_with_element_hash.get(&uuid)
1257 }
1258
1259 pub(self) fn get_root_element(&self) -> Option<&Element> {
1260 self.id_with_element_hash.get(&0)
1261 }
1262
1263 fn get_sort_order(&self, uuid: usize) -> Option<usize> {
1264 self.order_with_id_map
1265 .iter()
1266 .find(|(&_order, &iter_uuid)| iter_uuid == uuid)
1267 .map(|pair| *pair.0)
1268 }
1269
1270 pub(crate) fn clear(&mut self) {
1271 self.child_id_with_parent_id_hash.clear();
1272 self.order_with_id_map.clear();
1273 self.id_with_element_hash.clear();
1274 self.id_counter = 0;
1275 }
1276
1277 pub(crate) fn has_children(&self, uuid: ElementUuid) -> bool {
1278 let level = self.get_level(uuid);
1279
1280 match self
1281 .order_with_id_map
1282 .iter()
1283 .skip_while(|(&_order, &iter_uuid)| iter_uuid != uuid)
1284 .nth(1)
1285 {
1286 Some((_order, id)) => level < self.get_level(*id),
1287 None => false,
1288 }
1289 }
1290}
1291
1292struct TreeIter<'a> {
1293 unvisited: Vec<&'a Element>,
1294}
1295
1296impl<'a> TreeIter<'a> {
1297 fn new(tree: &'a TreeModel) -> Self {
1298 let ordered_elements = tree
1299 .order_with_id_map
1300 .iter()
1301 .rev()
1302 .map(|(_order, id)| -> &Element { tree.id_with_element_hash.get(id).unwrap() })
1303 .collect();
1304
1305 TreeIter {
1306 unvisited: ordered_elements,
1307 }
1308 }
1309}
1310
1311impl<'a> Iterator for TreeIter<'a> {
1312 type Item = &'a Element;
1313
1314 fn next(&mut self) -> Option<Self::Item> {
1315 let element = self.unvisited.pop()?;
1316
1317 Some(element)
1318 }
1319}
1320
1321#[derive(Clone, PartialEq, Debug)]
1322pub enum Element {
1323 FrameElement(Rc<Frame>),
1324 BlockElement(Rc<Block>),
1325 TextElement(Rc<Text>),
1326 ImageElement(Rc<Image>),
1327}
1328
1329impl Element {
1330 pub(crate) fn set_uuid(&mut self, uuid: usize) {
1331 match self {
1332 Element::FrameElement(rc_frame) => rc_frame.set_uuid(uuid),
1333 Element::BlockElement(rc_block) => rc_block.set_uuid(uuid),
1334 Element::TextElement(rc_text) => rc_text.set_uuid(uuid),
1335 Element::ImageElement(rc_image) => rc_image.set_uuid(uuid),
1336 }
1337 }
1338 pub fn uuid(&self) -> usize {
1339 match self {
1340 Element::FrameElement(rc_frame) => rc_frame.uuid(),
1341 Element::BlockElement(rc_block) => rc_block.uuid(),
1342 Element::TextElement(rc_text) => rc_text.uuid(),
1343 Element::ImageElement(rc_image) => rc_image.uuid(),
1344 }
1345 }
1346 pub fn text_length(&self) -> usize {
1347 match self {
1348 Element::FrameElement(rc_frame) => rc_frame.text_length(),
1349 Element::BlockElement(rc_block) => rc_block.text_length(),
1350 Element::TextElement(rc_text) => rc_text.text_length(),
1351 Element::ImageElement(rc_image) => rc_image.text_length(),
1352 }
1353 }
1354 pub fn end_of_element(&self) -> usize {
1355 match self {
1356 Element::FrameElement(rc_frame) => rc_frame.end(),
1357 Element::BlockElement(rc_block) => rc_block.end(),
1358 Element::TextElement(rc_text) => rc_text.end(),
1359 Element::ImageElement(rc_image) => rc_image.end(),
1360 }
1361 }
1362
1363 pub fn start_of_element(&self) -> usize {
1364 match self {
1365 Element::FrameElement(rc_frame) => rc_frame.start(),
1366 Element::BlockElement(rc_block) => rc_block.start(),
1367 Element::TextElement(rc_text) => rc_text.start(),
1368 Element::ImageElement(rc_image) => rc_image.start(),
1369 }
1370 }
1371
1372 pub fn is_block(&self) -> bool {
1373 matches!(self, Element::BlockElement(_))
1374 }
1375 pub fn get_block(&self) -> Option<Rc<Block>> {
1376 match self {
1377 Element::BlockElement(block) => Some(block.clone()),
1378 _ => None,
1379 }
1380 }
1381
1382 pub fn is_frame(&self) -> bool {
1383 matches!(self, Element::FrameElement(_))
1384 }
1385 pub fn get_frame(&self) -> Option<Rc<Frame>> {
1386 match self {
1387 Element::FrameElement(frame) => Some(frame.clone()),
1388 _ => None,
1389 }
1390 }
1391
1392 pub fn is_text(&self) -> bool {
1393 matches!(self, Element::TextElement(_))
1394 }
1395 pub fn get_text(&self) -> Option<Rc<Text>> {
1396 match self {
1397 Element::TextElement(text) => Some(text.clone()),
1398 _ => None,
1399 }
1400 }
1401
1402 pub fn is_image(&self) -> bool {
1403 matches!(self, Element::ImageElement(_))
1404 }
1405 pub fn get_image(&self) -> Option<Rc<Image>> {
1406 match self {
1407 Element::ImageElement(image) => Some(image.clone()),
1408 _ => None,
1409 }
1410 }
1411}
1412
1413#[cfg(test)]
1414mod tests_element {
1415 use std::rc::{Rc, Weak};
1416
1417 use crate::Block;
1418 use crate::Element::BlockElement;
1419
1420 #[test]
1421 fn get() {
1422 let element = BlockElement(Rc::new(Block::new(Weak::new())));
1423 assert!(element.is_block());
1424 assert!(!element.is_image());
1425 assert!(!element.is_frame());
1426 assert!(!element.is_text());
1427 }
1428}
1429
1430#[derive(Clone, Copy, PartialEq, Eq, Debug)]
1431pub enum ChangeReason {
1432 FormatChanged,
1434 ContentChanged,
1436 InternalStructureChanged,
1438 ChildrenChanged,
1440}
1441
1442pub(crate) trait ElementTrait {
1443 fn set_uuid(&self, uuid: usize);
1444 fn verify_rule_with_parent(&self, parent_element: &Element) -> Result<(), ModelError>;
1445}
1446
1447#[derive(Error, Debug)]
1448pub enum ModelError {
1449 #[error("no element found with this id: `{0}`")]
1450 ElementNotFound(String),
1451 #[error("forbidden operation: `{0}`")]
1452 ForbiddenOperation(String),
1453 #[error("Outside text limits in an element")]
1454 OutsideElementBounds,
1455 #[error("wrong parent")]
1456 WrongParent,
1457 #[error("unknown error")]
1458 Unknown,
1459}
1460
1461#[cfg(test)]
1462mod tree_model_tests {
1463 use super::*;
1464
1465 #[test]
1466 fn ancestors() {
1467 let element_manager_rc = ElementManager::new_rc();
1468 ElementManager::create_root_frame(element_manager_rc.clone());
1469
1470 let block = element_manager_rc
1471 .insert_new_block(0, InsertMode::AsChild)
1472 .unwrap();
1473
1474 let tree_model = element_manager_rc.tree_model.borrow();
1475
1476 assert_eq!(tree_model.number_of_ancestors(&block.uuid()), 1);
1477 }
1478}
1479
1480#[cfg(test)]
1481mod document_tests {
1482 use super::*;
1483
1484 #[test]
1485 fn list_all_children() {
1486 let document = TextDocument::new();
1487 document.print_debug_elements();
1488
1489 let children = document.element_manager.list_all_children(0);
1490
1491 assert_eq!(children.len(), 2);
1492
1493 let children = document.element_manager.list_all_children(1);
1494 assert_eq!(children.len(), 1);
1495 }
1496
1497 #[test]
1498 fn list_all_direct_children() {
1499 let document = TextDocument::new();
1500 document.print_debug_elements();
1501
1502 let children = document.element_manager.list_all_direct_children(0);
1503
1504 assert_eq!(children.len(), 1);
1505
1506 let children = document.element_manager.list_all_children(1);
1507 assert_eq!(children.len(), 1);
1508
1509 document
1510 .element_manager
1511 .insert_new_block(0, InsertMode::AsChild)
1512 .expect("Insertion failed");
1513
1514 document
1515 .element_manager
1516 .insert_new_block(0, InsertMode::AsChild)
1517 .expect("Insertion failed");
1518
1519 document
1520 .element_manager
1521 .insert_new_block(0, InsertMode::AsChild)
1522 .expect("Insertion failed");
1523
1524 document.print_debug_elements();
1525
1526 let children = document.element_manager.list_all_direct_children(0);
1527
1528 assert_eq!(children.len(), 4);
1529 }
1530
1531 #[test]
1532 fn insert_new_block_as_child() {
1533 let document = TextDocument::new();
1534 document.print_debug_elements();
1535
1536 document
1538 .element_manager
1539 .insert_new_block(0, InsertMode::AsChild)
1540 .expect("Insertion failed");
1541 document.print_debug_elements();
1542 assert_eq!(document.last_block().upgrade().unwrap().uuid(), 3);
1543
1544 let children = document.element_manager.list_all_children(0);
1545 assert_eq!(children.len(), 3);
1546 }
1547
1548 #[test]
1549 fn find_block() {
1550 let mut document = TextDocument::new();
1551 document
1552 .set_plain_text("plain_text\nsecond\nthird")
1553 .unwrap();
1554 document.print_debug_elements();
1555
1556 let block = document.find_block(10).unwrap();
1557 assert_eq!(block.upgrade().unwrap().uuid(), 1);
1558 let block = document.find_block(11).unwrap();
1559 assert_eq!(block.upgrade().unwrap().uuid(), 3);
1560 let block = document.find_block(23).unwrap();
1561 assert_eq!(block.upgrade().unwrap().uuid(), 5);
1562 }
1563
1564 #[test]
1565 fn insert_new_block_before() {
1566 let document = TextDocument::new();
1567 document.print_debug_elements();
1568
1569 document
1571 .element_manager
1572 .insert_new_block(1, InsertMode::Before)
1573 .expect("Insertion failed");
1574 document.print_debug_elements();
1575 assert_eq!(document.last_block().upgrade().unwrap().uuid(), 1);
1576
1577 let children = document.element_manager.list_all_children(0);
1578 assert_eq!(children.len(), 3);
1579 }
1580
1581 #[test]
1582 fn insert_new_block_after() {
1583 let document = TextDocument::new();
1584 document.print_debug_elements();
1585
1586 document
1588 .element_manager
1589 .insert_new_block(1, InsertMode::After)
1590 .expect("Insertion failed");
1591 document.print_debug_elements();
1592 assert_eq!(document.last_block().upgrade().unwrap().uuid(), 3);
1593
1594 let children = document.element_manager.list_all_children(0);
1595 assert_eq!(children.len(), 3);
1596
1597 document
1599 .element_manager
1600 .insert_new_block(1, InsertMode::After)
1601 .expect("Insertion failed");
1602 document.print_debug_elements();
1603 assert_eq!(document.last_block().upgrade().unwrap().uuid(), 3);
1604
1605 let children = document.element_manager.list_all_children(0);
1606 assert_eq!(children.len(), 4);
1607 }
1608
1609 #[test]
1610 fn insert_new_block_after_in_frame() {
1611 let document = TextDocument::new();
1612 document.print_debug_elements();
1613
1614 document
1616 .element_manager
1617 .insert_new_block(1, InsertMode::After)
1618 .expect("Insertion failed");
1619 document.print_debug_elements();
1620 assert_eq!(document.last_block().upgrade().unwrap().uuid(), 3);
1621
1622 let frame = document
1623 .element_manager
1624 .insert_new_frame(0, InsertMode::AsChild)
1625 .unwrap();
1626
1627 document
1628 .element_manager
1629 .insert_new_block(frame.uuid(), InsertMode::After)
1630 .unwrap();
1631
1632 let block_in_frame = document
1635 .element_manager
1636 .insert_new_block(frame.uuid(), InsertMode::AsChild)
1637 .unwrap();
1638
1639 document.print_debug_elements();
1641
1642 let _second_block_in_frame = document
1643 .element_manager
1644 .insert_new_block(block_in_frame.uuid(), InsertMode::After)
1645 .unwrap();
1646
1647 document.print_debug_elements();
1648
1649 let children = document.element_manager.list_all_children(0);
1650 assert_eq!(children.len(), 7);
1651 }
1652}