shell: use a ListEditor of ProcessLaunchers in top level
This commit is contained in:
parent
911b69aeea
commit
c68a9f785d
7 changed files with 378 additions and 178 deletions
shell/src
|
@ -8,7 +8,7 @@ use {
|
|||
termion::event::{Key, Event},
|
||||
cgmath::Point2,
|
||||
nested::{
|
||||
core::{OuterViewPort, InnerViewPort, Observer},
|
||||
core::{ViewPort, OuterViewPort, InnerViewPort, Observer},
|
||||
singleton::{SingletonView, SingletonBuffer},
|
||||
sequence::{SequenceView, SequenceViewExt},
|
||||
index::buffer::IndexBuffer,
|
||||
|
@ -69,14 +69,26 @@ impl TreeNav for ProcessArg {
|
|||
}
|
||||
|
||||
pub struct ProcessLauncher {
|
||||
editor: ListEditor< ProcessArg,
|
||||
Box<dyn Fn() -> Arc<RwLock<ProcessArg>> + Send + Sync + 'static> >
|
||||
cmd_editor: ListEditor<
|
||||
ProcessArg, Box<dyn Fn() -> Arc<RwLock<ProcessArg>> + Send + Sync + 'static>
|
||||
>,
|
||||
pty: Option<crate::pty::PTY>,
|
||||
ptybox: Arc<RwLock<crate::ascii_box::AsciiBox>>,
|
||||
|
||||
pty_port: ViewPort<dyn TerminalView>,
|
||||
|
||||
comp_port: ViewPort<dyn TerminalView>,
|
||||
compositor: Arc<RwLock<nested::terminal::TerminalCompositor>>
|
||||
}
|
||||
|
||||
impl ProcessLauncher {
|
||||
pub fn new() -> Self {
|
||||
ProcessLauncher {
|
||||
editor: ListEditor::new(
|
||||
let pty_port = ViewPort::new();
|
||||
let comp_port = ViewPort::new();
|
||||
let box_port = ViewPort::<dyn TerminalView>::new();
|
||||
let compositor = nested::terminal::TerminalCompositor::new(comp_port.inner());
|
||||
|
||||
let cmd_editor = ListEditor::new(
|
||||
Box::new(
|
||||
|| {
|
||||
Arc::new(RwLock::new(ProcessArg {
|
||||
|
@ -89,19 +101,52 @@ impl ProcessLauncher {
|
|||
ListEditorStyle::Plain)
|
||||
}))
|
||||
}
|
||||
),
|
||||
) as Box::<dyn Fn() -> Arc<RwLock<ProcessArg>> + Send + Sync>,
|
||||
ListEditorStyle::Plain
|
||||
)
|
||||
);
|
||||
|
||||
compositor.write().unwrap().push(
|
||||
box_port.outer()
|
||||
.map_item(|_idx, x| x.add_style_back(TerminalStyle::fg_color((90, 120, 100))))
|
||||
);
|
||||
compositor.write().unwrap().push(
|
||||
cmd_editor
|
||||
.get_seg_seq_view()
|
||||
.decorate("$(", ")", " ", 0)
|
||||
.to_grid_horizontal()
|
||||
.flatten()
|
||||
);
|
||||
|
||||
ProcessLauncher {
|
||||
cmd_editor,
|
||||
pty: None,
|
||||
ptybox: crate::ascii_box::AsciiBox::new(
|
||||
cgmath::Vector2::new(80, 25),
|
||||
pty_port.outer()
|
||||
.map_item(|_,a:&TerminalAtom| a.add_style_back(TerminalStyle::fg_color((230, 230, 230)))),
|
||||
box_port.inner()
|
||||
),
|
||||
pty_port,
|
||||
comp_port,
|
||||
compositor
|
||||
}
|
||||
}
|
||||
|
||||
pub fn launch_pty2(&mut self) {
|
||||
self.launch_pty(self.pty_port.inner());
|
||||
//self.ptybox.write().unwrap().fit_content();
|
||||
|
||||
//let mut p =
|
||||
//table_port.update_hooks.write().unwrap().push(Arc::new(p.clone().0));
|
||||
}
|
||||
|
||||
pub fn launch_pty(&mut self, port: InnerViewPort<dyn TerminalView>) -> Option<crate::pty::PTY> {
|
||||
self.up();
|
||||
self.up();
|
||||
|
||||
let mut strings = Vec::new();
|
||||
|
||||
let v = self.editor.get_data_port().get_view().unwrap();
|
||||
let v = self.cmd_editor.get_data_port().get_view().unwrap();
|
||||
for i in 0 .. v.len().unwrap_or(0) {
|
||||
let arg_view = v.get(&i).unwrap().read().unwrap().get_data_port().get_view().unwrap();
|
||||
strings.push(arg_view.iter().collect::<String>());
|
||||
|
@ -121,35 +166,31 @@ impl ProcessLauncher {
|
|||
|
||||
impl TerminalEditor for ProcessLauncher {
|
||||
fn get_term_view(&self) -> OuterViewPort<dyn TerminalView> {
|
||||
self.editor
|
||||
.get_seg_seq_view()
|
||||
.decorate("$(", ")", " ", 0)
|
||||
.to_grid_horizontal()
|
||||
.flatten()
|
||||
self.comp_port.outer()
|
||||
}
|
||||
|
||||
fn handle_terminal_event(&mut self, event: &TerminalEvent) -> TerminalEditorResult {
|
||||
match event {
|
||||
TerminalEvent::Input(Event::Key(Key::Char('\n'))) => {
|
||||
// launch command
|
||||
self.editor.up();
|
||||
self.editor.up();
|
||||
self.cmd_editor.up();
|
||||
self.cmd_editor.up();
|
||||
TerminalEditorResult::Exit
|
||||
}
|
||||
|
||||
event => self.editor.handle_terminal_event(event)
|
||||
event => self.cmd_editor.handle_terminal_event(event)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl TreeNav for ProcessLauncher {
|
||||
fn get_cursor(&self) -> TreeCursor { self.editor.get_cursor() }
|
||||
fn goto(&mut self, cur: TreeCursor) -> TreeNavResult { self.editor.goto(cur) }
|
||||
fn goto_home(&mut self) -> TreeNavResult { self.editor.goto_home() }
|
||||
fn goto_end(&mut self) -> TreeNavResult { self.editor.goto_end() }
|
||||
fn pxev(&mut self) -> TreeNavResult { self.editor.pxev() }
|
||||
fn nexd(&mut self) -> TreeNavResult { self.editor.nexd() }
|
||||
fn up(&mut self) -> TreeNavResult { self.editor.up() }
|
||||
fn dn(&mut self) -> TreeNavResult { self.editor.dn() }
|
||||
fn get_cursor(&self) -> TreeCursor { self.cmd_editor.get_cursor() }
|
||||
fn goto(&mut self, cur: TreeCursor) -> TreeNavResult { self.cmd_editor.goto(cur) }
|
||||
fn goto_home(&mut self) -> TreeNavResult { self.cmd_editor.goto_home() }
|
||||
fn goto_end(&mut self) -> TreeNavResult { self.cmd_editor.goto_end() }
|
||||
fn pxev(&mut self) -> TreeNavResult { self.cmd_editor.pxev() }
|
||||
fn nexd(&mut self) -> TreeNavResult { self.cmd_editor.nexd() }
|
||||
fn up(&mut self) -> TreeNavResult { self.cmd_editor.up() }
|
||||
fn dn(&mut self) -> TreeNavResult { self.cmd_editor.dn() }
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue