summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManos Pitsidianakis <el13635@mail.ntua.gr>2019-08-23 21:58:41 +0300
committerManos Pitsidianakis <el13635@mail.ntua.gr>2019-08-25 10:48:01 +0300
commitb474b44b1009face24d3eb1a3ec48cbbd546ff20 (patch)
tree97385a1e0ec8b5734d66511a0f08c54bee3d5d77
parent76909a1959ca2a0bc39e91ae22f401d6e756e975 (diff)
Add special use semantics for mailboxes
-rw-r--r--melib/src/backends.rs12
-rw-r--r--melib/src/lib.rs2
-rw-r--r--ui/src/conf.rs32
-rw-r--r--ui/src/conf/accounts.rs17
4 files changed, 54 insertions, 9 deletions
diff --git a/melib/src/backends.rs b/melib/src/backends.rs
index cdc6da1c..7b8f40ab 100644
--- a/melib/src/backends.rs
+++ b/melib/src/backends.rs
@@ -245,6 +245,18 @@ impl BackendOp for ReadOnlyOp {
}
}
+#[derive(Debug, Copy, Hash, Eq, Clone, Deserialize, PartialEq)]
+pub enum SpecialUseMailbox {
+ Normal,
+ Inbox,
+ Archive,
+ Drafts,
+ Flagged,
+ Junk,
+ Sent,
+ Trash,
+}
+
pub trait BackendFolder: Debug {
fn hash(&self) -> FolderHash;
fn name(&self) -> &str;
diff --git a/melib/src/lib.rs b/melib/src/lib.rs
index 5e9c6f7d..d9cea92a 100644
--- a/melib/src/lib.rs
+++ b/melib/src/lib.rs
@@ -120,7 +120,7 @@ extern crate uuid;
pub use crate::conf::*;
pub use crate::mailbox::*;
-pub use crate::backends::{Backends, RefreshEvent, RefreshEventConsumer};
+pub use crate::backends::{Backends, RefreshEvent, RefreshEventConsumer, SpecialUseMailbox};
pub use crate::email::{Envelope, Flag};
pub use crate::error::{MeliError, Result};
diff --git a/ui/src/conf.rs b/ui/src/conf.rs
index 9812b869..a3d5c359 100644
--- a/ui/src/conf.rs
+++ b/ui/src/conf.rs
@@ -38,6 +38,7 @@ pub use self::shortcuts::*;
use self::default_vals::*;
use self::notifications::NotificationsSettings;
use crate::pager::PagerSettings;
+use melib::backends::SpecialUseMailbox;
use melib::conf::AccountSettings;
use melib::error::*;
@@ -97,6 +98,8 @@ pub struct FolderConf {
subscribe: ToggleFlag,
#[serde(deserialize_with = "toggleflag_de", default)]
ignore: ToggleFlag,
+ #[serde(default = "none")]
+ usage: Option<SpecialUseMailbox>,
}
impl Default for FolderConf {
@@ -106,6 +109,7 @@ impl Default for FolderConf {
autoload: true,
subscribe: ToggleFlag::Unset,
ignore: ToggleFlag::False,
+ usage: None,
}
}
}
@@ -188,6 +192,34 @@ impl From<FileAccount> for AccountConf {
}
folder_confs.get_mut(s).unwrap().subscribe = ToggleFlag::True;
}
+
+ if folder_confs[s].usage.is_none() {
+ let name = s.split('/').last().unwrap_or("");
+ folder_confs.get_mut(s).unwrap().usage = if name.eq_ignore_ascii_case("inbox") {
+ Some(SpecialUseMailbox::Inbox)
+ } else if name.eq_ignore_ascii_case("archive") {
+ Some(SpecialUseMailbox::Archive)
+ } else if name.eq_ignore_ascii_case("drafts") {
+ Some(SpecialUseMailbox::Drafts)
+ } else if name.eq_ignore_ascii_case("junk") {
+ Some(SpecialUseMailbox::Junk)
+ } else if name.eq_ignore_ascii_case("spam") {
+ Some(SpecialUseMailbox::Junk)
+ } else if name.eq_ignore_ascii_case("sent") {
+ Some(SpecialUseMailbox::Sent)
+ } else if name.eq_ignore_ascii_case("trash") {
+ Some(SpecialUseMailbox::Trash)
+ } else {
+ Some(SpecialUseMailbox::Normal)
+ };
+ }
+
+ if folder_confs[s].ignore.is_unset() {
+ use SpecialUseMailbox::*;
+ if [Junk, Sent, Trash].contains(&folder_confs[s].usage.as_ref().unwrap()) {
+ folder_confs.get_mut(s).unwrap().ignore = ToggleFlag::InternalVal(true);
+ }
+ }
}
AccountConf {
diff --git a/ui/src/conf/accounts.rs b/ui/src/conf/accounts.rs
index fdb23320..63e08a1d 100644
--- a/ui/src/conf/accounts.rs
+++ b/ui/src/conf/accounts.rs
@@ -24,12 +24,11 @@
*/
use super::AccountConf;
-use super::ToggleFlag;
use fnv::FnvHashMap;
use melib::async_workers::{Async, AsyncBuilder, AsyncStatus};
use melib::backends::{
BackendOp, Backends, Folder, FolderHash, MailBackend, NotifyFn, ReadOnlyOp, RefreshEvent,
- RefreshEventConsumer, RefreshEventKind,
+ RefreshEventConsumer, RefreshEventKind, SpecialUseMailbox,
};
use melib::error::{MeliError, Result};
use melib::mailbox::*;
@@ -189,12 +188,7 @@ struct FolderNode {
}
impl Account {
- pub fn new(
- name: String,
- mut settings: AccountConf,
- map: &Backends,
- notify_fn: NotifyFn,
- ) -> Self {
+ pub fn new(name: String, settings: AccountConf, map: &Backends, notify_fn: NotifyFn) -> Self {
let mut backend = map.get(settings.account().format())(settings.account());
let mut ref_folders: FnvHashMap<FolderHash, Folder> = backend.folders();
let mut folders: FnvHashMap<FolderHash, MailboxEntry> =
@@ -212,6 +206,13 @@ impl Account {
/* Skip unsubscribed folder */
continue;
}
+
+ match settings.folder_confs[f.path()].usage {
+ Some(SpecialUseMailbox::Sent) => {
+ sent_folder = Some(f.hash());
+ }
+ _ => {}
+ }
folder_names.insert(f.hash(), f.path().to_string());
}