elio 1.3.0

Snappy, batteries-included terminal file manager with rich previews, inline images, bulk actions, and trash support.
Documentation
use super::super::App;
use super::super::text_edit::{
    char_to_byte, next_delete_end, next_word_start, previous_delete_start, previous_word_start,
    remove_char_range,
};

impl App {
    pub(in crate::app::create) fn create_insert_newline(&mut self) {
        let Some(c) = &mut self.overlays.create else {
            return;
        };
        let tail = {
            let byte = char_to_byte(&c.lines[c.cursor_line], c.cursor_col);
            c.lines[c.cursor_line].split_off(byte)
        };
        c.cursor_line += 1;
        c.lines.insert(c.cursor_line, tail);
        c.line_errors.insert(c.cursor_line, None);
        c.cursor_col = 0;
        c.preferred_col = 0;
    }

    pub(in crate::app::create) fn create_move_horizontal(&mut self, delta: isize) {
        let Some(c) = &mut self.overlays.create else {
            return;
        };
        if delta < 0 {
            if c.cursor_col > 0 {
                c.cursor_col -= 1;
            } else if c.cursor_line > 0 {
                c.cursor_line -= 1;
                c.cursor_col = c.lines[c.cursor_line].chars().count();
            }
        } else {
            let len = c.lines[c.cursor_line].chars().count();
            if c.cursor_col < len {
                c.cursor_col += 1;
            } else if c.cursor_line + 1 < c.lines.len() {
                c.cursor_line += 1;
                c.cursor_col = 0;
            }
        }
        c.preferred_col = c.cursor_col;
    }

    pub(in crate::app::create) fn create_move_word(&mut self, direction: isize) {
        let Some(c) = &mut self.overlays.create else {
            return;
        };
        let line = &c.lines[c.cursor_line];
        let new_col = if direction < 0 {
            previous_word_start(line, c.cursor_col)
        } else {
            next_word_start(line, c.cursor_col)
        };
        c.cursor_col = new_col;
        c.preferred_col = new_col;
    }

    pub(in crate::app::create) fn create_move_vertical(&mut self, delta: isize) {
        let Some(c) = &mut self.overlays.create else {
            return;
        };
        let new_line =
            (c.cursor_line as isize + delta).clamp(0, c.lines.len() as isize - 1) as usize;
        if new_line == c.cursor_line {
            return;
        }
        c.cursor_line = new_line;
        let max_col = c.lines[c.cursor_line].chars().count();
        c.cursor_col = c.preferred_col.min(max_col);
    }

    pub(in crate::app::create) fn create_backspace(&mut self) {
        let Some(c) = &mut self.overlays.create else {
            return;
        };
        if c.cursor_col > 0 {
            let start = char_to_byte(&c.lines[c.cursor_line], c.cursor_col - 1);
            let end = char_to_byte(&c.lines[c.cursor_line], c.cursor_col);
            c.lines[c.cursor_line].replace_range(start..end, "");
            c.cursor_col -= 1;
            c.preferred_col = c.cursor_col;
            c.line_errors[c.cursor_line] = None;
        } else if c.cursor_line > 0 {
            let removed = c.lines.remove(c.cursor_line);
            c.line_errors.remove(c.cursor_line);
            c.cursor_line -= 1;
            c.cursor_col = c.lines[c.cursor_line].chars().count();
            c.preferred_col = c.cursor_col;
            c.lines[c.cursor_line].push_str(&removed);
            c.line_errors[c.cursor_line] = None;
        }
    }

    pub(in crate::app::create) fn create_delete(&mut self) {
        let Some(c) = &mut self.overlays.create else {
            return;
        };
        let len = c.lines[c.cursor_line].chars().count();
        if c.cursor_col < len {
            let start = char_to_byte(&c.lines[c.cursor_line], c.cursor_col);
            let end = char_to_byte(&c.lines[c.cursor_line], c.cursor_col + 1);
            c.lines[c.cursor_line].replace_range(start..end, "");
            c.line_errors[c.cursor_line] = None;
        } else if c.cursor_line + 1 < c.lines.len() {
            let next = c.lines.remove(c.cursor_line + 1);
            c.line_errors.remove(c.cursor_line + 1);
            c.lines[c.cursor_line].push_str(&next);
            c.line_errors[c.cursor_line] = None;
        }
    }

    pub(in crate::app::create) fn create_delete_word_back(&mut self) {
        let Some(c) = &mut self.overlays.create else {
            return;
        };
        if c.cursor_col == 0 {
            return;
        }
        let line = &mut c.lines[c.cursor_line];
        let start = previous_delete_start(line, c.cursor_col);
        remove_char_range(line, start, c.cursor_col);
        c.cursor_col = start;
        c.preferred_col = start;
        c.line_errors[c.cursor_line] = None;
    }

    pub(in crate::app::create) fn create_delete_word_forward(&mut self) {
        let Some(c) = &mut self.overlays.create else {
            return;
        };
        let line = &mut c.lines[c.cursor_line];
        let end = next_delete_end(line, c.cursor_col);
        remove_char_range(line, c.cursor_col, end);
        c.line_errors[c.cursor_line] = None;
    }
}