34 lines
992 B
Rust
34 lines
992 B
Rust
use ratatui::prelude::*;
|
|
use ratatui::widgets::Widget;
|
|
|
|
pub struct LineNumberWidget(pub usize, pub usize);
|
|
|
|
fn usize_to_hex(mut value: usize, buffer: &mut [u8; 64]) -> &str {
|
|
const HEX: &[u8; 16] = b"0123456789ABCDEF";
|
|
let len = std::mem::size_of_val(&value);
|
|
|
|
for i in 0..len {
|
|
let current_byte = value & 0xff;
|
|
|
|
buffer[63 - 2 * i] = HEX[current_byte & 0x0f];
|
|
buffer[63 - 2 * i - 1] = HEX[current_byte >> 4];
|
|
|
|
value >>= 8;
|
|
}
|
|
|
|
unsafe { std::str::from_utf8_unchecked(&buffer[64 - len * 2..]) }
|
|
}
|
|
|
|
impl Widget for LineNumberWidget {
|
|
fn render(self, area: Rect, buf: &mut Buffer) {
|
|
let visible_lines = area.height as usize;
|
|
let mut buffer = [b'0'; 64];
|
|
|
|
let areas =
|
|
Layout::vertical(vec![Constraint::Length(1); visible_lines.min(self.1)]).split(area);
|
|
|
|
for (i, a) in areas.iter().enumerate() {
|
|
Line::from(usize_to_hex(self.0 + i * 16, &mut buffer)).render(*a, buf);
|
|
}
|
|
}
|
|
}
|