lib-nested/nested/src/integer/editor.rs

173 lines
5.1 KiB
Rust
Raw Normal View History

2021-08-31 02:10:10 +02:00
use {
crate::{
core::{OuterViewPort},
type_system::{Context, TypeTerm},
list::{PTYListEditor},
sequence::{SequenceView, SequenceViewExt, decorator::{PTYSeqDecorate, SeqDecorStyle}},
2021-11-19 12:19:52 +01:00
singleton::{SingletonBuffer, SingletonView},
2022-10-23 19:29:50 +02:00
vec::{VecBuffer},
index::{buffer::IndexBuffer},
2021-11-19 12:19:52 +01:00
terminal::{
TerminalAtom, TerminalEditor, TerminalEditorResult, TerminalEvent, TerminalStyle,
2022-10-23 19:29:50 +02:00
TerminalView, make_label
2021-11-19 12:19:52 +01:00
},
tree::{TreeCursor, TreeNav, TreeNavResult},
diagnostics::{Diagnostics, Message},
2022-12-19 11:26:07 +01:00
tree::NestedNode,
Nested,
2023-01-02 18:49:32 +01:00
commander::Commander
2021-11-19 12:19:52 +01:00
},
std::sync::Arc,
std::sync::RwLock,
termion::event::{Event, Key},
2022-10-23 19:29:50 +02:00
cgmath::{Vector2, Point2}
2021-08-31 02:10:10 +02:00
};
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
pub struct DigitEditor {
2022-12-19 11:26:07 +01:00
ctx: Arc<RwLock<Context>>,
2021-08-31 02:10:10 +02:00
radix: u32,
2022-10-23 19:29:50 +02:00
data: SingletonBuffer<Option<char>>,
msg: VecBuffer<Message>,
2021-08-31 02:10:10 +02:00
}
2022-12-19 11:26:07 +01:00
impl Commander for DigitEditor {
type Cmd = TerminalEvent;
2021-08-31 02:10:10 +02:00
2022-12-19 11:26:07 +01:00
fn send_cmd(&mut self, event: &TerminalEvent) {
2021-08-31 02:10:10 +02:00
match event {
TerminalEvent::Input(Event::Key(Key::Char(c))) => {
self.data.set(Some(*c));
2022-10-23 19:29:50 +02:00
self.msg.clear();
if c.to_digit(self.radix).is_none() {
let mut mb = IndexBuffer::new();
mb.insert_iter(vec![
(Point2::new(1, 0), make_label("invalid digit '")),
(Point2::new(2, 0), make_label(&format!("{}", *c))
2022-12-18 01:39:01 +01:00
.map_item(|_p,a| a.add_style_back(TerminalStyle::fg_color((140,140,250))))),
2022-10-23 19:29:50 +02:00
(Point2::new(3, 0), make_label("'"))
]);
self.msg.push(crate::diagnostics::make_error(mb.get_port().flatten()));
}
2021-08-31 02:10:10 +02:00
}
2021-11-19 12:19:52 +01:00
TerminalEvent::Input(Event::Key(Key::Backspace))
2022-12-19 11:26:07 +01:00
| TerminalEvent::Input(Event::Key(Key::Delete)) => {
self.data.set(None);
self.msg.clear();
self.msg.push(crate::diagnostics::make_warn(make_label("empty digit")));
}
_ => {}
2021-08-31 02:10:10 +02:00
}
}
}
2022-12-19 11:26:07 +01:00
impl DigitEditor {
pub fn new(ctx: Arc<RwLock<Context>>, radix: u32) -> Self {
DigitEditor {
ctx,
radix,
data: SingletonBuffer::new(None),
msg: VecBuffer::new(),
}
}
pub fn into_node(self) -> NestedNode {
let editor = Arc::new(RwLock::new(self));
let ed = editor.read().unwrap();
let r = ed.radix;
NestedNode::new()
.set_ctx(ed.ctx.clone())
.set_cmd(editor.clone())
.set_view(
ed.data
.get_port()
.map(move |c| {
TerminalAtom::new(
c.unwrap_or('?'),
if c.unwrap_or('?').to_digit(r).is_some() {
TerminalStyle::fg_color((100, 140, 100))
} else {
//TerminalStyle::bg_color((90, 10, 10))
TerminalStyle::fg_color((200, 40, 40))
},
)
})
.to_grid()
)
.set_diag(
ed.msg.get_port().to_sequence()
)
}
2022-05-08 23:30:49 +02:00
2022-12-19 11:26:07 +01:00
pub fn get_data_port(&self) -> OuterViewPort<dyn SingletonView<Item = Option<u32>>> {
let radix = self.radix;
self.data.get_port().map(move |c| c?.to_digit(radix))
2022-10-23 19:29:50 +02:00
}
}
2021-08-31 02:10:10 +02:00
pub struct PosIntEditor {
radix: u32,
2022-12-19 11:26:07 +01:00
digits: NestedNode
2021-08-31 02:10:10 +02:00
}
impl PosIntEditor {
2022-12-19 11:26:07 +01:00
pub fn new(ctx: Arc<RwLock<Context>>, radix: u32) -> Self {
2021-08-31 02:10:10 +02:00
PosIntEditor {
radix,
2022-12-19 11:26:07 +01:00
digits: PTYListEditor::new(
ctx.clone(),
TypeTerm::Type {
id: ctx.read().unwrap().get_typeid("Digit").unwrap(),
args: vec![
TypeTerm::Num(radix as i64)
]
},
None,
0
).into_node(
2022-12-19 11:26:07 +01:00
match radix {
16 => SeqDecorStyle::Hex,
_ => SeqDecorStyle::Plain
}
)
2021-08-31 02:10:10 +02:00
}
}
2022-12-19 11:26:07 +01:00
pub fn into_node(self) -> NestedNode {
self.digits
}
/*
pub fn get_data_port(&self) -> OuterViewPort<dyn SequenceView<Item = u32>> {
let radix = self.radix;
2022-12-19 11:26:07 +01:00
self.digits
2021-11-19 12:19:52 +01:00
.get_data_port()
.filter_map(move |digit_editor| {
digit_editor.read().unwrap().data.get()?.to_digit(radix)
})
}
2021-09-06 00:08:36 +02:00
pub fn get_value(&self) -> u32 {
let mut value = 0;
let mut weight = 1;
2021-11-19 12:19:52 +01:00
for digit_value in self
.get_data_port()
.get_view()
.unwrap()
.iter()
.collect::<Vec<_>>()
.into_iter()
.rev()
{
2021-09-06 00:08:36 +02:00
value += digit_value * weight;
weight *= self.radix;
}
value
2021-08-31 02:10:10 +02:00
}
2022-12-19 11:26:07 +01:00
*/
2021-08-31 02:10:10 +02:00
}
2022-05-08 23:30:49 +02:00