[geary/wip/713611-conversation-message-delete: 6/10] Wire ConversationMonitor to Account signals now that Conversations aren't.
- From: Michael Gratton <mjog src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geary/wip/713611-conversation-message-delete: 6/10] Wire ConversationMonitor to Account signals now that Conversations aren't.
- Date: Fri, 15 Dec 2017 04:12:22 +0000 (UTC)
commit 00f7daaa799a4af12f366a992b76a288fa0593e6
Author: Michael James Gratton <mike vee net>
Date: Thu Dec 7 14:20:22 2017 +1100
Wire ConversationMonitor to Account signals now that Conversations aren't.
Since Conversation instances no longer listen to Account signals to keep
its email paths updated and to fire email_flags_changed, it needs the
ConversationMonitor to do this for it.
* src/engine/app/app-conversation-monitor.vala (ConversationMonitor):
Listen to the email appended/inserted/removed signals on the monitor's
Account and launch the appropriate operations when triggered.
(ConversationMonitor.remove_emails_async): Require a source folder to
be passed in so we know which folder should be removed from an email's
paths in a conversation.
(ConversationMonitor.notify_email_flags_changed): Also fire the signal
on the target conversation.
* src/engine/app/conversation-monitor/app-remove-operation.vala
(RemoveOperation): Pass a source folder to the operation so it can be
forwarded on to ConversationMonitor.remove_emails_async and used for
both removing an email both from the base folder, but also from other
folders.
src/engine/app/app-conversation-monitor.vala | 198 ++++++++++++--------
.../conversation-monitor/app-remove-operation.vala | 14 +-
2 files changed, 127 insertions(+), 85 deletions(-)
---
diff --git a/src/engine/app/app-conversation-monitor.vala b/src/engine/app/app-conversation-monitor.vala
index 15dff59..87ae4c7 100644
--- a/src/engine/app/app-conversation-monitor.vala
+++ b/src/engine/app/app-conversation-monitor.vala
@@ -221,11 +221,12 @@ public class Geary.App.ConversationMonitor : BaseObject {
Gee.Collection<Geary.Email> emails) {
conversation_trimmed(conversation, emails);
}
-
+
protected virtual void notify_email_flags_changed(Conversation conversation, Geary.Email email) {
+ conversation.email_flags_changed(email);
email_flags_changed(conversation, email);
}
-
+
public int get_conversation_count() {
return conversations.size;
}
@@ -264,27 +265,30 @@ public class Geary.App.ConversationMonitor : BaseObject {
if (reseed_now)
operation_queue.add(new ReseedOperation(this, "already opened"));
operation_queue.add(new FillWindowOperation(this, false));
-
- folder.email_appended.connect(on_folder_email_appended);
- folder.email_inserted.connect(on_folder_email_inserted);
- folder.email_removed.connect(on_folder_email_removed);
- folder.opened.connect(on_folder_opened);
- folder.account.email_flags_changed.connect(on_account_email_flags_changed);
- folder.account.email_locally_complete.connect(on_account_email_locally_complete);
- // TODO: handle removed email
-
+
+ this.folder.email_appended.connect(on_folder_email_appended);
+ this.folder.email_inserted.connect(on_folder_email_inserted);
+ this.folder.email_removed.connect(on_folder_email_removed);
+ this.folder.opened.connect(on_folder_opened);
+ this.folder.account.email_appended.connect(on_account_email_appended);
+ this.folder.account.email_inserted.connect(on_account_email_inserted);
+ this.folder.account.email_removed.connect(on_account_email_removed);
+ this.folder.account.email_flags_changed.connect(on_account_email_flags_changed);
+
try {
yield folder.open_async(open_flags, cancellable);
} catch (Error err) {
is_monitoring = false;
-
- folder.email_appended.disconnect(on_folder_email_appended);
- folder.email_inserted.disconnect(on_folder_email_inserted);
- folder.email_removed.disconnect(on_folder_email_removed);
- folder.opened.disconnect(on_folder_opened);
- folder.account.email_flags_changed.disconnect(on_account_email_flags_changed);
- folder.account.email_locally_complete.disconnect(on_account_email_locally_complete);
-
+
+ this.folder.email_appended.disconnect(on_folder_email_appended);
+ this.folder.email_inserted.disconnect(on_folder_email_inserted);
+ this.folder.email_removed.disconnect(on_folder_email_removed);
+ this.folder.opened.disconnect(on_folder_opened);
+ this.folder.account.email_appended.disconnect(on_account_email_appended);
+ this.folder.account.email_inserted.disconnect(on_account_email_inserted);
+ this.folder.account.email_removed.disconnect(on_account_email_removed);
+ this.folder.account.email_flags_changed.disconnect(on_account_email_flags_changed);
+
throw err;
}
@@ -324,14 +328,16 @@ public class Geary.App.ConversationMonitor : BaseObject {
// set now to prevent reentrancy during yield or signal
is_monitoring = false;
-
- folder.email_appended.disconnect(on_folder_email_appended);
- folder.email_inserted.disconnect(on_folder_email_inserted);
- folder.email_removed.disconnect(on_folder_email_removed);
- folder.opened.disconnect(on_folder_opened);
- folder.account.email_flags_changed.disconnect(on_account_email_flags_changed);
- folder.account.email_locally_complete.disconnect(on_account_email_locally_complete);
-
+
+ this.folder.email_appended.disconnect(on_folder_email_appended);
+ this.folder.email_inserted.disconnect(on_folder_email_inserted);
+ this.folder.email_removed.disconnect(on_folder_email_removed);
+ this.folder.opened.disconnect(on_folder_opened);
+ this.folder.account.email_appended.disconnect(on_account_email_appended);
+ this.folder.account.email_inserted.disconnect(on_account_email_inserted);
+ this.folder.account.email_removed.disconnect(on_account_email_removed);
+ this.folder.account.email_flags_changed.disconnect(on_account_email_flags_changed);
+
bool closing = false;
Error? close_err = null;
try {
@@ -603,58 +609,51 @@ public class Geary.App.ConversationMonitor : BaseObject {
if (job.inside_scan)
notify_scan_completed();
}
-
- private void on_folder_email_appended(Gee.Collection<Geary.EmailIdentifier> appended_ids) {
- operation_queue.add(new AppendOperation(this, appended_ids));
- }
-
- private void on_folder_email_inserted(Gee.Collection<Geary.EmailIdentifier> inserted_ids) {
- operation_queue.add(new FillWindowOperation(this, true));
- }
-
- private void on_folder_email_removed(Gee.Collection<Geary.EmailIdentifier> removed_ids) {
- operation_queue.add(new RemoveOperation(this, removed_ids));
- operation_queue.add(new FillWindowOperation(this, false));
- }
-
- private void on_account_email_locally_complete(Geary.Folder folder,
- Gee.Collection<Geary.EmailIdentifier> complete_ids) {
- operation_queue.add(new ExternalAppendOperation(this, folder, complete_ids));
- }
-
+
internal async void append_emails_async(Gee.Collection<Geary.EmailIdentifier> appended_ids) {
debug("%d message(s) appended to %s, fetching to add to conversations...", appended_ids.size,
folder.to_string());
yield load_by_sparse_id(appended_ids, Geary.Folder.ListFlags.NONE, null);
}
-
- internal async void remove_emails_async(Gee.Collection<Geary.EmailIdentifier> removed_ids) {
+
+ internal async void remove_emails_async(Geary.Folder source_folder,
+ Gee.Collection<Geary.EmailIdentifier> removed_ids) {
debug("%d messages(s) removed from %s, trimming/removing conversations...", removed_ids.size,
- folder.to_string());
-
+ source_folder.to_string());
+
Gee.Collection<Geary.App.Conversation> removed;
Gee.MultiMap<Geary.App.Conversation, Geary.Email> trimmed;
- yield conversations.remove_emails_and_check_in_folder_async(folder. path, removed_ids,
folder.account,
- folder.path, out removed, out trimmed, null);
-
+ yield conversations.remove_emails_and_check_in_folder_async(
+ source_folder.path,
+ removed_ids,
+ this.folder.account,
+ this.folder.path,
+ out removed,
+ out trimmed,
+ null
+ );
+
foreach (Conversation conversation in trimmed.get_keys())
notify_conversation_trimmed(conversation, trimmed.get(conversation));
-
+
if (removed.size > 0)
notify_conversations_removed(removed);
-
- // For any still-existing conversations that we've trimmed messages
- // from, do a search for any messages that should still be there due to
- // full conversations. This way, some removed messages are instead
- // "demoted" to out-of-folder emails. This is kind of inefficient, but
- // it doesn't seem like there's a way around it.
- Gee.HashSet<RFC822.MessageID> search_message_ids = new Gee.HashSet<RFC822.MessageID>();
- foreach (Conversation conversation in trimmed.get_keys())
- search_message_ids.add_all(conversation.get_message_ids());
- yield expand_conversations_async(search_message_ids, new ProcessJobContext(false));
+
+ if (source_folder == this.folder) {
+ // For any still-existing conversations that we've trimmed messages
+ // from, do a search for any messages that should still be there due to
+ // full conversations. This way, some removed messages are instead
+ // "demoted" to out-of-folder emails. This is kind of inefficient, but
+ // it doesn't seem like there's a way around it.
+ Gee.HashSet<RFC822.MessageID> search_message_ids = new Gee.HashSet<RFC822.MessageID>();
+ foreach (Conversation conversation in trimmed.get_keys()) {
+ search_message_ids.add_all(conversation.get_message_ids());
+ }
+ yield expand_conversations_async(search_message_ids, new ProcessJobContext(false));
+ }
}
-
+
internal async void external_append_emails_async(Geary.Folder folder,
Gee.Collection<Geary.EmailIdentifier> appended_ids) {
if (get_search_blacklist().contains(folder.path))
@@ -669,22 +668,6 @@ public class Geary.App.ConversationMonitor : BaseObject {
yield external_load_by_sparse_id(folder, appended_ids, Geary.Folder.ListFlags.NONE, null);
}
- private void on_account_email_flags_changed(Geary.Folder folder,
- Gee.Map<Geary.EmailIdentifier, Geary.EmailFlags> map) {
- foreach (Geary.EmailIdentifier id in map.keys) {
- Conversation? conversation = conversations.get_by_email_identifier(id);
- if (conversation == null)
- continue;
-
- Email? email = conversation.get_email_by_id(id);
- if (email == null)
- continue;
-
- email.set_flags(map.get(id));
- notify_email_flags_changed(conversation, email);
- }
- }
-
private async Geary.EmailIdentifier? get_lowest_email_id_async(Cancellable? cancellable) {
Geary.EmailIdentifier? earliest_id = null;
try {
@@ -785,4 +768,57 @@ public class Geary.App.ConversationMonitor : BaseObject {
if (conversations.get_email_count() != initial_message_count)
operation_queue.add(new FillWindowOperation(this, is_insert));
}
+
+ private void on_folder_email_appended(Gee.Collection<EmailIdentifier> appended_ids) {
+ operation_queue.add(new AppendOperation(this, appended_ids));
+ }
+
+ private void on_folder_email_inserted(Gee.Collection<EmailIdentifier> inserted_ids) {
+ operation_queue.add(new FillWindowOperation(this, true));
+ }
+
+ private void on_folder_email_removed(Gee.Collection<EmailIdentifier> removed_ids) {
+ operation_queue.add(new RemoveOperation(this, this.folder, removed_ids));
+ operation_queue.add(new FillWindowOperation(this, false));
+ }
+
+ private void on_account_email_appended(Folder folder,
+ Gee.Collection<EmailIdentifier> added) {
+ if (folder != this.folder) {
+ operation_queue.add(
+ new ExternalAppendOperation(this, folder, added)
+ );
+ }
+ }
+
+ private void on_account_email_inserted(Folder folder,
+ Gee.Collection<EmailIdentifier> added) {
+ if (folder != this.folder) {
+ operation_queue.add(new FillWindowOperation(this, false));
+ }
+ }
+
+ private void on_account_email_removed(Folder folder,
+ Gee.Collection<EmailIdentifier> removed) {
+ if (folder != this.folder) {
+ operation_queue.add(new RemoveOperation(this, folder, removed));
+ }
+ }
+
+ private void on_account_email_flags_changed(Geary.Folder folder,
+ Gee.Map<EmailIdentifier,EmailFlags> map) {
+ foreach (EmailIdentifier id in map.keys) {
+ Conversation? conversation = this.conversations.get_by_email_identifier(id);
+ if (conversation == null)
+ continue;
+
+ Email? email = conversation.get_email_by_id(id);
+ if (email == null)
+ continue;
+
+ email.set_flags(map.get(id));
+ notify_email_flags_changed(conversation, email);
+ }
+ }
+
}
diff --git a/src/engine/app/conversation-monitor/app-remove-operation.vala
b/src/engine/app/conversation-monitor/app-remove-operation.vala
index 4b4ce57..fe53beb 100644
--- a/src/engine/app/conversation-monitor/app-remove-operation.vala
+++ b/src/engine/app/conversation-monitor/app-remove-operation.vala
@@ -5,14 +5,20 @@
*/
private class Geary.App.RemoveOperation : ConversationOperation {
+
+ private Geary.Folder source_folder;
private Gee.Collection<Geary.EmailIdentifier> removed_ids;
-
- public RemoveOperation(ConversationMonitor monitor, Gee.Collection<Geary.EmailIdentifier> removed_ids) {
+
+ public RemoveOperation(ConversationMonitor monitor,
+ Geary.Folder source_folder,
+ Gee.Collection<Geary.EmailIdentifier> removed_ids) {
base(monitor);
+ this.source_folder = source_folder;
this.removed_ids = removed_ids;
}
-
+
public override async void execute_async() {
- yield monitor.remove_emails_async(removed_ids);
+ yield monitor.remove_emails_async(this.source_folder, this.removed_ids);
}
+
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]