wip: Refactor ReprTree; add ReprTreeBuilder
This commit is contained in:
parent
41c02465be
commit
26186b3375
20 changed files with 924 additions and 563 deletions
examples/tty-06-lines/src
|
@ -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 {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue