ui: add statusbar change with tab switch and updates

master
Manos Pitsidianakis 2019-09-15 09:41:52 +03:00
parent 059d86de93
commit 5ddd68ad9f
Signed by: Manos Pitsidianakis
GPG Key ID: 73627C2F690DF710
4 changed files with 74 additions and 23 deletions

View File

@ -100,6 +100,10 @@ pub trait Component: Display + Debug + Send {
fn get_shortcuts(&self, _context: &Context) -> ShortcutMaps { fn get_shortcuts(&self, _context: &Context) -> ShortcutMaps {
Default::default() Default::default()
} }
fn get_status(&self, _context: &Context) -> Option<String> {
None
}
} }
/* /*

View File

@ -295,6 +295,11 @@ impl Component for Listing {
context context
.replies .replies
.push_back(UIEvent::RefreshMailbox((self.cursor_pos.0, folder_hash))); .push_back(UIEvent::RefreshMailbox((self.cursor_pos.0, folder_hash)));
context
.replies
.push_back(UIEvent::StatusEvent(StatusEvent::UpdateStatus(
self.get_status(context).unwrap(),
)));
return true; return true;
} }
UIEvent::Input(ref k) UIEvent::Input(ref k)
@ -335,6 +340,11 @@ impl Component for Listing {
context context
.replies .replies
.push_back(UIEvent::RefreshMailbox((self.cursor_pos.0, folder_hash))); .push_back(UIEvent::RefreshMailbox((self.cursor_pos.0, folder_hash)));
context
.replies
.push_back(UIEvent::StatusEvent(StatusEvent::UpdateStatus(
self.get_status(context).unwrap(),
)));
return true; return true;
} }
UIEvent::Action(ref action) => match action { UIEvent::Action(ref action) => match action {
@ -365,6 +375,11 @@ impl Component for Listing {
.position(|&h| h == folder_hash) .position(|&h| h == folder_hash)
.unwrap_or(0), .unwrap_or(0),
); );
context
.replies
.push_back(UIEvent::StatusEvent(StatusEvent::UpdateStatus(
self.get_status(context).unwrap(),
)));
self.dirty = true; self.dirty = true;
} }
UIEvent::ChangeMode(UIMode::Normal) => { UIEvent::ChangeMode(UIMode::Normal) => {
@ -385,9 +400,19 @@ impl Component for Listing {
} }
UIEvent::StartupCheck(_) => { UIEvent::StartupCheck(_) => {
self.dirty = true; self.dirty = true;
context
.replies
.push_back(UIEvent::StatusEvent(StatusEvent::UpdateStatus(
self.get_status(context).unwrap(),
)));
} }
UIEvent::MailboxUpdate(_) => { UIEvent::MailboxUpdate(_) => {
self.dirty = true; self.dirty = true;
context
.replies
.push_back(UIEvent::StatusEvent(StatusEvent::UpdateStatus(
self.get_status(context).unwrap(),
)));
} }
_ => {} _ => {}
} }
@ -489,6 +514,38 @@ impl Component for Listing {
Conversations(ref mut l) => l.set_id(id), Conversations(ref mut l) => l.set_id(id),
} }
} }
fn get_status(&self, context: &Context) -> Option<String> {
Some({
let folder_hash = if let Some(h) = context.accounts[self.cursor_pos.0]
.folders_order
.get(self.cursor_pos.1)
{
*h
} else {
return Some(String::new());
};
if !context.accounts[self.cursor_pos.0].folders[&folder_hash].is_available() {
return Some(String::new());
}
let account = &context.accounts[self.cursor_pos.0];
let m = if account[self.cursor_pos.1].is_available() {
account[self.cursor_pos.1].unwrap()
} else {
return Some(String::new());
};
format!(
"Mailbox: {}, Messages: {}, New: {}",
m.folder.name(),
m.envelopes.len(),
m.envelopes
.iter()
.map(|h| &account.collection[&h])
.filter(|e| !e.is_seen())
.count()
)
})
}
} }
impl From<IndexStyle> for ListingComponent { impl From<IndexStyle> for ListingComponent {

View File

@ -929,29 +929,7 @@ impl Component for StatusBar {
return true; return true;
} }
match &event { match event {
UIEvent::RefreshMailbox((ref idx_a, ref idx_f)) => {
match context.accounts[*idx_a].status(*idx_f) {
Ok(_) => {}
Err(_) => {
return false;
}
}
let account = &context.accounts[*idx_a];
let m = &account[*idx_f].unwrap();
self.status = format!(
"{} | Mailbox: {}, Messages: {}, New: {}",
self.mode,
m.folder.name(),
m.envelopes.len(),
m.envelopes
.iter()
.map(|h| &account.collection[&h])
.filter(|e| !e.is_seen())
.count()
);
self.dirty = true;
}
UIEvent::ChangeMode(m) => { UIEvent::ChangeMode(m) => {
let offset = self.status.find('|').unwrap_or_else(|| self.status.len()); let offset = self.status.find('|').unwrap_or_else(|| self.status.len());
self.status.replace_range(..offset, &format!("{} ", m)); self.status.replace_range(..offset, &format!("{} ", m));
@ -1038,6 +1016,10 @@ impl Component for StatusBar {
self.display_buffer = s.clone(); self.display_buffer = s.clone();
self.dirty = true; self.dirty = true;
} }
UIEvent::StatusEvent(StatusEvent::UpdateStatus(ref mut s)) => {
self.status = format!("{} | {}", self.mode, std::mem::replace(s, String::new()));
self.dirty = true;
}
_ => {} _ => {}
} }
false false
@ -1321,6 +1303,13 @@ impl Component for Tabbed {
match *event { match *event {
UIEvent::Input(Key::Char('T')) => { UIEvent::Input(Key::Char('T')) => {
self.cursor_pos = (self.cursor_pos + 1) % self.children.len(); self.cursor_pos = (self.cursor_pos + 1) % self.children.len();
context
.replies
.push_back(UIEvent::StatusEvent(StatusEvent::UpdateStatus(
self.children[self.cursor_pos]
.get_status(context)
.unwrap_or_default(),
)));
self.set_dirty(); self.set_dirty();
return true; return true;
} }

View File

@ -38,6 +38,7 @@ pub enum StatusEvent {
DisplayMessage(String), DisplayMessage(String),
BufClear, BufClear,
BufSet(String), BufSet(String),
UpdateStatus(String),
} }
/// `ThreadEvent` encapsulates all of the possible values we need to transfer between our threads /// `ThreadEvent` encapsulates all of the possible values we need to transfer between our threads