Skip to content

Commit

Permalink
Link things up better, fix some bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
ethteck committed Sep 3, 2024
1 parent 59a3208 commit f49e7f9
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 104 deletions.
181 changes: 93 additions & 88 deletions app/src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ use crate::{
};
use anyhow::Error;
use bdiff_hex_view::{CursorState, HexViewSelection, HexViewSelectionSide, HexViewSelectionState};
use eframe::egui::{Align, Layout, RichText, Ui};
use eframe::egui::{Align, Layout, Modifiers, RichText, Ui};
use eframe::{
egui::{self, Checkbox, Context, Style, ViewportCommand},
epaint::{Rounding, Shadow},
Expand Down Expand Up @@ -148,36 +148,36 @@ impl BdiffApp {
if let Some(fv) = self.get_hex_view_by_id(fv) {
let mut changed = false;
if ctx.input(|i| i.key_pressed(egui::Key::ArrowLeft))
&& fv.selection.start() > 0
&& fv.selection.end() > 0
&& fv.hv.selection.start() > 0
&& fv.hv.selection.end() > 0
{
fv.selection.adjust_cur_pos(-1);
fv.hv.selection.adjust_cur_pos(-1);
changed = true;
}
if ctx.input(|i| i.key_pressed(egui::Key::ArrowRight))
&& fv.selection.start() < fv.file.data.len() - 1
&& fv.selection.end() < fv.file.data.len() - 1
&& fv.hv.selection.start() < fv.file.data.len() - 1
&& fv.hv.selection.end() < fv.file.data.len() - 1
{
fv.selection.adjust_cur_pos(1);
fv.hv.selection.adjust_cur_pos(1);
changed = true;
}
if ctx.input(|i| i.key_pressed(egui::Key::ArrowUp))
&& fv.selection.start() >= fv.bytes_per_row
&& fv.selection.end() >= fv.bytes_per_row
&& fv.hv.selection.start() >= fv.bytes_per_row
&& fv.hv.selection.end() >= fv.bytes_per_row
{
fv.selection.adjust_cur_pos(-(fv.bytes_per_row as isize));
fv.hv.selection.adjust_cur_pos(-(fv.bytes_per_row as isize));
changed = true;
}
if ctx.input(|i| i.key_pressed(egui::Key::ArrowDown))
&& fv.selection.start() < fv.file.data.len() - fv.bytes_per_row
&& fv.selection.end() < fv.file.data.len() - fv.bytes_per_row
&& fv.hv.selection.start() < fv.file.data.len() - fv.bytes_per_row
&& fv.hv.selection.end() < fv.file.data.len() - fv.bytes_per_row
{
fv.selection.adjust_cur_pos(fv.bytes_per_row as isize);
fv.hv.selection.adjust_cur_pos(fv.bytes_per_row as isize);
changed = true;
}

if changed {
self.global_selection = fv.selection.clone();
self.global_selection = fv.hv.selection.clone();
}
}
}
Expand All @@ -189,6 +189,8 @@ impl BdiffApp {
.map(|fv| fv.cur_pos)
.collect::<Vec<usize>>();

let diffing = self.file_views.len() > 1 && self.diff_state.enabled;

for fv in self.file_views.iter_mut() {
// Keys
if ctx.input(|i| i.key_pressed(egui::Key::Home)) {
Expand Down Expand Up @@ -231,7 +233,7 @@ impl BdiffApp {
if ctx.input(|i| i.key_pressed(egui::Key::Enter)) {
let last_byte = fv.cur_pos + fv.hv.bytes_per_screen(&fv.file.data);

if self.diff_state.enabled {
if diffing {
if last_byte < fv.file.data.len() {
match self.diff_state.get_next_diff(last_byte) {
Some(next_diff) => {
Expand Down Expand Up @@ -409,7 +411,7 @@ impl eframe::App for BdiffApp {
if self.last_selected_hv.is_some() && fv.id == self.last_selected_hv.unwrap() {
let selected_bytes = fv.hv.get_selected_bytes(&fv.file.data);

let selected_bytes: String = match fv.selection.side {
let selected_bytes: String = match fv.hv.selection.side {
HexViewSelectionSide::Hex => selected_bytes
.iter()
.map(|b| format!("{:02X}", b))
Expand Down Expand Up @@ -483,13 +485,13 @@ impl eframe::App for BdiffApp {

settings::byte_grouping_slider(ui, &mut self.settings.byte_grouping);

// if ui
// .add_enabled(self.file_views.len() > 1, diff_checkbox)
// .clicked()
// && self.diff_state.enabled
// {
// self.recalculate_diffs()
// }
if ui
.add_enabled(self.file_views.len() > 1, diff_checkbox)
.clicked()
&& self.diff_state.enabled
{
//self.recalculate_diffs()
}

ui.add_enabled(self.file_views.len() > 1, mirror_selection_checkbox);

Expand All @@ -516,84 +518,81 @@ impl eframe::App for BdiffApp {
let mut calc_diff = false;

// Main panel
egui::CentralPanel::default().show(ctx, |_ui| {
// TODO unused CentralPanel
for fv in self.file_views.iter_mut() {
let cur_sel = fv.selection.clone();
let can_selection_change = match self.selecting_hv {
Some(id) => id == fv.id,
None => true,
};
fv.show(
&mut self.config,
&self.settings,
&self.diff_state,
ctx,
cursor_state,
can_selection_change,
);
if fv.selection != cur_sel {
match fv.selection.state {
HexViewSelectionState::Selecting => {
self.selecting_hv = Some(fv.id);
self.last_selected_hv = Some(fv.id);
}
_ => {
self.selecting_hv = None;
}
for fv in self.file_views.iter_mut() {
let cur_sel = fv.hv.selection.clone();
let can_selection_change = match self.selecting_hv {
Some(id) => id == fv.id,
None => true,
};
fv.show(
&mut self.config,
&self.settings,
&self.diff_state,
ctx,
cursor_state,
can_selection_change,
);
if fv.hv.selection != cur_sel {
match fv.hv.selection.state {
HexViewSelectionState::Selecting => {
self.selecting_hv = Some(fv.id);
self.last_selected_hv = Some(fv.id);
}
self.global_selection = fv.selection.clone();
}

if cursor_state == CursorState::Released {
// If we released the mouse button somewhere else, end the selection
// The state wouldn't be Selecting if we had captured the release event inside the fv
if fv.selection.state == HexViewSelectionState::Selecting {
fv.selection.state = HexViewSelectionState::Selected;
_ => {
self.selecting_hv = None;
}
}
self.global_selection = fv.hv.selection.clone();
}

if cursor_state == CursorState::Released {
self.selecting_hv = None;
if self.global_selection.state == HexViewSelectionState::Selecting {
self.global_selection.state = HexViewSelectionState::Selected;
// If we released the mouse button somewhere else, end the selection
// The state wouldn't be Selecting if we had captured the release event inside the fv
if fv.hv.selection.state == HexViewSelectionState::Selecting {
fv.hv.selection.state = HexViewSelectionState::Selected;
}
}
}

if self.options.mirror_selection {
for fv in self.file_views.iter_mut() {
if fv.selection != self.global_selection {
fv.selection = self.global_selection.clone();
if fv.selection.start() >= fv.file.data.len()
|| fv.selection.end() >= fv.file.data.len()
{
fv.selection.clear()
}
}
}
if cursor_state == CursorState::Released {
self.selecting_hv = None;
if self.global_selection.state == HexViewSelectionState::Selecting {
self.global_selection.state = HexViewSelectionState::Selected;
}
}

// Delete any closed hex views
self.file_views.retain(|fv| {
calc_diff = calc_diff || fv.closed;
let delete: bool = { fv.closed };

if let Some(id) = self.last_selected_hv {
if fv.id == id {
self.last_selected_hv = None;
if self.options.mirror_selection {
for fv in self.file_views.iter_mut() {
if fv.hv.selection != self.global_selection {
fv.hv.selection = self.global_selection.clone();
if fv.hv.selection.start() >= fv.file.data.len()
|| fv.hv.selection.end() >= fv.file.data.len()
{
fv.hv.selection.clear()
}
}
}
}

!delete
});
// Delete any closed hex views
self.file_views.retain(|fv| {
calc_diff = calc_diff || fv.closed;
let delete: bool = { fv.closed };

// If we have no hex views left, don't keep track of any selection
if self.file_views.is_empty() {
self.global_selection.clear();
if let Some(id) = self.last_selected_hv {
if delete && fv.id == id {
self.last_selected_hv = None;
}
}

!delete
});

// If we have no hex views left, don't keep track of any selection
if self.file_views.is_empty() {
self.global_selection.clear();
}

// File reloading
for fv in self.file_views.iter_mut() {
if fv.file.modified.swap(false, Ordering::Relaxed) {
Expand Down Expand Up @@ -624,7 +623,7 @@ impl eframe::App for BdiffApp {
}

if calc_diff {
self.recalculate_diffs()
self.recalculate_diffs();
}

if self.settings.theme_menu_open {
Expand All @@ -635,8 +634,12 @@ impl eframe::App for BdiffApp {

impl BdiffApp {
fn recalculate_diffs(&mut self) {
//self.diff_state.recalculate();
// TODO FIX
let files: &[&[u8]] = &self
.file_views
.iter()
.map(|fv| fv.file.data.as_slice())
.collect::<Vec<&[u8]>>();
self.diff_state.recalculate(files);
}

fn show_overwrite_modal(&mut self, modal: &Modal) {
Expand Down Expand Up @@ -672,7 +675,9 @@ impl BdiffApp {
ui.label(RichText::new(self.goto_modal.status.clone()).color(egui::Color32::RED));

goto_modal.buttons(ui, |ui| {
if ui.button("Go").clicked() || ctx.input(|i| i.key_pressed(egui::Key::Enter)) {
if ui.button("Go").clicked()
|| ctx.input_mut(|i| i.consume_key(Modifiers::NONE, egui::Key::Enter))
{
let pos: Option<usize> = parse_int::parse(&self.goto_modal.value).ok();

match pos {
Expand All @@ -694,7 +699,7 @@ impl BdiffApp {
goto_modal.close();
};

if ctx.input(|i| i.key_pressed(egui::Key::Escape)) {
if ctx.input_mut(|i| i.consume_key(Modifiers::NONE, egui::Key::Escape)) {
goto_modal.close();
}
});
Expand Down
26 changes: 12 additions & 14 deletions app/src/file_view.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use anyhow::Error;
use bdiff_hex_view::{CursorState, HexView, HexViewSelection, HexViewSelectionState};
use bdiff_hex_view::{CursorState, HexView, HexViewSelectionState};
use eframe::egui::FontId;
use eframe::{
egui::{self, Id},
Expand All @@ -23,8 +23,6 @@ pub struct FileView {
pub bytes_per_row: usize,
pub cur_pos: usize,
pub pos_locked: bool,
pub selection: HexViewSelection,
pub cursor_pos: Option<usize>,
pub show_selection_info: bool,
pub show_cursor_info: bool,
pub hv: HexView,
Expand All @@ -44,8 +42,6 @@ impl FileView {
bytes_per_row: default_bytes_per_row,
cur_pos: 0,
pos_locked: false,
selection: HexViewSelection::default(),
cursor_pos: None,
show_selection_info: true,
show_cursor_info: true,
hv: HexView::new(id),
Expand All @@ -59,13 +55,15 @@ impl FileView {
pub fn reload_file(&mut self) -> Result<(), Error> {
self.file.data = read_file_bytes(self.file.path.clone())?;

if self.selection.range.first >= self.file.data.len()
&& self.selection.range.second >= self.file.data.len()
if self.hv.selection.range.first >= self.file.data.len()
&& self.hv.selection.range.second >= self.file.data.len()
{
self.selection.clear();
self.hv.selection.clear();
} else {
self.selection.range.first = self.selection.range.first.min(self.file.data.len() - 1);
self.selection.range.second = self.selection.range.second.min(self.file.data.len() - 1);
self.hv.selection.range.first =
self.hv.selection.range.first.min(self.file.data.len() - 1);
self.hv.selection.range.second =
self.hv.selection.range.second.min(self.file.data.len() - 1);
}
Ok(())
}
Expand Down Expand Up @@ -172,11 +170,11 @@ impl FileView {
});

if self.show_selection_info {
let selection_text = match self.selection.state {
let selection_text = match self.hv.selection.state {
HexViewSelectionState::None => "No selection".to_owned(),
_ => {
let start = self.selection.start();
let end = self.selection.end();
let start = self.hv.selection.start();
let end = self.hv.selection.end();
let length = end - start + 1;

let map_entry = match self.mt.map_file {
Expand Down Expand Up @@ -215,7 +213,7 @@ impl FileView {
}

if self.show_cursor_info {
let hover_text = match self.cursor_pos {
let hover_text = match self.hv.cursor_pos {
Some(pos) => {
let map_entry = match self.mt.map_file {
Some(ref map_file) => map_file.get_entry(pos, pos + 1),
Expand Down
1 change: 1 addition & 0 deletions app/src/map_file.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ use iset::IntervalMap;

use crate::watcher::create_watcher;

#[allow(dead_code)]
#[derive(Clone, Debug)]
pub struct MapFileEntry {
pub seg_name: String,
Expand Down
4 changes: 2 additions & 2 deletions hex_view/src/hex_view.rs
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ impl HexView {
let res = ui.add(hex_label);

if byte.is_some() {
if res.hovered() {
if res.contains_pointer() {
self.cursor_pos = Some(row_current_pos);
}
if can_selection_change {
Expand Down Expand Up @@ -358,7 +358,7 @@ impl HexView {
ui.add(Spacer::default().spacing_x(1.0));

if byte.is_some() {
if res.hovered() {
if res.contains_pointer() {
self.cursor_pos = Some(row_current_pos);
}
if can_selection_change {
Expand Down

0 comments on commit f49e7f9

Please sign in to comment.