diff options
author | Canop <cano.petrole@gmail.com> | 2020-07-14 21:58:12 +0200 |
---|---|---|
committer | Canop <cano.petrole@gmail.com> | 2020-07-14 21:58:12 +0200 |
commit | d198f840c44118bc7e9af0bd03c2db9bcb1d699f (patch) | |
tree | 46f6b2c2b08f550963018a8f18bfc8e1836c35d3 /src/hex | |
parent | cc83313ef6d6ef076699207e3e92b64390f70afd (diff) |
chars in binary preview
Diffstat (limited to 'src/hex')
-rw-r--r-- | src/hex/hex_view.rs | 55 |
1 files changed, 48 insertions, 7 deletions
diff --git a/src/hex/hex_view.rs b/src/hex/hex_view.rs index e2b7672..c4c8525 100644 --- a/src/hex/hex_view.rs +++ b/src/hex/hex_view.rs @@ -11,7 +11,7 @@ use { }, crossterm::{ cursor, - style::{Color, Print, ResetColor, SetBackgroundColor, SetForegroundColor}, + style::{Color, Print, SetForegroundColor}, QueueableCommand, }, memmap::Mmap, @@ -92,9 +92,31 @@ impl HexView { self.page_height = area.height as i32; let page = self.get_page(self.scroll as usize, line_count)?; let styles = &panel_skin.styles; - let mut show_middle_space = false; - if area.width > 50 { - show_middle_space = true; + let mut left_margin = false; + let mut hex_middle_space = false; + let mut chars_middle_space = false; + let mut inter_hex = false; + let mut chars = false; + let mut rem = area.width as i32 - 32; // 32: minimum, tight + if rem > 17 { + chars = true; + rem -= 17; + } + if rem > 16 { + inter_hex = true; + rem -= 16; + } + if rem > 1 { + hex_middle_space = true; + rem -= 1; + } + if rem > 1 { + left_margin = true; + rem -= 1; + } + if rem > 1 { + chars_middle_space = true; + //rem -= 1; } let scrollbar = area.scrollbar(self.scroll, self.line_count() as i32); let scrollbar_fg = styles.scrollbar_thumb.get_fg() @@ -105,16 +127,35 @@ impl HexView { let mut cw = CropWriter::new(w, area.width as usize - 1); // -1 for scrollbar let cw = &mut cw; if y < page.len() { + if left_margin { + cw.queue_char(&styles.default, ' ')?; + } let line = &page[y]; for x in 0..16 { - if x==8 && show_middle_space { + if x==8 && hex_middle_space { cw.queue_char(&styles.default, ' ')?; } if let Some(b) = line.bytes.get(x) { let byte = Byte::from(*b); - cw.queue_string(byte.style(styles), format!(" {:02x}", b))?; + if inter_hex { + cw.queue_string(byte.style(styles), format!("{:02x} ", b))?; + } else { + cw.queue_string(byte.style(styles), format!("{:02x}", b))?; + } } else { - cw.queue_str(&styles.default, " ")?; + cw.queue_str(&styles.default, if inter_hex { " " } else { " " })?; + } + } + if chars { + cw.queue_char(&styles.default, ' ')?; + for x in 0..16 { + if x==8 && chars_middle_space { + cw.queue_char(&styles.default, ' ')?; + } + if let Some(b) = line.bytes.get(x) { + let byte = Byte::from(*b); + cw.queue_char(byte.style(styles), byte.as_char())?; + } } } cw.fill(&styles.default, LONG_SPACE)?; |