Basic save functionality
This commit is contained in:
parent
0c81912cac
commit
5d1c8d8b8b
@ -49,7 +49,9 @@ pub struct Editor {
|
|||||||
/// Keycode mapping enum
|
/// Keycode mapping enum
|
||||||
#[derive(Copy, Clone, Debug, PartialEq)]
|
#[derive(Copy, Clone, Debug, PartialEq)]
|
||||||
pub enum EditorKey<T> {
|
pub enum EditorKey<T> {
|
||||||
|
Enter,
|
||||||
Escape,
|
Escape,
|
||||||
|
Backspace,
|
||||||
ArrowLeft,
|
ArrowLeft,
|
||||||
ArrowRight,
|
ArrowRight,
|
||||||
ArrowUp,
|
ArrowUp,
|
||||||
@ -124,7 +126,9 @@ impl Editor {
|
|||||||
|
|
||||||
for char in in_str.chars() {
|
for char in in_str.chars() {
|
||||||
input.push(match char {
|
input.push(match char {
|
||||||
|
'\x7f' => Backspace,
|
||||||
'\x1b' => Escape,
|
'\x1b' => Escape,
|
||||||
|
'\r' => Enter,
|
||||||
_ => OtherKey(char),
|
_ => OtherKey(char),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -278,23 +282,19 @@ impl Editor {
|
|||||||
let key = self.read_key();
|
let key = self.read_key();
|
||||||
if key.is_some() {
|
if key.is_some() {
|
||||||
let char = key.unwrap();
|
let char = key.unwrap();
|
||||||
|
|
||||||
match char {
|
match char {
|
||||||
OtherKey(c) => {
|
Backspace => _del_or_backspace(Backspace),
|
||||||
if c == ctrl_key('q') {
|
Enter => {
|
||||||
print!("\x1b[2J");
|
// TODO
|
||||||
print!("\x1b[H");
|
|
||||||
// Break out of the input loop
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
DeleteKey => (),
|
|
||||||
Escape => (),
|
Escape => (),
|
||||||
ArrowUp => self.move_cursor(&ArrowUp),
|
ArrowUp => self.move_cursor(&ArrowUp),
|
||||||
ArrowDown => self.move_cursor(&ArrowDown),
|
ArrowDown => self.move_cursor(&ArrowDown),
|
||||||
ArrowLeft => self.move_cursor(&ArrowLeft),
|
ArrowLeft => self.move_cursor(&ArrowLeft),
|
||||||
ArrowRight => self.move_cursor(&ArrowRight),
|
ArrowRight => self.move_cursor(&ArrowRight),
|
||||||
PageUp => self.page_up_or_down(PageUp),
|
PageUp => self._page_up_or_down(PageUp),
|
||||||
PageDown => self.page_up_or_down(PageDown),
|
PageDown => self._page_up_or_down(PageDown),
|
||||||
HomeKey => {
|
HomeKey => {
|
||||||
self.cursor_x = 0;
|
self.cursor_x = 0;
|
||||||
}
|
}
|
||||||
@ -303,6 +303,26 @@ impl Editor {
|
|||||||
self.cursor_x = self.rows[self.cursor_y].chars.len();
|
self.cursor_x = self.rows[self.cursor_y].chars.len();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
OtherKey(c) => {
|
||||||
|
if c.is_ascii_control() {
|
||||||
|
if c == ctrl_key('q') {
|
||||||
|
print!("\x1b[2J");
|
||||||
|
print!("\x1b[H");
|
||||||
|
// Break out of the input loop
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
if c == ctrl_key('s') {
|
||||||
|
self.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
if c == ctrl_key('h') {
|
||||||
|
self._del_or_backspace(Backspace);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
self.insert_char(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
_ => (),
|
_ => (),
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -313,7 +333,11 @@ impl Editor {
|
|||||||
Some(OtherKey('\0'))
|
Some(OtherKey('\0'))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn page_up_or_down(&mut self, key: EditorKey<char>) {
|
fn _del_or_backspace(&mut self, key: EditorKey<char>) {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
fn _page_up_or_down(&mut self, key: EditorKey<char>) {
|
||||||
let mut times = self.screen_rows;
|
let mut times = self.screen_rows;
|
||||||
|
|
||||||
// Update the cursor position
|
// Update the cursor position
|
||||||
@ -542,10 +566,46 @@ impl Editor {
|
|||||||
self.update_row(self.rows.len() - 1);
|
self.update_row(self.rows.len() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn row_insert_char(&mut self, row_index: usize, char_index: usize, ch: char) {
|
||||||
|
let mut at = char_index;
|
||||||
|
let row = &mut self.rows[row_index];
|
||||||
|
|
||||||
|
if at > row.chars.len() {
|
||||||
|
at = row.chars.len();
|
||||||
|
}
|
||||||
|
|
||||||
|
row.chars.insert(at, ch);
|
||||||
|
|
||||||
|
self.update_row(row_index);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Editor Operations
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
fn insert_char(&mut self, ch: char) {
|
||||||
|
if self.cursor_y == self.rows.len() {
|
||||||
|
self.append_row("");
|
||||||
|
}
|
||||||
|
|
||||||
|
self.row_insert_char(self.cursor_y, self.cursor_x, ch);
|
||||||
|
self.cursor_x += 1;
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
// File I/O
|
// File I/O
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
fn rows_to_string(&mut self) -> String {
|
||||||
|
let mut output = String::new();
|
||||||
|
|
||||||
|
for row in self.rows {
|
||||||
|
output.push_str(&row.chars)
|
||||||
|
}
|
||||||
|
|
||||||
|
output
|
||||||
|
}
|
||||||
|
|
||||||
/// Open a file for display
|
/// Open a file for display
|
||||||
pub fn open(&mut self, filename: &str) -> io::Result<()> {
|
pub fn open(&mut self, filename: &str) -> io::Result<()> {
|
||||||
self.filename = filename.to_owned();
|
self.filename = filename.to_owned();
|
||||||
@ -560,4 +620,18 @@ impl Editor {
|
|||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn save(&mut self) -> io::Result<()> {
|
||||||
|
if self.filename.len() == 0 {
|
||||||
|
return Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut file = File::create(&self.filename)?;
|
||||||
|
let data = &mut self.rows_to_string();
|
||||||
|
|
||||||
|
file.write_all(data.as_bytes())?;
|
||||||
|
file.sync_all()?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user