Update scroll_offset so the cursor stays visible within `visible_lines`.
(&mut self, inner_width: u16, prefix_w: usize, visible_lines: usize)
| 280 | |
| 281 | /// Update scroll_offset so the cursor stays visible within `visible_lines`. |
| 282 | fn ensure_cursor_visible(&mut self, inner_width: u16, prefix_w: usize, visible_lines: usize) { |
| 283 | if visible_lines == 0 { |
| 284 | self.scroll_offset = 0; |
| 285 | return; |
| 286 | } |
| 287 | // Clamp scroll_offset to valid range first (content may have shrunk) |
| 288 | let total = self.visual_line_count_with_prefix(inner_width, prefix_w); |
| 289 | let max_scroll = total.saturating_sub(visible_lines); |
| 290 | if self.scroll_offset > max_scroll { |
| 291 | self.scroll_offset = max_scroll; |
| 292 | } |
| 293 | let (cursor_vrow, _) = self.cursor_visual_position(inner_width, prefix_w); |
| 294 | if cursor_vrow < self.scroll_offset { |
| 295 | self.scroll_offset = cursor_vrow; |
| 296 | } else if cursor_vrow >= self.scroll_offset + visible_lines { |
| 297 | self.scroll_offset = cursor_vrow - visible_lines + 1; |
| 298 | } |
| 299 | } |
| 300 | |
| 301 | pub fn char_pos_to_byte_pos(&self, char_pos: usize) -> usize { |
| 302 | self.input |
no test coverage detected