aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-11-11 13:07:08 -0500
committerJesse Luehrs <doy@tozt.net>2019-11-11 13:07:08 -0500
commit28cb645786aa233b975975173cff5f66c9b629c8 (patch)
treedd440e8aededee708e7b323633e77253afcacb78
parent3ff771c00eee3028757f474b546e23ff2bcbc481 (diff)
downloadvt100-rust-28cb645786aa233b975975173cff5f66c9b629c8.tar.gz
vt100-rust-28cb645786aa233b975975173cff5f66c9b629c8.zip
factor out cursor movement logic
-rw-r--r--src/row.rs38
-rw-r--r--src/term.rs26
2 files changed, 37 insertions, 27 deletions
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<u8>) {
+ 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);
+ }
+ }
+}