diff options
| author | Namilskyy <alive6863@gmail.com> | 2025-04-01 22:29:47 +0300 |
|---|---|---|
| committer | Namilskyy <alive6863@gmail.com> | 2025-04-01 22:31:49 +0300 |
| commit | c9bca4946f43629e9b5a3f6549dc3851c6e713b3 (patch) | |
| tree | 5548312adc31c3299f1c74d7b0dee6589ff0214e /src/hex.rs | |
| parent | 0b069b828d117655053bd8972e32424ec78cbdb5 (diff) | |
Implemented the scrolling fucntion
Diffstat (limited to 'src/hex.rs')
| -rw-r--r-- | src/hex.rs | 48 |
1 files changed, 43 insertions, 5 deletions
@@ -1,27 +1,64 @@ use std::{fs, io}; use std::io::stdout; use ratatui::{backend::CrosstermBackend, Terminal}; +use ratatui::widgets::{ScrollbarState, ScrollDirection}; use crossterm::{execute, terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}}; use crate::{input, render}; - + pub struct HexEditor { filename: String, data: Vec<u8>, cursor: usize, - terminal: Terminal<CrosstermBackend<std::io::Stdout>>, + terminal: Terminal<CrosstermBackend<std::io::Stdout>,>, + scrollbar_state: ScrollbarState, + scroll_position: usize } impl HexEditor { + pub fn new(filename: String, data: Vec<u8>) -> io::Result<Self> { enable_raw_mode()?; execute!(stdout(), EnterAlternateScreen)?; let terminal = Terminal::new(CrosstermBackend::new(stdout()))?; - Ok(Self { filename, data, cursor: 0, terminal }) + let line_count = (data.len() + 15) / 16; + let scrollbar_state = ScrollbarState::default() + .content_length(line_count) + .viewport_content_length(10); + + Ok(Self { + filename, + data, + cursor: 0, + terminal, + scrollbar_state, + scroll_position: 0, + }) } + pub fn run(&mut self) -> io::Result<()> { - while input::handle_input(&mut self.cursor, &mut self.data[..])? { - render::draw(&mut self.terminal, &self.data, self.cursor, &self.filename)?; + while input::handle_input( + &mut self.cursor, + &mut self.data, + &mut self.scroll_position + )? { + let total_lines = (self.data.len() + 15) / 16; + let visible_lines = self.terminal.size()?.height as usize; + + + self.scrollbar_state = ScrollbarState::new(total_lines) + .viewport_content_length(visible_lines) + .position(self.scroll_position); + + + render::draw( + &mut self.terminal, + &self.data, + self.cursor, + &self.filename, + self.scroll_position, + &mut self.scrollbar_state + )?; } self.cleanup() } @@ -32,4 +69,5 @@ impl HexEditor { fs::write(&self.filename, &self.data)?; Ok(()) } + } |
