pub(crate) mod editor;
pub(crate) mod jump_to_byte;
pub(crate) mod search;
pub(crate) mod unsaved_changes;
use ratatui::widgets::Paragraph;
use crate::{app::Data, label::Handler as LabelHandler, screen::Handler as ScreenHandler};
#[derive(PartialEq, Eq, Copy, Clone)]
pub enum Window {
Ascii,
Hex,
JumpToByte,
Search,
UnsavedChanges,
Label(usize),
Unhandled,
}
#[derive(PartialEq, Eq)]
pub enum PopupOutput<'a> {
Str(&'a str),
Boolean(bool),
NoOutput,
}
pub trait KeyHandler {
fn is_focusing(&self, window_type: Window) -> bool;
fn left(&mut self, _: &mut Data, _: &mut ScreenHandler, _: &mut LabelHandler) {}
fn right(&mut self, _: &mut Data, _: &mut ScreenHandler, _: &mut LabelHandler) {}
fn up(&mut self, _: &mut Data, _: &mut ScreenHandler, _: &mut LabelHandler) {}
fn down(&mut self, _: &mut Data, _: &mut ScreenHandler, _: &mut LabelHandler) {}
fn home(&mut self, _: &mut Data, _: &mut ScreenHandler, _: &mut LabelHandler) {}
fn end(&mut self, _: &mut Data, _: &mut ScreenHandler, _: &mut LabelHandler) {}
fn page_up(&mut self, _: &mut Data, _: &mut ScreenHandler, _: &mut LabelHandler) {}
fn page_down(&mut self, _: &mut Data, _: &mut ScreenHandler, _: &mut LabelHandler) {}
fn backspace(&mut self, _: &mut Data, _: &mut ScreenHandler, _: &mut LabelHandler) {}
fn delete(&mut self, _: &mut Data, _: &mut ScreenHandler, _: &mut LabelHandler) {}
fn enter(&mut self, _: &mut Data, _: &mut ScreenHandler, _: &mut LabelHandler) {}
fn char(&mut self, _: &mut Data, _: &mut ScreenHandler, _: &mut LabelHandler, _: char) {}
fn get_user_input(&self) -> PopupOutput<'_> {
PopupOutput::NoOutput
}
fn dimensions(&self) -> Option<(u16, u16)> {
None
}
fn widget(&self) -> Paragraph<'_> {
Paragraph::new("")
}
}
pub(crate) fn adjust_offset(
app: &mut Data,
display: &mut ScreenHandler,
labels: &mut LabelHandler,
) {
let bytes_per_line = display.comp_layouts.bytes_per_line;
let bytes_per_screen = bytes_per_line * display.comp_layouts.lines_per_screen;
if app.offset < app.start_address {
app.start_address = (app.offset / bytes_per_line) * bytes_per_line;
} else if app.offset >= app.start_address + (bytes_per_screen) {
app.start_address =
(app.offset / bytes_per_line) * bytes_per_line - bytes_per_screen + bytes_per_line;
}
labels.offset = format!("{:#X}", app.offset);
}