From 222140d74dc2cf558ee06b884b7967dc2e3149c7 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Mon, 13 Mar 2023 01:32:42 -0400 Subject: [PATCH] Add search to resource browser --- retrotool-gui/src/main.rs | 4 ++- retrotool-gui/src/tabs/project.rs | 43 ++++++++++++++++++++++++++++--- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/retrotool-gui/src/main.rs b/retrotool-gui/src/main.rs index dbc51ec..dbc8a51 100644 --- a/retrotool-gui/src/main.rs +++ b/retrotool-gui/src/main.rs @@ -97,7 +97,9 @@ struct UiState { impl Default for UiState { fn default() -> Self { let mut tree = egui_dock::Tree::new(vec![TabType::Empty]); - tree.split_left(egui_dock::NodeIndex::root(), 0.25, vec![TabType::Project(ProjectTab)]); + tree.split_left(egui_dock::NodeIndex::root(), 0.25, vec![TabType::Project( + ProjectTab::default(), + )]); Self { tree, ui_font: FontId { size: 13.0, family: FontFamily::Proportional }, diff --git a/retrotool-gui/src/tabs/project.rs b/retrotool-gui/src/tabs/project.rs index 6cff2bd..c21494b 100644 --- a/retrotool-gui/src/tabs/project.rs +++ b/retrotool-gui/src/tabs/project.rs @@ -19,7 +19,10 @@ use crate::{ pub const K_FORM_FMV0: FourCC = FourCC(*b"FMV0"); pub const K_FORM_ROOM: FourCC = FourCC(*b"ROOM"); -pub struct ProjectTab; +#[derive(Default)] +pub struct ProjectTab { + search: String, +} impl SystemTab for ProjectTab { type LoadParam = (); @@ -32,12 +35,40 @@ impl SystemTab for ProjectTab { state: &mut TabState, ) { let (server, packages) = query; + + let mut set_open = None; + ui.horizontal(|ui| { + if ui.button("Expand all").clicked() { + set_open = Some(true); + } + if ui.button("Collapse all").clicked() { + set_open = Some(false); + } + }); + egui::TextEdit::singleline(&mut self.search).hint_text("Search").ui(ui); + let mut packages_sorted = packages.iter().map(|(_, p)| p).collect::>(); packages_sorted.sort_by_key(|p| &p.name); for package in packages_sorted { - egui::CollapsingHeader::new(&package.name).show(ui, |ui| { - for entry in &package.entries { + let search = self.search.to_ascii_lowercase(); + let search = search.trim_start_matches('{').trim_end_matches('}'); + let mut iter = package + .entries + .iter() + .filter(|e| { + search.is_empty() + || (search.as_bytes().len() == 4 + && e.kind.0.eq_ignore_ascii_case(search.as_bytes())) + || matches!(&e.name, Some(v) if v.contains(search)) + || e.id.to_string().contains(search) + }) + .peekable(); + if iter.peek().is_none() { + continue; + } + egui::CollapsingHeader::new(&package.name).open(set_open).show(ui, |ui| { + for entry in iter { let monospace = ui.style().text_styles.get(&egui::TextStyle::Monospace).unwrap().clone(); let mut job = LayoutJob::simple( @@ -67,6 +98,12 @@ impl SystemTab for ProjectTab { let asset_ref = AssetRef { id: entry.id, kind: entry.kind }; if egui::SelectableLabel::new(state.open_assets.contains(&asset_ref), job) .ui(ui) + .context_menu(|ui| { + if ui.button(format!("Copy \"{}\"", entry.id)).clicked() { + ui.output_mut(|out| out.copied_text = format!("{}", entry.id)); + ui.close_menu(); + } + }) .clicked() { match entry.kind {