[geary/wip/765516-gtk-widget-conversation-viewer: 120/142] Move managing toolbar mesage buttons from convo viewer to controller.
- From: Michael Gratton <mjog src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geary/wip/765516-gtk-widget-conversation-viewer: 120/142] Move managing toolbar mesage buttons from convo viewer to controller.
- Date: Fri, 2 Sep 2016 04:35:42 +0000 (UTC)
commit 28975c70704d4e37c6ad40f6be6d33fdb9fe3930
Author: Michael James Gratton <mike vee net>
Date: Sun Aug 14 12:18:40 2016 +1000
Move managing toolbar mesage buttons from convo viewer to controller.
* src/client/application/geary-controller.vala (GearyController): Update
message button state when updating ConversationViewer state.
(GearyController::on_conversations_selected): Move logic for handling
different numbers of selected conversations from ConversationViewer
here, so that message button state can be updated when the selection
count changes.
* src/client/conversation-viewer/conversation-viewer.vala
(ConversationViewer): Add ::is_composer_visible property, methods for
showing empty/muiple conversations selected UI.
src/client/application/geary-controller.vala | 41 ++++++-
.../conversation-viewer/conversation-viewer.vala | 129 ++++++++++----------
2 files changed, 101 insertions(+), 69 deletions(-)
---
diff --git a/src/client/application/geary-controller.vala b/src/client/application/geary-controller.vala
index 869f413..c0dd4b8 100644
--- a/src/client/application/geary-controller.vala
+++ b/src/client/application/geary-controller.vala
@@ -1323,6 +1323,7 @@ public class GearyController : Geary.BaseObject {
private void on_folder_selected(Geary.Folder? folder) {
debug("Folder %s selected", folder != null ? folder.to_string() : "(null)");
this.main_window.conversation_viewer.show_loading();
+ enable_message_buttons(false);
// If the folder is being unset, clear the message list and exit here.
if (folder == null) {
@@ -1481,6 +1482,7 @@ public class GearyController : Geary.BaseObject {
} else {
this.main_window.conversation_viewer.show_empty_folder();
}
+ enable_message_buttons(false);
}
conversation_count_changed(count);
}
@@ -1529,11 +1531,40 @@ public class GearyController : Geary.BaseObject {
}
private void on_conversations_selected(Gee.Set<Geary.App.Conversation> selected) {
- selected_conversations = selected;
- if (this.current_folder != null) {
- this.main_window.conversation_viewer.load_conversations.begin(
- selected, this.current_folder
- );
+ this.selected_conversations = selected;
+ ConversationViewer viewer = this.main_window.conversation_viewer;
+ if (this.current_folder != null && !viewer.is_composer_visible) {
+ switch(selected.size) {
+ case 0:
+ enable_message_buttons(false);
+ viewer.show_none_selected();
+ break;
+
+ case 1:
+ // Cancel existing avatar loads before loading new
+ // convo since that will start loading more avatars
+ avatar_session.flush_queue();
+ bool is_search = this.current_folder is Geary.SearchFolder;
+ viewer.load_conversation.begin(
+ Geary.Collection.get_first(selected),
+ this.current_folder,
+ (obj, ret) => {
+ try {
+ viewer.load_conversation.end(ret);
+ enable_message_buttons(!is_search);
+ } catch (Error err) {
+ debug("Unable to load conversation: %s",
+ err.message);
+ }
+ }
+ );
+ break;
+
+ default:
+ enable_multiple_message_buttons();
+ viewer.show_multiple_selected();
+ break;
+ }
}
}
diff --git a/src/client/conversation-viewer/conversation-viewer.vala
b/src/client/conversation-viewer/conversation-viewer.vala
index cfc8cc3..1087c6d 100644
--- a/src/client/conversation-viewer/conversation-viewer.vala
+++ b/src/client/conversation-viewer/conversation-viewer.vala
@@ -33,10 +33,20 @@ public class ConversationViewer : Gtk.Stack {
COUNT;
}
+ /**
+ * The current conversation listbox, if any.
+ */
public ConversationListBox? current_list {
get; private set; default = null;
}
+ /**
+ * Specifies if a full-height composer is currently shown.
+ */
+ public bool is_composer_visible {
+ get { return (get_visible_child() == this.composer_page); }
+ }
+
// Stack pages
[GtkChild]
private Gtk.Spinner loading_page;
@@ -183,7 +193,21 @@ public class ConversationViewer : Gtk.Stack {
public void show_loading() {
set_visible_child(this.loading_page);
}
-
+
+ /**
+ * Shows the UI when no conversations have been selected
+ */
+ public void show_none_selected() {
+ set_visible_child(this.no_conversations_page);
+ }
+
+ /**
+ * Shows the UI when multiple conversations have been selected
+ */
+ public void show_multiple_selected() {
+ set_visible_child(this.multiple_conversations_page);
+ }
+
/**
* Shows the empty folder UI.
*/
@@ -199,72 +223,49 @@ public class ConversationViewer : Gtk.Stack {
}
/**
- * Shows one or more conversations in the viewer.
+ * Shows a conversation in the viewer.
*/
- public async void load_conversations(Gee.Set<Geary.App.Conversation> conversations,
- Geary.Folder location) {
- if (get_visible_child() == this.composer_page) {
- // When first showing a composer, the conversation list
- // will be cleared. In that case the composer should
- // remain visible.
- return;
+ public async void load_conversation(Geary.App.Conversation conversation,
+ Geary.Folder location)
+ throws Error {
+ // If the load is taking too long, display the spinner
+ if (this.conversation_timeout_id != 0) {
+ Source.remove(this.conversation_timeout_id);
}
- debug("Conversations selected in %s: %u", location.to_string(), conversations.size);
- if (conversations.size == 0) {
- set_visible_child(this.no_conversations_page);
- GearyApplication.instance.controller.enable_message_buttons(false);
- } else if (conversations.size > 1) {
- set_visible_child(this.multiple_conversations_page);
- GearyApplication.instance.controller.enable_multiple_message_buttons();
- } else {
- // If the load is taking too long, display the spinner
- if (this.conversation_timeout_id != 0) {
- Source.remove(this.conversation_timeout_id);
- }
- this.conversation_timeout_id =
- Timeout.add(SELECT_CONVERSATION_TIMEOUT_MSEC, () => {
- if (this.conversation_timeout_id != 0) {
- debug("Loading timed out\n");
- show_loading();
- }
- this.conversation_timeout_id = 0;
- return false;
- });
-
- Geary.Account account = location.account;
- ConversationListBox new_list = new ConversationListBox(
- Geary.Collection.get_first(conversations),
- account.get_contact_store(),
- new Geary.App.EmailStore(account),
- location.special_folder_type == Geary.SpecialFolderType.DRAFTS,
- conversation_page.get_vadjustment()
- );
-
- // Need to fire this signal early so the the controller
- // can hook in to its signals to catch any emails added
- // during loading.
- this.conversation_added(new_list);
-
- // Cancel existing avatar loads this before loading new
- // convo since that will start loading more avatars
- GearyApplication.instance.controller.avatar_session.flush_queue();
-
- bool loaded = false;
- try {
- yield new_list.load_conversation();
- loaded = true;
- remove_current_list();
- add_new_list(new_list);
+ this.conversation_timeout_id =
+ Timeout.add(SELECT_CONVERSATION_TIMEOUT_MSEC, () => {
+ if (this.conversation_timeout_id != 0) {
+ debug("Loading timed out\n");
+ // XXX should disable message buttons here, so
+ // need to move this timer to the controller.
+ show_loading();
+ }
this.conversation_timeout_id = 0;
- } catch (Error err) {
- debug("Unable to load conversation: %s", err.message);
- }
- set_visible_child(this.conversation_page);
- GearyApplication.instance.controller.enable_message_buttons(true);
-
- if (loaded && location is Geary.SearchFolder) {
- yield new_list.load_search_terms((Geary.SearchFolder) location);
- }
+ return false;
+ });
+
+ Geary.Account account = location.account;
+ ConversationListBox new_list = new ConversationListBox(
+ conversation,
+ account.get_contact_store(),
+ new Geary.App.EmailStore(account),
+ location.special_folder_type == Geary.SpecialFolderType.DRAFTS,
+ conversation_page.get_vadjustment()
+ );
+
+ // Need to fire this signal early so the the controller
+ // can hook in to its signals to catch any emails added
+ // during loading.
+ this.conversation_added(new_list);
+
+ yield new_list.load_conversation();
+
+ remove_current_list();
+ add_new_list(new_list);
+ set_visible_child(this.conversation_page);
+ this.conversation_timeout_id = 0;
+ if (location is Geary.SearchFolder) {
+ yield new_list.load_search_terms((Geary.SearchFolder) location);
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]