2022-05-08 23:30:49 +02:00
|
|
|
use {
|
|
|
|
crate::{
|
2022-06-19 23:13:21 +02:00
|
|
|
core::{OuterViewPort, TypeLadder, Context},
|
2022-05-08 23:30:49 +02:00
|
|
|
terminal::{
|
2022-06-19 23:13:21 +02:00
|
|
|
TerminalEditor, TerminalStyle, TerminalView,
|
2022-05-08 23:30:49 +02:00
|
|
|
make_label
|
|
|
|
},
|
2022-10-14 23:42:35 +02:00
|
|
|
list::{ListCursorMode},
|
2022-06-19 23:13:21 +02:00
|
|
|
tree_nav::{TerminalTreeEditor},
|
|
|
|
color::{bg_style_from_depth, fg_style_from_depth}
|
2022-05-08 23:30:49 +02:00
|
|
|
},
|
|
|
|
std::{sync::{Arc, RwLock}, ops::{Deref, DerefMut}},
|
|
|
|
termion::event::{Event, Key},
|
|
|
|
};
|
|
|
|
|
|
|
|
#[derive(Clone)]
|
2022-06-24 15:54:05 +02:00
|
|
|
pub enum ProductEditorSegment {
|
2022-06-19 23:13:21 +02:00
|
|
|
T( String, usize ),
|
2022-05-08 23:30:49 +02:00
|
|
|
N {
|
|
|
|
t: TypeLadder,
|
|
|
|
editor: Option<Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>>,
|
2022-10-14 23:42:35 +02:00
|
|
|
ed_depth: usize,
|
|
|
|
cur_depth: usize,
|
|
|
|
cur_dist: isize
|
2022-05-08 23:30:49 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-06-24 15:54:05 +02:00
|
|
|
impl ProductEditorSegment {
|
2022-05-08 23:30:49 +02:00
|
|
|
pub fn get_view(&self, ctx: Arc<RwLock<Context>>) -> OuterViewPort<dyn TerminalView> {
|
|
|
|
match self {
|
2022-06-24 15:54:05 +02:00
|
|
|
ProductEditorSegment::T(t, depth) =>
|
2022-05-08 23:30:49 +02:00
|
|
|
make_label(t.as_str())
|
2022-06-19 23:13:21 +02:00
|
|
|
.map_item({
|
|
|
|
let depth = *depth;
|
|
|
|
move |i, x|
|
2022-10-14 23:42:35 +02:00
|
|
|
x.add_style_back(fg_style_from_depth(depth)).add_style_back(TerminalStyle::italic(true))
|
2022-06-19 23:13:21 +02:00
|
|
|
}
|
|
|
|
),
|
2022-05-08 23:30:49 +02:00
|
|
|
|
2022-10-14 23:42:35 +02:00
|
|
|
ProductEditorSegment::N { t: _, editor: Some(e), ed_depth, cur_depth, cur_dist } =>
|
2022-05-08 23:30:49 +02:00
|
|
|
e.read().unwrap()
|
|
|
|
.get_term_view()
|
2022-08-12 18:57:40 +02:00
|
|
|
.map_item({
|
|
|
|
let e = e.clone();
|
2022-10-14 23:42:35 +02:00
|
|
|
let d = *ed_depth;
|
|
|
|
let cur_dist = *cur_dist;
|
|
|
|
|
2022-08-12 18:57:40 +02:00
|
|
|
move |i, x| {
|
2022-10-14 23:42:35 +02:00
|
|
|
let c = e.read().unwrap().get_cursor();
|
|
|
|
let cur_depth = c.tree_addr.len();
|
|
|
|
let select =
|
2022-10-15 03:52:38 +02:00
|
|
|
if cur_dist == 0 {
|
|
|
|
cur_depth
|
2022-10-14 23:42:35 +02:00
|
|
|
} else {
|
2022-10-15 03:52:38 +02:00
|
|
|
usize::MAX
|
2022-10-14 23:42:35 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
return x
|
2022-10-15 03:52:38 +02:00
|
|
|
.add_style_back(bg_style_from_depth(select))
|
|
|
|
.add_style_back(TerminalStyle::bold(select==1))
|
2022-10-14 23:42:35 +02:00
|
|
|
.add_style_back(fg_style_from_depth(d));
|
2022-08-12 18:57:40 +02:00
|
|
|
}
|
2022-05-08 23:30:49 +02:00
|
|
|
}),
|
|
|
|
|
2022-10-14 23:42:35 +02:00
|
|
|
ProductEditorSegment::N{ t, editor: None, ed_depth, cur_depth, cur_dist } =>
|
2022-05-08 23:30:49 +02:00
|
|
|
make_label(&ctx.read().unwrap().type_term_to_str(&t[0]))
|
2022-06-19 23:13:21 +02:00
|
|
|
.map_item({
|
2022-10-14 23:42:35 +02:00
|
|
|
let cur_depth = *cur_depth;
|
|
|
|
let ed_depth = *ed_depth;
|
|
|
|
let cur_dist = *cur_dist;
|
|
|
|
|
|
|
|
move |i, x|
|
2022-10-15 03:52:38 +02:00
|
|
|
x.add_style_back(TerminalStyle::fg_color((215,140,95)))
|
|
|
|
.add_style_back(bg_style_from_depth(if cur_dist == 0 { 0 } else { usize::MAX }))
|
2022-10-14 23:42:35 +02:00
|
|
|
.add_style_back(TerminalStyle::bold(cur_dist == 0))
|
2022-05-08 23:30:49 +02:00
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|