impl TextArea {
pub fn move_left(&mut self) {
let pos = self.cursors.primary().pos;
if pos.col > 0 {
self.set_primary_cursor(pos.line, pos.col - 1);
} else if pos.line > 0 {
let new_line = pos.line - 1;
let new_col = self.line_len(new_line);
self.set_primary_cursor(new_line, new_col);
}
self.update_selection();
}
pub fn move_right(&mut self) {
let pos = self.cursors.primary().pos;
let line_len = self.line_len(pos.line);
if pos.col < line_len {
self.set_primary_cursor(pos.line, pos.col + 1);
} else if pos.line + 1 < self.lines.len() {
self.set_primary_cursor(pos.line + 1, 0);
}
self.update_selection();
}
pub fn move_up(&mut self) {
let pos = self.cursors.primary().pos;
if pos.line > 0 {
let new_line = pos.line - 1;
let new_col = pos.col.min(self.line_len(new_line));
self.set_primary_cursor(new_line, new_col);
}
self.update_selection();
}
pub fn move_down(&mut self) {
let pos = self.cursors.primary().pos;
if pos.line + 1 < self.lines.len() {
let new_line = pos.line + 1;
let new_col = pos.col.min(self.line_len(new_line));
self.set_primary_cursor(new_line, new_col);
}
self.update_selection();
}
pub fn move_home(&mut self) {
let pos = self.cursors.primary().pos;
self.set_primary_cursor(pos.line, 0);
self.update_selection();
}
pub fn move_end(&mut self) {
let pos = self.cursors.primary().pos;
let line_len = self.line_len(pos.line);
self.set_primary_cursor(pos.line, line_len);
self.update_selection();
}
pub fn move_document_start(&mut self) {
self.set_primary_cursor(0, 0);
self.update_selection();
}
pub fn move_document_end(&mut self) {
let last_line = self.lines.len().saturating_sub(1);
let last_col = self.line_len(last_line);
self.set_primary_cursor(last_line, last_col);
self.update_selection();
}
pub fn move_word_left(&mut self) {
let pos = self.cursors.primary().pos;
if pos.col == 0 {
if pos.line > 0 {
let new_line = pos.line - 1;
let new_col = self.line_len(new_line);
self.set_primary_cursor(new_line, new_col);
}
return;
}
let Some(line) = self.lines.get(pos.line) else {
return;
};
let chars: Vec<char> = line.chars().collect();
let mut col = pos.col.min(chars.len());
while col > 0 && chars[col - 1].is_whitespace() {
col -= 1;
}
while col > 0 && !chars[col - 1].is_whitespace() {
col -= 1;
}
self.set_primary_cursor(pos.line, col);
self.update_selection();
}
pub fn move_word_right(&mut self) {
let pos = self.cursors.primary().pos;
let Some(line) = self.lines.get(pos.line) else {
return;
};
let chars: Vec<char> = line.chars().collect();
let mut col = pos.col;
if col >= chars.len() {
if pos.line + 1 < self.lines.len() {
self.set_primary_cursor(pos.line + 1, 0);
}
return;
}
while col < chars.len() && !chars[col].is_whitespace() {
col += 1;
}
while col < chars.len() && chars[col].is_whitespace() {
col += 1;
}
self.set_primary_cursor(pos.line, col);
self.update_selection();
}
pub fn page_up(&mut self, page_size: usize) {
let pos = self.cursors.primary().pos;
let new_line = pos.line.saturating_sub(page_size);
let new_col = pos.col.min(self.line_len(new_line));
self.set_primary_cursor(new_line, new_col);
self.update_selection();
}
pub fn page_down(&mut self, page_size: usize) {
let pos = self.cursors.primary().pos;
let new_line = (pos.line + page_size).min(self.lines.len().saturating_sub(1));
let new_col = pos.col.min(self.line_len(new_line));
self.set_primary_cursor(new_line, new_col);
self.update_selection();
}
pub fn select_all(&mut self) {
use super::cursor::CursorPos;
use super::cursor::CursorSet;
let last_line = self.lines.len().saturating_sub(1);
let last_col = self.lines.last().map(|l| l.chars().count()).unwrap_or(0);
self.cursors = CursorSet::new(CursorPos::new(last_line, last_col));
self.cursors.primary_mut().anchor = Some(CursorPos::new(0, 0));
}
}
use super::TextArea;