summaryrefslogtreecommitdiff
path: root/src/hex.rs
diff options
context:
space:
mode:
authorNamilskyy <alive6863@gmail.com>2025-04-01 22:29:47 +0300
committerNamilskyy <alive6863@gmail.com>2025-04-01 22:31:49 +0300
commitc9bca4946f43629e9b5a3f6549dc3851c6e713b3 (patch)
tree5548312adc31c3299f1c74d7b0dee6589ff0214e /src/hex.rs
parent0b069b828d117655053bd8972e32424ec78cbdb5 (diff)
Implemented the scrolling fucntion
Diffstat (limited to 'src/hex.rs')
-rw-r--r--src/hex.rs48
1 files changed, 43 insertions, 5 deletions
diff --git a/src/hex.rs b/src/hex.rs
index 67f692d..7980252 100644
--- a/src/hex.rs
+++ b/src/hex.rs
@@ -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(())
}
+
}