Skip to content

Commit b6d1477

Browse files
committed
feat: implement up and down arrow keys
1 parent 481f957 commit b6d1477

File tree

3 files changed

+68
-1
lines changed

3 files changed

+68
-1
lines changed

src/app.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use std::{
66

77
#[cfg(not(target_arch = "wasm32"))]
88
use anyhow::{bail, Context};
9+
use egui::{Align, Modifiers};
910
use egui_extras::{Column, TableBuilder};
1011
use log::info;
1112

@@ -23,6 +24,8 @@ pub struct LogViewerApp {
2324
last_filename: Arc<Mutex<Option<PathBuf>>>,
2425
show_last_filename: bool,
2526

27+
#[serde(skip)]
28+
should_scroll: bool,
2629
#[serde(skip)]
2730
loading_status: LoadingStatus,
2831
}
@@ -35,6 +38,7 @@ impl Default for LogViewerApp {
3538
start_open_path: Default::default(),
3639
loading_status: Default::default(),
3740
last_filename: Default::default(),
41+
should_scroll: Default::default(),
3842
show_last_filename: true,
3943
}
4044
}
@@ -95,6 +99,21 @@ impl LogViewerApp {
9599
// Make table clickable
96100
table_builder = table_builder.sense(egui::Sense::click());
97101

102+
table_builder = match (self.should_scroll, self.data.as_ref()) {
103+
(true, Some(data)) => {
104+
self.should_scroll = false;
105+
if let Some(selected_row) = data.selected_row {
106+
table_builder.scroll_to_row(selected_row, Some(Align::Center))
107+
} else {
108+
table_builder
109+
}
110+
}
111+
(true, None) | (false, _) => {
112+
self.should_scroll = false;
113+
table_builder
114+
}
115+
};
116+
98117
let table = table_builder.header(text_height, |mut header| {
99118
for field_name in self.data_display_options.main_list_fields() {
100119
header.col(|ui| {
@@ -374,6 +393,23 @@ impl LogViewerApp {
374393
)),
375394
}
376395
}
396+
397+
fn check_shortcuts(&mut self, ui: &mut egui::Ui) {
398+
if let Some(data) = self.data.as_mut() {
399+
let up_shortcut = egui::KeyboardShortcut::new(Modifiers::NONE, egui::Key::ArrowUp);
400+
let down_shortcut = egui::KeyboardShortcut::new(Modifiers::NONE, egui::Key::ArrowDown);
401+
402+
if ui.input_mut(|i| i.consume_shortcut(&up_shortcut)) {
403+
data.move_selected_to_prev();
404+
self.should_scroll = true;
405+
}
406+
407+
if ui.input_mut(|i| i.consume_shortcut(&down_shortcut)) {
408+
data.move_selected_to_next();
409+
self.should_scroll = true;
410+
}
411+
}
412+
}
377413
}
378414

379415
#[cfg(not(target_arch = "wasm32"))]
@@ -430,6 +466,8 @@ impl eframe::App for LogViewerApp {
430466
egui::TopBottomPanel::top("top_panel").show(ctx, |ui| {
431467
// The top panel is often a good place for a menu bar:
432468

469+
self.check_shortcuts(ui);
470+
433471
egui::menu::bar(ui, |ui| {
434472
// NOTE: no File->Quit on web pages!
435473
let is_web = cfg!(target_arch = "wasm32");

src/app/data.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,36 @@ impl Data {
127127
let selected_row_index = self.selected_row?;
128128
Some(self.rows[selected_row_index].as_slice(common_fields))
129129
}
130+
131+
pub fn move_selected_to_next(&mut self) {
132+
if let Some(selected) = self.selected_row.as_mut() {
133+
if *selected < self.rows.len() - 1 {
134+
*selected += 1;
135+
} else {
136+
// Do nothing already on last row
137+
}
138+
} else if !self.rows.is_empty() {
139+
// Set to first row
140+
self.selected_row = Some(0)
141+
} else {
142+
// No rows to select
143+
}
144+
}
145+
146+
pub fn move_selected_to_prev(&mut self) {
147+
if let Some(selected) = self.selected_row.as_mut() {
148+
if *selected > 0 {
149+
*selected -= 1;
150+
} else {
151+
// Do nothing already on first row
152+
}
153+
} else if !self.rows.is_empty() {
154+
// Set to last row
155+
self.selected_row = Some(self.rows.len() - 1)
156+
} else {
157+
// No rows to select
158+
}
159+
}
130160
}
131161

132162
impl TryFrom<&str> for LogRow {

src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
mod app;
44
pub use app::LogViewerApp;
55

6-
// TODO 2: Add support for navigating using arrow keys Implement hot keys https://github.com/c-git/egui/blob/34db001db14940c948eb03d3fe87f2af2c45daba/crates/egui_demo_lib/src/demo/demo_app_windows.rs#L323
76
// TODO 2: Add filter by and let user pick like ID or date or something like that
87
// TODO 2: Add button to set to current value if a field is selected
98
// TODO 3: Support auto reload (look into watching for changes) https://watchexec.github.io/

0 commit comments

Comments
 (0)