From 28cb645786aa233b975975173cff5f66c9b629c8 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Mon, 11 Nov 2019 13:07:08 -0500 Subject: factor out cursor movement logic --- src/row.rs | 38 +++++++++++--------------------------- src/term.rs | 26 ++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 27 deletions(-) (limited to 'src') diff --git a/src/row.rs b/src/row.rs index 640f4ec..51fab96 100644 --- a/src/row.rs +++ b/src/row.rs @@ -127,20 +127,13 @@ impl Row { }; if cell != &default_cell { if pos != prev_pos { - if pos.row == prev_pos.row + 1 { - if !wrapping - || prev_pos.col != self.cols() - || pos.col != 0 - { - crate::term::CRLF::default().write_buf(contents); - crate::term::MoveRight::new(pos.col) - .write_buf(contents); - } - } else if prev_pos.row == pos.row { - crate::term::MoveRight::new(pos.col - prev_pos.col) + if !wrapping + || prev_pos.row + 1 != pos.row + || prev_pos.col != self.cols() + || pos.col != 0 + { + crate::term::MoveFromTo::new(prev_pos, pos) .write_buf(contents); - } else { - crate::term::MoveTo::new(pos).write_buf(contents); } prev_pos = pos; } @@ -198,22 +191,13 @@ impl Row { }; if cell != prev_cell { if pos != prev_pos { - if pos.row == prev_pos.row + 1 { - if !wrapping - || prev_pos.col != self.cols() - || pos.col != 0 - { - crate::term::CRLF::default().write_buf(contents); - crate::term::MoveRight::new(pos.col) - .write_buf(contents); - } - } else if prev_pos.row == pos.row - && prev_pos.col < pos.col + if !wrapping + || prev_pos.row + 1 != pos.row + || prev_pos.col != self.cols() + || pos.col != 0 { - crate::term::MoveRight::new(pos.col - prev_pos.col) + crate::term::MoveFromTo::new(prev_pos, pos) .write_buf(contents); - } else { - crate::term::MoveTo::new(pos).write_buf(contents); } prev_pos = pos; } diff --git a/src/term.rs b/src/term.rs index e1f1a22..5b99841 100644 --- a/src/term.rs +++ b/src/term.rs @@ -293,3 +293,29 @@ impl BufWrite for HideCursor { } } } + +#[derive(Debug)] +pub struct MoveFromTo { + from: crate::grid::Pos, + to: crate::grid::Pos, +} + +impl MoveFromTo { + pub fn new(from: crate::grid::Pos, to: crate::grid::Pos) -> Self { + Self { from, to } + } +} + +impl BufWrite for MoveFromTo { + fn write_buf(&self, buf: &mut Vec) { + if self.to.row == self.from.row + 1 && self.to.col == 0 { + crate::term::CRLF::default().write_buf(buf); + } else if self.from.row == self.to.row && self.from.col < self.to.col + { + crate::term::MoveRight::new(self.to.col - self.from.col) + .write_buf(buf); + } else { + crate::term::MoveTo::new(self.to).write_buf(buf); + } + } +} -- cgit v1.2.3-54-g00ecf