diff --git a/crates/tek_tui/src/tui_command.rs b/crates/tek_tui/src/tui_command.rs index b9a18b5b..c00bf92a 100644 --- a/crates/tek_tui/src/tui_command.rs +++ b/crates/tek_tui/src/tui_command.rs @@ -266,18 +266,30 @@ impl Command for FileBrowserCommand { fn execute (self, state: &mut T) -> Perhaps { use FileBrowserCommand::*; match state.phrases_mode_mut().clone() { - Some(PhrasesMode::Import(index, browser)) => { - todo!() + Some(PhrasesMode::Import(index, browser)) => match self { + Cancel => { + *state.phrases_mode_mut() = None; + }, + Chdir(cwd) => { + *state.phrases_mode_mut() = Some(PhrasesMode::Import( + index, FileBrowser::new(Some(cwd))? + )); + }, + _ => todo!(), + _ => unreachable!() }, - Some(PhrasesMode::Export(index, browser)) => { - todo!() - }, - _ => match self { - Begin => { - todo!() + Some(PhrasesMode::Export(index, browser)) => match self { + Cancel => { + *state.phrases_mode_mut() = None; + }, + Chdir(cwd) => { + *state.phrases_mode_mut() = Some(PhrasesMode::Export( + index, FileBrowser::new(Some(cwd))? + )); }, _ => unreachable!() - } + }, + _ => unreachable!(), }; Ok(None) } diff --git a/crates/tek_tui/src/tui_content.rs b/crates/tek_tui/src/tui_content.rs index 106a4de1..195169b6 100644 --- a/crates/tek_tui/src/tui_content.rs +++ b/crates/tek_tui/src/tui_content.rs @@ -187,7 +187,15 @@ impl<'a, T: PhrasesViewState> Content for PhrasesView<'a, T> { impl Content for FileBrowser { type Engine = Tui; fn content (&self) -> impl Widget { - "todo: file browser" + Stack::down(|add|{ + for (_, name) in self.dirs.iter() { + add(&name.as_str())?; + } + for (_, name) in self.files.iter() { + add(&name.as_str())?; + } + Ok(()) + }) } } diff --git a/crates/tek_tui/src/tui_model.rs b/crates/tek_tui/src/tui_model.rs index 0a3f628f..7c71e365 100644 --- a/crates/tek_tui/src/tui_model.rs +++ b/crates/tek_tui/src/tui_model.rs @@ -172,8 +172,8 @@ pub enum PhrasesMode { #[derive(Debug, Clone)] pub struct FileBrowser { pub cwd: PathBuf, - pub dirs: Vec, - pub files: Vec, + pub dirs: Vec<(OsString, String)>, + pub files: Vec<(OsString, String)>, pub filter: String, pub index: usize, pub scroll: usize, @@ -183,10 +183,23 @@ pub struct FileBrowser { impl FileBrowser { pub fn new (cwd: Option) -> Usually { let cwd = if let Some(cwd) = cwd { cwd } else { std::env::current_dir()? }; + let mut dirs = vec![]; + let mut files = vec![]; + for entry in std::fs::read_dir(&cwd)? { + let entry = entry?; + let name = entry.file_name(); + let decoded = name.clone().into_string().unwrap_or_else(|_|"".to_string()); + let meta = entry.metadata()?; + if meta.is_dir() { + dirs.push((name, format!("📁 {decoded}"))); + } else if meta.is_file() { + files.push((name, format!("📄 {decoded}"))); + } + } Ok(Self { cwd, - dirs: vec![/*todo*/], - files: vec![/*todo*/], + dirs, + files, filter: "".to_string(), index: 0, scroll: 0,