Skip to content

Commit 75c0aa6

Browse files
committed
feat: add more shortcut keys
1 parent 70f2e61 commit 75c0aa6

File tree

2 files changed

+76
-46
lines changed

2 files changed

+76
-46
lines changed

src/app.rs

Lines changed: 66 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use std::{
77
#[cfg(not(target_arch = "wasm32"))]
88
use anyhow::{bail, Context};
99
use data::filter::{Comparator, FieldSpecifier, FilterConfig, FilterOn};
10-
use egui::Align;
10+
use egui::{Align, KeyboardShortcut};
1111
use egui_extras::{Column, TableBuilder};
1212
use log::info;
1313
use shortcut::Shortcuts;
@@ -29,6 +29,8 @@ pub struct LogViewerApp {
2929
track_item_align: Option<Align>,
3030
shortcuts: Shortcuts,
3131

32+
#[serde(skip)]
33+
should_focus_search: bool,
3234
#[serde(skip)]
3335
should_scroll: bool,
3436
#[serde(skip)]
@@ -45,6 +47,7 @@ impl Default for LogViewerApp {
4547
last_filename: Default::default(),
4648
track_item_align: Default::default(),
4749
shortcuts: Default::default(),
50+
should_focus_search: Default::default(),
4851
should_scroll: Default::default(),
4952
show_last_filename: true,
5053
}
@@ -456,6 +459,31 @@ impl LogViewerApp {
456459
data.unfilter();
457460
}
458461
}
462+
463+
if ui.input_mut(|i| i.consume_shortcut(&self.shortcuts.open)) {
464+
self.loading_status = self.initiate_loading(ui.ctx().clone());
465+
}
466+
467+
#[cfg(not(target_arch = "wasm32"))]
468+
{
469+
if ui.input_mut(|i| i.consume_shortcut(&self.shortcuts.reload)) {
470+
self.loading_status = self.reload_file();
471+
}
472+
473+
if ui.input_mut(|i| i.consume_shortcut(&self.shortcuts.load_latest)) {
474+
self.loading_status = self.load_most_recent_file();
475+
}
476+
}
477+
478+
if ui.input_mut(|i| i.consume_shortcut(&self.shortcuts.apply_filter)) {
479+
if let Some(data) = self.data.as_mut() {
480+
data.apply_filter(self.data_display_options.common_fields());
481+
}
482+
}
483+
484+
if ui.input_mut(|i| i.consume_shortcut(&self.shortcuts.search)) {
485+
self.focus_search_text_edit();
486+
}
459487
}
460488

461489
fn navigation_and_filtering_ui(&mut self, ui: &mut egui::Ui) {
@@ -481,16 +509,11 @@ impl LogViewerApp {
481509
}
482510
let mut should_apply_filter = false;
483511
if is_filter_enabled {
484-
if ui.button("Apply").clicked() {
512+
if shortcut_button(ui, "Apply", "", &self.shortcuts.apply_filter).clicked() {
485513
should_apply_filter = true;
486514
}
487515
if data.is_filtered()
488-
&& ui
489-
.button("Unfilter")
490-
.on_hover_text(format!(
491-
"Clears Filter ({})",
492-
ui.ctx().format_shortcut(&self.shortcuts.unfilter)
493-
))
516+
&& shortcut_button(ui, "Unfilter", "Clears Filter ", &self.shortcuts.unfilter)
494517
.clicked()
495518
{
496519
data.unfilter();
@@ -505,7 +528,12 @@ impl LogViewerApp {
505528
comparator,
506529
} = filter;
507530
ui.label("Search Key: ");
508-
if ui.text_edit_singleline(search_key).lost_focus()
531+
let search_key_text_edit = ui.text_edit_singleline(search_key);
532+
if self.should_focus_search {
533+
self.should_focus_search = false;
534+
search_key_text_edit.request_focus();
535+
}
536+
if search_key_text_edit.lost_focus()
509537
&& ui.input(|i| i.key_pressed(egui::Key::Enter))
510538
{
511539
should_apply_filter = true;
@@ -570,59 +598,32 @@ impl LogViewerApp {
570598

571599
fn navigation_ui(&mut self, ui: &mut egui::Ui) {
572600
ui.label("Nav:");
573-
if ui
574-
.button("⏪")
575-
.on_hover_text(format!(
576-
"First ({})",
577-
ui.ctx().format_shortcut(&self.shortcuts.first)
578-
))
579-
.clicked()
580-
{
601+
if shortcut_button(ui, "⏪", "First ", &self.shortcuts.first).clicked() {
581602
self.move_selected_first();
582603
}
583-
if ui
584-
.button("⬆")
585-
.on_hover_text(format!(
586-
"Previous ({})",
587-
ui.ctx().format_shortcut(&self.shortcuts.prev)
588-
))
589-
.clicked()
590-
{
604+
if shortcut_button(ui, "⬆", "Previous ", &self.shortcuts.prev).clicked() {
591605
self.move_selected_prev();
592606
}
593-
if ui
594-
.button("⬇")
595-
.on_hover_text(format!(
596-
"Next ({})",
597-
ui.ctx().format_shortcut(&self.shortcuts.next)
598-
))
599-
.clicked()
600-
{
607+
if shortcut_button(ui, "⬇", "Next ", &self.shortcuts.next).clicked() {
601608
self.move_selected_next();
602609
}
603-
if ui
604-
.button("⏩")
605-
.on_hover_text(format!(
606-
"Last ({})",
607-
ui.ctx().format_shortcut(&self.shortcuts.last)
608-
))
609-
.clicked()
610-
{
610+
if shortcut_button(ui, "⏩", "Last ", &self.shortcuts.last).clicked() {
611611
self.move_selected_last();
612612
}
613613
}
614614
fn data_load_ui(&mut self, ui: &mut egui::Ui) {
615615
ui.horizontal(|ui| {
616-
if ui.button("📂 Open log file...").clicked() {
617-
let ctx = ui.ctx().clone();
618-
self.loading_status = self.initiate_loading(ctx);
616+
if shortcut_button(ui, "📂 Open log file...", "", &self.shortcuts.open).clicked() {
617+
self.loading_status = self.initiate_loading(ui.ctx().clone());
619618
}
620619
#[cfg(not(target_arch = "wasm32"))]
621620
{
622-
if ui.button("Reload").clicked() {
621+
if shortcut_button(ui, "Reload", "", &self.shortcuts.reload).clicked() {
623622
self.loading_status = self.reload_file();
624623
}
625-
if ui.button("Load Most Recent File").clicked() {
624+
if shortcut_button(ui, "Load Most Recent File", "", &self.shortcuts.load_latest)
625+
.clicked()
626+
{
626627
self.loading_status = self.load_most_recent_file();
627628
}
628629
}
@@ -637,6 +638,13 @@ impl LogViewerApp {
637638
}
638639
});
639640
}
641+
642+
fn focus_search_text_edit(&mut self) {
643+
if let Some(data) = self.data.as_mut() {
644+
data.filter.get_or_insert(Default::default()); // Create filter if it doesn't exist
645+
self.should_focus_search = true;
646+
}
647+
}
640648
}
641649

642650
#[cfg(not(target_arch = "wasm32"))]
@@ -760,3 +768,15 @@ pub fn calculate_hash<T: Hash + ?Sized>(t: &T) -> u64 {
760768
t.hash(&mut s);
761769
s.finish()
762770
}
771+
772+
fn shortcut_button(
773+
ui: &mut egui::Ui,
774+
caption: impl Into<egui::WidgetText>,
775+
hint_msg: &str,
776+
shortcut: &KeyboardShortcut,
777+
) -> egui::Response {
778+
ui.button(caption).on_hover_text(format!(
779+
"{hint_msg}({})",
780+
ui.ctx().format_shortcut(shortcut)
781+
))
782+
}

src/app/shortcut.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ pub struct Shortcuts {
88
pub first: KeyboardShortcut,
99
pub last: KeyboardShortcut,
1010
pub unfilter: KeyboardShortcut,
11+
pub open: KeyboardShortcut,
12+
pub reload: KeyboardShortcut,
13+
pub load_latest: KeyboardShortcut,
14+
pub apply_filter: KeyboardShortcut,
15+
pub search: KeyboardShortcut,
1116
}
1217

1318
impl Default for Shortcuts {
@@ -18,6 +23,11 @@ impl Default for Shortcuts {
1823
first: KeyboardShortcut::new(Modifiers::NONE, egui::Key::Home),
1924
last: KeyboardShortcut::new(Modifiers::NONE, egui::Key::End),
2025
unfilter: KeyboardShortcut::new(Modifiers::NONE, egui::Key::Escape),
26+
open: KeyboardShortcut::new(Modifiers::CTRL, egui::Key::O),
27+
reload: KeyboardShortcut::new(Modifiers::NONE, egui::Key::F5),
28+
load_latest: KeyboardShortcut::new(Modifiers::NONE, egui::Key::F6),
29+
apply_filter: KeyboardShortcut::new(Modifiers::NONE, egui::Key::F7),
30+
search: KeyboardShortcut::new(Modifiers::CTRL, egui::Key::F),
2131
}
2232
}
2333
}

0 commit comments

Comments
 (0)