2022-06-19 23:13:21 +02:00
|
|
|
use {
|
2023-02-13 18:39:45 +01:00
|
|
|
r3vi::{
|
|
|
|
view::{
|
|
|
|
OuterViewPort,
|
|
|
|
singleton::*,
|
2024-03-15 18:54:25 +01:00
|
|
|
port::UpdateTask
|
2023-02-13 18:39:45 +01:00
|
|
|
},
|
|
|
|
buffer::singleton::*
|
|
|
|
},
|
2023-11-12 18:07:20 +01:00
|
|
|
laddertypes::{TypeTerm},
|
2022-06-19 23:13:21 +02:00
|
|
|
crate::{
|
2024-08-06 16:20:02 +02:00
|
|
|
repr_tree::{Context, ReprTree, ReprLeaf, ReprTreeExt, GenericReprTreeMorphism},
|
2024-01-07 20:04:23 +01:00
|
|
|
edit_tree::{EditTree, TreeNavResult},
|
2023-11-24 21:26:17 +01:00
|
|
|
editors::ObjCommander,
|
2022-06-19 23:13:21 +02:00
|
|
|
},
|
|
|
|
std::sync::Arc,
|
2023-02-20 03:40:37 +01:00
|
|
|
std::sync::RwLock
|
2022-06-19 23:13:21 +02:00
|
|
|
};
|
|
|
|
|
2024-11-16 22:21:41 +01:00
|
|
|
pub mod ctx;
|
|
|
|
pub use crate::editors::char::ctx::init_ctx;
|
2023-08-21 15:49:07 +02:00
|
|
|
|
2022-06-19 23:13:21 +02:00
|
|
|
pub struct CharEditor {
|
2023-02-18 04:15:47 +01:00
|
|
|
ctx: Arc<RwLock<Context>>,
|
2023-08-11 01:51:41 +02:00
|
|
|
data: SingletonBuffer<char>
|
2022-06-19 23:13:21 +02:00
|
|
|
}
|
|
|
|
|
2023-02-18 04:15:47 +01:00
|
|
|
impl ObjCommander for CharEditor {
|
2023-02-24 19:26:46 +01:00
|
|
|
fn send_cmd_obj(&mut self, cmd_obj: Arc<RwLock<ReprTree>>) -> TreeNavResult {
|
2023-02-18 04:15:47 +01:00
|
|
|
let cmd_obj = cmd_obj.read().unwrap();
|
|
|
|
let cmd_type = cmd_obj.get_type().clone();
|
2022-12-19 11:26:07 +01:00
|
|
|
|
2023-11-12 18:07:20 +01:00
|
|
|
if cmd_type == Context::parse(&self.ctx, "Char") {
|
2023-02-18 04:15:47 +01:00
|
|
|
if let Some(cmd_view) = cmd_obj.get_view::<dyn SingletonView<Item = char>>() {
|
|
|
|
let value = cmd_view.get();
|
2023-05-19 11:26:05 +02:00
|
|
|
|
|
|
|
if self.ctx.read().unwrap().meta_chars.contains(&value) {
|
|
|
|
TreeNavResult::Exit
|
|
|
|
} else {
|
2023-08-11 01:51:41 +02:00
|
|
|
self.data.set(value);
|
2023-05-19 11:26:05 +02:00
|
|
|
TreeNavResult::Continue
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
TreeNavResult::Exit
|
2023-02-18 04:15:47 +01:00
|
|
|
}
|
2023-05-19 11:26:05 +02:00
|
|
|
} else {
|
2023-11-24 21:26:17 +01:00
|
|
|
TreeNavResult::Exit
|
2022-12-18 01:20:17 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-06-19 23:13:21 +02:00
|
|
|
impl CharEditor {
|
2023-02-18 04:15:47 +01:00
|
|
|
pub fn new(ctx: Arc<RwLock<Context>>) -> Self {
|
2022-06-19 23:13:21 +02:00
|
|
|
CharEditor {
|
2023-02-18 04:15:47 +01:00
|
|
|
ctx,
|
2023-08-11 01:51:41 +02:00
|
|
|
data: SingletonBuffer::new('\0')
|
2022-06-19 23:13:21 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-08-11 01:51:41 +02:00
|
|
|
pub fn get_port(&self) -> OuterViewPort<dyn SingletonView<Item = char>> {
|
2022-06-19 23:13:21 +02:00
|
|
|
self.data.get_port()
|
|
|
|
}
|
2022-08-12 18:57:40 +02:00
|
|
|
|
|
|
|
pub fn get(&self) -> char {
|
2023-08-11 01:51:41 +02:00
|
|
|
self.get_port().get_view().unwrap().get()
|
2022-08-12 18:57:40 +02:00
|
|
|
}
|
2022-06-19 23:13:21 +02:00
|
|
|
|
2024-01-06 17:04:15 +01:00
|
|
|
pub fn new_edit_tree(
|
|
|
|
ctx0: Arc<RwLock<Context>>,
|
2024-03-10 14:04:08 +01:00
|
|
|
data: SingletonBuffer<char>,
|
2024-01-06 17:04:15 +01:00
|
|
|
depth: OuterViewPort<dyn SingletonView<Item = usize>>
|
2024-01-07 20:04:23 +01:00
|
|
|
) -> EditTree {
|
2024-03-15 18:54:25 +01:00
|
|
|
//let data = SingletonBuffer::new('\0');
|
2023-02-18 04:15:47 +01:00
|
|
|
let ctx = ctx0.clone();
|
2023-08-08 17:37:27 +02:00
|
|
|
let editor = Arc::new(RwLock::new(CharEditor{ ctx, data: data.clone() }));
|
2023-08-15 23:18:51 +02:00
|
|
|
|
2024-01-07 20:04:23 +01:00
|
|
|
EditTree::new(
|
2023-08-15 23:18:51 +02:00
|
|
|
ctx0.clone(),
|
2023-09-08 13:40:06 +02:00
|
|
|
depth
|
2023-08-15 23:18:51 +02:00
|
|
|
)
|
2023-08-08 17:37:27 +02:00
|
|
|
.set_cmd( editor.clone() )
|
|
|
|
.set_editor( editor.clone() )
|
2022-06-19 23:13:21 +02:00
|
|
|
}
|
2022-12-18 01:20:17 +01:00
|
|
|
}
|