summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2020-07-05 12:45:25 +0200
committerMatthias Beyer <mail@beyermatthias.de>2020-07-05 12:45:25 +0200
commitd76040741bd237c92f6969a562f82fb2045850f3 (patch)
tree0eee58d2fd09f428e7802ea34b617c087b5dfc93 /src
parent44ebbe5193aa16b38e55791fd37adf6d8032dc85 (diff)
Add sidebar implementation
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Diffstat (limited to 'src')
-rw-r--r--src/main.rs20
-rw-r--r--src/sidebar.rs43
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)
+ })
+ })
+}