[geary/wip/730682-refine-convo-list: 11/12] Simple, inefficient preview loader implementation.
- From: Michael Gratton <mjog src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geary/wip/730682-refine-convo-list: 11/12] Simple, inefficient preview loader implementation.
- Date: Sun, 15 Oct 2017 10:46:59 +0000 (UTC)
commit 9c41ee7fcf3b807d72ed8f370a66953eb5f6a0b6
Author: Michael James Gratton <mike vee net>
Date: Sun Oct 15 21:03:28 2017 +1030
Simple, inefficient preview loader implementation.
* src/client/conversation-list/preview-loader.vala (PreviewLoader): Very
early implementation of a preview loader class.
* src/client/conversation-list/conversation-list-item.vala
(ConversationListItem): Accept a preview loader as a ctor arg, use it
for loading the preview when updating the UI.
* src/client/conversation-list/conversation-list.vala (ConversationList):
Construct a new preview loader when binding a new model, pass it to the
items when constructed.
po/POTFILES.in | 1 +
src/CMakeLists.txt | 2 +-
.../conversation-list/conversation-list-item.vala | 16 ++++--
.../conversation-list/conversation-list.vala | 9 +++-
src/client/conversation-list/preview-loader.vala | 61 ++++++++++++++++++++
5 files changed, 82 insertions(+), 7 deletions(-)
---
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 8b22157..7a69b65 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -53,6 +53,7 @@ src/client/conversation-list/conversation-list-model.vala
src/client/conversation-list/conversation-list-store.vala
src/client/conversation-list/conversation-list-view.vala
src/client/conversation-list/formatted-conversation-data.vala
+src/client/conversation-list/preview-loader.vala
src/client/conversation-viewer/conversation-email.vala
src/client/conversation-viewer/conversation-list-box.vala
src/client/conversation-viewer/conversation-message.vala
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index ecd5cd6..e0eed3d 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -368,7 +368,7 @@ client/conversation-list/conversation-list-model.vala
client/conversation-list/conversation-list-store.vala
client/conversation-list/conversation-list-view.vala
client/conversation-list/formatted-conversation-data.vala
-
+client/conversation-list/preview-loader.vala
client/conversation-viewer/conversation-email.vala
client/conversation-viewer/conversation-list-box.vala
client/conversation-viewer/conversation-message.vala
diff --git a/src/client/conversation-list/conversation-list-item.vala
b/src/client/conversation-list/conversation-list-item.vala
index 0a6ea0c..af3b1e8 100644
--- a/src/client/conversation-list/conversation-list-item.vala
+++ b/src/client/conversation-list/conversation-list-item.vala
@@ -97,15 +97,18 @@ public class ConversationListItem : Gtk.Grid {
private Geary.App.Conversation conversation;
private Gee.List<Geary.RFC822.MailboxAddress> account_addresses;
private bool use_to;
+ private PreviewLoader preview_loader;
private Configuration config;
public ConversationListItem(Geary.App.Conversation conversation,
Gee.List<Geary.RFC822.MailboxAddress> account_addresses,
bool use_to,
+ PreviewLoader preview_loader,
Configuration config) {
this.conversation = conversation;
this.account_addresses = account_addresses;
this.use_to = use_to;
+ this.preview_loader = preview_loader;
this.config = config;
this.conversation.appended.connect(() => { update(); });
@@ -158,14 +161,17 @@ public class ConversationListItem : Gtk.Grid {
);
}
- string preview_text = "long long long long preview";
if (this.config.display_preview) {
// XXX load & format preview here
- // preview_text = XXXX;
- preview.set_text(preview_text);
- preview.show();
+ this.preview_loader.load.begin(preview_message, (obj, ret) => {
+ string? preview_text = this.preview_loader.load.end(ret);
+ if (preview_text != null) {
+ this.preview.set_text(preview_text);
+ }
+ });
+ this.preview.show();
} else {
- preview.hide();
+ this.preview.hide();
}
// conversation list store sorts by date-received, so
diff --git a/src/client/conversation-list/conversation-list.vala
b/src/client/conversation-list/conversation-list.vala
index c404b97..a5bb3bc 100644
--- a/src/client/conversation-list/conversation-list.vala
+++ b/src/client/conversation-list/conversation-list.vala
@@ -59,19 +59,26 @@ public class ConversationList : Gtk.ListBox {
}
public new void bind_model(Geary.App.ConversationMonitor monitor) {
+ Geary.Folder displayed = monitor.folder;
+ Geary.App.EmailStore store = new Geary.App.EmailStore(displayed.account);
+ PreviewLoader loader = new PreviewLoader(store, new Cancellable()); // XXX
+
monitor.scan_started.connect(on_scan_started);
monitor.scan_completed.connect(on_scan_completed);
+ monitor.scan_completed.connect(() => {
+ loader.load_remote();
+ });
this.model = new ConversationListModel(monitor);
this.model.items_changed.connect(on_model_items_changed);
- Geary.Folder displayed = monitor.folder;
Gee.List<Geary.RFC822.MailboxAddress> account_addresses =
displayed.account.information.get_all_mailboxes();
bool use_to = (displayed != null) && displayed.special_folder_type.is_outgoing();
base.bind_model(this.model, (convo) => {
return new ConversationListItem(convo as Geary.App.Conversation,
account_addresses,
use_to,
+ loader,
this.config);
}
);
diff --git a/src/client/conversation-list/preview-loader.vala
b/src/client/conversation-list/preview-loader.vala
new file mode 100644
index 0000000..29d3445
--- /dev/null
+++ b/src/client/conversation-list/preview-loader.vala
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2017 Michael Gratton <mike vee net>
+ * Copyright 2016 Software Freedom Conservancy Inc.
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+/**
+ * Loads message body previews for conversation list items asynchronously.
+ */
+public class PreviewLoader : Geary.BaseObject {
+
+ // XXX Remove ALL and NONE when PREVIEW has been fixed. See Bug 714317.
+ private const Geary.Email.Field WITH_PREVIEW_FIELDS =
+ Geary.Email.Field.ENVELOPE | Geary.Email.Field.FLAGS |
+ Geary.Email.Field.PROPERTIES | Geary.Email.Field.PREVIEW |
+ Geary.Email.Field.ALL | Geary.Email.Field.NONE;
+
+ private Geary.App.EmailStore email_store;
+ private Cancellable cancellable;
+ private bool loading_local_only = true;
+
+
+ public PreviewLoader(Geary.App.EmailStore email_store, Cancellable cancellable) {
+ this.email_store = email_store;
+ this.cancellable = cancellable;
+ }
+
+ public void load_remote() {
+ this.loading_local_only = false;
+ }
+
+ public async string? load(Geary.Email target) {
+ Gee.Collection<Geary.EmailIdentifier> pending = new Gee.HashSet<Geary.EmailIdentifier>();
+ pending.add(target.id);
+
+ Geary.Folder.ListFlags flags = (this.loading_local_only)
+ ? Geary.Folder.ListFlags.LOCAL_ONLY
+ : Geary.Folder.ListFlags.NONE;
+
+ Gee.Collection<Geary.Email>? emails = null;
+ try {
+ emails = yield email_store.list_email_by_sparse_id_async(
+ pending, ConversationListStore.WITH_PREVIEW_FIELDS, flags, this.cancellable
+ );
+ } catch (Error err) {
+ // Ignore NOT_FOUND, as that's entirely possible when waiting for the remote to open
+ if (!(err is Geary.EngineError.NOT_FOUND))
+ debug("Unable to fetch preview: %s", err.message);
+ }
+
+ Geary.Email? loaded = Geary.Collection.get_first(emails);
+ string? preview = null;
+ if (loaded != null) {
+ preview = Geary.String.reduce_whitespace(loaded.get_preview_as_string());
+ }
+ return preview;
+ }
+
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]