cursor
This commit is contained in:
parent
d55c65216f
commit
b4da358591
1 changed files with 34 additions and 2 deletions
36
src/lib.rs
36
src/lib.rs
|
@ -55,6 +55,7 @@ pub enum Msg {
|
|||
pub struct Model {
|
||||
screen_buffer: [u8; 65536],
|
||||
screen_buffer_index: usize,
|
||||
cursor_index: usize,
|
||||
fd: OwnedFd,
|
||||
stdin: OwnedFd,
|
||||
input: String,
|
||||
|
@ -64,6 +65,7 @@ impl Model {
|
|||
fn new(
|
||||
screen_buffer: [u8; 65536],
|
||||
screen_buffer_index: usize,
|
||||
cursor_index: usize,
|
||||
fd: OwnedFd,
|
||||
stdin: OwnedFd,
|
||||
input: String,
|
||||
|
@ -71,6 +73,7 @@ impl Model {
|
|||
Model {
|
||||
screen_buffer,
|
||||
screen_buffer_index,
|
||||
cursor_index,
|
||||
fd,
|
||||
stdin,
|
||||
input,
|
||||
|
@ -84,14 +87,33 @@ impl Model {
|
|||
None => (),
|
||||
},
|
||||
Msg::KeyPressed(key) => match key {
|
||||
keyboard::Key::Character(c) => self.input.push_str(c.as_str()),
|
||||
keyboard::Key::Character(c) => {
|
||||
self.input_char(c.chars().nth(0).unwrap());
|
||||
}
|
||||
keyboard::Key::Named(keyboard::key::Named::Enter) => {
|
||||
self.input.push('\n');
|
||||
let mut write_buffer = self.input.as_bytes().to_vec();
|
||||
write(self.fd.as_fd(), &mut write_buffer);
|
||||
self.input = String::new();
|
||||
self.cursor_index = 0;
|
||||
}
|
||||
keyboard::Key::Named(keyboard::key::Named::Space) => {
|
||||
self.input_char(' ');
|
||||
}
|
||||
keyboard::Key::Named(keyboard::key::Named::ArrowLeft) => {
|
||||
if self.cursor_index <= 0 {
|
||||
self.cursor_index = 0;
|
||||
} else {
|
||||
self.cursor_index -= 1;
|
||||
}
|
||||
}
|
||||
keyboard::Key::Named(keyboard::key::Named::ArrowRight) => {
|
||||
if self.cursor_index >= self.input.len() - 1 {
|
||||
self.cursor_index = self.input.len() - 1;
|
||||
} else {
|
||||
self.cursor_index += 1;
|
||||
}
|
||||
}
|
||||
keyboard::Key::Named(keyboard::key::Named::Space) => self.input.push(' '),
|
||||
_ => (),
|
||||
},
|
||||
};
|
||||
|
@ -132,6 +154,15 @@ impl Model {
|
|||
self.screen_buffer_index += 1;
|
||||
}
|
||||
}
|
||||
|
||||
fn input_char(&mut self, c: char) {
|
||||
if self.cursor_index == self.input.len() {
|
||||
self.input.push_str(c.to_string().as_str());
|
||||
} else {
|
||||
self.input.insert(self.cursor_index, c);
|
||||
}
|
||||
self.cursor_index += 1;
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for Model {
|
||||
|
@ -139,6 +170,7 @@ impl Default for Model {
|
|||
let mut me = Self::new(
|
||||
[0; 65536],
|
||||
0,
|
||||
0,
|
||||
spawn_pty_with_shell("/home/mtgmonkey/.nix-profile/bin/dash".to_string()),
|
||||
std::io::stdin().as_fd().try_clone_to_owned().unwrap(),
|
||||
String::new(),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue