typeterm editor: outfactor Commander-impl into separate file
This commit is contained in:
parent
bf69e8293b
commit
fea6193885
2 changed files with 204 additions and 186 deletions
202
nested/src/editors/typeterm/cmd.rs
Normal file
202
nested/src/editors/typeterm/cmd.rs
Normal file
|
@ -0,0 +1,202 @@
|
||||||
|
use {
|
||||||
|
r3vi::{
|
||||||
|
buffer::{singleton::*, vec::*},
|
||||||
|
view::{singleton::*, sequence::*, OuterViewPort}
|
||||||
|
},
|
||||||
|
crate::{
|
||||||
|
type_system::{Context, TypeID, TypeTerm, ReprTree},
|
||||||
|
editors::{list::{ListCursorMode, ListEditor, ListCmd}},
|
||||||
|
tree::{NestedNode, TreeNav, TreeNavResult, TreeCursor},
|
||||||
|
commander::ObjCommander
|
||||||
|
},
|
||||||
|
std::{sync::{Arc, RwLock, Mutex}, any::Any},
|
||||||
|
cgmath::{Vector2},
|
||||||
|
|
||||||
|
super::{TypeTermEditor, State}
|
||||||
|
};
|
||||||
|
|
||||||
|
impl ObjCommander for TypeTermEditor {
|
||||||
|
fn send_cmd_obj(&mut self, co: Arc<RwLock<ReprTree>>) -> TreeNavResult {
|
||||||
|
let cur = self.get_cursor();
|
||||||
|
|
||||||
|
let cmd_obj = co.clone();
|
||||||
|
let cmd_obj = cmd_obj.read().unwrap();
|
||||||
|
|
||||||
|
if cmd_obj.get_type().clone() == (&self.ctx, "( Char )").into() {
|
||||||
|
if let Some(cmd_view) = cmd_obj.get_view::<dyn SingletonView<Item = char>>() {
|
||||||
|
let c = cmd_view.get();
|
||||||
|
|
||||||
|
match &self.state {
|
||||||
|
State::Any => {
|
||||||
|
match c {
|
||||||
|
'<' => {
|
||||||
|
self.set_state( State::App );
|
||||||
|
TreeNavResult::Continue
|
||||||
|
}
|
||||||
|
'0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9' => {
|
||||||
|
self.set_state( State::Num );
|
||||||
|
self.send_child_cmd( co );
|
||||||
|
TreeNavResult::Continue
|
||||||
|
}
|
||||||
|
'\'' => {
|
||||||
|
self.set_state( State::Char );
|
||||||
|
TreeNavResult::Continue
|
||||||
|
}
|
||||||
|
'~' => {
|
||||||
|
TreeNavResult::Exit
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
self.set_state( State::AnySymbol );
|
||||||
|
self.cur_node.get_mut().goto(TreeCursor::home());
|
||||||
|
self.send_child_cmd( co )
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
State::Char => {
|
||||||
|
match c {
|
||||||
|
'\'' => {
|
||||||
|
self.cur_node.get_mut().goto(TreeCursor::none());
|
||||||
|
TreeNavResult::Exit
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
self.send_child_cmd( co )
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
State::Ladder => {
|
||||||
|
let res = self.send_child_cmd( co.clone() );
|
||||||
|
|
||||||
|
match res {
|
||||||
|
TreeNavResult::Continue => {
|
||||||
|
match c {
|
||||||
|
'~' => {
|
||||||
|
self.normalize_nested_ladder();
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
TreeNavResult::Continue
|
||||||
|
}
|
||||||
|
TreeNavResult::Exit => {
|
||||||
|
match c {
|
||||||
|
'~' => TreeNavResult::Continue,
|
||||||
|
_ => TreeNavResult::Exit
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
State::App => {
|
||||||
|
let res = self.send_child_cmd( co.clone() );
|
||||||
|
|
||||||
|
match res {
|
||||||
|
TreeNavResult::Exit => {
|
||||||
|
match c {
|
||||||
|
'~' => {
|
||||||
|
self.previous_item_into_ladder();
|
||||||
|
TreeNavResult::Continue
|
||||||
|
},
|
||||||
|
_ => {TreeNavResult::Exit}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
TreeNavResult::Continue => {
|
||||||
|
match c {
|
||||||
|
'>'|
|
||||||
|
' ' => {
|
||||||
|
let i = self.cur_node.get().get_edit::<ListEditor>().unwrap();
|
||||||
|
let i = i.read().unwrap();
|
||||||
|
if let Some(i) = i.get_item() {
|
||||||
|
let tte = i.get_edit::<TypeTermEditor>().unwrap();
|
||||||
|
let mut tte = tte.write().unwrap();
|
||||||
|
|
||||||
|
if tte.state == State::Ladder {
|
||||||
|
tte.normalize_singleton();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
|
||||||
|
TreeNavResult::Continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
State::AnySymbol |
|
||||||
|
State::FunSymbol |
|
||||||
|
State::VarSymbol => {
|
||||||
|
let res = self.send_child_cmd( co );
|
||||||
|
match res {
|
||||||
|
TreeNavResult::Exit => {
|
||||||
|
match c {
|
||||||
|
'~' => {
|
||||||
|
self.morph_to_ladder();
|
||||||
|
self.send_cmd_obj(
|
||||||
|
ListCmd::Split.into_repr_tree( &self.ctx )
|
||||||
|
)
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
TreeNavResult::Exit
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
TreeNavResult::Continue => {
|
||||||
|
TreeNavResult::Continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_ => {
|
||||||
|
self.send_child_cmd( co )
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
TreeNavResult::Exit
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
match &self.state {
|
||||||
|
State::Any => {
|
||||||
|
let cmd_repr = co.read().unwrap();
|
||||||
|
if cmd_repr.get_type().clone() == (&self.ctx, "( NestedNode )").into() {
|
||||||
|
if let Some(view) = cmd_repr.get_view::<dyn SingletonView<Item = NestedNode>>() {
|
||||||
|
let node = view.get();
|
||||||
|
|
||||||
|
if node.data.read().unwrap().get_type().clone() == (&self.ctx, "( Char )").into() {
|
||||||
|
self.set_state( State::AnySymbol );
|
||||||
|
} else {
|
||||||
|
self.set_state( State::Ladder );
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
eprintln!("ERROR");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
self.set_state( State::AnySymbol );
|
||||||
|
}
|
||||||
|
|
||||||
|
self.cur_node.get_mut().goto(TreeCursor::home());
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let res = self.send_child_cmd( co.clone() );
|
||||||
|
|
||||||
|
self.normalize_empty();
|
||||||
|
|
||||||
|
if let Some(cmd) = co.read().unwrap().get_view::<dyn SingletonView<Item = ListCmd>>() {
|
||||||
|
match cmd.get() {
|
||||||
|
ListCmd::Split => {
|
||||||
|
if self.state == State::Ladder {
|
||||||
|
self.normalize_singleton();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ =>{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
mod ctx;
|
mod ctx;
|
||||||
mod nav;
|
mod nav;
|
||||||
|
mod cmd;
|
||||||
|
|
||||||
pub use ctx::init_ctx;
|
pub use ctx::init_ctx;
|
||||||
|
|
||||||
|
@ -19,7 +20,7 @@ use {
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
|
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
|
||||||
pub enum State {
|
pub(super) enum State {
|
||||||
Any,
|
Any,
|
||||||
Num,
|
Num,
|
||||||
Char,
|
Char,
|
||||||
|
@ -467,188 +468,3 @@ impl TypeTermEditor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ObjCommander for TypeTermEditor {
|
|
||||||
fn send_cmd_obj(&mut self, co: Arc<RwLock<ReprTree>>) -> TreeNavResult {
|
|
||||||
let cur = self.get_cursor();
|
|
||||||
|
|
||||||
let cmd_obj = co.clone();
|
|
||||||
let cmd_obj = cmd_obj.read().unwrap();
|
|
||||||
|
|
||||||
if cmd_obj.get_type().clone() == (&self.ctx, "( Char )").into() {
|
|
||||||
if let Some(cmd_view) = cmd_obj.get_view::<dyn SingletonView<Item = char>>() {
|
|
||||||
let c = cmd_view.get();
|
|
||||||
|
|
||||||
match &self.state {
|
|
||||||
State::Any => {
|
|
||||||
match c {
|
|
||||||
'<' => {
|
|
||||||
self.set_state( State::App );
|
|
||||||
TreeNavResult::Continue
|
|
||||||
}
|
|
||||||
'0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9' => {
|
|
||||||
self.set_state( State::Num );
|
|
||||||
self.send_child_cmd( co );
|
|
||||||
TreeNavResult::Continue
|
|
||||||
}
|
|
||||||
'\'' => {
|
|
||||||
self.set_state( State::Char );
|
|
||||||
TreeNavResult::Continue
|
|
||||||
}
|
|
||||||
'~' => {
|
|
||||||
TreeNavResult::Exit
|
|
||||||
}
|
|
||||||
_ => {
|
|
||||||
self.set_state( State::AnySymbol );
|
|
||||||
self.cur_node.get_mut().goto(TreeCursor::home());
|
|
||||||
self.send_child_cmd( co )
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
State::Char => {
|
|
||||||
match c {
|
|
||||||
'\'' => {
|
|
||||||
self.cur_node.get_mut().goto(TreeCursor::none());
|
|
||||||
TreeNavResult::Exit
|
|
||||||
}
|
|
||||||
_ => {
|
|
||||||
self.send_child_cmd( co )
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
State::Ladder => {
|
|
||||||
let res = self.send_child_cmd( co.clone() );
|
|
||||||
|
|
||||||
match res {
|
|
||||||
TreeNavResult::Continue => {
|
|
||||||
match c {
|
|
||||||
'~' => {
|
|
||||||
self.normalize_nested_ladder();
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
TreeNavResult::Continue
|
|
||||||
}
|
|
||||||
TreeNavResult::Exit => {
|
|
||||||
match c {
|
|
||||||
'~' => TreeNavResult::Continue,
|
|
||||||
_ => TreeNavResult::Exit
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
State::App => {
|
|
||||||
let res = self.send_child_cmd( co.clone() );
|
|
||||||
|
|
||||||
match res {
|
|
||||||
TreeNavResult::Exit => {
|
|
||||||
match c {
|
|
||||||
'~' => {
|
|
||||||
self.previous_item_into_ladder();
|
|
||||||
TreeNavResult::Continue
|
|
||||||
},
|
|
||||||
_ => {TreeNavResult::Exit}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
TreeNavResult::Continue => {
|
|
||||||
match c {
|
|
||||||
'>'|
|
|
||||||
' ' => {
|
|
||||||
let i = self.cur_node.get().get_edit::<ListEditor>().unwrap();
|
|
||||||
let i = i.read().unwrap();
|
|
||||||
if let Some(i) = i.get_item() {
|
|
||||||
let tte = i.get_edit::<TypeTermEditor>().unwrap();
|
|
||||||
let mut tte = tte.write().unwrap();
|
|
||||||
|
|
||||||
if tte.state == State::Ladder {
|
|
||||||
tte.normalize_singleton();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
|
|
||||||
TreeNavResult::Continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
State::AnySymbol |
|
|
||||||
State::FunSymbol |
|
|
||||||
State::VarSymbol => {
|
|
||||||
let res = self.send_child_cmd( co );
|
|
||||||
match res {
|
|
||||||
TreeNavResult::Exit => {
|
|
||||||
match c {
|
|
||||||
'~' => {
|
|
||||||
self.morph_to_ladder();
|
|
||||||
self.send_cmd_obj(
|
|
||||||
ListCmd::Split.into_repr_tree( &self.ctx )
|
|
||||||
)
|
|
||||||
}
|
|
||||||
_ => {
|
|
||||||
TreeNavResult::Exit
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
TreeNavResult::Continue => {
|
|
||||||
TreeNavResult::Continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_ => {
|
|
||||||
self.send_child_cmd( co )
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
TreeNavResult::Exit
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
match &self.state {
|
|
||||||
State::Any => {
|
|
||||||
let cmd_repr = co.read().unwrap();
|
|
||||||
if cmd_repr.get_type().clone() == (&self.ctx, "( NestedNode )").into() {
|
|
||||||
if let Some(view) = cmd_repr.get_view::<dyn SingletonView<Item = NestedNode>>() {
|
|
||||||
let node = view.get();
|
|
||||||
|
|
||||||
if node.data.read().unwrap().get_type().clone() == (&self.ctx, "( Char )").into() {
|
|
||||||
self.set_state( State::AnySymbol );
|
|
||||||
} else {
|
|
||||||
self.set_state( State::Ladder );
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
eprintln!("ERROR");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
self.set_state( State::AnySymbol );
|
|
||||||
}
|
|
||||||
|
|
||||||
self.cur_node.get_mut().goto(TreeCursor::home());
|
|
||||||
}
|
|
||||||
_ => {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let res = self.send_child_cmd( co.clone() );
|
|
||||||
|
|
||||||
self.normalize_empty();
|
|
||||||
|
|
||||||
if let Some(cmd) = co.read().unwrap().get_view::<dyn SingletonView<Item = ListCmd>>() {
|
|
||||||
match cmd.get() {
|
|
||||||
ListCmd::Split => {
|
|
||||||
if self.state == State::Ladder {
|
|
||||||
self.normalize_singleton();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ =>{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
res
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue