[geary/mjog/email-plugins: 58/61] Plugin.EmailStore: Add email-displayed signal



commit 8a36587cc06f1b1364aa9e6d07f54911cda8e211
Author: Michael Gratton <mike vee net>
Date:   Mon Mar 23 00:00:58 2020 +1100

    Plugin.EmailStore: Add email-displayed signal
    
    Ensure the signal is emitted whenever an email in the conversation
    viewer is displayed fully (i.e. expanded).

 src/client/application/application-controller.vala        | 15 ++++++++++++++-
 src/client/application/application-email-context.vala     | 11 ++++++++++-
 src/client/application/application-main-window.vala       |  9 +++++++++
 .../application/application-notification-context.vala     | 11 ++++++++++-
 src/client/conversation-viewer/conversation-list-box.vala |  8 ++++++++
 src/client/plugin/plugin-email-store.vala                 |  3 +++
 6 files changed, 54 insertions(+), 3 deletions(-)
---
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<Geary.App.Conversation> 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<Geary.EmailIdentifier>? 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<Geary.EmailIdentifier> 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);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]