summaryrefslogtreecommitdiffstats
path: root/src/components/mail
diff options
context:
space:
mode:
authorManos Pitsidianakis <el13635@mail.ntua.gr>2020-11-09 19:32:38 +0200
committerManos Pitsidianakis <el13635@mail.ntua.gr>2020-11-09 19:35:47 +0200
commitcbaf21764c033799b5cd3e830e9fd32085f55625 (patch)
treebeda24fb65055c00accf0802b5c9a177fb030d7a /src/components/mail
parentda69eecafee831310243b36402e694f9aea54007 (diff)
Remove status tab, move account status page to listing
Diffstat (limited to 'src/components/mail')
-rw-r--r--src/components/mail/listing.rs541
-rw-r--r--src/components/mail/status.rs330
2 files changed, 323 insertions, 548 deletions
diff --git a/src/components/mail/listing.rs b/src/components/mail/listing.rs
index 15d12223..cebe022e 100644
--- a/src/components/mail/listing.rs
+++ b/src/components/mail/listing.rs
@@ -472,6 +472,7 @@ enum ListingFocus {
pub struct Listing {
component: ListingComponent,
accounts: Vec<AccountMenuEntry>,
+ status: Option<AccountStatus>,
dirty: bool,
visible: bool,
cursor_pos: (usize, usize),
@@ -570,7 +571,11 @@ impl Component for Listing {
}
}
- self.component.draw(grid, area, context);
+ if let Some(s) = self.status.as_mut() {
+ s.draw(grid, area, context);
+ } else {
+ self.component.draw(grid, area, context);
+ }
} else if right_component_width == 0 {
self.draw_menu(grid, area, context);
} else {
@@ -583,8 +588,12 @@ impl Component for Listing {
}
}
}
- self.component
- .draw(grid, (set_x(upper_left, mid + 1), bottom_right), context);
+ if let Some(s) = self.status.as_mut() {
+ s.draw(grid, (set_x(upper_left, mid + 1), bottom_right), context);
+ } else {
+ self.component
+ .draw(grid, (set_x(upper_left, mid + 1), bottom_right), context);
+ }
}
self.dirty = false;
}
@@ -672,7 +681,17 @@ impl Component for Listing {
_ => {}
}
- if self.focus == ListingFocus::Mailbox && self.component.process_event(event, context) {
+ if self.focus == ListingFocus::Mailbox && self.status.is_some() {
+ if let Some(s) = self.status.as_mut() {
+ if s.process_event(event, context) {
+ return true;
+ }
+ }
+ }
+ if self.focus == ListingFocus::Mailbox
+ && self.status.is_none()
+ && self.component.process_event(event, context)
+ {
return true;
}
@@ -817,256 +836,263 @@ impl Component for Listing {
return true;
}
- UIEvent::Action(ref action) => match action {
- Action::Listing(ListingAction::SetPlain) => {
- self.component.set_style(IndexStyle::Plain);
- return true;
- }
- Action::Listing(ListingAction::SetThreaded) => {
- self.component.set_style(IndexStyle::Threaded);
- return true;
- }
- Action::Listing(ListingAction::SetCompact) => {
- self.component.set_style(IndexStyle::Compact);
- return true;
- }
- Action::Listing(ListingAction::SetConversations) => {
- self.component.set_style(IndexStyle::Conversations);
- return true;
+ UIEvent::Input(ref k)
+ if shortcut!(
+ k == shortcuts[Listing::DESCRIPTION]["toggle_menu_visibility"]
+ ) =>
+ {
+ self.menu_visibility = !self.menu_visibility;
+ self.set_dirty(true);
+ }
+ UIEvent::ChangeMode(UIMode::Normal) => {
+ self.dirty = true;
+ }
+ UIEvent::Resize => {
+ self.set_dirty(true);
+ }
+ UIEvent::Action(Action::ViewMailbox(ref idx)) => {
+ if let Some((_, _, _, mailbox_hash)) =
+ self.accounts[self.cursor_pos.0].entries.get(*idx)
+ {
+ let account_hash = self.accounts[self.cursor_pos.0].hash;
+ self.cursor_pos.1 = *idx;
+ self.status = None;
+ self.component
+ .set_coordinates((account_hash, *mailbox_hash));
+ self.set_dirty(true);
}
- Action::Listing(ListingAction::Import(file_path, mailbox_path)) => {
- let account = &mut context.accounts[self.cursor_pos.0];
- if let Err(err) = account
- .mailbox_by_path(&mailbox_path)
- .and_then(|mailbox_hash| {
- Ok((
- std::fs::read(&file_path).chain_err_summary(|| {
- format!("Could not read {}", file_path.display())
- })?,
- mailbox_hash,
- ))
- })
- .and_then(|(bytes, mailbox_hash)| {
- account.save(&bytes, mailbox_hash, None)
- })
- {
- context.replies.push_back(UIEvent::StatusEvent(
- StatusEvent::DisplayMessage(err.to_string()),
- ));
+ return true;
+ }
+ _ => {}
+ }
+
+ if self.status.is_none() {
+ match event {
+ UIEvent::Action(ref action) => match action {
+ Action::Listing(ListingAction::SetPlain) => {
+ self.component.set_style(IndexStyle::Plain);
+ return true;
}
- return true;
- }
- Action::Listing(a @ ListingAction::SetSeen)
- | Action::Listing(a @ ListingAction::SetUnseen)
- | Action::Listing(a @ ListingAction::Delete)
- | Action::Listing(a @ ListingAction::CopyTo(_))
- | Action::Listing(a @ ListingAction::MoveTo(_))
- | Action::Listing(a @ ListingAction::CopyToOtherAccount(_, _))
- | Action::Listing(a @ ListingAction::MoveToOtherAccount(_, _))
- | Action::Listing(a @ ListingAction::Tag(_)) => {
- let focused = self.component.get_focused_items(context);
- self.component.perform_action(context, focused, a);
- let mut row_updates: SmallVec<[ThreadHash; 8]> = SmallVec::new();
- for (k, v) in self.component.selection().iter_mut() {
- if *v {
- *v = false;
- row_updates.push(*k);
+ Action::Listing(ListingAction::SetThreaded) => {
+ self.component.set_style(IndexStyle::Threaded);
+ return true;
+ }
+ Action::Listing(ListingAction::SetCompact) => {
+ self.component.set_style(IndexStyle::Compact);
+ return true;
+ }
+ Action::Listing(ListingAction::SetConversations) => {
+ self.component.set_style(IndexStyle::Conversations);
+ return true;
+ }
+ Action::Listing(ListingAction::Import(file_path, mailbox_path)) => {
+ let account = &mut context.accounts[self.cursor_pos.0];
+ if let Err(err) = account
+ .mailbox_by_path(&mailbox_path)
+ .and_then(|mailbox_hash| {
+ Ok((
+ std::fs::read(&file_path).chain_err_summary(|| {
+ format!("Could not read {}", file_path.display())
+ })?,
+ mailbox_hash,
+ ))
+ })
+ .and_then(|(bytes, mailbox_hash)| {
+ account.save(&bytes, mailbox_hash, None)
+ })
+ {
+ context.replies.push_back(UIEvent::StatusEvent(
+ StatusEvent::DisplayMessage(err.to_string()),
+ ));
+ }
+ return true;
+ }
+ Action::Listing(a @ ListingAction::SetSeen)
+ | Action::Listing(a @ ListingAction::SetUnseen)
+ | Action::Listing(a @ ListingAction::Delete)
+ | Action::Listing(a @ ListingAction::CopyTo(_))
+ | Action::Listing(a @ ListingAction::MoveTo(_))
+ | Action::Listing(a @ ListingAction::CopyToOtherAccount(_, _))
+ | Action::Listing(a @ ListingAction::MoveToOtherAccount(_, _))
+ | Action::Listing(a @ ListingAction::Tag(_)) => {
+ let focused = self.component.get_focused_items(context);
+ self.component.perform_action(context, focused, a);
+ let mut row_updates: SmallVec<[ThreadHash; 8]> = SmallVec::new();
+ for (k, v) in self.component.selection().iter_mut() {
+ if *v {
+ *v = false;
+ row_updates.push(*k);
+ }
}
}
- self.component.row_updates().extend(row_updates.drain(..));
- self.component.set_dirty(true);
+ _ => {}
+ },
+ UIEvent::Input(ref key)
+ if shortcut!(key == shortcuts[Listing::DESCRIPTION]["scroll_up"]) =>
+ {
+ let amount = if self.cmd_buf.is_empty() {
+ 1
+ } else if let Ok(amount) = self.cmd_buf.parse::<usize>() {
+ self.cmd_buf.clear();
+ self.component.set_modifier_active(false);
+ context
+ .replies
+ .push_back(UIEvent::StatusEvent(StatusEvent::BufClear));
+ amount
+ } else {
+ self.cmd_buf.clear();
+ self.component.set_modifier_active(false);
+ context
+ .replies
+ .push_back(UIEvent::StatusEvent(StatusEvent::BufClear));
+ return true;
+ };
+ self.component.set_movement(PageMovement::Up(amount));
return true;
}
- Action::ViewMailbox(idx) => {
- if let Some((_, _, _, mailbox_hash)) =
- self.accounts[self.cursor_pos.0].entries.get(*idx)
- {
- let account_hash = self.accounts[self.cursor_pos.0].hash;
- self.cursor_pos.1 = *idx;
- self.component
- .set_coordinates((account_hash, *mailbox_hash));
- self.set_dirty(true);
+ UIEvent::Input(ref key)
+ if shortcut!(key == shortcuts[Listing::DESCRIPTION]["scroll_down"]) =>
+ {
+ let amount = if self.cmd_buf.is_empty() {
+ 1
+ } else if let Ok(amount) = self.cmd_buf.parse::<usize>() {
+ self.cmd_buf.clear();
+ self.component.set_modifier_active(false);
+ context
+ .replies
+ .push_back(UIEvent::StatusEvent(StatusEvent::BufClear));
+ amount
} else {
+ self.cmd_buf.clear();
+ self.component.set_modifier_active(false);
+ context
+ .replies
+ .push_back(UIEvent::StatusEvent(StatusEvent::BufClear));
return true;
- }
+ };
+ self.component.set_movement(PageMovement::Down(amount));
return true;
}
- _ => {}
- },
- UIEvent::ChangeMode(UIMode::Normal) => {
- self.dirty = true;
- }
- UIEvent::Resize => {
- self.set_dirty(true);
- }
- UIEvent::Input(ref key)
- if shortcut!(key == shortcuts[Listing::DESCRIPTION]["scroll_up"]) =>
- {
- let amount = if self.cmd_buf.is_empty() {
- 1
- } else if let Ok(amount) = self.cmd_buf.parse::<usize>() {
- self.cmd_buf.clear();
- self.component.set_modifier_active(false);
- context
- .replies
- .push_back(UIEvent::StatusEvent(StatusEvent::BufClear));
- amount
- } else {
- self.cmd_buf.clear();
- self.component.set_modifier_active(false);
- context
- .replies
- .push_back(UIEvent::StatusEvent(StatusEvent::BufClear));
+ UIEvent::Input(ref key)
+ if shortcut!(key == shortcuts[Listing::DESCRIPTION]["prev_page"]) =>
+ {
+ let mult = if self.cmd_buf.is_empty() {
+ 1
+ } else if let Ok(mult) = self.cmd_buf.parse::<usize>() {
+ self.cmd_buf.clear();
+ self.component.set_modifier_active(false);
+ context
+ .replies
+ .push_back(UIEvent::StatusEvent(StatusEvent::BufClear));
+ mult
+ } else {
+ self.cmd_buf.clear();
+ self.component.set_modifier_active(false);
+ context
+ .replies
+ .push_back(UIEvent::StatusEvent(StatusEvent::BufClear));
+ return true;
+ };
+ self.component.set_movement(PageMovement::PageUp(mult));
return true;
- };
- self.component.set_movement(PageMovement::Up(amount));
- return true;
- }
- UIEvent::Input(ref key)
- if shortcut!(key == shortcuts[Listing::DESCRIPTION]["scroll_down"]) =>
- {
- let amount = if self.cmd_buf.is_empty() {
- 1
- } else if let Ok(amount) = self.cmd_buf.parse::<usize>() {
- self.cmd_buf.clear();
- self.component.set_modifier_active(false);
- context
- .replies
- .push_back(UIEvent::StatusEvent(StatusEvent::BufClear));
- amount
- } else {
- self.cmd_buf.clear();
- self.component.set_modifier_active(false);
- context
- .replies
- .push_back(UIEvent::StatusEvent(StatusEvent::BufClear));
+ }
+ UIEvent::Input(ref key)
+ if shortcut!(key == shortcuts[Listing::DESCRIPTION]["next_page"]) =>
+ {
+ let mult = if self.cmd_buf.is_empty() {
+ 1
+ } else if let Ok(mult) = self.cmd_buf.parse::<usize>() {
+ self.cmd_buf.clear();
+ self.component.set_modifier_active(false);
+ context
+ .replies
+ .push_back(UIEvent::StatusEvent(StatusEvent::BufClear));
+ mult
+ } else {
+ self.cmd_buf.clear();
+ self.component.set_modifier_active(false);
+ context
+ .replies
+ .push_back(UIEvent::StatusEvent(StatusEvent::BufClear));
+ return true;
+ };
+ self.component.set_movement(PageMovement::PageDown(mult));
return true;
- };
- self.component.set_movement(PageMovement::Down(amount));
- return true;
- }
- UIEvent::Input(ref key)
- if shortcut!(key == shortcuts[Listing::DESCRIPTION]["prev_page"]) =>
- {
- let mult = if self.cmd_buf.is_empty() {
- 1
- } else if let Ok(mult) = self.cmd_buf.parse::<usize>() {
- self.cmd_buf.clear();
- self.component.set_modifier_active(false);
- context
- .replies
- .push_back(UIEvent::StatusEvent(StatusEvent::BufClear));
- mult
- } else {
- self.cmd_buf.clear();
- self.component.set_modifier_active(false);
- context
- .replies
- .push_back(UIEvent::StatusEvent(StatusEvent::BufClear));
+ }
+ UIEvent::Input(ref key) if *key == Key::Home => {
+ self.component.set_movement(PageMovement::Home);
return true;
- };
- self.component.set_movement(PageMovement::PageUp(mult));
- return true;
- }
- UIEvent::Input(ref key)
- if shortcut!(key == shortcuts[Listing::DESCRIPTION]["next_page"]) =>
- {
- let mult = if self.cmd_buf.is_empty() {
- 1
- } else if let Ok(mult) = self.cmd_buf.parse::<usize>() {
- self.cmd_buf.clear();
- self.component.set_modifier_active(false);
+ }
+ UIEvent::Input(ref key) if *key == Key::End => {
+ self.component.set_movement(PageMovement::End);
+ return true;
+ }
+ UIEvent::Input(ref key)
+ if shortcut!(key == shortcuts[Listing::DESCRIPTION]["search"]) =>
+ {
context
.replies
- .push_back(UIEvent::StatusEvent(StatusEvent::BufClear));
- mult
- } else {
- self.cmd_buf.clear();
- self.component.set_modifier_active(false);
+ .push_back(UIEvent::CmdInput(Key::Paste("search ".to_string())));
context
.replies
- .push_back(UIEvent::StatusEvent(StatusEvent::BufClear));
- return true;
- };
- self.component.set_movement(PageMovement::PageDown(mult));
- return true;
- }
- UIEvent::Input(ref key) if *key == Key::Home => {
- self.component.set_movement(PageMovement::Home);
- return true;
- }
- UIEvent::Input(ref key) if *key == Key::End => {
- self.component.set_movement(PageMovement::End);
- return true;
- }
- UIEvent::Input(ref k)
- if shortcut!(
- k == shortcuts[Listing::DESCRIPTION]["toggle_menu_visibility"]
- ) =>
- {
- self.menu_visibility = !self.menu_visibility;
- self.set_dirty(true);
- }
- UIEvent::Input(ref key)
- if shortcut!(key == shortcuts[Listing::DESCRIPTION]["search"]) =>
- {
- context
- .replies
- .push_back(UIEvent::CmdInput(Key::Paste("search ".to_string())));
- context
- .replies
- .push_back(UIEvent::ChangeMode(UIMode::Command));
- return true;
- }
- UIEvent::Input(ref key)
- if shortcut!(key == shortcuts[Listing::DESCRIPTION]["set_seen"]) =>
- {
- let mut event = UIEvent::Action(Action::Listing(ListingAction::SetSeen));
- if self.process_event(&mut event, context) {
+ .push_back(UIEvent::ChangeMode(UIMode::Command));
return true;
}
- }
- UIEvent::Input(ref key)
- if shortcut!(key == shortcuts[Listing::DESCRIPTION]["refresh"]) =>
- {
- let account = &mut context.accounts[self.cursor_pos.0];
- if let Some(&mailbox_hash) = account.mailboxes_order.get(self.cursor_pos.1) {
- if let Err(err) = account.refresh(mailbox_hash) {
- context.replies.push_back(UIEvent::Notification(
- Some("Could not refresh.".to_string()),
- err.to_string(),
- Some(NotificationType::Error(err.kind)),
- ));
+ UIEvent::Input(ref key)
+ if shortcut!(key == shortcuts[Listing::DESCRIPTION]["set_seen"]) =>
+ {
+ let mut event = UIEvent::Action(Action::Listing(ListingAction::SetSeen));
+ if self.process_event(&mut event, context) {
+ return true;
}
}
- return true;
- }
- UIEvent::Input(ref key)
- if !self.component.unfocused()
- && shortcut!(key == shortcuts[Listing::DESCRIPTION]["union_modifier"])
- && self.component.modifier_command().is_some() =>
- {
- self.component.set_modifier_command(Some(Modifier::Union));
- }
- UIEvent::Input(ref key)
- if !self.component.unfocused()
- && shortcut!(key == shortcuts[Listing::DESCRIPTION]["diff_modifier"])
- && self.component.modifier_command().is_some() =>
- {
- self.component
- .set_modifier_command(Some(Modifier::Difference));
- }
- UIEvent::Input(ref key)
- if !self.component.unfocused()
- && shortcut!(
- key == shortcuts[Listing::DESCRIPTION]["intersection_modifier"]
- )
- && self.component.modifier_command().is_some() =>
- {
- self.component
- .set_modifier_command(Some(Modifier::Intersection));
+ UIEvent::Input(ref key)
+ if shortcut!(key == shortcuts[Listing::DESCRIPTION]["refresh"]) =>
+ {
+ let account = &mut context.accounts[self.cursor_pos.0];
+ if let Some(&mailbox_hash) = account.mailboxes_order.get(self.cursor_pos.1)
+ {
+ if let Err(err) = account.refresh(mailbox_hash) {
+ context.replies.push_back(UIEvent::Notification(
+ Some("Could not refresh.".to_string()),
+ err.to_string(),
+ Some(NotificationType::Error(err.kind)),
+ ));
+ }
+ }
+ return true;
+ }
+ UIEvent::Input(ref key)
+ if !self.component.unfocused()
+ && shortcut!(
+ key == shortcuts[Listing::DESCRIPTION]["union_modifier"]
+ )
+ && self.component.modifier_command().is_some() =>
+ {
+ self.component.set_modifier_command(Some(Modifier::Union));
+ }
+ UIEvent::Input(ref key)
+ if !self.component.unfocused()
+ && shortcut!(
+ key == shortcuts[Listing::DESCRIPTION]["diff_modifier"]
+ )
+ && self.component.modifier_command().is_some() =>
+ {
+ self.component
+ .set_modifier_command(Some(Modifier::Difference));
+ }
+ UIEvent::Input(ref key)
+ if !self.component.unfocused()
+ && shortcut!(
+ key == shortcuts[Listing::DESCRIPTION]["intersection_modifier"]
+ )
+ && self.component.modifier_command().is_some() =>
+ {
+ self.component
+ .set_modifier_command(Some(Modifier::Intersection));
+ }
+ _ => {}
}
- _ => {}
}
} else if self.focus == ListingFocus::Menu {
match *event {
@@ -1077,9 +1103,23 @@ impl Component for Listing {
return true;
}
UIEvent::Input(ref k)
+ if shortcut!(k == shortcuts[Listing::DESCRIPTION]["open_mailbox"])
+ && self.menu_cursor_pos.1 == 0 =>
+ {
+ self.status = Some(AccountStatus::new(
+ self.menu_cursor_pos.0,
+ self.theme_default,
+ ));
+ self.focus = ListingFocus::Mailbox;
+ self.ratio = 90;
+ return true;
+ }
+ UIEvent::Input(ref k)
if shortcut!(k == shortcuts[Listing::DESCRIPTION]["open_mailbox"]) =>
{
self.cursor_pos = self.menu_cursor_pos;
+ self.cursor_pos.1 = self.cursor_pos.1.saturating_sub(1);
+ self.status = None;
self.change_account(context);
self.focus = ListingFocus::Mailbox;
self.ratio = 90;
@@ -1118,10 +1158,8 @@ impl Component for Listing {
self.menu_cursor_pos.1 -= 1;
} else if self.menu_cursor_pos.0 > 0 {
self.menu_cursor_pos.0 -= 1;
- self.menu_cursor_pos.1 = self.accounts[self.menu_cursor_pos.0]
- .entries
- .len()
- .saturating_sub(1);
+ self.menu_cursor_pos.1 =
+ self.accounts[self.menu_cursor_pos.0].entries.len();
} else {
return true;
}
@@ -1129,7 +1167,7 @@ impl Component for Listing {
}
} else if shortcut!(k == shortcuts[Listing::DESCRIPTION]["scroll_down"]) {
while amount > 0 {
- if self.menu_cursor_pos.1 + 1
+ if self.menu_cursor_pos.1
< self.accounts[self.menu_cursor_pos.0].entries.len()
{
self.menu_cursor_pos.1 += 1;
@@ -1170,7 +1208,7 @@ impl Component for Listing {
k if shortcut!(k == shortcuts[Listing::DESCRIPTION]["next_mailbox"]) => {
if self.accounts[self.menu_cursor_pos.0]
.entries
- .get(self.menu_cursor_pos.1 + amount)
+ .get(self.menu_cursor_pos.1.saturating_sub(1) + amount)
.is_some()
{
self.menu_cursor_pos.1 += amount;
@@ -1180,10 +1218,10 @@ impl Component for Listing {
}
}
k if shortcut!(k == shortcuts[Listing::DESCRIPTION]["prev_mailbox"]) => {
- if self.cursor_pos.1 >= amount {
+ if self.cursor_pos.1 >= amount + 1 {
if self.accounts[self.menu_cursor_pos.0]
.entries
- .get(self.menu_cursor_pos.1 - amount)
+ .get(self.menu_cursor_pos.1.saturating_sub(1) - amount)
.is_some()
{
self.menu_cursor_pos.1 -= amount;
@@ -1305,11 +1343,20 @@ impl Component for Listing {
false
}
fn is_dirty(&self) -> bool {
- self.dirty || self.component.is_dirty()
+ self.dirty
+ || self
+ .status
+ .as_ref()
+ .map(Component::is_dirty)
+ .unwrap_or_else(|| self.component.is_dirty())
}
fn set_dirty(&mut self, value: bool) {
self.dirty = value;
- self.component.set_dirty(value);
+ if let Some(s) = self.status.as_mut() {
+ s.set_dirty(value);
+ } else {
+ self.component.set_dirty(value);
+ }
}
fn get_shortcuts(&self, context: &Context) -> ShortcutMaps {
@@ -1387,6 +1434,7 @@ impl Listing {
let mut ret = Listing {
component: Offline(OfflineListing::new((account_entries[0].hash, 0))),
accounts: account_entries,
+ status: None,
visible: true,
dirty: true,
cursor_pos: (0, 0),
@@ -1481,7 +1529,11 @@ impl Listing {
}
let account_attrs = if must_highlight_account {
- crate::conf::value(context, "mail.sidebar_highlighted_account_name")
+ if self.focus == ListingFocus::Menu && self.menu_cursor_pos.1 == 0 {
+ crate::conf::value(context, "mail.sidebar_highlighted")
+ } else {
+ crate::conf::value(context, "mail.sidebar_highlighted_account_name")
+ }
} else {
crate::conf::value(context, "mail.sidebar_account_name")
};
@@ -1519,7 +1571,7 @@ impl Listing {
}
let (att, index_att, unread_count_att) = if must_highlight_account {
if (self.focus == ListingFocus::Mailbox && self.cursor_pos.1 == idx)
- || (self.focus == ListingFocus::Menu && self.menu_cursor_pos.1 == idx)
+ || (self.focus == ListingFocus::Menu && self.menu_cursor_pos.1 == idx + 1)
{
let mut ret = (
crate::conf::value(context, "mail.sidebar_highlighted"),
@@ -1724,5 +1776,6 @@ impl Listing {
self.get_status(context),
)));
self.menu_cursor_pos = self.cursor_pos;
+ self.menu_cursor_pos.1 += 1;
}
}
diff --git a/src/components/mail/status.rs b/src/components/mail/status.rs
index 413bab9b..222dca54 100644
--- a/src/components/mail/status.rs
+++ b/src/components/mail/status.rs
@@ -22,299 +22,6 @@
use super::*;
#[derive(Debug)]
-pub struct StatusPanel {
- cursor: (usize, usize),
- account_cursor: usize,
- status: Option<AccountStatus>,
- content: CellBuffer,
- dirty: bool,
- theme_default: ThemeAttribute,
- id: ComponentId,
-}
-
-impl core::fmt::Display for StatusPanel {
- fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
- write!(f, "status")
- }
-}
-
-impl Component for StatusPanel {
- fn draw(&mut self, grid: &mut CellBuffer, area: Area, context: &mut Context) {
- if let Some(ref mut status) = self.status {
- status.draw(grid, area, context);
- return;
- }
- self.draw_accounts(context);
- let (width, height) = self.content.size();
- let (cols, rows) = (width!(area), height!(area));
- self.cursor = (
- std::cmp::min(width.saturating_sub(cols), self.cursor.0),
- std::cmp::min(height.saturating_sub(rows), self.cursor.1),
- );
- clear_area(grid, area, self.theme_default);
- copy_area(
- grid,
- &self.content,
- area,
- (
- (
- std::cmp::min((width - 1).saturating_sub(cols), self.cursor.0),
- std::cmp::min((height - 1).saturating_sub(rows), self.cursor.1),
- ),
- (
- std::cmp::min(self.cursor.0 + cols, width - 1),
- std::cmp::min(self.cursor.1 + rows, height - 1),
- ),
- ),
- );
- context.dirty_areas.push_back(area);
- }
- fn process_event(&mut self, event: &mut UIEvent, context: &mut Context) -> bool {
- if let Some(ref mut status) = self.status {
- if status.process_event(event, context) {
- return true;
- }
- }
-
- match *event {
- UIEvent::Input(Key::Char('k')) if self.status.is_none() => {
- self.account_cursor = self.account_cursor.saturating_sub(1);
- self.dirty = true;
- return true;
- }
- UIEvent::Input(Key::Char('j')) if self.status.is_none() => {
- if self.account_cursor + 1 < context.accounts.len() {
- self.account_cursor += 1;
- self.dirty = true;
- }
- return true;
- }
- UIEvent::Input(Key::Char('\n')) if self.status.is_none() => {
- self.status = Some(AccountStatus::new(self.account_cursor, self.theme_default));
- return true;
- }
- UIEvent::Input(Key::Esc) if self.status.is_some() => {
- self.status = None;
- return true;
- }
- UIEvent::Input(Key::Left) if self.status.is_none() => {
- self.cursor.0 = self.cursor.0.saturating_sub(1);
- self.dirty = true;
- return true;
- }
- UIEvent::Input(Key::Right) if self.status.is_none() => {
- self.cursor.0 = self.cursor.0 + 1;
- self.dirty = true;
- return true;
- }
- UIEvent::Input(Key::Up) if self.status.is_none() => {
- self.cursor.1 = self.cursor.1.saturating_sub(1);
- self.dirty = true;
- return true;
- }
- UIEvent::Input(Key::Down) if self.status.is_none() => {
- self.cursor.1 = self.cursor.1 + 1;
- self.dirty = true;
- return true;
- }
- UIEvent::MailboxUpdate(_)
- | UIEvent::StatusEvent(StatusEvent::NewJob(_))
- | UIEvent::StatusEvent(StatusEvent::JobFinished(_))
- | UIEvent::StatusEvent(StatusEvent::JobCanceled(_)) => {
- self.set_dirty(true);
- }
- _ => {}
- }
-
- false
- }
- fn is_dirty(&self) -> bool {
- self.dirty || self.status.as_ref().map(|s| s.is_dirty()).unwrap_or(false)
- }
- fn set_dirty(&mut self, value: bool) {
- self.dirty = value;
- if let Some(ref mut status) = self.status {
- status.set_dirty(value);
- }
- }
-
- fn id(&self) -> ComponentId {
- self.id
- }
- fn set_id(&mut self, id: ComponentId) {
- self.id = id;
- }
-}
-
-impl StatusPanel {
- pub fn new(theme_default: ThemeAttribute) -> StatusPanel {
- let default_cell = {
- let mut ret = Cell::with_char(' ');
- ret.set_fg(theme_default.fg)
- .set_bg(theme_default.bg)
- .set_attrs(theme_default.attrs);
- ret
- };
- let mut content = CellBuffer::new(120, 40, default_cell);
- content.set_growable(true);
-
- StatusPanel {
- cursor: (0, 0),
- account_cursor: 0,
- content,
- status: None,
- dirty: true,
- theme_default,
- id: ComponentId::new_v4(),
- }
- }
- fn draw_accounts(&mut self, context: &Context) {
- let default_cell = {
- let mut ret = Cell::with_char(' ');
- ret.set_fg(self.theme_default.fg)
- .set_bg(self.theme_default.bg)