mail/view: remove unnecessary Clone derives

There's no need to clone MailViews when opening them in new tabs,
just initialize new ones with the same metadata. That saves us the
trouble of implementing Clone for all related types.

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
pull/295/head
Manos Pitsidianakis 2023-09-02 19:36:12 +03:00
parent 1b3bebe304
commit 3344a8dbf6
Signed by: Manos Pitsidianakis
GPG Key ID: 7729C7707F7E09D0
2 changed files with 22 additions and 26 deletions

View File

@ -66,19 +66,6 @@ pub struct MailView {
id: ComponentId,
}
impl Clone for MailView {
fn clone(&self) -> Self {
MailView {
contact_selector: None,
forward_dialog: None,
state: MailViewState::default(),
active_jobs: self.active_jobs.clone(),
main_loop_handler: self.main_loop_handler.clone(),
..*self
}
}
}
impl std::fmt::Display for MailView {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "view mail")
@ -791,9 +778,10 @@ impl Component for MailView {
};
}
UIEvent::Action(Listing(OpenInNewTab)) => {
let new_tab = Self::new(self.coordinates, context);
context
.replies
.push_back(UIEvent::Action(Tab(New(Some(Box::new(self.clone()))))));
.push_back(UIEvent::Action(Tab(New(Some(Box::new(new_tab))))));
return true;
}
_ => {}

View File

@ -26,7 +26,7 @@ use melib::UnixTimestamp;
use super::*;
use crate::components::PageMovement;
#[derive(Debug, Clone)]
#[derive(Debug)]
struct ThreadEntry {
index: (usize, ThreadNodeHash, usize),
/// (indentation, thread_node index, line number in listing)
@ -48,7 +48,7 @@ pub enum ThreadViewFocus {
MailView,
}
#[derive(Debug, Default, Clone)]
#[derive(Debug, Default)]
pub struct ThreadView {
new_cursor_pos: usize,
cursor_pos: usize,
@ -116,7 +116,7 @@ impl ThreadView {
return;
}
let old_entries = self.entries.clone();
let old_entries = std::mem::take(&mut self.entries);
let old_focused_entry = if self.entries.len() > self.cursor_pos {
Some(self.entries.remove(self.cursor_pos))
@ -1024,9 +1024,17 @@ impl Component for ThreadView {
fn process_event(&mut self, event: &mut UIEvent, context: &mut Context) -> bool {
if let UIEvent::Action(Listing(OpenInNewTab)) = event {
/* Handle this before self.mailview does */
let new_tab = Self::new(
self.coordinates,
self.thread_group,
Some(self.entries[self.expanded_pos].msg_hash),
false,
Some(self.focus),
context,
);
context
.replies
.push_back(UIEvent::Action(Tab(New(Some(Box::new(self.clone()))))));
.push_back(UIEvent::Action(Tab(New(Some(Box::new(new_tab))))));
return true;
}
@ -1047,7 +1055,7 @@ impl Component for ThreadView {
{
if self.cursor_pos > 0 {
self.new_cursor_pos = self.new_cursor_pos.saturating_sub(1);
self.dirty = true;
self.set_dirty(true);
}
true
}
@ -1057,7 +1065,7 @@ impl Component for ThreadView {
let height = self.visible_entries.iter().flat_map(|v| v.iter()).count();
if height > 0 && self.new_cursor_pos + 1 < height {
self.new_cursor_pos += 1;
self.dirty = true;
self.set_dirty(true);
}
true
}
@ -1065,24 +1073,24 @@ impl Component for ThreadView {
if shortcut!(key == shortcuts[Shortcuts::THREAD_VIEW]["prev_page"]) =>
{
self.movement = Some(PageMovement::PageUp(1));
self.dirty = true;
self.set_dirty(true);
true
}
UIEvent::Input(ref key)
if shortcut!(key == shortcuts[Shortcuts::THREAD_VIEW]["next_page"]) =>
{
self.movement = Some(PageMovement::PageDown(1));
self.dirty = true;
self.set_dirty(true);
true
}
UIEvent::Input(ref k) if shortcut!(k == shortcuts[Shortcuts::GENERAL]["home_page"]) => {
self.movement = Some(PageMovement::Home);
self.dirty = true;
self.set_dirty(true);
true
}
UIEvent::Input(ref k) if shortcut!(k == shortcuts[Shortcuts::GENERAL]["end_page"]) => {
self.movement = Some(PageMovement::End);
self.dirty = true;
self.set_dirty(true);
true
}
UIEvent::Input(ref k)
@ -1124,7 +1132,7 @@ impl Component for ThreadView {
self.reversed = !self.reversed;
let expanded_hash = self.entries[self.expanded_pos].msg_hash;
self.initiate(Some(expanded_hash), false, context);
self.dirty = true;
self.set_dirty(true);
true
}
UIEvent::Input(ref key)
@ -1156,7 +1164,7 @@ impl Component for ThreadView {
}
self.cursor_pos = self.new_cursor_pos;
self.recalc_visible_entries();
self.dirty = true;
self.set_dirty(true);
true
}
UIEvent::Resize | UIEvent::VisibilityChange(true) => {