replace TerminalTreeEditor with Nested trait
This commit is contained in:
parent
97624e1a8e
commit
0a8c77772c
20 changed files with 244 additions and 138 deletions
|
@ -8,8 +8,9 @@ use {
|
|||
TerminalAtom, TerminalEditor, TerminalEditorResult, TerminalEvent, TerminalStyle,
|
||||
TerminalView,
|
||||
},
|
||||
tree_nav::{TerminalTreeEditor, TreeCursor, TreeNav, TreeNavResult},
|
||||
diagnostics::Diagnostics
|
||||
tree::{TreeCursor, TreeNav, TreeNavResult},
|
||||
diagnostics::Diagnostics,
|
||||
Nested
|
||||
},
|
||||
std::sync::Arc,
|
||||
std::sync::RwLock,
|
||||
|
@ -69,6 +70,6 @@ impl TerminalEditor for CharEditor {
|
|||
}
|
||||
}
|
||||
|
||||
impl TerminalTreeEditor for CharEditor {}
|
||||
impl Nested for CharEditor {}
|
||||
|
||||
|
||||
|
|
|
@ -4,9 +4,7 @@ use {
|
|||
type_term::{TypeDict, TypeTerm, TypeID},
|
||||
AnyOuterViewPort, OuterViewPort, View,
|
||||
},
|
||||
tree_nav::{
|
||||
TerminalTreeEditor
|
||||
}
|
||||
Nested
|
||||
},
|
||||
std::{
|
||||
collections::HashMap,
|
||||
|
@ -244,7 +242,7 @@ pub struct Context {
|
|||
objects: HashMap<String, Object>,
|
||||
|
||||
/// editors
|
||||
editor_ctors: HashMap<TypeID, Box<dyn Fn(&Self, TypeTerm) -> Option<Arc<RwLock<dyn TerminalTreeEditor>>> + Send + Sync>>,
|
||||
editor_ctors: HashMap<TypeID, Box<dyn Fn(&Self, TypeTerm) -> Option<Arc<RwLock<dyn Nested>>> + Send + Sync>>,
|
||||
|
||||
/// morphisms
|
||||
default_constructors: HashMap<TypeTerm, Box<dyn Fn() -> Object + Send + Sync>>,
|
||||
|
@ -281,7 +279,7 @@ impl Context {
|
|||
self.type_dict.type_term_to_str(&t)
|
||||
}
|
||||
|
||||
pub fn add_editor_ctor(&mut self, tn: &str, mk_editor: Box<dyn Fn(&Self, TypeTerm) -> Option<Arc<RwLock<dyn TerminalTreeEditor>>> + Send + Sync>) {
|
||||
pub fn add_editor_ctor(&mut self, tn: &str, mk_editor: Box<dyn Fn(&Self, TypeTerm) -> Option<Arc<RwLock<dyn Nested>>> + Send + Sync>) {
|
||||
if let Some(tid) = self.type_dict.get_typeid(&tn.into()) {
|
||||
self.editor_ctors.insert(tid, mk_editor);
|
||||
} else {
|
||||
|
@ -289,7 +287,7 @@ impl Context {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn make_editor(&self, type_term: TypeTerm) -> Option<Arc<RwLock<dyn TerminalTreeEditor>>> {
|
||||
pub fn make_editor(&self, type_term: TypeTerm) -> Option<Arc<RwLock<dyn Nested>>> {
|
||||
if let TypeTerm::Type{ id, args } = type_term.clone() {
|
||||
let mk_editor = self.editor_ctors.get(&id)?;
|
||||
mk_editor(self, type_term)
|
||||
|
@ -297,7 +295,7 @@ impl Context {
|
|||
None
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
pub fn add_morphism(
|
||||
&mut self,
|
||||
morph_type: MorphismType,
|
||||
|
|
|
@ -330,3 +330,4 @@ where
|
|||
}
|
||||
|
||||
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
||||
|
||||
|
|
|
@ -10,8 +10,9 @@ use {
|
|||
TerminalAtom, TerminalEditor, TerminalEditorResult, TerminalEvent, TerminalStyle,
|
||||
TerminalView, make_label
|
||||
},
|
||||
tree_nav::{TerminalTreeEditor, TreeCursor, TreeNav, TreeNavResult},
|
||||
diagnostics::{Diagnostics, Message}
|
||||
tree::{TreeCursor, TreeNav, TreeNavResult},
|
||||
diagnostics::{Diagnostics, Message},
|
||||
Nested
|
||||
},
|
||||
std::sync::Arc,
|
||||
std::sync::RwLock,
|
||||
|
@ -95,7 +96,7 @@ impl TerminalEditor for DigitEditor {
|
|||
}
|
||||
}
|
||||
|
||||
impl TerminalTreeEditor for DigitEditor {}
|
||||
impl Nested for DigitEditor {}
|
||||
|
||||
impl Diagnostics for DigitEditor {
|
||||
fn get_msg_port(&self) -> OuterViewPort<dyn SequenceView<Item = crate::diagnostics::Message>> {
|
||||
|
@ -205,5 +206,5 @@ impl TerminalEditor for PosIntEditor {
|
|||
}
|
||||
}
|
||||
|
||||
impl TerminalTreeEditor for PosIntEditor {}
|
||||
impl Nested for PosIntEditor {}
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@ pub mod vec;
|
|||
pub mod product;
|
||||
pub mod sum;
|
||||
pub mod list;
|
||||
pub mod tree_nav;
|
||||
pub mod tree;
|
||||
pub mod diagnostics;
|
||||
|
||||
// high-level types
|
||||
|
@ -35,3 +35,16 @@ pub mod terminal;
|
|||
pub fn magic_header() {
|
||||
eprintln!("<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>");
|
||||
}
|
||||
|
||||
use crate::terminal::{TerminalEditor};
|
||||
use crate::diagnostics::{Diagnostics};
|
||||
use crate::tree::{TreeNav, TreeType};
|
||||
|
||||
pub trait Nested
|
||||
: TerminalEditor
|
||||
+ TreeNav
|
||||
// + TreeType
|
||||
+ Diagnostics
|
||||
+ Send
|
||||
{}
|
||||
|
||||
|
|
|
@ -12,7 +12,8 @@ use {
|
|||
make_label, TerminalEditor, TerminalEditorResult, TerminalEvent, TerminalStyle,
|
||||
TerminalView,
|
||||
},
|
||||
tree_nav::{TerminalTreeEditor, TreeCursor, TreeNav, TreeNavResult},
|
||||
Nested,
|
||||
tree::{TreeCursor, TreeNav, TreeNavResult},
|
||||
vec::VecBuffer,
|
||||
color::{bg_style_from_depth, fg_style_from_depth}
|
||||
},
|
||||
|
@ -23,7 +24,7 @@ use {
|
|||
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
||||
|
||||
pub struct ListEditor<ItemEditor>
|
||||
where ItemEditor: TerminalTreeEditor + ?Sized + Send + Sync + 'static
|
||||
where ItemEditor: Nested + ?Sized + Send + Sync + 'static
|
||||
{
|
||||
pub(super) cursor: SingletonBuffer<ListCursor>,
|
||||
pub(super) data: VecBuffer<Arc<RwLock<ItemEditor>>>,
|
||||
|
@ -34,7 +35,7 @@ where ItemEditor: TerminalTreeEditor + ?Sized + Send + Sync + 'static
|
|||
}
|
||||
|
||||
impl<ItemEditor> ListEditor<ItemEditor>
|
||||
where ItemEditor: TerminalTreeEditor + ?Sized + Send + Sync + 'static
|
||||
where ItemEditor: Nested + ?Sized + Send + Sync + 'static
|
||||
{
|
||||
pub fn new(make_item_editor: impl Fn() -> Arc<RwLock<ItemEditor>> + Send + Sync + 'static, depth: usize) -> Self {
|
||||
ListEditor {
|
||||
|
@ -58,7 +59,7 @@ where ItemEditor: TerminalTreeEditor + ?Sized + Send + Sync + 'static
|
|||
);
|
||||
segment_view_port.into_outer().map(move |segment| segment.pty_view())
|
||||
}
|
||||
|
||||
|
||||
pub fn get_data_port(&self) -> OuterViewPort<dyn SequenceView<Item = Arc<RwLock<ItemEditor>>>> {
|
||||
self.data.get_port().to_sequence()
|
||||
}
|
||||
|
|
|
@ -12,9 +12,10 @@ use {
|
|||
make_label, TerminalEditor, TerminalEditorResult, TerminalEvent, TerminalStyle,
|
||||
TerminalView,
|
||||
},
|
||||
tree_nav::{TerminalTreeEditor, TreeCursor, TreeNav, TreeNavResult},
|
||||
tree::{TreeCursor, TreeNav, TreeNavResult},
|
||||
vec::VecBuffer,
|
||||
color::{bg_style_from_depth, fg_style_from_depth}
|
||||
color::{bg_style_from_depth, fg_style_from_depth},
|
||||
Nested
|
||||
},
|
||||
std::sync::{Arc, RwLock},
|
||||
termion::event::{Event, Key},
|
||||
|
@ -22,7 +23,7 @@ use {
|
|||
};
|
||||
|
||||
impl<ItemEditor> TreeNav for ListEditor<ItemEditor>
|
||||
where ItemEditor: TerminalTreeEditor + ?Sized + Send + Sync + 'static
|
||||
where ItemEditor: Nested + ?Sized + Send + Sync + 'static
|
||||
{
|
||||
fn get_cursor_warp(&self) -> TreeCursor {
|
||||
let cur = self.cursor.get();
|
||||
|
|
|
@ -12,10 +12,11 @@ use {
|
|||
make_label, TerminalEditor, TerminalEditorResult, TerminalEvent, TerminalStyle,
|
||||
TerminalView,
|
||||
},
|
||||
tree_nav::{TerminalTreeEditor, TreeCursor, TreeNav, TreeNavResult},
|
||||
tree::{TreeCursor, TreeNav, TreeNavResult},
|
||||
diagnostics::{Diagnostics},
|
||||
vec::VecBuffer,
|
||||
color::{bg_style_from_depth, fg_style_from_depth}
|
||||
color::{bg_style_from_depth, fg_style_from_depth},
|
||||
Nested
|
||||
},
|
||||
std::sync::{Arc, RwLock},
|
||||
termion::event::{Event, Key},
|
||||
|
@ -23,7 +24,7 @@ use {
|
|||
};
|
||||
|
||||
pub struct PTYListEditor<ItemEditor>
|
||||
where ItemEditor: TerminalTreeEditor + ?Sized + Send + Sync + 'static
|
||||
where ItemEditor: Nested + ?Sized + Send + Sync + 'static
|
||||
{
|
||||
pub editor: ListEditor<ItemEditor>,
|
||||
|
||||
|
@ -36,7 +37,7 @@ where ItemEditor: TerminalTreeEditor + ?Sized + Send + Sync + 'static
|
|||
}
|
||||
|
||||
impl<ItemEditor> PTYListEditor<ItemEditor>
|
||||
where ItemEditor: TerminalTreeEditor + ?Sized + Send + Sync + 'static
|
||||
where ItemEditor: Nested + ?Sized + Send + Sync + 'static
|
||||
{
|
||||
pub fn new(
|
||||
make_item_editor: impl Fn() -> Arc<RwLock<ItemEditor>> + Send + Sync + 'static,
|
||||
|
@ -92,7 +93,7 @@ where ItemEditor: TerminalTreeEditor + ?Sized + Send + Sync + 'static
|
|||
}
|
||||
|
||||
impl<ItemEditor> TerminalEditor for PTYListEditor<ItemEditor>
|
||||
where ItemEditor: TerminalTreeEditor + ?Sized + Send + Sync + 'static
|
||||
where ItemEditor: Nested + ?Sized + Send + Sync + 'static
|
||||
{
|
||||
fn get_term_view(&self) -> OuterViewPort<dyn TerminalView> {
|
||||
self.editor
|
||||
|
@ -229,7 +230,7 @@ where ItemEditor: TerminalTreeEditor + ?Sized + Send + Sync + 'static
|
|||
}
|
||||
|
||||
impl<ItemEditor> TreeNav for PTYListEditor<ItemEditor>
|
||||
where ItemEditor: TerminalTreeEditor + ?Sized + Send + Sync + 'static
|
||||
where ItemEditor: Nested + ?Sized + Send + Sync + 'static
|
||||
{
|
||||
fn get_cursor_warp(&self) -> TreeCursor {
|
||||
self.editor.get_cursor_warp()
|
||||
|
@ -249,7 +250,7 @@ where ItemEditor: TerminalTreeEditor + ?Sized + Send + Sync + 'static
|
|||
}
|
||||
|
||||
impl<ItemEditor> Diagnostics for PTYListEditor<ItemEditor>
|
||||
where ItemEditor: TerminalTreeEditor + Diagnostics + ?Sized + Send + Sync + 'static
|
||||
where ItemEditor: Nested + Diagnostics + ?Sized + Send + Sync + 'static
|
||||
{
|
||||
fn get_msg_port(&self) -> OuterViewPort<dyn SequenceView<Item = crate::diagnostics::Message>> {
|
||||
self.editor
|
||||
|
@ -273,8 +274,8 @@ where ItemEditor: TerminalTreeEditor + Diagnostics + ?Sized + Send + Sync + 'sta
|
|||
}
|
||||
}
|
||||
|
||||
impl<ItemEditor> TerminalTreeEditor for PTYListEditor<ItemEditor>
|
||||
where ItemEditor: TerminalTreeEditor + ?Sized + Send + Sync + 'static
|
||||
impl<ItemEditor> Nested for PTYListEditor<ItemEditor>
|
||||
where ItemEditor: Nested + ?Sized + Send + Sync + 'static
|
||||
{}
|
||||
|
||||
use crate::{
|
||||
|
|
|
@ -6,7 +6,7 @@ use {
|
|||
sequence::SequenceView,
|
||||
singleton::SingletonView,
|
||||
terminal::{TerminalView, TerminalStyle, make_label},
|
||||
tree_nav::TerminalTreeEditor,
|
||||
Nested,
|
||||
color::{bg_style_from_depth, fg_style_from_depth}
|
||||
},
|
||||
std::sync::Arc,
|
||||
|
@ -14,7 +14,7 @@ use {
|
|||
};
|
||||
|
||||
pub enum ListSegment<ItemEditor>
|
||||
where ItemEditor: TerminalTreeEditor + ?Sized + Send + Sync + 'static
|
||||
where ItemEditor: Nested + ?Sized + Send + Sync + 'static
|
||||
{
|
||||
InsertCursor,
|
||||
Item {
|
||||
|
@ -29,7 +29,7 @@ pub trait PTYSegment {
|
|||
}
|
||||
|
||||
impl<ItemEditor> PTYSegment for ListSegment<ItemEditor>
|
||||
where ItemEditor: TerminalTreeEditor + ?Sized + Send + Sync + 'static
|
||||
where ItemEditor: Nested + ?Sized + Send + Sync + 'static
|
||||
{
|
||||
fn pty_view(&self) -> OuterViewPort<dyn TerminalView> {
|
||||
match self {
|
||||
|
@ -64,7 +64,7 @@ where ItemEditor: TerminalTreeEditor + ?Sized + Send + Sync + 'static
|
|||
}
|
||||
|
||||
pub struct ListSegmentSequence<ItemEditor>
|
||||
where ItemEditor: TerminalTreeEditor + ?Sized + Send + Sync + 'static
|
||||
where ItemEditor: Nested + ?Sized + Send + Sync + 'static
|
||||
{
|
||||
data: Arc<dyn SequenceView<Item = Arc<RwLock<ItemEditor>>>>,
|
||||
cursor: Arc<dyn SingletonView<Item = ListCursor>>,
|
||||
|
@ -77,13 +77,13 @@ where ItemEditor: TerminalTreeEditor + ?Sized + Send + Sync + 'static
|
|||
}
|
||||
|
||||
impl<ItemEditor> View for ListSegmentSequence<ItemEditor>
|
||||
where ItemEditor: TerminalTreeEditor + ?Sized + Send + Sync + 'static
|
||||
where ItemEditor: Nested + ?Sized + Send + Sync + 'static
|
||||
{
|
||||
type Msg = usize;
|
||||
}
|
||||
|
||||
impl<ItemEditor> SequenceView for ListSegmentSequence<ItemEditor>
|
||||
where ItemEditor: TerminalTreeEditor + ?Sized + Send + Sync + 'static
|
||||
where ItemEditor: Nested + ?Sized + Send + Sync + 'static
|
||||
{
|
||||
type Item = ListSegment<ItemEditor>;
|
||||
|
||||
|
@ -136,7 +136,7 @@ where ItemEditor: TerminalTreeEditor + ?Sized + Send + Sync + 'static
|
|||
}
|
||||
|
||||
impl<ItemEditor> ListSegmentSequence<ItemEditor>
|
||||
where ItemEditor: TerminalTreeEditor + ?Sized + Send + Sync + 'static
|
||||
where ItemEditor: Nested + ?Sized + Send + Sync + 'static
|
||||
{
|
||||
pub fn new(
|
||||
cursor_port: OuterViewPort<dyn SingletonView<Item = ListCursor>>,
|
||||
|
|
|
@ -1,26 +1,60 @@
|
|||
|
||||
use {
|
||||
crate::{
|
||||
core::{TypeLadder, Context},
|
||||
terminal::{TerminalView},
|
||||
tree_nav::{TerminalTreeEditor},
|
||||
core::{TypeLadder, Context, OuterViewPort},
|
||||
terminal::{TerminalView, TerminalEditor, TerminalEvent, TerminalEditorResult, make_label},
|
||||
tree::{TreeNav},
|
||||
integer::PosIntEditor,
|
||||
list::{ListEditor, PTYListEditor},
|
||||
sequence::{decorator::{SeqDecorStyle}},
|
||||
product::editor::ProductEditor,
|
||||
char_editor::CharEditor
|
||||
char_editor::CharEditor,
|
||||
diagnostics::Diagnostics,
|
||||
Nested
|
||||
},
|
||||
cgmath::{Vector2, Point2},
|
||||
std::sync::{Arc, RwLock},
|
||||
};
|
||||
|
||||
pub fn make_editor(ctx: Arc<RwLock<Context>>, t: &TypeLadder, depth: usize) -> Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>> {
|
||||
enum RhsNode {
|
||||
Sum (
|
||||
Arc<RwLock< PTYListEditor< RhsNode > >>
|
||||
),
|
||||
Product (
|
||||
Arc<RwLock< PTYListEditor< RhsNode > >>
|
||||
),
|
||||
String(
|
||||
Arc<RwLock< PTYListEditor< CharEditor > >>
|
||||
)
|
||||
}
|
||||
|
||||
impl TreeNav for RhsNode {}
|
||||
|
||||
impl TerminalEditor for RhsNode {
|
||||
fn get_term_view(&self) -> OuterViewPort<dyn TerminalView> {
|
||||
make_label("todo")
|
||||
}
|
||||
|
||||
fn handle_terminal_event(&mut self, event: &TerminalEvent) -> TerminalEditorResult {
|
||||
TerminalEditorResult::Continue
|
||||
}
|
||||
}
|
||||
|
||||
impl Diagnostics for RhsNode {}
|
||||
impl Nested for RhsNode {}
|
||||
|
||||
struct GrammarRuleEditor {
|
||||
lhs: Arc<RwLock<PTYListEditor<CharEditor>>>,
|
||||
rhs: Arc<RwLock<PTYListEditor<RhsNode>>>
|
||||
}
|
||||
|
||||
pub fn make_editor(ctx: Arc<RwLock<Context>>, t: &TypeLadder, depth: usize) -> Arc<RwLock<dyn Nested + Send + Sync>> {
|
||||
let c = ctx.read().unwrap();
|
||||
if t[0] == c.type_term_from_str("( PosInt 16 BigEndian )").unwrap() {
|
||||
Arc::new(RwLock::new(PosIntEditor::new(16))) as Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>
|
||||
Arc::new(RwLock::new(PosIntEditor::new(16))) as Arc<RwLock<dyn Nested + Send + Sync>>
|
||||
|
||||
} else if t[0] == c.type_term_from_str("( PosInt 10 BigEndian )").unwrap() {
|
||||
Arc::new(RwLock::new(PosIntEditor::new(10))) as Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>
|
||||
Arc::new(RwLock::new(PosIntEditor::new(10))) as Arc<RwLock<dyn Nested + Send + Sync>>
|
||||
|
||||
} else if t[0] == c.type_term_from_str("( String )").unwrap() {
|
||||
Arc::new(RwLock::new(
|
||||
|
@ -64,7 +98,7 @@ pub fn make_editor(ctx: Arc<RwLock<Context>>, t: &TypeLadder, depth: usize) -> A
|
|||
'"',
|
||||
depth
|
||||
)
|
||||
)) as Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>
|
||||
)) as Arc<RwLock<dyn Nested + Send + Sync>>
|
||||
} else if t[0] == c.type_term_from_str("( List Symbol )").unwrap() {
|
||||
Arc::new(RwLock::new(
|
||||
PTYListEditor::new(
|
||||
|
@ -83,7 +117,7 @@ pub fn make_editor(ctx: Arc<RwLock<Context>>, t: &TypeLadder, depth: usize) -> A
|
|||
' ',
|
||||
depth
|
||||
)
|
||||
)) as Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>
|
||||
)) as Arc<RwLock<dyn Nested + Send + Sync>>
|
||||
|
||||
} else if t[0] == c.type_term_from_str("( List Char )").unwrap() {
|
||||
Arc::new(RwLock::new(
|
||||
|
@ -95,7 +129,7 @@ pub fn make_editor(ctx: Arc<RwLock<Context>>, t: &TypeLadder, depth: usize) -> A
|
|||
'\n',
|
||||
depth+1
|
||||
)
|
||||
)) as Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>
|
||||
)) as Arc<RwLock<dyn Nested + Send + Sync>>
|
||||
|
||||
} else if t[0] == c.type_term_from_str("( List ℕ )").unwrap() {
|
||||
Arc::new(RwLock::new(
|
||||
|
@ -107,7 +141,7 @@ pub fn make_editor(ctx: Arc<RwLock<Context>>, t: &TypeLadder, depth: usize) -> A
|
|||
',',
|
||||
depth
|
||||
)
|
||||
)) as Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>
|
||||
)) as Arc<RwLock<dyn Nested + Send + Sync>>
|
||||
|
||||
} else if t[0] == c.type_term_from_str("( Path )").unwrap() {
|
||||
Arc::new(RwLock::new(PTYListEditor::new(
|
||||
|
@ -126,7 +160,7 @@ pub fn make_editor(ctx: Arc<RwLock<Context>>, t: &TypeLadder, depth: usize) -> A
|
|||
SeqDecorStyle::Path,
|
||||
'/',
|
||||
depth
|
||||
))) as Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>
|
||||
))) as Arc<RwLock<dyn Nested + Send + Sync>>
|
||||
|
||||
} else if t[0] == c.type_term_from_str("( List Path )").unwrap() {
|
||||
Arc::new(RwLock::new(
|
||||
|
@ -146,11 +180,11 @@ pub fn make_editor(ctx: Arc<RwLock<Context>>, t: &TypeLadder, depth: usize) -> A
|
|||
',',
|
||||
depth
|
||||
)
|
||||
)) as Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>
|
||||
)) as Arc<RwLock<dyn Nested + Send + Sync>>
|
||||
|
||||
} else if t[0] == c.type_term_from_str("( List RGB )").unwrap() {
|
||||
Arc::new(RwLock::new(
|
||||
PTYListEditor::<dyn TerminalTreeEditor + Send +Sync>::new(
|
||||
PTYListEditor::<dyn Nested + Send +Sync>::new(
|
||||
{
|
||||
let d = depth+1;
|
||||
let ctx = ctx.clone();
|
||||
|
@ -162,7 +196,7 @@ pub fn make_editor(ctx: Arc<RwLock<Context>>, t: &TypeLadder, depth: usize) -> A
|
|||
',',
|
||||
depth
|
||||
)
|
||||
)) as Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>
|
||||
)) as Arc<RwLock<dyn Nested + Send + Sync>>
|
||||
|
||||
} else if t[0] == c.type_term_from_str("( RGB )").unwrap() {
|
||||
Arc::new(RwLock::new(ProductEditor::new(depth, ctx.clone())
|
||||
|
@ -174,7 +208,7 @@ pub fn make_editor(ctx: Arc<RwLock<Context>>, t: &TypeLadder, depth: usize) -> A
|
|||
.with_t(Point2::new(1, 3), "b: ")
|
||||
.with_n(Point2::new(2, 3), vec![ ctx.read().unwrap().type_term_from_str("( PosInt 16 BigEndian )").unwrap() ] )
|
||||
.with_t(Point2::new(0, 4), "} ")
|
||||
)) as Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>
|
||||
)) as Arc<RwLock<dyn Nested + Send + Sync>>
|
||||
|
||||
} else if t[0] == c.type_term_from_str("( Vec3i )").unwrap() {
|
||||
Arc::new(RwLock::new(ProductEditor::new(depth, ctx.clone())
|
||||
|
@ -186,11 +220,11 @@ pub fn make_editor(ctx: Arc<RwLock<Context>>, t: &TypeLadder, depth: usize) -> A
|
|||
.with_t(Point2::new(1, 3), "z: ")
|
||||
.with_n(Point2::new(2, 3), vec![ ctx.read().unwrap().type_term_from_str("( PosInt 10 BigEndian )").unwrap() ] )
|
||||
.with_t(Point2::new(0, 4), "}")
|
||||
)) as Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>
|
||||
)) as Arc<RwLock<dyn Nested + Send + Sync>>
|
||||
|
||||
} else if t[0] == c.type_term_from_str("( Json )").unwrap() {
|
||||
Arc::new(RwLock::new(
|
||||
PTYListEditor::<dyn TerminalTreeEditor + Send + Sync>::new(
|
||||
PTYListEditor::<dyn Nested + Send + Sync>::new(
|
||||
Box::new({
|
||||
let ctx = ctx.clone();
|
||||
move || {
|
||||
|
@ -198,18 +232,18 @@ pub fn make_editor(ctx: Arc<RwLock<Context>>, t: &TypeLadder, depth: usize) -> A
|
|||
.with_n(Point2::new(0, 0), vec![ ctx.read().unwrap().type_term_from_str("( String )").unwrap() ] )
|
||||
.with_t(Point2::new(1, 0), ": ")
|
||||
.with_n(Point2::new(2, 0), vec![ ctx.read().unwrap().type_term_from_str("( Json )").unwrap() ] )
|
||||
)) as Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>
|
||||
)) as Arc<RwLock<dyn Nested + Send + Sync>>
|
||||
}
|
||||
}),
|
||||
SeqDecorStyle::VerticalSexpr,
|
||||
'\n',
|
||||
depth
|
||||
)
|
||||
)) as Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>
|
||||
)) as Arc<RwLock<dyn Nested + Send + Sync>>
|
||||
|
||||
} else if t[0] == c.type_term_from_str("( List Term )").unwrap() {
|
||||
Arc::new(RwLock::new(
|
||||
PTYListEditor::<dyn TerminalTreeEditor + Send + Sync>::new(
|
||||
PTYListEditor::<dyn Nested + Send + Sync>::new(
|
||||
Box::new({
|
||||
let ctx = ctx.clone();
|
||||
move || {
|
||||
|
@ -220,7 +254,7 @@ pub fn make_editor(ctx: Arc<RwLock<Context>>, t: &TypeLadder, depth: usize) -> A
|
|||
'\n',
|
||||
depth
|
||||
)
|
||||
)) as Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>
|
||||
)) as Arc<RwLock<dyn Nested + Send + Sync>>
|
||||
|
||||
} else { // else: term
|
||||
Arc::new(RwLock::new(
|
||||
|
|
|
@ -12,9 +12,11 @@ use {
|
|||
sequence::{SequenceView},
|
||||
make_editor::make_editor,
|
||||
|
||||
tree_nav::{TreeNav, TerminalTreeEditor, TreeNavResult},
|
||||
tree::{TreeNav, TreeNavResult},
|
||||
diagnostics::{Diagnostics, Message},
|
||||
terminal::{TerminalStyle}
|
||||
terminal::{TerminalStyle},
|
||||
|
||||
Nested
|
||||
},
|
||||
cgmath::{Vector2, Point2},
|
||||
std::sync::{Arc, RwLock},
|
||||
|
@ -111,7 +113,7 @@ impl ProductEditor {
|
|||
Some(self.get_editor_segment_mut(self.cursor?))
|
||||
}
|
||||
|
||||
pub fn get_editor(&self, idx: isize) -> Option<Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>> {
|
||||
pub fn get_editor(&self, idx: isize) -> Option<Arc<RwLock<dyn Nested + Send + Sync>>> {
|
||||
if let ProductEditorSegment::N{ t: _, editor, ed_depth: _, cur_depth: _, cur_dist: _ } = self.get_editor_segment(idx) {
|
||||
editor
|
||||
} else {
|
||||
|
@ -119,7 +121,7 @@ impl ProductEditor {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn get_cur_editor(&self) -> Option<Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>> {
|
||||
pub fn get_cur_editor(&self) -> Option<Arc<RwLock<dyn Nested + Send + Sync>>> {
|
||||
self.get_editor(self.cursor?)
|
||||
}
|
||||
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
use {
|
||||
crate::{
|
||||
list::ListCursorMode,
|
||||
tree_nav::{TreeNav, TreeNavResult, TreeCursor, TerminalTreeEditor},
|
||||
tree::{TreeNav, TreeNavResult, TreeCursor},
|
||||
product::{segment::ProductEditorSegment, ProductEditor},
|
||||
make_editor::{make_editor}
|
||||
make_editor::{make_editor},
|
||||
Nested
|
||||
},
|
||||
cgmath::{Point2, Vector2},
|
||||
std::{sync::{Arc, RwLock}, ops::{Deref, DerefMut}},
|
||||
|
@ -248,5 +249,5 @@ impl TreeNav for ProductEditor {
|
|||
}
|
||||
}
|
||||
|
||||
impl TerminalTreeEditor for ProductEditor {}
|
||||
impl Nested for ProductEditor {}
|
||||
|
||||
|
|
|
@ -6,8 +6,8 @@ use {
|
|||
make_label
|
||||
},
|
||||
list::{ListCursorMode},
|
||||
tree_nav::{TerminalTreeEditor},
|
||||
color::{bg_style_from_depth, fg_style_from_depth}
|
||||
color::{bg_style_from_depth, fg_style_from_depth},
|
||||
Nested
|
||||
},
|
||||
std::{sync::{Arc, RwLock}, ops::{Deref, DerefMut}},
|
||||
termion::event::{Event, Key},
|
||||
|
@ -18,7 +18,7 @@ pub enum ProductEditorSegment {
|
|||
T( String, usize ),
|
||||
N {
|
||||
t: TypeLadder,
|
||||
editor: Option<Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>>,
|
||||
editor: Option<Arc<RwLock<dyn Nested + Send + Sync>>>,
|
||||
ed_depth: usize,
|
||||
cur_depth: usize,
|
||||
cur_dist: isize
|
||||
|
|
|
@ -12,9 +12,10 @@ use {
|
|||
sequence::{SequenceView},
|
||||
make_editor::make_editor,
|
||||
|
||||
tree_nav::{TreeNav, TreeCursor, TerminalTreeEditor, TreeNavResult},
|
||||
tree::{TreeNav, TreeCursor, TreeNavResult},
|
||||
diagnostics::{Diagnostics, Message},
|
||||
terminal::{TerminalStyle}
|
||||
terminal::{TerminalStyle},
|
||||
Nested
|
||||
},
|
||||
cgmath::{Vector2, Point2},
|
||||
std::sync::{Arc, RwLock},
|
||||
|
@ -24,7 +25,7 @@ use {
|
|||
|
||||
pub struct SumEditor {
|
||||
cur: usize,
|
||||
editors: Vec< Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>> >,
|
||||
editors: Vec< Arc<RwLock<dyn Nested + Send + Sync>> >,
|
||||
|
||||
port: ViewPort< dyn TerminalView >,
|
||||
diag_port: OuterViewPort< dyn SequenceView<Item = Message> >
|
||||
|
@ -32,7 +33,7 @@ pub struct SumEditor {
|
|||
|
||||
impl SumEditor {
|
||||
pub fn new(
|
||||
editors: Vec< Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>> >
|
||||
editors: Vec< Arc<RwLock<dyn Nested + Send + Sync>> >
|
||||
) -> Self {
|
||||
let port = ViewPort::new();
|
||||
let mut diag_buf = VecBuffer::new();
|
||||
|
@ -44,11 +45,12 @@ impl SumEditor {
|
|||
diag_port: diag_buf.get_port().to_sequence()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
pub fn select(&mut self, idx: usize) {
|
||||
self.cur = idx;
|
||||
let tv = self.editors[ self.cur ].read().unwrap().get_term_view();
|
||||
tv.add_observer( self.port.get_cast() );
|
||||
self.port.update_hooks.write().unwrap().clear();
|
||||
self.port.add_update_hook( Arc::new(tv.0.clone()) );
|
||||
self.port.set_view( Some(tv.get_view_arc()) );
|
||||
}
|
||||
|
@ -81,6 +83,9 @@ impl TerminalEditor for SumEditor {
|
|||
match event {
|
||||
TerminalEvent::Input( termion::event::Event::Key(Key::Ctrl('x')) ) => {
|
||||
self.select( (self.cur + 1) % self.editors.len() );
|
||||
if self.editors[ self.cur ].read().unwrap().get_cursor().tree_addr.len() == 0 {
|
||||
self.dn();
|
||||
}
|
||||
TerminalEditorResult::Continue
|
||||
},
|
||||
event => {
|
||||
|
@ -96,6 +101,6 @@ impl Diagnostics for SumEditor {
|
|||
}
|
||||
}
|
||||
|
||||
impl TerminalTreeEditor for SumEditor {}
|
||||
impl Nested for SumEditor {}
|
||||
|
||||
|
||||
|
|
35
nested/src/tree/cursor.rs
Normal file
35
nested/src/tree/cursor.rs
Normal file
|
@ -0,0 +1,35 @@
|
|||
use {
|
||||
crate::list::ListCursorMode,
|
||||
cgmath::Vector2
|
||||
};
|
||||
|
||||
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
||||
|
||||
#[derive(Clone, Eq, PartialEq)]
|
||||
pub struct TreeCursor {
|
||||
pub leaf_mode: ListCursorMode,
|
||||
pub tree_addr: Vec<isize>,
|
||||
}
|
||||
|
||||
impl TreeCursor {
|
||||
pub fn home() -> Self {
|
||||
TreeCursor {
|
||||
leaf_mode: ListCursorMode::Insert,
|
||||
tree_addr: vec![0]
|
||||
}
|
||||
}
|
||||
|
||||
pub fn none() -> Self {
|
||||
TreeCursor {
|
||||
leaf_mode: ListCursorMode::Select,
|
||||
tree_addr: vec![],
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for TreeCursor {
|
||||
fn default() -> Self {
|
||||
TreeCursor::none()
|
||||
}
|
||||
}
|
||||
|
18
nested/src/tree/mod.rs
Normal file
18
nested/src/tree/mod.rs
Normal file
|
@ -0,0 +1,18 @@
|
|||
pub mod cursor;
|
||||
pub mod nav;
|
||||
pub mod typeinfo;
|
||||
|
||||
pub struct TreeAddr(Vec<usize>);
|
||||
|
||||
impl From<Vec<usize>> for TreeAddr {
|
||||
fn from(v: Vec<usize>) -> TreeAddr {
|
||||
TreeAddr(v)
|
||||
}
|
||||
}
|
||||
|
||||
pub use {
|
||||
cursor::TreeCursor,
|
||||
nav::{TreeNav, TreeNavResult},
|
||||
typeinfo::TreeType
|
||||
};
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
use {
|
||||
crate::list::ListCursorMode,
|
||||
crate::tree::TreeCursor,
|
||||
cgmath::Vector2
|
||||
};
|
||||
|
||||
|
@ -20,34 +21,6 @@ impl From<TreeNavResult> for TerminalEditorResult {
|
|||
}
|
||||
*/
|
||||
|
||||
#[derive(Clone, Eq, PartialEq)]
|
||||
pub struct TreeCursor {
|
||||
pub leaf_mode: ListCursorMode,
|
||||
pub tree_addr: Vec<isize>,
|
||||
}
|
||||
|
||||
impl TreeCursor {
|
||||
pub fn home() -> Self {
|
||||
TreeCursor {
|
||||
leaf_mode: ListCursorMode::Insert,
|
||||
tree_addr: vec![0]
|
||||
}
|
||||
}
|
||||
|
||||
pub fn none() -> Self {
|
||||
TreeCursor {
|
||||
leaf_mode: ListCursorMode::Select,
|
||||
tree_addr: vec![],
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for TreeCursor {
|
||||
fn default() -> Self {
|
||||
TreeCursor::none()
|
||||
}
|
||||
}
|
||||
|
||||
pub trait TreeNav {
|
||||
/* CORE
|
||||
*/
|
||||
|
@ -59,6 +32,10 @@ pub trait TreeNav {
|
|||
TreeCursor::default()
|
||||
}
|
||||
|
||||
fn get_max_depth(&self) -> usize {
|
||||
0
|
||||
}
|
||||
|
||||
fn goby(&mut self, direction: Vector2<isize>) -> TreeNavResult {
|
||||
TreeNavResult::Exit
|
||||
}
|
||||
|
@ -149,8 +126,3 @@ pub trait TreeNav {
|
|||
}
|
||||
}
|
||||
|
||||
use crate::terminal::{TerminalEditor};
|
||||
use crate::diagnostics::{Diagnostics};
|
||||
|
||||
pub trait TerminalTreeEditor : TerminalEditor + TreeNav + Diagnostics + Send {}
|
||||
|
|
@ -16,30 +16,32 @@ use {
|
|||
terminal::{
|
||||
TerminalAtom, TerminalEditor, TerminalEditorResult, TerminalEvent, TerminalStyle, TerminalView, make_label
|
||||
},
|
||||
tree_nav::{TreeCursor, TreeNav, TreeNavResult, TerminalTreeEditor},
|
||||
tree::{TreeCursor, TreeNav, TreeNavResult},
|
||||
diagnostics::{Diagnostics},
|
||||
make_editor::make_editor,
|
||||
product::ProductEditor
|
||||
product::ProductEditor,
|
||||
sum::SumEditor,
|
||||
Nested
|
||||
}
|
||||
};
|
||||
|
||||
trait Action {
|
||||
fn make_editor(&self, ctx: Arc<RwLock<Context>>) -> Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>;
|
||||
fn make_editor(&self, ctx: Arc<RwLock<Context>>) -> Arc<RwLock<dyn Nested + Send + Sync>>;
|
||||
}
|
||||
|
||||
pub struct ActCd {}
|
||||
impl Action for ActCd {
|
||||
fn make_editor(&self, ctx: Arc<RwLock<Context>>) -> Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>> {
|
||||
fn make_editor(&self, ctx: Arc<RwLock<Context>>) -> Arc<RwLock<dyn Nested + Send + Sync>> {
|
||||
let depth = 1;
|
||||
Arc::new(RwLock::new(ProductEditor::new(depth, ctx.clone())
|
||||
.with_n(Point2::new(0, 0), vec![ ctx.read().unwrap().type_term_from_str("( Path )").unwrap() ] )
|
||||
)) as Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>
|
||||
)) as Arc<RwLock<dyn Nested + Send + Sync>>
|
||||
}
|
||||
}
|
||||
|
||||
pub struct ActLs {}
|
||||
impl Action for ActLs {
|
||||
fn make_editor(&self, ctx: Arc<RwLock<Context>>) -> Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>> {
|
||||
fn make_editor(&self, ctx: Arc<RwLock<Context>>) -> Arc<RwLock<dyn Nested + Send + Sync>> {
|
||||
let depth = 1;
|
||||
Arc::new(RwLock::new(ProductEditor::new(depth, ctx.clone())
|
||||
.with_t(Point2::new(1, 0), " Files")
|
||||
|
@ -47,24 +49,39 @@ impl Action for ActLs {
|
|||
.with_t(Point2::new(1, 1), " Options")
|
||||
.with_n(Point2::new(0, 1), vec![ ctx.read().unwrap().type_term_from_str("( List String )").unwrap() ] )
|
||||
|
||||
)) as Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>
|
||||
)) as Arc<RwLock<dyn Nested + Send + Sync>>
|
||||
}
|
||||
}
|
||||
|
||||
pub struct ActEcho {}
|
||||
impl Action for ActEcho {
|
||||
fn make_editor(&self, ctx: Arc<RwLock<Context>>) -> Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>> {
|
||||
fn make_editor(&self, ctx: Arc<RwLock<Context>>) -> Arc<RwLock<dyn Nested + Send + Sync>> {
|
||||
let depth = 1;
|
||||
Arc::new(RwLock::new(ProductEditor::new(depth, ctx.clone())
|
||||
|
||||
let a = Arc::new(RwLock::new(ProductEditor::new(depth, ctx.clone())
|
||||
.with_n(Point2::new(0, 0), vec![ ctx.read().unwrap().type_term_from_str("( String )").unwrap() ] )
|
||||
|
||||
)) as Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>
|
||||
)) as Arc<RwLock<dyn Nested + Send + Sync>>;
|
||||
|
||||
let b = Arc::new(RwLock::new(ProductEditor::new(depth, ctx.clone())
|
||||
.with_n(Point2::new(0, 0), vec![ ctx.read().unwrap().type_term_from_str("( PosInt 16 BigEndian )").unwrap() ] )
|
||||
|
||||
)) as Arc<RwLock<dyn Nested + Send + Sync>>;
|
||||
|
||||
let mut x = Arc::new(RwLock::new( SumEditor::new(
|
||||
vec![
|
||||
a, b
|
||||
]
|
||||
) ));
|
||||
|
||||
x.write().unwrap().select(0);
|
||||
x
|
||||
}
|
||||
}
|
||||
|
||||
pub struct ActCp {}
|
||||
impl Action for ActCp {
|
||||
fn make_editor(&self, ctx: Arc<RwLock<Context>>) -> Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>> {
|
||||
fn make_editor(&self, ctx: Arc<RwLock<Context>>) -> Arc<RwLock<dyn Nested + Send + Sync>> {
|
||||
let depth = 1;
|
||||
Arc::new(RwLock::new(ProductEditor::new(depth, ctx.clone())
|
||||
.with_t(Point2::new(1, 1), " Source")
|
||||
|
@ -73,13 +90,13 @@ impl Action for ActCp {
|
|||
.with_n(Point2::new(0, 2), vec![ ctx.read().unwrap().type_term_from_str("( Path )").unwrap() ] )
|
||||
.with_t(Point2::new(1, 3), " Options")
|
||||
.with_n(Point2::new(0, 3), vec![ ctx.read().unwrap().type_term_from_str("( List Symbol )").unwrap() ] )
|
||||
)) as Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>
|
||||
)) as Arc<RwLock<dyn Nested + Send + Sync>>
|
||||
}
|
||||
}
|
||||
|
||||
pub struct ActNum {}
|
||||
impl Action for ActNum {
|
||||
fn make_editor(&self, ctx: Arc<RwLock<Context>>) -> Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>> {
|
||||
fn make_editor(&self, ctx: Arc<RwLock<Context>>) -> Arc<RwLock<dyn Nested + Send + Sync>> {
|
||||
let depth = 1;
|
||||
Arc::new(RwLock::new(ProductEditor::new(depth, ctx.clone())
|
||||
.with_t(Point2::new(1, 1), " Value")
|
||||
|
@ -87,7 +104,7 @@ impl Action for ActNum {
|
|||
.with_t(Point2::new(1, 2), " Radix")
|
||||
.with_n(Point2::new(0, 2), vec![ ctx.read().unwrap().type_term_from_str("( PosInt 10 BigEndian )").unwrap() ] )
|
||||
|
||||
)) as Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>
|
||||
)) as Arc<RwLock<dyn Nested + Send + Sync>>
|
||||
|
||||
// Arc::new(RwLock::new(nested::integer::PosIntEditor::new(10)))
|
||||
}
|
||||
|
@ -95,7 +112,7 @@ impl Action for ActNum {
|
|||
|
||||
pub struct ActColor {}
|
||||
impl Action for ActColor {
|
||||
fn make_editor(&self, ctx: Arc<RwLock<Context>>) -> Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>> {
|
||||
fn make_editor(&self, ctx: Arc<RwLock<Context>>) -> Arc<RwLock<dyn Nested + Send + Sync>> {
|
||||
let depth = 1;
|
||||
Arc::new(RwLock::new(ProductEditor::new(depth, ctx.clone())
|
||||
.with_t(Point2::new(1, 1), " RGB")
|
||||
|
@ -104,19 +121,19 @@ impl Action for ActColor {
|
|||
.with_n(Point2::new(0, 2), vec![ ctx.read().unwrap().type_term_from_str("( RGB )").unwrap() ] )
|
||||
.with_t(Point2::new(1, 3), " HSL")
|
||||
.with_n(Point2::new(0, 3), vec![ ctx.read().unwrap().type_term_from_str("( RGB )").unwrap() ] )
|
||||
)) as Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>
|
||||
)) as Arc<RwLock<dyn Nested + Send + Sync>>
|
||||
}
|
||||
}
|
||||
|
||||
pub struct ActLet {}
|
||||
impl Action for ActLet {
|
||||
fn make_editor(&self, ctx: Arc<RwLock<Context>>) -> Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>> {
|
||||
fn make_editor(&self, ctx: Arc<RwLock<Context>>) -> Arc<RwLock<dyn Nested + Send + Sync>> {
|
||||
let depth = 1;
|
||||
Arc::new(RwLock::new(ProductEditor::new(depth, ctx.clone())
|
||||
.with_n(Point2::new(0, 0), vec![ ctx.read().unwrap().type_term_from_str("( Symbol )").unwrap() ] )
|
||||
.with_t(Point2::new(1, 0), " := ")
|
||||
.with_n(Point2::new(2, 0), vec![ ctx.read().unwrap().type_term_from_str("( PosInt 10 BigEndian )").unwrap() ] )
|
||||
)) as Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>
|
||||
)) as Arc<RwLock<dyn Nested + Send + Sync>>
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -127,7 +144,7 @@ pub struct Commander {
|
|||
valid: Arc<RwLock<bool>>,
|
||||
confirmed: bool,
|
||||
symbol_editor: PTYListEditor<CharEditor>,
|
||||
cmd_editor: Option<Arc<RwLock<dyn TerminalTreeEditor + Send + Sync>>>,
|
||||
cmd_editor: Option<Arc<RwLock<dyn Nested + Send + Sync>>>,
|
||||
|
||||
view_elements: VecBuffer<OuterViewPort<dyn TerminalView>>,
|
||||
out_port: OuterViewPort<dyn TerminalView>,
|
||||
|
@ -209,9 +226,12 @@ impl TerminalEditor for Commander {
|
|||
if let (Some(cmd_editor), true) = (self.cmd_editor.as_ref(), self.confirmed) {
|
||||
match event {
|
||||
TerminalEvent::Input(Event::Key(Key::Char('\n'))) => {
|
||||
if cmd_editor.write().unwrap().nexd() == TreeNavResult::Exit {
|
||||
let mut c = cmd_editor.write().unwrap();
|
||||
if let TerminalEditorResult::Exit = c.handle_terminal_event(&TerminalEvent::Input(Event::Key(Key::Char('\n')))) {
|
||||
|
||||
// run
|
||||
cmd_editor.write().unwrap().goto(TreeCursor::none());
|
||||
c.goto(TreeCursor::none());
|
||||
c.up();
|
||||
|
||||
TerminalEditorResult::Exit
|
||||
} else {
|
||||
|
@ -245,7 +265,7 @@ impl TerminalEditor for Commander {
|
|||
self.m_buf.clear();
|
||||
self.m_buf.push(b.get_port().to_sequence());
|
||||
}
|
||||
|
||||
|
||||
TerminalEditorResult::Continue
|
||||
}
|
||||
|
||||
|
@ -323,5 +343,5 @@ impl TreeNav for Commander {
|
|||
}
|
||||
}
|
||||
|
||||
impl TerminalTreeEditor for Commander {}
|
||||
impl Nested for Commander {}
|
||||
|
||||
|
|
|
@ -22,10 +22,11 @@ use {
|
|||
make_label, Terminal, TerminalAtom, TerminalCompositor, TerminalEditor,
|
||||
TerminalEditorResult, TerminalEvent, TerminalStyle, TerminalView,
|
||||
},
|
||||
tree_nav::{TreeNav, TerminalTreeEditor, TreeCursor, TreeNavResult},
|
||||
tree::{TreeNav, TreeCursor, TreeNavResult},
|
||||
vec::VecBuffer,
|
||||
integer::{PosIntEditor},
|
||||
diagnostics::{Diagnostics}
|
||||
diagnostics::{Diagnostics},
|
||||
Nested
|
||||
},
|
||||
std::sync::{Arc, RwLock},
|
||||
termion::event::{Event, Key},
|
||||
|
|
|
@ -10,8 +10,9 @@ use {
|
|||
TerminalAtom, TerminalEditor, TerminalEditorResult, TerminalEvent, TerminalStyle,
|
||||
TerminalView,
|
||||
},
|
||||
tree_nav::{TerminalTreeEditor, TreeCursor, TreeNav, TreeNavResult},
|
||||
diagnostics::Diagnostics
|
||||
tree::{TreeCursor, TreeNav, TreeNavResult},
|
||||
diagnostics::Diagnostics,
|
||||
Nested
|
||||
},
|
||||
std::sync::Arc,
|
||||
std::sync::RwLock,
|
||||
|
@ -77,7 +78,7 @@ impl TreeNav for ProcessArg {
|
|||
impl Diagnostics for ProcessArg {
|
||||
}
|
||||
|
||||
impl TerminalTreeEditor for ProcessArg {}
|
||||
impl Nested for ProcessArg {}
|
||||
|
||||
pub struct ProcessLauncher {
|
||||
cmd_editor: PTYListEditor<ProcessArg>,
|
||||
|
@ -272,5 +273,5 @@ impl TreeNav for ProcessLauncher {
|
|||
impl Diagnostics for ProcessLauncher {
|
||||
}
|
||||
|
||||
impl TerminalTreeEditor for ProcessLauncher {}
|
||||
impl Nested for ProcessLauncher {}
|
||||
|
||||
|
|
Loading…
Reference in a new issue