use crate::app::App;
use crate::editor::UIState;
impl App {
pub fn goto(&mut self, offset: usize) {
if offset >= self.file_info.size {
return;
}
if offset == 0 {
self.reader.page_start = 0;
} else if offset >= self.reader.page_start && offset <= self.reader.page_end {
} else if offset > self.hex_view.offset {
if offset > self.reader.page_end
&& self.reader.page_end + self.config.hex_mode_bytes_per_line > offset
{
self.reader.page_start += self.config.hex_mode_bytes_per_line;
self.dialog_renderer = None;
self.state = UIState::Normal;
} else if offset - self.hex_view.offset == self.reader.page_current_size {
self.reader.page_start += self.reader.page_current_size;
} else {
self.reader.page_start =
offset / self.reader.page_current_size * self.reader.page_current_size;
}
} else {
if offset < self.reader.page_start
&& offset + self.config.hex_mode_bytes_per_line >= self.reader.page_start
{
self.reader.page_start = offset / self.config.hex_mode_bytes_per_line
* self.config.hex_mode_bytes_per_line;
} else if self.hex_view.offset - offset == self.reader.page_current_size {
if self.reader.page_start > self.reader.page_current_size {
self.reader.page_start -= self.reader.page_current_size;
} else {
self.reader.page_start = 0;
}
} else {
self.reader.page_start =
offset / self.reader.page_current_size * self.reader.page_current_size;
}
}
self.reader.page_end = self.reader.page_start + self.reader.page_current_size - 1;
self.hex_view.cursor.y =
(offset - self.reader.page_start) / self.config.hex_mode_bytes_per_line;
self.hex_view.cursor.x =
(offset - self.reader.page_start) % self.config.hex_mode_bytes_per_line;
self.hex_view.last_visited_offset = self.hex_view.offset;
self.hex_view.offset = offset;
App::log(self, format!("goto: {:x}", offset));
}
}