wip: Refactor ReprTree; add ReprTreeBuilder

This commit is contained in:
Michael Sippel 2024-12-24 12:50:02 +01:00
parent 41c02465be
commit 26186b3375
Signed by: senvas
GPG key ID: F96CF119C34B64A6
20 changed files with 924 additions and 563 deletions
examples/tty-06-lines/src

View file

@ -32,16 +32,20 @@ struct LineDiagnostic {
msg: String
}
struct LineEditor {
num_buf: SingletonBuffer< u64 >,
diag_buf: VecBuffer< LineDiagnostic >,
chars_edit: Arc<RwLock<ListEditor>>,
out_port: ViewPort< dyn TerminalView >,
view: Arc<RwLock< LineView >>,
cast: Arc<RwLock<ObserverBroadcast<dyn TerminalView>>>,
}
struct LineView {
line_num: Arc< dyn SingletonView<Item = u64> >,
segments: Arc< dyn SequenceView<Item = ListSegment> >,
diagnostics: Arc< dyn SequenceView<Item = LineDiagnostic> >,
diag_buf: VecBuffer< LineDiagnostic >,
cast: Arc<RwLock<ObserverBroadcast<dyn TerminalView>>>,
out_port: OuterViewPort<dyn TerminalView>,
proj_helper: ProjectionHelper<usize, Self>
proj_helper: ProjectionHelper<usize, LineEditor>
}
impl View for LineView {
@ -121,10 +125,9 @@ impl IndexView<Point2<i16>> for LineView {
while n > 0 { n_digits += 1; n /= 10; }
let diag_len = self.diagnostics.iter().map(|d| d.msg.chars().count() as i16).max().unwrap_or(0);
IndexArea::Range(
Point2::new( xoff -1-n_digits , 0) ..=
Point2::new( xoff - n_digits - 1 , 0) ..=
Point2::new(
xoff+
i16::max(
xoff + i16::max(
self.segments.len().unwrap_or(i16::MAX as usize) as i16,
diag_len
),
@ -134,57 +137,72 @@ impl IndexView<Point2<i16>> for LineView {
}
}
impl LineView {
impl LineEditor {
pub fn new(
ctx: &Arc<RwLock<Context>>,
n: u64,
le: &ListEditor,
) -> Arc<RwLock<Self>> {
let line_num_buf = SingletonBuffer::new(n);
let num_buf = SingletonBuffer::new(n);
let diag_buf = VecBuffer::new();
let seg_seq = ListSegmentSequence::new(le.get_cursor_port(), le.get_data_port())
let chars_edit = ListEditor::new(
ctx.clone(),
Context::parse(&ctx, "<List Char>")
);
let chars_seg_seq = ListSegmentSequence::new(chars_edit.get_cursor_port(), chars_edit.get_data_port())
.read().unwrap().get_view();
let out_port = ViewPort::new();
let mut proj_helper = ProjectionHelper::new(out_port.update_hooks.clone());
let lv = Arc::new(RwLock::new(LineView{
line_num: proj_helper.new_singleton_arg(0, line_num_buf.get_port(),
|s: &mut LineView, _msg|{
s.cast.write().unwrap()
let mut proj_helper = ProjectionHelper::new(out_port.update_hooks.clone());
let line_view = Arc::new(RwLock::new(LineView {
line_num: proj_helper.new_singleton_arg(0, num_buf.get_port(),
|e: &mut LineEditor, _msg|{
e.cast.write().unwrap()
.notify(&IndexArea::Range(
(Point2::new(-100, 0) ..= Point2::new(0, 0))
));
}),
segments: proj_helper.new_sequence_arg(1, seg_seq,
|s: &mut LineView, idx| {
s.cast.write().unwrap()
segments: proj_helper.new_sequence_arg(1, chars_seg_seq,
|e: &mut LineEditor, idx| {
e.cast.write().unwrap()
.notify(&IndexArea::Range(
(Point2::new(0, *idx as i16 - 1) ..= Point2::new(100, *idx as i16))
(Point2::new(*idx as i16, 0) ..= Point2::new(*idx as i16, 0))
));
}),
diagnostics: proj_helper.new_sequence_arg(2, diag_buf.get_port().to_sequence(),
|s: &mut LineView, idx| {
s.cast.write().unwrap()
|e: &mut LineEditor, idx| {
e.cast.write().unwrap()
.notify(&IndexArea::Range(
(Point2::new(-100, 1+*idx as i16) ..= Point2::new(100, 1+*idx as i16))
));
}),
diag_buf,
cast: out_port.inner().get_broadcast(),
proj_helper,
out_port: out_port.outer()
}));
lv.write().unwrap().proj_helper.set_proj(&lv);
out_port.inner().set_view(Some(lv.clone()));
let line_edit = Arc::new(RwLock::new(LineEditor {
num_buf,
diag_buf,
chars_edit: Arc::new(RwLock::new(chars_edit)),
cast: out_port.inner().get_broadcast(),
view: line_view.clone(),
out_port,
}));
lv
line_view.write().unwrap().proj_helper.set_proj(&line_edit);
line_edit
}
pub fn set_linum(&mut self, n: u64) {
self.num_buf.set(n);
}
pub fn add_diag(&mut self, diag: LineDiagnostic) {
self.diag_buf.push(diag);
}
pub fn get_port(&self) -> OuterViewPort<dyn TerminalView> {
self.out_port.clone()
self.out_port.outer()
}
}
@ -205,6 +223,11 @@ impl LinesEditor {
Context::parse(&ctx, "Line ~ EditTree"),
|rt, σ| {
eprintln!("LINE EDITOR CONSTRUCT");
/*
rt.insert_branch(
Context::parse(&ctx, "EditTree"),
)*/
}
);
ctx.write().unwrap().morphisms.add_morphism( line_to_edittree );
@ -238,12 +261,11 @@ impl LinesEditor {
let mut list_edit = list_edit.into_node( depth_port );
nested_tty::editors::list::PTYListController::for_node( &mut list_edit, Some('\n'), None );
list_edit.disp.view
.write().unwrap()
.insert_branch(ReprTree::from_view(
Context::parse(&ctx, "TerminalView"),
lines_view
));
list_edit.disp.view.write().unwrap()
.insert_branch(ReprTree::from_view(
Context::parse(&ctx, "TerminalView"),
lines_view
));
LinesEditor {
// lines,
@ -258,26 +280,34 @@ impl LinesEditor {
.read().unwrap()
.data.len() as u64;
let line =
self.make_line(line_value)
.descend(Context::parse(&self.ctx, "EditTree")).unwrap()
.edittree(&self.ctx).get();
let depth = SingletonBuffer::new(0).get_port();
let le = line.read().unwrap().get_edit::<ListEditor>().unwrap();
le.write().unwrap().goto(TreeCursor::none());
let chars_rt = self.make_line(line_value);
let chars_edittree = chars_rt
.descend(Context::parse(&self.ctx, "EditTree")).unwrap()
.edittree(&self.ctx).get()
.read().unwrap().clone();
let lvport = LineView::new( n, &*le.read().unwrap() ).read().unwrap().get_port();
line.write().unwrap().disp.view
let line = LineEditor::new(&self.ctx, n);
line.write().unwrap().chars_edit = chars_edittree.get_edit::<ListEditor>().unwrap();
let line_port = line.read().unwrap().get_port();
let mut line_edittree = EditTree::new(self.ctx.clone(), depth)
.set_nav( line.read().unwrap().chars_edit.clone() )
.set_cmd( line.read().unwrap().chars_edit.clone() )
.set_editor( line.clone() );
line_edittree.disp.view
.insert_leaf(
Context::parse(&self.ctx, "TerminalView"),
ReprLeaf::from_view( lvport )
ReprLeaf::from_view( line_port )
);
self.edit.write().unwrap()
.get_edit::< ListEditor >().unwrap()
.write().unwrap()
.data
.push(line);
.push( Arc::new(RwLock::new(line_edittree)) );
}
pub fn make_line(&self, line_value: &str) -> Arc<RwLock<ReprTree>> {
@ -287,6 +317,7 @@ impl LinesEditor {
line_value
);
// create Editor & transfer data to Editor
ctx.read().unwrap().apply_morphism(
&rt_line,
&laddertypes::MorphismType {