2020-12-04 20:38:51 +01:00
|
|
|
|
|
|
|
#![feature(trait_alias)]
|
2020-12-08 15:51:24 +01:00
|
|
|
#![feature(assoc_char_funcs)]
|
2020-12-04 20:38:51 +01:00
|
|
|
|
|
|
|
pub mod view;
|
|
|
|
pub mod port;
|
|
|
|
pub mod channel;
|
2020-12-08 15:58:23 +01:00
|
|
|
pub mod singleton_buffer;
|
|
|
|
pub mod vec_buffer;
|
2020-12-09 12:56:38 +01:00
|
|
|
pub mod terminal;
|
2020-12-14 19:36:21 +01:00
|
|
|
pub mod string_editor;
|
2020-12-04 20:38:51 +01:00
|
|
|
|
2020-12-07 18:09:48 +01:00
|
|
|
use {
|
2020-12-09 17:56:33 +01:00
|
|
|
async_std::{task},
|
2020-12-07 18:09:48 +01:00
|
|
|
std::{
|
|
|
|
sync::{Arc, RwLock}
|
|
|
|
},
|
|
|
|
cgmath::{Vector2},
|
|
|
|
crate::{
|
|
|
|
view::{View, Observer},
|
2020-12-09 17:31:08 +01:00
|
|
|
port::{ViewPort, InnerViewPort, OuterViewPort},
|
2020-12-08 15:58:23 +01:00
|
|
|
singleton_buffer::SingletonBuffer,
|
2020-12-09 12:56:38 +01:00
|
|
|
vec_buffer::VecBuffer,
|
2020-12-14 19:36:21 +01:00
|
|
|
terminal::{
|
|
|
|
Terminal,
|
|
|
|
TerminalAtom,
|
|
|
|
TerminalStyle,
|
|
|
|
TerminalCompositor,
|
|
|
|
TerminalEvent
|
|
|
|
}
|
|
|
|
},
|
|
|
|
termion::event::{Event, Key}
|
2020-12-07 18:09:48 +01:00
|
|
|
};
|
2020-12-04 20:38:51 +01:00
|
|
|
|
2020-12-09 17:31:08 +01:00
|
|
|
struct Fill(TerminalAtom);
|
|
|
|
impl View for Fill {
|
|
|
|
type Key = Vector2<i16>;
|
|
|
|
type Value = TerminalAtom;
|
|
|
|
|
|
|
|
fn view(&self, _: Vector2<i16>) -> Option<TerminalAtom> {
|
|
|
|
Some(self.0.clone())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-04 20:38:51 +01:00
|
|
|
#[async_std::main]
|
|
|
|
async fn main() {
|
2020-12-09 17:31:08 +01:00
|
|
|
let composite_view = port::ViewPort::new();
|
|
|
|
let mut compositor = TerminalCompositor::new(composite_view.inner());
|
2020-12-08 15:51:24 +01:00
|
|
|
|
2020-12-09 17:31:08 +01:00
|
|
|
task::spawn(async move {
|
2020-12-14 19:36:21 +01:00
|
|
|
/*\
|
|
|
|
<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
|
|
|
Setup Views
|
|
|
|
<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
|
|
|
\*/
|
2020-12-09 17:31:08 +01:00
|
|
|
let fp = port::ViewPort::with_view(Arc::new(Fill(TerminalAtom::new('.', TerminalStyle::fg_color((50,50,50))))));
|
|
|
|
compositor.push(fp.outer());
|
|
|
|
|
2020-12-14 19:36:21 +01:00
|
|
|
let ep = port::ViewPort::new();
|
|
|
|
let mut editor = string_editor::StringEditor::new(ep.inner());
|
|
|
|
compositor.push(ep.outer());
|
2020-12-04 20:38:51 +01:00
|
|
|
|
2020-12-14 19:36:21 +01:00
|
|
|
/*\
|
|
|
|
<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
|
|
|
Event Loop
|
|
|
|
<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
|
|
|
\*/
|
|
|
|
let mut term = Terminal::new();
|
|
|
|
loop {
|
|
|
|
match term.next_event().await {
|
|
|
|
TerminalEvent::Resize(size) => {
|
|
|
|
for x in 0 .. size.x {
|
|
|
|
for y in 0 .. size.y {
|
|
|
|
fp.inner().notify(Vector2::new(x,y));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
TerminalEvent::Input(Event::Key(Key::Left)) => editor.prev(),
|
|
|
|
TerminalEvent::Input(Event::Key(Key::Right)) => editor.next(),
|
|
|
|
TerminalEvent::Input(Event::Key(Key::Home)) => editor.goto(0),
|
|
|
|
TerminalEvent::Input(Event::Key(Key::End)) => editor.goto_end(),
|
|
|
|
TerminalEvent::Input(Event::Key(Key::Char(c))) => editor.insert(c),
|
|
|
|
TerminalEvent::Input(Event::Key(Key::Delete)) => editor.delete(),
|
|
|
|
TerminalEvent::Input(Event::Key(Key::Backspace)) => { editor.prev(); editor.delete(); },
|
|
|
|
TerminalEvent::Input(Event::Key(Key::Ctrl('c'))) => break,
|
|
|
|
_ => {}
|
2020-12-09 17:31:08 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2020-12-04 20:38:51 +01:00
|
|
|
|
2020-12-14 19:36:21 +01:00
|
|
|
/*\
|
|
|
|
<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
|
|
|
Terminal Rendering
|
|
|
|
<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
|
|
|
\*/
|
2020-12-09 17:56:33 +01:00
|
|
|
Terminal::show(composite_view.into_outer()).await.ok();
|
2020-12-04 20:38:51 +01:00
|
|
|
}
|
|
|
|
|