ObjCommander: return TreeNavResult

This commit is contained in:
Michael Sippel 2023-02-24 19:26:46 +01:00
parent 73499e0ab3
commit 4acce3921d
Signed by: senvas
GPG key ID: F96CF119C34B64A6
9 changed files with 91 additions and 75 deletions

View file

@ -8,25 +8,20 @@ pub trait Commander {
use std::sync::{Arc, RwLock}; use std::sync::{Arc, RwLock};
use crate::{ use crate::{
type_system::ReprTree, type_system::ReprTree,
tree::{nav::TreeNavResult, NestedNode} tree::{nav::TreeNavResult}
}; };
//use r3vi::view::singleton::*; //use r3vi::view::singleton::*;
pub trait ObjCommander { pub trait ObjCommander {
fn send_cmd_obj(&mut self, cmd_obj: Arc<RwLock<ReprTree>>) -> TreeNavResult;
fn send_cmd_node(&mut self, node: NestedNode) -> TreeNavResult {
TreeNavResult::Continue
}
fn send_cmd_obj(&mut self, cmd_obj: Arc<RwLock<ReprTree>>);
} }
/*
//impl<Cmd: 'static, T: Commander<Cmd>> ObjCommander for T { //impl<Cmd: 'static, T: Commander<Cmd>> ObjCommander for T {
impl<C: Commander> ObjCommander for C impl<C: Commander> ObjCommander for C
where C::Cmd: 'static where C::Cmd: 'static
{ {
fn send_cmd_obj(&mut self, _cmd_obj: Arc<RwLock<ReprTree>>) { fn send_cmd_obj(&mut self, _cmd_obj: Arc<RwLock<ReprTree>>) -> TreeNavResult{
/* /*
self.send_cmd( self.send_cmd(
&cmd_obj.read().unwrap() &cmd_obj.read().unwrap()
@ -41,8 +36,9 @@ where C::Cmd: 'static
impl<T: Clone + Send + Sync> Commander for r3vi::buffer::vec::VecBuffer<T> { impl<T: Clone + Send + Sync> Commander for r3vi::buffer::vec::VecBuffer<T> {
type Cmd = r3vi::buffer::vec::VecDiff<T>; type Cmd = r3vi::buffer::vec::VecDiff<T>;
fn send_cmd(&mut self, cmd: &Self::Cmd) { fn send_cmd(&mut self, cmd: &Self::Cmd) -> TreeNavResult {
self.apply_diff(cmd.clone()); self.apply_diff(cmd.clone());
TreeNavResult::
} }
} }
*/

View file

@ -9,7 +9,7 @@ use {
crate::{ crate::{
type_system::{Context, ReprTree}, type_system::{Context, ReprTree},
terminal::{TerminalAtom, TerminalStyle}, terminal::{TerminalAtom, TerminalStyle},
tree::NestedNode, tree::{NestedNode, TreeNavResult},
commander::{ObjCommander} commander::{ObjCommander}
}, },
std::sync::Arc, std::sync::Arc,
@ -22,7 +22,7 @@ pub struct CharEditor {
} }
impl ObjCommander for CharEditor { impl ObjCommander for CharEditor {
fn send_cmd_obj(&mut self, cmd_obj: Arc<RwLock<ReprTree>>) { fn send_cmd_obj(&mut self, cmd_obj: Arc<RwLock<ReprTree>>) -> TreeNavResult {
let cmd_obj = cmd_obj.read().unwrap(); let cmd_obj = cmd_obj.read().unwrap();
let cmd_type = cmd_obj.get_type().clone(); let cmd_type = cmd_obj.get_type().clone();
@ -35,25 +35,8 @@ impl ObjCommander for CharEditor {
self.data.set(Some(value)); self.data.set(Some(value));
} }
} }
/*
if cmd_type == term_event_type {
if let Some(te_view) = cmd_obj.get_view::<dyn SingletonView<Item = TerminalEvent>>() {
let event = te_view.get();
match event {
TerminalEvent::Input(Event::Key(Key::Char(c))) => {
self.data.set(Some(c));
}
TerminalEvent::Input(Event::Key(Key::Backspace)) TreeNavResult::Continue
| TerminalEvent::Input(Event::Key(Key::Delete)) => {
self.data.set(None);
}
_ => {}
}
}
}
*/
} }
} }

View file

@ -17,8 +17,8 @@ use {
TerminalAtom, TerminalEvent, TerminalStyle, make_label TerminalAtom, TerminalEvent, TerminalStyle, make_label
}, },
diagnostics::{Message}, diagnostics::{Message},
tree::NestedNode, tree::{NestedNode, TreeNavResult},
commander::Commander commander::ObjCommander
}, },
std::sync::Arc, std::sync::Arc,
std::sync::RwLock, std::sync::RwLock,
@ -35,34 +35,34 @@ pub struct DigitEditor {
msg: VecBuffer<Message>, msg: VecBuffer<Message>,
} }
impl Commander for DigitEditor { impl ObjCommander for DigitEditor {
type Cmd = TerminalEvent; fn send_cmd_obj(&mut self, cmd_obj: Arc<RwLock<ReprTree>>) -> TreeNavResult {
let cmd_obj = cmd_obj.read().unwrap();
let cmd_type = cmd_obj.get_type().clone();
fn send_cmd(&mut self, event: &TerminalEvent) { let char_type = (&self.ctx, "( Char )").into();
match event { //let _term_event_type = (&ctx, "( TerminalEvent )").into();
TerminalEvent::Input(Event::Key(Key::Char(c))) => {
self.data.set(Some(*c)); if cmd_type == char_type {
if let Some(cmd_view) = cmd_obj.get_view::<dyn SingletonView<Item = char>>() {
let c = cmd_view.get();
self.data.set(Some(c));
self.msg.clear(); self.msg.clear();
if c.to_digit(self.radix).is_none() { if c.to_digit(self.radix).is_none() {
let mut mb = IndexBuffer::new(); let mut mb = IndexBuffer::new();
mb.insert_iter(vec![ mb.insert_iter(vec![
(Point2::new(1, 0), make_label("invalid digit '")), (Point2::new(1, 0), make_label("invalid digit '")),
(Point2::new(2, 0), make_label(&format!("{}", *c)) (Point2::new(2, 0), make_label(&format!("{}", c))
.map_item(|_p,a| a.add_style_back(TerminalStyle::fg_color((140,140,250))))), .map_item(|_p,a| a.add_style_back(TerminalStyle::fg_color((140,140,250))))),
(Point2::new(3, 0), make_label("'")) (Point2::new(3, 0), make_label("'"))
]); ]);
self.msg.push(crate::diagnostics::make_error(mb.get_port().flatten())); self.msg.push(crate::diagnostics::make_error(mb.get_port().flatten()));
} }
} }
TerminalEvent::Input(Event::Key(Key::Backspace))
| TerminalEvent::Input(Event::Key(Key::Delete)) => {
self.data.set(None);
self.msg.clear();
self.msg.push(crate::diagnostics::make_warn(make_label("empty digit")));
}
_ => {}
} }
TreeNavResult::Continue
} }
} }

View file

@ -255,8 +255,8 @@ impl ListEditor {
let prev_node = self.data.get(prev_idx); let prev_node = self.data.get(prev_idx);
if let Some(prev_editor) = prev_node.editor.clone() { if let Some(prev_editor) = prev_node.editor.clone() {
let mut prev_editor = prev_editor.downcast::<RwLock<ListEditor>>().unwrap(); let prev_editor = prev_editor.downcast::<RwLock<ListEditor>>().unwrap();
let mut prev_editor = prev_editor.write().unwrap(); let prev_editor = prev_editor.write().unwrap();
if prev_editor.get_data_port().get_view().unwrap().iter() if prev_editor.get_data_port().get_view().unwrap().iter()
.filter_map(|x| x.get_data_view::<dyn SingletonView<Item = Option<char>>>(vec![].into_iter())?.get()).count() == 0 .filter_map(|x| x.get_data_view::<dyn SingletonView<Item = Option<char>>>(vec![].into_iter())?.get()).count() == 0

View file

@ -7,7 +7,7 @@ use {
type_system::{Context, TypeTerm, ReprTree}, type_system::{Context, TypeTerm, ReprTree},
editors::list::*, editors::list::*,
terminal::{TerminalEvent, TerminalView, make_label}, terminal::{TerminalEvent, TerminalView, make_label},
tree::{TreeCursor, TreeNav}, tree::{TreeCursor, TreeNav, TreeNavResult},
diagnostics::{Diagnostics}, diagnostics::{Diagnostics},
tree::NestedNode, tree::NestedNode,
PtySegment PtySegment
@ -231,7 +231,7 @@ use r3vi::view::singleton::SingletonView;
use crate::commander::ObjCommander; use crate::commander::ObjCommander;
impl ObjCommander for PTYListEditor { impl ObjCommander for PTYListEditor {
fn send_cmd_obj(&mut self, cmd_obj: Arc<RwLock<ReprTree>>) { fn send_cmd_obj(&mut self, cmd_obj: Arc<RwLock<ReprTree>>) -> TreeNavResult {
let mut e = self.editor.write().unwrap(); let mut e = self.editor.write().unwrap();
let cur = e.cursor.get(); let cur = e.cursor.get();
@ -253,6 +253,8 @@ impl ObjCommander for PTYListEditor {
| TerminalEvent::Input(Event::Key(Key::Insert)) => { | TerminalEvent::Input(Event::Key(Key::Insert)) => {
e.toggle_leaf_mode(); e.toggle_leaf_mode();
e.set_leaf_mode(ListCursorMode::Select); e.set_leaf_mode(ListCursorMode::Select);
TreeNavResult::Continue
} }
_ => { _ => {
if let Some(idx) = cur.idx { if let Some(idx) = cur.idx {
@ -261,9 +263,11 @@ impl ObjCommander for PTYListEditor {
match event { match event {
TerminalEvent::Input(Event::Key(Key::Backspace)) => { TerminalEvent::Input(Event::Key(Key::Backspace)) => {
e.delete_pxev(); e.delete_pxev();
TreeNavResult::Continue
} }
TerminalEvent::Input(Event::Key(Key::Delete)) => { TerminalEvent::Input(Event::Key(Key::Delete)) => {
e.delete_nexd(); e.delete_nexd();
TreeNavResult::Continue
} }
_ => { _ => {
let mut node = Context::make_node(&e.ctx, e.typ.clone(), self.depth).unwrap(); let mut node = Context::make_node(&e.ctx, e.typ.clone(), self.depth).unwrap();
@ -281,6 +285,8 @@ impl ObjCommander for PTYListEditor {
if ! remove { if ! remove {
*/ */
e.insert(node); e.insert(node);
TreeNavResult::Continue
} }
} }
}, },
@ -306,8 +312,9 @@ impl ObjCommander for PTYListEditor {
item.handle_terminal_event(event); item.handle_terminal_event(event);
} }
*/ */
TreeNavResult::Continue
} else { } else {
item.send_cmd_obj(cmd_obj); item.send_cmd_obj(cmd_obj)
} }
} }
TerminalEvent::Input(Event::Key(Key::Delete)) => { TerminalEvent::Input(Event::Key(Key::Delete)) => {
@ -329,31 +336,40 @@ impl ObjCommander for PTYListEditor {
item.handle_terminal_event(event); item.handle_terminal_event(event);
} }
*/ */
TreeNavResult::Continue
} else { } else {
item.send_cmd_obj(cmd_obj); item.send_cmd_obj(cmd_obj)
} }
} }
TerminalEvent::Input(Event::Key(Key::Char(c))) => { TerminalEvent::Input(Event::Key(Key::Char(c))) => {
if Some(c) == self.split_char { if Some(c) == self.split_char {
PTYListEditor::split(&mut e); PTYListEditor::split(&mut e);
TreeNavResult::Continue
} else { } else {
item.send_cmd_obj(cmd_obj); item.send_cmd_obj(cmd_obj)
} }
} }
_ => { _ => {
item.send_cmd_obj(cmd_obj); item.send_cmd_obj(cmd_obj)
} }
} }
} else { } else {
item.send_cmd_obj(cmd_obj); item.send_cmd_obj(cmd_obj)
} }
} else {
TreeNavResult::Exit
} }
} }
} }
} else {
TreeNavResult::Exit
} }
} }
} }
} else {
TreeNavResult::Exit
} }
} else if cmd_type == char_type && cur.mode == ListCursorMode::Select { } else if cmd_type == char_type && cur.mode == ListCursorMode::Select {
if let Some(cmd_view) = co.get_view::<dyn SingletonView<Item = char>>() { if let Some(cmd_view) = co.get_view::<dyn SingletonView<Item = char>>() {
@ -362,11 +378,27 @@ impl ObjCommander for PTYListEditor {
if Some(c) == self.split_char { if Some(c) == self.split_char {
PTYListEditor::split(&mut e); PTYListEditor::split(&mut e);
TreeNavResult::Continue
} else { } else {
if let Some(mut item) = e.get_item_mut() { if let Some(mut item) = e.get_item_mut() {
item.send_cmd_obj(cmd_obj); match item.send_cmd_obj(cmd_obj) {
TreeNavResult::Continue => TreeNavResult::Continue,
TreeNavResult::Exit => {
item.goto(TreeCursor::none());
e.cursor.set(ListCursor {
mode: ListCursorMode::Insert,
idx: Some(cur.idx.unwrap_or(0)+1)
});
TreeNavResult::Continue
}
}
} else {
TreeNavResult::Exit
} }
} }
} else {
TreeNavResult::Exit
} }
} else { } else {
drop(co); drop(co);
@ -377,12 +409,16 @@ impl ObjCommander for PTYListEditor {
new_edit.goto(TreeCursor::home()); new_edit.goto(TreeCursor::home());
new_edit.send_cmd_obj(cmd_obj); new_edit.send_cmd_obj(cmd_obj);
e.insert(new_edit); e.insert(new_edit);
TreeNavResult::Continue
}, },
ListCursorMode::Select => { ListCursorMode::Select => {
if let Some(mut item) = e.get_item_mut() { if let Some(mut item) = e.get_item_mut() {
item.send_cmd_obj(cmd_obj); item.send_cmd_obj(cmd_obj)
} } else {
TreeNavResult::Exit
}
} }
} }
} }

View file

@ -199,7 +199,7 @@ use r3vi::view::singleton::SingletonView;
use crate::{commander::ObjCommander, type_system::ReprTree}; use crate::{commander::ObjCommander, type_system::ReprTree};
impl ObjCommander for ProductEditor { impl ObjCommander for ProductEditor {
fn send_cmd_obj(&mut self, cmd_obj: Arc<RwLock<ReprTree>>) { fn send_cmd_obj(&mut self, cmd_obj: Arc<RwLock<ReprTree>>) -> TreeNavResult {
let co = cmd_obj.read().unwrap(); let co = cmd_obj.read().unwrap();
let cmd_type = co.get_type().clone(); let cmd_type = co.get_type().clone();
let term_event_type = (&self.ctx, "( TerminalEvent )").into(); let term_event_type = (&self.ctx, "( TerminalEvent )").into();
@ -257,10 +257,14 @@ impl ObjCommander for ProductEditor {
self.update_cur_segment(); self.update_cur_segment();
} }
} }
TreeNavResult::Continue
} else { } else {
drop(co); drop(co);
if let Some(mut node) = self.get_cur_editor() { if let Some(mut node) = self.get_cur_editor() {
node.send_cmd_obj(cmd_obj); node.send_cmd_obj(cmd_obj)
} else {
TreeNavResult::Exit
} }
} }
} }

View file

@ -7,10 +7,7 @@ use {
} }
}, },
crate::{ crate::{
terminal::{ terminal::TerminalView,
TerminalEditor, TerminalEditorResult,
TerminalEvent, TerminalView
},
editors::list::ListCursorMode, editors::list::ListCursorMode,
type_system::{Context, ReprTree}, type_system::{Context, ReprTree},
tree::{TreeNav, TreeCursor, TreeNavResult}, tree::{TreeNav, TreeCursor, TreeNavResult},
@ -20,8 +17,7 @@ use {
PtySegment PtySegment
}, },
cgmath::{Vector2}, cgmath::{Vector2},
std::sync::{Arc, RwLock}, std::sync::{Arc, RwLock}
termion::event::{Key}
}; };
pub struct SumEditor { pub struct SumEditor {
@ -131,7 +127,7 @@ impl PtySegment for SumEditor {
} }
impl ObjCommander for SumEditor { impl ObjCommander for SumEditor {
fn send_cmd_obj(&mut self, obj: Arc<RwLock<ReprTree>>) { fn send_cmd_obj(&mut self, obj: Arc<RwLock<ReprTree>>) -> TreeNavResult {
self.editors[ self.cur ].send_cmd_obj( obj ); self.editors[ self.cur ].send_cmd_obj( obj )
} }
} }

View file

@ -43,10 +43,12 @@ pub struct NestedNode {
} }
impl ObjCommander for NestedNode { impl ObjCommander for NestedNode {
fn send_cmd_obj(&mut self, cmd_obj: Arc<RwLock<ReprTree>>) { fn send_cmd_obj(&mut self, cmd_obj: Arc<RwLock<ReprTree>>) -> TreeNavResult {
if let Some(cmd) = self.cmd.as_ref() { if let Some(cmd) = self.cmd.as_ref() {
// todo: filter out tree-nav cmds and send them to tree_nav // todo: filter out tree-nav cmds and send them to tree_nav
cmd.write().unwrap().send_cmd_obj(cmd_obj); cmd.write().unwrap().send_cmd_obj(cmd_obj)
} else {
TreeNavResult::Exit
} }
} }
} }

View file

@ -7,8 +7,7 @@ use {
integer::*, integer::*,
product::* product::*
}, },
tree::{NestedNode}, tree::{NestedNode},
terminal::{TerminalEditor},
diagnostics::{Diagnostics}, diagnostics::{Diagnostics},
type_system::{MorphismTypePattern}, type_system::{MorphismTypePattern},
}, },