From 2f7fd0c53d6d64043530ccb6d208217a6ed5718c Mon Sep 17 00:00:00 2001 From: rhysd Date: Sat, 23 Jul 2022 19:20:20 +0900 Subject: [PATCH 1/3] implement `TextArea::scroll` and `CursorMove::InViewport` --- src/cursor.rs | 13 ++++++++++ src/textarea.rs | 13 +++++++--- src/widget.rs | 65 +++++++++++++++++++++++++++++++++++++------------ 3 files changed, 72 insertions(+), 19 deletions(-) diff --git a/src/cursor.rs b/src/cursor.rs index 260a949..d031b64 100644 --- a/src/cursor.rs +++ b/src/cursor.rs @@ -1,3 +1,4 @@ +use crate::widget::Viewport; use crate::word::{find_word_start_backward, find_word_start_forward}; #[cfg(feature = "arbitrary")] use arbitrary::Arbitrary; @@ -187,6 +188,7 @@ pub enum CursorMove { /// assert_eq!(textarea.cursor(), (2, 4)); /// ``` Jump(u16, u16), + InViewport, } impl CursorMove { @@ -194,6 +196,7 @@ impl CursorMove { &self, (row, col): (usize, usize), lines: &[String], + viewport: &Viewport, ) -> Option<(usize, usize)> { use CursorMove::*; @@ -271,6 +274,16 @@ impl CursorMove { let col = fit_col(*col as usize, &lines[row]); Some((row, col)) } + InViewport => { + let (row_top, col_top, row_bottom, col_bottom) = viewport.position(); + + let row = row.clamp(row_top as usize, row_bottom as usize); + let row = cmp::min(row, lines.len() - 1); + let col = col.clamp(col_top as usize, col_bottom as usize); + let col = fit_col(col, &lines[row]); + + Some((row, col)) + } } } } diff --git a/src/textarea.rs b/src/textarea.rs index 91a3801..b14aff2 100644 --- a/src/textarea.rs +++ b/src/textarea.rs @@ -5,7 +5,7 @@ use crate::input::{Input, Key}; #[cfg(feature = "search")] use crate::search::Search; use crate::util::spaces; -use crate::widget::{Renderer, ScrollTop}; +use crate::widget::{Renderer, Viewport}; use crate::word::{find_word_end_forward, find_word_start_backward}; use tui::style::{Modifier, Style}; use tui::text::Spans; @@ -42,7 +42,7 @@ pub struct TextArea<'a> { history: History, cursor_line_style: Style, line_number_style: Option