add TreeNavCmd and keymap functions
This commit is contained in:
parent
25d8acdb72
commit
d15077aca0
7 changed files with 155 additions and 33 deletions
|
@ -9,6 +9,7 @@ use {
|
||||||
nested::{
|
nested::{
|
||||||
edit_tree::{NestedNode, TreeCursor, TreeNav},
|
edit_tree::{NestedNode, TreeCursor, TreeNav},
|
||||||
repr_tree::{Context, ReprTree},
|
repr_tree::{Context, ReprTree},
|
||||||
|
editors::ObjCommander
|
||||||
},
|
},
|
||||||
nested_tty::{
|
nested_tty::{
|
||||||
terminal::TermOutWriter, DisplaySegment, Terminal, TerminalAtom, TerminalCompositor,
|
terminal::TermOutWriter, DisplaySegment, Terminal, TerminalAtom, TerminalCompositor,
|
||||||
|
@ -96,7 +97,7 @@ async fn main() {
|
||||||
|
|
||||||
/* Create a Char-Node with editor & view
|
/* Create a Char-Node with editor & view
|
||||||
*/
|
*/
|
||||||
let mut n1 = Context::make_node(
|
let mut node1 = Context::make_node(
|
||||||
&ctx,
|
&ctx,
|
||||||
// node type
|
// node type
|
||||||
Context::parse(&ctx, "Char"),
|
Context::parse(&ctx, "Char"),
|
||||||
|
@ -105,7 +106,7 @@ async fn main() {
|
||||||
).unwrap();
|
).unwrap();
|
||||||
|
|
||||||
// add a display view to the node
|
// add a display view to the node
|
||||||
n1 = node_make_view( n1 );
|
node1 = node_make_view( node1 );
|
||||||
|
|
||||||
/* Create a <List Char>-Node with editor & view
|
/* Create a <List Char>-Node with editor & view
|
||||||
*/
|
*/
|
||||||
|
@ -127,32 +128,13 @@ async fn main() {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
let ctx = ctx.clone();
|
let ctx = ctx.clone();
|
||||||
let mut node = n1.clone();
|
let mut node1 = node1.clone();
|
||||||
node.goto(TreeCursor::home());
|
let mut node2 = node2.clone();
|
||||||
|
|
||||||
|
|
||||||
let node2 = node2.clone();
|
|
||||||
move |ev| {
|
move |ev| {
|
||||||
|
let mut node1 = node1.clone();
|
||||||
if let Some(cmd) =node2.cmd.get() {
|
let mut node2 = node2.clone();
|
||||||
cmd.write().unwrap().send_cmd_obj(
|
node1.send_cmd_obj( ev.to_repr_tree(&ctx) );
|
||||||
ReprTree::new_leaf(
|
node2.send_cmd_obj( ev.to_repr_tree(&ctx) );
|
||||||
Context::parse(&ctx, "TerminalEvent"),
|
|
||||||
SingletonBuffer::new(ev.clone()).get_port().into()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
match ev {
|
|
||||||
TerminalEvent::Input(Event::Key(Key::Char(c))) => {
|
|
||||||
if let Some(cmd) = node.cmd.get() {
|
|
||||||
cmd.write().unwrap().send_cmd_obj(
|
|
||||||
ReprTree::from_char(&ctx, c)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -170,12 +152,12 @@ async fn main() {
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
let label = ctx.read().unwrap().type_term_to_str( &n1.get_type() );
|
let label = ctx.read().unwrap().type_term_to_str( &node1.get_type() );
|
||||||
compositor.write().unwrap()
|
compositor.write().unwrap()
|
||||||
.push(nested_tty::make_label( &label ).offset(Vector2::new(0, 2)));
|
.push(nested_tty::make_label( &label ).offset(Vector2::new(0, 2)));
|
||||||
|
|
||||||
compositor.write().unwrap()
|
compositor.write().unwrap()
|
||||||
.push(n1.display_view().offset(Vector2::new(15, 2)));
|
.push(node1.display_view().offset(Vector2::new(15, 2)));
|
||||||
|
|
||||||
|
|
||||||
let label2 = ctx.read().unwrap().type_term_to_str( &node2.get_type() );
|
let label2 = ctx.read().unwrap().type_term_to_str( &node2.get_type() );
|
||||||
|
|
|
@ -26,6 +26,20 @@ pub enum TreeNavResult { Continue, Exit }
|
||||||
#[derive(Clone, Copy, Eq, PartialEq, Debug)]
|
#[derive(Clone, Copy, Eq, PartialEq, Debug)]
|
||||||
pub enum TreeHeightOp { P, Q, Max }
|
pub enum TreeHeightOp { P, Q, Max }
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug)]
|
||||||
|
pub enum TreeNavCmd {
|
||||||
|
pxev, nexd, up, dn,
|
||||||
|
qpxev, qnexd, dup, qdn,
|
||||||
|
|
||||||
|
dn_pxev,
|
||||||
|
up_nexd,
|
||||||
|
pxev_dn_qnexd
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TreeNavCmd {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
pub trait TreeNav {
|
pub trait TreeNav {
|
||||||
/* CORE
|
/* CORE
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -282,9 +282,28 @@ impl TreeNav for NestedNode {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
use crate::edit_tree::nav::TreeNavCmd;
|
||||||
|
|
||||||
impl ObjCommander for NestedNode {
|
impl ObjCommander for NestedNode {
|
||||||
fn send_cmd_obj(&mut self, cmd_obj: Arc<RwLock<ReprTree>>) -> TreeNavResult {
|
fn send_cmd_obj(&mut self, cmd_obj: Arc<RwLock<ReprTree>>) -> TreeNavResult {
|
||||||
if let Some(cmd) = self.cmd.get() {
|
|
||||||
|
if cmd_obj.read().unwrap().get_type() == &Context::parse(&self.ctx, "TreeNavCmd") {
|
||||||
|
if let Some(cmd) = cmd_obj.read().unwrap().get_view::<dyn SingletonView<Item = TreeNavCmd>>() {
|
||||||
|
match cmd.get() {
|
||||||
|
TreeNavCmd::pxev => self.pxev(),
|
||||||
|
TreeNavCmd::nexd => self.nexd(),
|
||||||
|
TreeNavCmd::qpxev => self.qpxev(),
|
||||||
|
TreeNavCmd::qnexd => self.qnexd(),
|
||||||
|
|
||||||
|
TreeNavCmd::up => self.up(),
|
||||||
|
TreeNavCmd::dn => self.dn(),
|
||||||
|
|
||||||
|
_ => TreeNavResult::Continue
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
TreeNavResult::Exit
|
||||||
|
}
|
||||||
|
} else if let Some(cmd) = self.cmd.get() {
|
||||||
// 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 {
|
} else {
|
||||||
|
|
|
@ -230,8 +230,6 @@ impl ListEditor {
|
||||||
|
|
||||||
/// insert a new element
|
/// insert a new element
|
||||||
pub fn insert(&mut self, item: Arc<RwLock<NestedNode>>) {
|
pub fn insert(&mut self, item: Arc<RwLock<NestedNode>>) {
|
||||||
eprintln!("list insert");
|
|
||||||
|
|
||||||
item.read().unwrap().depth.0.set_view(
|
item.read().unwrap().depth.0.set_view(
|
||||||
self.depth.map(|d| d+1).get_view()
|
self.depth.map(|d| d+1).get_view()
|
||||||
);
|
);
|
||||||
|
|
109
lib-nested-tty/src/edit_tree/keymap.rs
Normal file
109
lib-nested-tty/src/edit_tree/keymap.rs
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
use {
|
||||||
|
termion::event::{Event, Key},
|
||||||
|
r3vi::{
|
||||||
|
buffer::singleton::*
|
||||||
|
},
|
||||||
|
nested::{
|
||||||
|
repr_tree::{Context, ReprTree},
|
||||||
|
editors::list::ListCmd,
|
||||||
|
edit_tree::nav::TreeNavCmd
|
||||||
|
},
|
||||||
|
crate::{
|
||||||
|
TerminalEvent
|
||||||
|
},
|
||||||
|
std::sync::{Arc, RwLock}
|
||||||
|
};
|
||||||
|
|
||||||
|
fn neo2_treenav_keymap( key: &Key ) -> Option<TreeNavCmd> {
|
||||||
|
match key {
|
||||||
|
Key::Ctrl(c) => {
|
||||||
|
match c {
|
||||||
|
|
||||||
|
// left hand
|
||||||
|
'l' => Some(TreeNavCmd::up),
|
||||||
|
'i' => Some(TreeNavCmd::qnexd),
|
||||||
|
'a' => Some(TreeNavCmd::dn),
|
||||||
|
'e' => Some(TreeNavCmd::pxev),
|
||||||
|
|
||||||
|
// right hand
|
||||||
|
'n' => Some(TreeNavCmd::nexd),
|
||||||
|
'r' => Some(TreeNavCmd::dn_pxev),
|
||||||
|
't' => Some(TreeNavCmd::qnexd),
|
||||||
|
'g' => Some(TreeNavCmd::up_nexd),
|
||||||
|
|
||||||
|
_ => None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn universal_treenav_keymap( key: &Key ) -> Option<TreeNavCmd> {
|
||||||
|
match key {
|
||||||
|
Key::Left => Some(TreeNavCmd::pxev),
|
||||||
|
Key::Right => Some(TreeNavCmd::nexd),
|
||||||
|
Key::Up => Some(TreeNavCmd::up),
|
||||||
|
Key::Down => Some(TreeNavCmd::dn),
|
||||||
|
Key::Home => Some(TreeNavCmd::qpxev),
|
||||||
|
Key::End => Some(TreeNavCmd::qnexd),
|
||||||
|
Key::PageUp => Some(TreeNavCmd::up_nexd),
|
||||||
|
Key::PageDown => Some(TreeNavCmd::pxev_dn_qnexd),
|
||||||
|
_ => None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn tty_list_keymap( key: &Key ) -> Option<ListCmd> {
|
||||||
|
match key {
|
||||||
|
// Key::Char('\t') => Some( ListCmd::ToggleLeafMode ),
|
||||||
|
|
||||||
|
Key::Backspace => Some( ListCmd::DeletePxev ),
|
||||||
|
Key::Delete => Some( ListCmd::DeleteNexd ),
|
||||||
|
|
||||||
|
_ => None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TerminalEvent {
|
||||||
|
pub fn to_repr_tree( &self, ctx: &Arc<RwLock<Context>> ) -> Arc<RwLock<ReprTree>> {
|
||||||
|
match self {
|
||||||
|
TerminalEvent::Input(Event::Key(key)) => {
|
||||||
|
if let Some(tree_nav_cmd) = neo2_treenav_keymap(key) {
|
||||||
|
ReprTree::new_leaf(
|
||||||
|
Context::parse(&ctx, "TreeNavCmd"),
|
||||||
|
SingletonBuffer::new(tree_nav_cmd).get_port().into()
|
||||||
|
)
|
||||||
|
} else if let Some(tree_nav_cmd) = universal_treenav_keymap(key) {
|
||||||
|
ReprTree::new_leaf(
|
||||||
|
Context::parse(&ctx, "TreeNavCmd"),
|
||||||
|
SingletonBuffer::new(tree_nav_cmd).get_port().into()
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
if let Some(list_cmd) = tty_list_keymap(key) {
|
||||||
|
ReprTree::new_leaf(
|
||||||
|
Context::parse(&ctx, "ListCmd"),
|
||||||
|
SingletonBuffer::new(list_cmd).get_port().into()
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
match key {
|
||||||
|
Key::Char(c) => {
|
||||||
|
ReprTree::from_char(&ctx, *c)
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
ReprTree::new_leaf(
|
||||||
|
Context::parse(&ctx, "TerminalEvent"),
|
||||||
|
SingletonBuffer::new(self.clone()).get_port().into()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
ReprTree::new_leaf(
|
||||||
|
Context::parse(&ctx, "TerminalEvent"),
|
||||||
|
SingletonBuffer::new(self.clone()).get_port().into()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,3 +1,4 @@
|
||||||
|
|
||||||
pub mod color;
|
pub mod color;
|
||||||
|
pub mod keymap;
|
||||||
|
|
||||||
|
|
|
@ -212,7 +212,6 @@ impl PTYListController {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn handle_any_event(&mut self, cmd_obj: Arc<RwLock<ReprTree>>) -> TreeNavResult {
|
pub fn handle_any_event(&mut self, cmd_obj: Arc<RwLock<ReprTree>>) -> TreeNavResult {
|
||||||
eprintln!("ANY EVENT");
|
|
||||||
let mut e = self.editor.write().unwrap();
|
let mut e = self.editor.write().unwrap();
|
||||||
let cur = e.cursor.get();
|
let cur = e.cursor.get();
|
||||||
let ctx = e.ctx.clone();
|
let ctx = e.ctx.clone();
|
||||||
|
|
Loading…
Reference in a new issue