use { std::sync::RwLock, termion::event::{Key, Event}, crate::{ core::{ViewPort, OuterViewPort}, singleton::{SingletonView, SingletonBuffer}, vec::VecBuffer, terminal::{TerminalView, TerminalEvent, TerminalEditor, TerminalEditorResult}, tree_nav::{TreeNav, TreeNavResult} } }; //<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> pub struct CharEditor { data: SingletonBuffer>, data_port: ViewPort>> } impl CharEditor { pub fn new() -> Self { let mut data_port = ViewPort::new(); CharEditor { data: SingletonBuffer::new(None, data_port.inner()), data_port } } pub fn get_data_port(&self) -> OuterViewPort>> { self.data_port.outer() } } impl TreeNav for CharEditor {} impl TerminalEditor for CharEditor { fn get_term_view(&self) -> OuterViewPort { crate::terminal::make_label( &if let Some(c) = self.data.get() { c.to_string() } else { "".to_string() }) } fn handle_terminal_event(&mut self, event: &TerminalEvent) -> TerminalEditorResult { match event { TerminalEvent::Input(Event::Key(Key::Char('\n'))) => TerminalEditorResult::Continue, TerminalEvent::Input(Event::Key(Key::Char(c))) => { self.data.set(Some(*c)); TerminalEditorResult::Exit } TerminalEvent::Input(Event::Key(Key::Backspace)) | TerminalEvent::Input(Event::Key(Key::Delete)) => { self.data.set(None); TerminalEditorResult::Exit } _ => TerminalEditorResult::Continue } } }