From a553050f91d6c9a191771381950795ad9fcc3bba Mon Sep 17 00:00:00 2001 From: CrispyPin Date: Thu, 17 Aug 2023 13:00:30 +0200 Subject: [PATCH] add local searching --- src/main.rs | 62 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 16 deletions(-) diff --git a/src/main.rs b/src/main.rs index 273fc31..b2568ff 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@ use std::fs::{read_link, DirEntry}; use std::path::PathBuf; +use eframe::egui::{Id, Key}; use eframe::{egui, Frame, NativeOptions}; use egui_extras::{Column, TableBuilder}; @@ -14,11 +15,14 @@ fn main() { } struct FileGui { + home: String, current_dir: PathBuf, loaded_dir: PathBuf, - path_input: String, - home: String, entries: Vec, + path_input: String, + path_input_id: Id, + search_input: String, + search_input_id: Id, } struct Entry { @@ -42,11 +46,14 @@ impl FileGui { let home = std::env::var("HOME").unwrap(); let current_dir = std::env::current_dir().unwrap(); let mut s = Self { + home, current_dir, loaded_dir: PathBuf::new(), - path_input: String::new(), - home, entries: Vec::new(), + path_input: String::new(), + path_input_id: Id::null(), + search_input: String::new(), + search_input_id: Id::null(), }; s.override_input(); s.refresh_entries(); @@ -62,7 +69,7 @@ impl FileGui { .replace(&self.home, "~"); } - fn enter_input(&mut self) { + fn apply_input(&mut self) { let path = self.path_input.replace('~', &self.home).replace('\\', "/"); self.current_dir = PathBuf::from(path); } @@ -80,6 +87,7 @@ impl FileGui { .unwrap() .filter_map(|dir_entry| dir_entry.ok().map(Entry::new)) .flatten() + .filter(|e| e.name.contains(&self.search_input)) .collect(); self.entries .sort_by(|a, b| b.is_dir().cmp(&a.is_dir()).then(a.name.cmp(&b.name))); @@ -110,7 +118,16 @@ impl FileGui { } impl eframe::App for FileGui { - fn update(&mut self, ctx: &egui::Context, _frame: &mut Frame) { + fn update(&mut self, ctx: &egui::Context, frame: &mut Frame) { + if ctx.input(|i| i.key_pressed(Key::F) && i.modifiers.ctrl) { + ctx.memory_mut(|m| m.request_focus(self.search_input_id)); + } + if ctx.input(|i| i.key_pressed(Key::L) && i.modifiers.ctrl) { + ctx.memory_mut(|m| m.request_focus(self.path_input_id)); + } + if ctx.input(|i| i.key_pressed(Key::R) && i.modifiers.ctrl) { + self.refresh_entries(); + } egui::TopBottomPanel::top("top_bar").show(ctx, |ui| { ui.horizontal(|ui| { if ui.button("⏶").clicked() { @@ -120,14 +137,21 @@ impl eframe::App for FileGui { self.refresh_entries(); } let path_bar = ui.text_edit_singleline(&mut self.path_input); + self.path_input_id = path_bar.id; if path_bar.lost_focus() { if ui.input(|i| i.key_pressed(egui::Key::Enter)) { - self.enter_input(); + self.apply_input(); self.refresh_entries(); } else if ui.input(|i| i.key_pressed(egui::Key::Escape)) { self.override_input(); } } + let filter_input = ui.text_edit_singleline(&mut self.search_input); + self.search_input_id = filter_input.id; + if filter_input.changed() { + self.refresh_entries(); + } + if let Some(filename) = self.loaded_dir.file_name() { ui.label(filename.to_str().unwrap()); } @@ -136,7 +160,7 @@ impl eframe::App for FileGui { egui::CentralPanel::default().show(ctx, |ui| { TableBuilder::new(ui) .striped(true) - .max_scroll_height(1200.0) + .max_scroll_height(frame.info().window_info.size.y) .column(Column::auto()) .column(Column::remainder()) .body(|body| { @@ -144,14 +168,7 @@ impl eframe::App for FileGui { body.rows(18.0, self.entries.len(), |row_index, mut row| { let entry = &self.entries[row_index]; row.col(|ui| { - ui.label(match entry.filetype { - FileType::Dir => "🗁", - FileType::File => "🗋", - FileType::SymLinkFile => "⮩", - FileType::SymLinkDir => "⎆", - FileType::SymLinkMissing => "⚠", - FileType::Unknown => "?", - }); + ui.label(entry.filetype.icon()); }); row.col(|ui| { if ui.button(&entry.name).clicked() { @@ -200,3 +217,16 @@ impl Entry { self.filetype == FileType::Dir || self.filetype == FileType::SymLinkDir } } + +impl FileType { + fn icon(&self) -> &str { + match self { + FileType::Dir => "🗁", + FileType::File => "🗋", + FileType::SymLinkFile => "⮩", + FileType::SymLinkDir => "⎆", + FileType::SymLinkMissing => "⚠", + FileType::Unknown => "?", + } + } +}