Browse Source

melib: add quoted body in reply draft

embed
Manos Pitsidianakis 4 years ago
parent
commit
c88ee18dda
Signed by: epilys GPG Key ID: 73627C2F690DF710
  1. 44
      melib/src/mailbox/email/compose/mod.rs
  2. 38
      ui/src/components/mail/compose.rs

44
melib/src/mailbox/email/compose/mod.rs

@ -42,9 +42,53 @@ impl Default for Draft {
}
impl Draft {
pub fn as_reply(envelope: &Envelope, bytes: &[u8]) -> Self {
let mut ret = Draft::default();
ret.headers_mut().insert(
"References".into(),
format!(
"{} {}",
envelope
.references()
.iter()
.fold(String::new(), |mut acc, x| {
if !acc.is_empty() {
acc.push(' ');
}
acc.push_str(&x.to_string());
acc
}),
envelope.message_id()
),
);
ret.headers_mut()
.insert("In-Reply-To".into(), envelope.message_id().into());
ret.headers_mut()
.insert("To".into(), envelope.field_from_to_string());
ret.headers_mut()
.insert("Cc".into(), envelope.field_cc_to_string());
let body = envelope.body_bytes(bytes);
ret.body = {
let reply_body_bytes = decode_rec(&body, None);
let reply_body = String::from_utf8_lossy(&reply_body_bytes);
let lines: Vec<&str> = reply_body.lines().collect();
let mut ret = String::with_capacity(reply_body.len() + lines.len());
for l in lines {
ret.push('>');
ret.push_str(l.trim());
ret.push('\n');
}
ret.pop();
ret
};
ret
}
pub fn headers_mut(&mut self) -> &mut FnvHashMap<String, String> {
&mut self.headers
}
pub fn headers(&self) -> &FnvHashMap<String, String> {
&self.headers
}

38
ui/src/components/mail/compose.rs

@ -108,10 +108,15 @@ impl Composer {
.unwrap();
let threads = &mailbox.threads;
let containers = &threads.containers();
let mut ret = Composer::default();
let p = containers[msg];
let parent_message = &mailbox.collection[p.message().unwrap()];
let mut op = context.accounts[coordinates.0]
.backend
.operation(parent_message.hash());
let parent_bytes = op.as_bytes();
ret.draft = Draft::as_reply(parent_message, parent_bytes.unwrap());
ret.draft.headers_mut().insert(
"Subject".into(),
if p.show_subject() {
@ -123,33 +128,6 @@ impl Composer {
mailbox.collection[p.message().unwrap()].subject().into()
},
);
let parent_message = &mailbox.collection[p.message().unwrap()];
ret.draft.headers_mut().insert(
"References".into(),
format!(
"{} {}",
parent_message
.references()
.iter()
.fold(String::new(), |mut acc, x| {
if !acc.is_empty() {
acc.push(' ');
}
acc.push_str(&x.to_string());
acc
}),
parent_message.message_id()
),
);
ret.draft
.headers_mut()
.insert("In-Reply-To".into(), parent_message.message_id().into());
ret.draft
.headers_mut()
.insert("To".into(), parent_message.field_from_to_string());
ret.draft
.headers_mut()
.insert("Cc".into(), parent_message.field_cc_to_string());
ret.account_cursor = coordinates.0;
ret.reply_context = Some((
@ -436,7 +414,7 @@ impl Component for Composer {
return true;
}
/* Switch to Pager mode if we're on Overview mode */
UIEventType::Input(Key::Char('p')) if self.mode.is_overview() => {
UIEventType::Input(Key::Char('v')) if self.mode.is_overview() => {
self.mode = ViewMode::Pager;
self.set_dirty();
return true;

Loading…
Cancel
Save