diff --git a/objdiff-gui/src/hotkeys.rs b/objdiff-gui/src/hotkeys.rs index 762e5db..ba2e660 100644 --- a/objdiff-gui/src/hotkeys.rs +++ b/objdiff-gui/src/hotkeys.rs @@ -1,4 +1,4 @@ -use egui::{Context, Key, PointerButton}; +use egui::{style::ScrollAnimation, vec2, Context, Key, PointerButton}; pub fn enter_pressed(ctx: &Context) -> bool { ctx.input_mut(|i| i.key_pressed(Key::Enter) || i.pointer.button_pressed(PointerButton::Extra2)) @@ -9,3 +9,36 @@ pub fn back_pressed(ctx: &Context) -> bool { i.key_pressed(Key::Backspace) || i.pointer.button_pressed(PointerButton::Extra1) }) } + +pub fn up_pressed(ctx: &Context) -> bool { + ctx.input_mut(|i| i.key_pressed(Key::ArrowUp) || i.key_pressed(Key::W)) +} + +pub fn down_pressed(ctx: &Context) -> bool { + ctx.input_mut(|i| i.key_pressed(Key::ArrowDown) || i.key_pressed(Key::S)) +} + +pub fn page_up_pressed(ctx: &Context) -> bool { ctx.input_mut(|i| i.key_pressed(Key::PageUp)) } + +pub fn page_down_pressed(ctx: &Context) -> bool { ctx.input_mut(|i| i.key_pressed(Key::PageDown)) } + +pub fn home_pressed(ctx: &Context) -> bool { ctx.input_mut(|i| i.key_pressed(Key::Home)) } + +pub fn end_pressed(ctx: &Context) -> bool { ctx.input_mut(|i| i.key_pressed(Key::End)) } + +pub fn check_scroll_hotkeys(ui: &mut egui::Ui) { + let ui_height = ui.available_rect_before_wrap().height(); + if up_pressed(ui.ctx()) { + ui.scroll_with_delta_animation(vec2(0.0, ui_height / 10.0), ScrollAnimation::none()); + } else if down_pressed(ui.ctx()) { + ui.scroll_with_delta_animation(vec2(0.0, -ui_height / 10.0), ScrollAnimation::none()); + } else if page_up_pressed(ui.ctx()) { + ui.scroll_with_delta_animation(vec2(0.0, ui_height), ScrollAnimation::none()); + } else if page_down_pressed(ui.ctx()) { + ui.scroll_with_delta_animation(vec2(0.0, -ui_height), ScrollAnimation::none()); + } else if home_pressed(ui.ctx()) { + ui.scroll_with_delta_animation(vec2(0.0, f32::INFINITY), ScrollAnimation::none()); + } else if end_pressed(ui.ctx()) { + ui.scroll_with_delta_animation(vec2(0.0, -f32::INFINITY), ScrollAnimation::none()); + } +} diff --git a/objdiff-gui/src/views/data_diff.rs b/objdiff-gui/src/views/data_diff.rs index 70ae1dc..c08e415 100644 --- a/objdiff-gui/src/views/data_diff.rs +++ b/objdiff-gui/src/views/data_diff.rs @@ -179,6 +179,8 @@ fn data_table_ui( let left_diffs = left_section.map(|(_, section)| split_diffs(§ion.data_diff)); let right_diffs = right_section.map(|(_, section)| split_diffs(§ion.data_diff)); + hotkeys::check_scroll_hotkeys(ui); + render_table(ui, available_width, 2, config.code_font.size, total_rows, |row, column| { let i = row.index(); let address = i * BYTES_PER_ROW; diff --git a/objdiff-gui/src/views/extab_diff.rs b/objdiff-gui/src/views/extab_diff.rs index ce59a3a..db391e0 100644 --- a/objdiff-gui/src/views/extab_diff.rs +++ b/objdiff-gui/src/views/extab_diff.rs @@ -235,6 +235,8 @@ pub fn extab_diff_ui( } }); + hotkeys::check_scroll_hotkeys(ui); + // Table render_strips(ui, available_width, 2, |ui, column| { if column == 0 { diff --git a/objdiff-gui/src/views/function_diff.rs b/objdiff-gui/src/views/function_diff.rs index 997a3fc..1df1152 100644 --- a/objdiff-gui/src/views/function_diff.rs +++ b/objdiff-gui/src/views/function_diff.rs @@ -435,6 +435,7 @@ fn asm_table_ui( }; if left_len.is_some() && right_len.is_some() { // Joint view + hotkeys::check_scroll_hotkeys(ui); render_table( ui, available_width, diff --git a/objdiff-gui/src/views/symbol_diff.rs b/objdiff-gui/src/views/symbol_diff.rs index 1dca5de..7fa185f 100644 --- a/objdiff-gui/src/views/symbol_diff.rs +++ b/objdiff-gui/src/views/symbol_diff.rs @@ -649,6 +649,8 @@ pub fn symbol_list_ui( } } + hotkeys::check_scroll_hotkeys(ui); + ui.scope(|ui| { ui.style_mut().override_text_style = Some(egui::TextStyle::Monospace); ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend);