ui: add set as read/unread, delete actions
Implemented only in compact listing for now.embed
parent
2d7f9ca46f
commit
8c97336307
|
@ -771,8 +771,8 @@ impl Envelope {
|
||||||
self.timestamp = new_val.timestamp() as UnixTimestamp;
|
self.timestamp = new_val.timestamp() as UnixTimestamp;
|
||||||
}
|
}
|
||||||
pub fn set_flag(&mut self, f: Flag, mut operation: Box<BackendOp>) -> Result<()> {
|
pub fn set_flag(&mut self, f: Flag, mut operation: Box<BackendOp>) -> Result<()> {
|
||||||
|
self.flags.toggle(f);
|
||||||
operation.set_flag(self, f)?;
|
operation.set_flag(self, f)?;
|
||||||
self.flags |= f;
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
pub fn flags(&self) -> Flag {
|
pub fn flags(&self) -> Flag {
|
||||||
|
@ -781,6 +781,9 @@ impl Envelope {
|
||||||
pub fn set_seen(&mut self, operation: Box<BackendOp>) -> Result<()> {
|
pub fn set_seen(&mut self, operation: Box<BackendOp>) -> Result<()> {
|
||||||
self.set_flag(Flag::SEEN, operation)
|
self.set_flag(Flag::SEEN, operation)
|
||||||
}
|
}
|
||||||
|
pub fn set_unseen(&mut self, operation: Box<BackendOp>) -> Result<()> {
|
||||||
|
self.set_flag(Flag::SEEN, operation)
|
||||||
|
}
|
||||||
pub fn is_seen(&self) -> bool {
|
pub fn is_seen(&self) -> bool {
|
||||||
self.flags.contains(Flag::SEEN)
|
self.flags.contains(Flag::SEEN)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1145,6 +1145,63 @@ impl Component for CompactListing {
|
||||||
self.filter(filter_term, context);
|
self.filter(filter_term, context);
|
||||||
self.dirty = true;
|
self.dirty = true;
|
||||||
}
|
}
|
||||||
|
Action::Listing(a @ SetRead)
|
||||||
|
| Action::Listing(a @ SetUnread)
|
||||||
|
| Action::Listing(a @ Delete) => {
|
||||||
|
let account = &mut context.accounts[self.cursor_pos.0];
|
||||||
|
let folder_hash = account[self.cursor_pos.1]
|
||||||
|
.as_ref()
|
||||||
|
.map(|m| m.folder.hash())
|
||||||
|
.unwrap();
|
||||||
|
let threads = &account.collection.threads[&folder_hash];
|
||||||
|
let i = if self.filtered_selection.is_empty() {
|
||||||
|
let thread_node = threads.root_set(self.cursor_pos.2);
|
||||||
|
let thread_node = &threads.thread_nodes()[&thread_node];
|
||||||
|
if let Some(i) = thread_node.message() {
|
||||||
|
i
|
||||||
|
} else {
|
||||||
|
let mut iter_ptr = thread_node.children()[0];
|
||||||
|
while threads.thread_nodes()[&iter_ptr].message().is_none() {
|
||||||
|
iter_ptr = threads.thread_nodes()[&iter_ptr].children()[0];
|
||||||
|
}
|
||||||
|
threads.thread_nodes()[&iter_ptr].message().unwrap()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
self.filtered_selection[self.cursor_pos.2]
|
||||||
|
};
|
||||||
|
if !account.contains_key(i) {
|
||||||
|
/* The envelope has been renamed or removed, so wait for the appropriate event to
|
||||||
|
* arrive */
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
match a {
|
||||||
|
SetRead => {
|
||||||
|
let (hash, is_seen) = {
|
||||||
|
let envelope: &Envelope = &account.get_env(&i);
|
||||||
|
(envelope.hash(), envelope.is_seen())
|
||||||
|
};
|
||||||
|
if !is_seen {
|
||||||
|
let op = account.operation(hash);
|
||||||
|
let envelope: &mut Envelope = &mut account.get_env_mut(&i);
|
||||||
|
envelope.set_seen(op).unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SetUnread => {
|
||||||
|
let (hash, is_seen) = {
|
||||||
|
let envelope: &Envelope = &account.get_env(&i);
|
||||||
|
(envelope.hash(), envelope.is_seen())
|
||||||
|
};
|
||||||
|
if is_seen {
|
||||||
|
let op = account.operation(hash);
|
||||||
|
let envelope: &mut Envelope = &mut account.get_env_mut(&i);
|
||||||
|
envelope.set_unseen(op).unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Delete => { /* do nothing */ }
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_ => {}
|
_ => {}
|
||||||
},
|
},
|
||||||
UIEvent::Input(Key::Esc) => {
|
UIEvent::Input(Key::Esc) => {
|
||||||
|
|
|
@ -90,6 +90,10 @@ named!(
|
||||||
toggle<Action>,
|
toggle<Action>,
|
||||||
preceded!(tag!("set "), alt_complete!(threaded | plain | compact))
|
preceded!(tag!("set "), alt_complete!(threaded | plain | compact))
|
||||||
);
|
);
|
||||||
|
named!(
|
||||||
|
listing_action<Action>,
|
||||||
|
alt_complete!(toggle | envelope_action | filter | toggle_thread_snooze)
|
||||||
|
);
|
||||||
|
|
||||||
named!(
|
named!(
|
||||||
toggle_thread_snooze<Action>,
|
toggle_thread_snooze<Action>,
|
||||||
|
@ -118,6 +122,19 @@ named!(
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
named!(
|
||||||
|
envelope_action<Action>,
|
||||||
|
alt_complete!(
|
||||||
|
preceded!(
|
||||||
|
ws!(tag!("set")),
|
||||||
|
alt_complete!(
|
||||||
|
map!(ws!(tag!("read")), |_| Listing(SetRead))
|
||||||
|
| map!(ws!(tag!("unread")), |_| Listing(SetUnread))
|
||||||
|
)
|
||||||
|
) | map!(ws!(tag!("delete")), |_| Listing(Delete))
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
named!(pub parse_command<Action>,
|
named!(pub parse_command<Action>,
|
||||||
alt_complete!( goto | toggle | sort | subsort | close | toggle_thread_snooze | mailinglist |filter)
|
alt_complete!( goto | listing_action | sort | subsort | close | mailinglist)
|
||||||
);
|
);
|
||||||
|
|
|
@ -37,6 +37,9 @@ pub enum ListingAction {
|
||||||
SetThreaded,
|
SetThreaded,
|
||||||
SetCompact,
|
SetCompact,
|
||||||
Filter(String),
|
Filter(String),
|
||||||
|
SetRead,
|
||||||
|
SetUnread,
|
||||||
|
Delete,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
|
Loading…
Reference in New Issue