list editor: create node with full type already instaed of calling morph after inserting the tail elements
This commit is contained in:
parent
efb4cd39da
commit
b97ba8dedb
2 changed files with 37 additions and 54 deletions
|
@ -268,18 +268,26 @@ impl ListEditor {
|
|||
}
|
||||
|
||||
/// split the list off at the current cursor position and return the second half
|
||||
pub fn split(&mut self) -> ListEditor {
|
||||
let mut le = ListEditor::new(
|
||||
Arc::new(RwLock::new(self.ctx.read().unwrap().clone())),
|
||||
self.typ.clone());
|
||||
|
||||
pub fn split(&mut self, le_node: &mut NestedNode) {
|
||||
let cur = self.cursor.get();
|
||||
if let Some(idx) = cur.idx {
|
||||
let idx = idx as usize;
|
||||
le_node.goto(TreeCursor::home());
|
||||
for _ in idx .. self.data.len() {
|
||||
le.data.push( self.data.get(idx) );
|
||||
|
||||
eprintln!("send items to new tail");
|
||||
le_node.cmd.get().unwrap().write().unwrap().send_cmd_obj(
|
||||
self.data.get(idx).read().unwrap().data.clone().unwrap()
|
||||
/*
|
||||
ReprTree::new_leaf(
|
||||
self.ctx.read().unwrap().type_term_from_str("( NestedNode )").unwrap(),
|
||||
SingletonBuffer::<NestedNode>::new( self.data.get(idx).clone().read().unwrap().clone() ).get_port().into()
|
||||
)
|
||||
*/
|
||||
);
|
||||
self.data.remove(idx);
|
||||
}
|
||||
le_node.goto(TreeCursor::none());
|
||||
|
||||
if self.is_listlist() {
|
||||
if idx > 0 && idx < self.data.len()+1 {
|
||||
|
@ -303,8 +311,6 @@ impl ListEditor {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
le
|
||||
}
|
||||
|
||||
/// append data of other editor at the end and set cursor accordingly
|
||||
|
@ -347,24 +353,35 @@ impl ListEditor {
|
|||
if let Some(item) = self.get_item() {
|
||||
// let item = item.read().unwrap();
|
||||
let depth = item.depth;
|
||||
|
||||
|
||||
if let Some(head_editor) = item.editor.get() {
|
||||
|
||||
let head = head_editor.downcast::<RwLock<ListEditor>>().unwrap();
|
||||
let mut head = head.write().unwrap();
|
||||
|
||||
|
||||
if head.data.len() > 0 {
|
||||
if cur.tree_addr.len() > 2 {
|
||||
eprintln!("call child head listlist split");
|
||||
head.listlist_split();
|
||||
eprintln!("return");
|
||||
}
|
||||
|
||||
let mut tail = head.split();
|
||||
eprintln!("got head");
|
||||
|
||||
let mut tail_node = Context::make_node(&self.ctx, self.typ.clone(), 0).unwrap();
|
||||
head.split( &mut tail_node );
|
||||
|
||||
eprintln!("made split");
|
||||
|
||||
head.goto(TreeCursor::none());
|
||||
drop(head);
|
||||
|
||||
tail.cursor.set(
|
||||
ListCursor {
|
||||
idx: Some(0),
|
||||
mode: if cur.tree_addr.len() > 2 {
|
||||
eprintln!("done goto");
|
||||
|
||||
tail_node.goto(
|
||||
TreeCursor {
|
||||
tree_addr: vec![0],
|
||||
leaf_mode: if cur.tree_addr.len() > 2 {
|
||||
ListCursorMode::Select
|
||||
} else {
|
||||
ListCursorMode::Insert
|
||||
|
@ -372,25 +389,11 @@ impl ListEditor {
|
|||
}
|
||||
);
|
||||
|
||||
let item_type =
|
||||
if let Some(data) = item.data.clone() {
|
||||
let data = data.read().unwrap();
|
||||
Some(data.get_type().clone())
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
let mut tail_node = tail.into_node(depth.get());
|
||||
|
||||
//if let Some(item_type) = item_type {
|
||||
//eprintln!("morph to {}", self.ctx.read().unwrap().type_term_to_str(&self.typ));
|
||||
tail_node = tail_node.morph(self.typ.clone());
|
||||
//}
|
||||
|
||||
//eprintln!("insert node");
|
||||
self.insert(
|
||||
Arc::new(RwLock::new(tail_node))
|
||||
);
|
||||
|
||||
eprintln!("made insert");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -64,34 +64,14 @@ impl TypeTermEditor {
|
|||
src_tyid: ctx.get_typeid("List"),
|
||||
dst_tyid: ctx.get_typeid("TypeTerm").unwrap()
|
||||
};
|
||||
|
||||
ctx.add_morphism(pattern,
|
||||
Arc::new(
|
||||
|mut node, _dst_type:_| {
|
||||
// eprintln!("morphism to typeterm");
|
||||
move |mut node, _dst_type:_| {
|
||||
eprintln!("morphism to typeterm");
|
||||
PTYListController::for_node( &mut node, Some(' '), None );
|
||||
PTYListStyle::for_node( &mut node, ("","","") );
|
||||
let mut new_node = TypeTermEditor::with_node( node.ctx.clone().unwrap(), node.depth.get(), node.clone(), State::Any );
|
||||
|
||||
let item_editor1 = node.get_edit::<ListEditor>().clone().unwrap();
|
||||
let item_editor = item_editor1.read().unwrap();
|
||||
|
||||
for i in 0..item_editor.data.len() {
|
||||
let item_node = item_editor.data.get(i);
|
||||
let item_node = item_node.read().unwrap();
|
||||
|
||||
let item_val_editor = item_node.get_edit::<crate::editors::char::CharEditor>().clone().unwrap();
|
||||
let item_val_editor = item_val_editor.read().unwrap();
|
||||
let c = item_val_editor.get();
|
||||
|
||||
new_node.send_cmd_obj(
|
||||
ReprTree::from_char(new_node.ctx.as_ref().unwrap(), c)
|
||||
);
|
||||
}
|
||||
|
||||
if item_editor.data.len() > 0 {
|
||||
new_node.goto(TreeCursor::home());
|
||||
}
|
||||
|
||||
Some(new_node)
|
||||
}
|
||||
)
|
||||
|
|
Loading…
Reference in a new issue