From cc119c19b02da84183489cb3b05bc41e3c5dcf3d Mon Sep 17 00:00:00 2001 From: Manos Pitsidianakis Date: Sun, 26 Jul 2020 01:13:00 +0300 Subject: [PATCH] melib/maildir: send NewFlags events --- melib/src/backends/maildir/backend.rs | 30 +++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/melib/src/backends/maildir/backend.rs b/melib/src/backends/maildir/backend.rs index a708aef7..8bcd161c 100644 --- a/melib/src/backends/maildir/backend.rs +++ b/melib/src/backends/maildir/backend.rs @@ -362,6 +362,7 @@ impl MailBackend for MaildirType { debug!("watching {:?}", root_path); let hash_indexes = self.hash_indexes.clone(); let mailbox_index = self.mailbox_index.clone(); + let root_mailbox_hash: MailboxHash = self.mailboxes.values().find(|m| m.parent.is_none()).map(|m| m.hash()).unwrap(); let mailbox_counts = self .mailboxes .iter() @@ -561,10 +562,10 @@ impl MailBackend for MaildirType { let mut hash_indexes_lock = hash_indexes.lock().unwrap(); let index_lock = hash_indexes_lock.entry(mailbox_hash).or_default(); - // TODO: Represent index states with an enum: make illegal - // states unrepresentable. - let was_seen: bool = src.flags().contains(Flag::SEEN); - let is_seen: bool = dest.flags().contains(Flag::SEEN); + let old_flags = src.flags(); + let new_flags = dest.flags(); + let was_seen: bool = old_flags.contains(Flag::SEEN); + let is_seen: bool = new_flags.contains(Flag::SEEN); if index_lock.contains_key(&old_hash) && !index_lock[&old_hash].removed @@ -585,6 +586,13 @@ impl MailBackend for MaildirType { } else if was_seen && !is_seen { *mailbox_counts[&mailbox_hash].0.lock().unwrap() += 1; } + if old_flags != new_flags { + sender.send(RefreshEvent { + account_hash, + mailbox_hash: get_path_hash!(dest), + kind: NewFlags(new_hash, (new_flags, vec![])), + }); + } mailbox_index.lock().unwrap().insert(new_hash,get_path_hash!(dest) ); index_lock.insert(new_hash, dest.into()); continue; @@ -651,6 +659,13 @@ impl MailBackend for MaildirType { kind: Rename(old_hash, new_hash), }); debug!("contains_new_key"); + if old_flags != new_flags { + sender.send(RefreshEvent { + account_hash, + mailbox_hash: get_path_hash!(dest), + kind: NewFlags(new_hash, (new_flags, vec![])), + }); + } } /* Maybe a re-read should be triggered here just to be safe. @@ -663,8 +678,11 @@ impl MailBackend for MaildirType { } /* Trigger rescan of mailbox */ DebouncedEvent::Rescan => { - /* Actually should rescan all mailboxes */ - unreachable!("Unimplemented: rescan of all mailboxes in MaildirType") + sender.send(RefreshEvent { + account_hash, + mailbox_hash: root_mailbox_hash, + kind: Rescan, + }); } _ => {} },