From fe0938b1de0c46fc2afcaa3dcd6a0f4ec870d21a Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Fri, 2 Aug 2024 00:36:10 +0200 Subject: add state which is shared with the lua environment --- src/cursor.rs | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 src/cursor.rs (limited to 'src/cursor.rs') diff --git a/src/cursor.rs b/src/cursor.rs new file mode 100644 index 0000000..ad6703e --- /dev/null +++ b/src/cursor.rs @@ -0,0 +1,107 @@ + +pub enum CursorMove { + Up(usize), + Down(usize), + Left(usize), + Right(usize), + Top, + Bottom, + Begin, + End, + Jump((usize, usize)), + Relative((isize, isize)), +} + +#[derive(Default, Debug, Clone)] +pub struct Cursor { + x: isize, + y: isize, + x_max: isize, + y_max: isize, +} + +impl Cursor { + pub const fn new() -> Self { + Self { + x: 0, + y: 0, + x_max: 0, + y_max: 0, + } + } + + pub fn with_position(mut self, x: isize, y: isize) -> Self { + self.x = x; + self.y = y; + self + } + + pub fn with_max(mut self, x: isize, y: isize) -> Self { + self.x_max = x; + self.y_max = y; + self + } + + pub fn x(&self) -> usize { + self.x as usize + } + + pub fn y(&self) -> usize { + self.y as usize + } + + pub fn set_x_max(&mut self, max: usize) { + self.x_max = max as isize; + } + + pub fn set_y_max(&mut self, max: usize) { + self.y_max = max as isize; + } + + pub fn move_checked(&mut self, m: CursorMove) { + self.move_unchecked(m); + self.correct_cursor_position(); + } + + pub fn move_unchecked(&mut self, m: CursorMove) { + match m { + CursorMove::Up(n) => self.y -= n as isize, + CursorMove::Down(n) => self.y += n as isize, + CursorMove::Left(n) => self.x -= n as isize, + CursorMove::Right(n) => self.x += n as isize, + CursorMove::Top => self.y = 0, + CursorMove::Bottom => self.y = self.y_max, + CursorMove::Begin => self.x = 0, + CursorMove::End => self.x = self.x_max, + CursorMove::Jump((x, y)) => { + self.x = x as isize; + self.y = y as isize; + }, + CursorMove::Relative((x, y)) => { + self.x += x; + self.y += y; + } + }; + } + + pub fn correct_cursor_position(&mut self) { + self.y = self.y.max(0).min(self.y_max); + self.x = self.x.max(0).min(self.x_max); + } + + pub fn is_at_start(&self) -> bool { + self.x == 0 + } + + pub fn is_at_end(&self) -> bool { + self.x == self.x_max + } + + pub fn is_at_top(&self) -> bool { + self.y == 0 + } + + pub fn is_at_bottom(&self) -> bool { + self.y == self.y_max + } +} -- cgit v1.2.3-70-g09d2