diff --git a/src/client/application/application-controller.vala b/src/client/application/application-controller.vala index ec892c5e..28d80331 100644 --- a/src/client/application/application-controller.vala +++ b/src/client/application/application-controller.vala @@ -1283,7 +1283,7 @@ internal class Application.Controller : Geary.BaseObject { } /** Clears new message counts in notification plugin contexts. */ - public void clear_new_messages(Geary.Folder source, + internal void clear_new_messages(Geary.Folder source, Gee.Set visible) { foreach (MainWindow window in this.application.get_main_windows()) { window.folder_list.set_has_new(source, false); @@ -1294,6 +1294,19 @@ internal class Application.Controller : Geary.BaseObject { } } + /** Notifies plugins of new email being displayed. */ + internal void email_loaded(Geary.AccountInformation account, + Geary.Email loaded) { + foreach (NotificationContext plugin in + this.plugins.get_notification_contexts()) { + plugin.email_displayed(account, loaded); + } + foreach (EmailContext plugin in + this.plugins.get_email_contexts()) { + plugin.email_displayed(account, loaded); + } + } + /** Displays a composer on the last active main window. */ internal void show_composer(Composer.Widget composer, Gee.Collection? refers_to, diff --git a/src/client/application/application-email-context.vala b/src/client/application/application-email-context.vala index a79cd5bb..759ff815 100644 --- a/src/client/application/application-email-context.vala +++ b/src/client/application/application-email-context.vala @@ -66,9 +66,18 @@ internal class Application.EmailContext : } } + internal void email_displayed(Geary.AccountInformation account, + Geary.Email email) { + this.email.email_displayed( + this.email_factory.to_plugin_email(email, account) + ); + } + internal void email_sent(Geary.AccountInformation account, Geary.Email email) { - this.email.email_sent(email_factory.to_plugin_email(email, account)); + this.email.email_sent( + this.email_factory.to_plugin_email(email, account) + ); } internal void destroy() { diff --git a/src/client/application/application-main-window.vala b/src/client/application/application-main-window.vala index cafb5e24..d4189970 100644 --- a/src/client/application/application-main-window.vala +++ b/src/client/application/application-main-window.vala @@ -2062,6 +2062,7 @@ public class Application.MainWindow : } private void on_conversation_view_added(ConversationListBox list) { + list.email_loaded.connect(on_email_loaded); list.mark_email.connect(on_email_mark); list.reply_to_all_email.connect(on_email_reply_to_all); list.reply_to_sender_email.connect(on_email_reply_to_sender); @@ -2457,6 +2458,14 @@ public class Application.MainWindow : // Individual conversation email view action callbacks + private void on_email_loaded(ConversationListBox view, + Geary.Email loaded) { + this.controller.email_loaded( + view.conversation.base_folder.account.information, + loaded + ); + } + private void on_email_mark(ConversationListBox view, Gee.Collection messages, Geary.NamedFlag? to_add, diff --git a/src/client/application/application-notification-context.vala b/src/client/application/application-notification-context.vala index c98bc752..1587b049 100644 --- a/src/client/application/application-notification-context.vala +++ b/src/client/application/application-notification-context.vala @@ -206,9 +206,18 @@ internal class Application.NotificationContext : this.email_factory.destroy_email_store(this.email); } + internal void email_displayed(Geary.AccountInformation account, + Geary.Email email) { + this.email.email_displayed( + this.email_factory.to_plugin_email(email, account) + ); + } + internal void email_sent(Geary.AccountInformation account, Geary.Email email) { - this.email.email_sent(email_factory.to_plugin_email(email, account)); + this.email.email_sent( + this.email_factory.to_plugin_email(email, account) + ); } internal void clear_new_messages(Geary.Folder location, diff --git a/src/client/conversation-viewer/conversation-list-box.vala b/src/client/conversation-viewer/conversation-list-box.vala index 2c45425a..15a766ff 100644 --- a/src/client/conversation-viewer/conversation-list-box.vala +++ b/src/client/conversation-viewer/conversation-list-box.vala @@ -296,6 +296,9 @@ public class ConversationListBox : Gtk.ListBox, Geary.BaseInterface { // to appropriate times to try to do that scroll. public signal void should_scroll(); + // Emitted when an email is loaded for the first time + public signal void email_loaded(Geary.Email email); + protected ConversationRow(Geary.Email? email) { base_ref(); @@ -379,6 +382,7 @@ public class ConversationListBox : Gtk.ListBox, Geary.BaseInterface { update_row_expansion(); if (this.view.message_body_state == NOT_STARTED) { yield this.view.load_body(); + email_loaded(this.view.email); } } @@ -613,6 +617,9 @@ public class ConversationListBox : Gtk.ListBox, Geary.BaseInterface { this.mark_read_timer.start(); } + /** Fired when an email is fully loaded in the list box. */ + public signal void email_loaded(Geary.Email email); + /** Fired when the user clicks "reply" in the message menu. */ public signal void reply_to_sender_email(Geary.Email email, string? quote); @@ -1136,6 +1143,7 @@ public class ConversationListBox : Gtk.ListBox, Geary.BaseInterface { }); EmailRow row = new EmailRow(view); + row.email_loaded.connect((e) => { email_loaded(e); }); this.email_rows.set(email.id, row); if (append_row) { diff --git a/src/client/plugin/plugin-email-store.vala b/src/client/plugin/plugin-email-store.vala index b2638857..d36eada8 100644 --- a/src/client/plugin/plugin-email-store.vala +++ b/src/client/plugin/plugin-email-store.vala @@ -15,6 +15,9 @@ public interface Plugin.EmailStore : Geary.BaseObject { + /** Emitted when an email has been displayed in the UI. */ + public signal void email_displayed(Email sent); + /** Emitted when an email has been sent. */ public signal void email_sent(Email sent);