diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2020-07-05 12:45:25 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2020-07-05 12:45:25 +0200 |
commit | d76040741bd237c92f6969a562f82fb2045850f3 (patch) | |
tree | 0eee58d2fd09f428e7802ea34b617c087b5dfc93 /src | |
parent | 44ebbe5193aa16b38e55791fd37adf6d8032dc85 (diff) |
Add sidebar implementation
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Diffstat (limited to 'src')
-rw-r--r-- | src/main.rs | 20 | ||||
-rw-r--r-- | src/sidebar.rs | 43 |
2 files changed, 61 insertions, 2 deletions
diff --git a/src/main.rs b/src/main.rs index 358318f..646a9fe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,10 +3,12 @@ use std::path::PathBuf; use anyhow::Result; use cursive::CursiveExt; +use cursive::view::Nameable; use mailparse::MailHeaderMap; use mailparse::ParsedMail; mod mailstore; +mod sidebar; fn list_view_for<'a, I>(i: I) -> Result<cursive::views::ListView> where I: Iterator<Item = &'a ParsedMail> @@ -33,12 +35,26 @@ fn main() -> Result<()> { .map(PathBuf::from) .ok_or_else(|| anyhow!("No path to maildir passed"))?; + let dirs = walkdir::WalkDir::new(maildir_path.clone()) + .max_depth(0) + .follow_links(false) + .same_file_system(true) + .into_iter() + .filter_map(Result::ok) + .filter(|de| de.file_type().is_dir()) + .map(|de| de.path().to_path_buf()); + let sidebar = sidebar::sidebar(dirs)?; + let mut md = mailstore::MailStore::from_path(maildir_path); md.load()?; - let view = list_view_for(md.cur_mail().iter().map(mailstore::Mail::parsed))?; + let list_view = list_view_for(md.cur_mail().iter().map(mailstore::Mail::parsed))?; + + let mut layout = cursive::views::LinearLayout::horizontal(); + layout.add_child(sidebar.with_name("Sidebar")); + layout.add_child(list_view); let mut siv = cursive::Cursive::default(); - siv.add_layer(view); + siv.add_layer(layout); siv.add_global_callback('q', |s| s.quit()); siv.run(); diff --git a/src/sidebar.rs b/src/sidebar.rs new file mode 100644 index 0000000..ecc2e29 --- /dev/null +++ b/src/sidebar.rs @@ -0,0 +1,43 @@ +use std::path::PathBuf; +use anyhow::Result; +use std::fmt; +use std::ffi::OsStr; + +#[derive(Debug)] +pub struct TreeEntry { + name: String, + dir: Option<PathBuf>, +} + +impl fmt::Display for TreeEntry { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.name) + } +} + + +pub fn sidebar<I>(iter: I) -> Result<cursive_tree_view::TreeView<TreeEntry>> + where I: Iterator<Item = PathBuf> +{ + let mut tv = cursive_tree_view::TreeView::default(); + + iter.map(|path| { + path.file_name() + .and_then(OsStr::to_str) + .map(String::from) + .ok_or_else(|| anyhow!("UTF8 error")) + .map(|name| { + TreeEntry { + name, + dir: Some(path) + } + }) + }) + .enumerate() + .fold(Ok(tv), |accu, (i, item)| { + accu.and_then(|mut tv| { + item.map(|itm| tv.insert_item(itm, cursive_tree_view::Placement::After, i)) + .map(|_| tv) + }) + }) +} |