From 3af9faac82dc19d5d9059d190cc17ce7186e4a10 Mon Sep 17 00:00:00 2001 From: fiaxh Date: Sun, 4 Nov 2018 20:19:34 +0100 Subject: [PATCH] Use ContentItems in ConversationSelector, Chat/Groupchat(Pm)Row -> ConversationRow --- libdino/src/service/content_item_store.vala | 10 +- main/CMakeLists.txt | 3 - .../conversation_selector/conversation_row.ui | 1 + .../ui/conversation_selector/chat_row.vala | 54 -------- .../conversation_row.vala | 117 ++++++++++++++++-- .../groupchat_pm_row.vala | 43 ------- .../conversation_selector/groupchat_row.vala | 32 ----- main/src/ui/conversation_selector/list.vala | 11 +- .../content_populator.vala | 2 +- 9 files changed, 119 insertions(+), 154 deletions(-) delete mode 100644 main/src/ui/conversation_selector/chat_row.vala delete mode 100644 main/src/ui/conversation_selector/groupchat_pm_row.vala delete mode 100644 main/src/ui/conversation_selector/groupchat_row.vala diff --git a/libdino/src/service/content_item_store.vala b/libdino/src/service/content_item_store.vala index 0b89e288..1886236c 100644 --- a/libdino/src/service/content_item_store.vala +++ b/libdino/src/service/content_item_store.vala @@ -82,7 +82,15 @@ public class ContentItemStore : StreamInteractionModule, Object { return item.size > 0 ? item[0] : null; } - public Gee.List get_latest(Conversation conversation, int count) { + public ContentItem? get_latest(Conversation conversation) { + Gee.List items = get_n_latest(conversation, 1); + if (items.size > 0) { + return items.get(0); + } + return null; + } + + public Gee.List get_n_latest(Conversation conversation, int count) { QueryBuilder select = db.content_item.select() .with(db.content_item.conversation_id, "=", conversation.id) .with(db.content_item.hide, "=", false) diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index e6cecb94..2f1e082b 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -97,10 +97,7 @@ SOURCES src/ui/contact_details/muc_config_form_provider.vala src/ui/conversation_list_titlebar.vala src/ui/global_search.vala - src/ui/conversation_selector/chat_row.vala src/ui/conversation_selector/conversation_row.vala - src/ui/conversation_selector/groupchat_pm_row.vala - src/ui/conversation_selector/groupchat_row.vala src/ui/conversation_selector/list.vala src/ui/conversation_selector/view.vala src/ui/conversation_summary/chat_state_populator.vala diff --git a/main/data/conversation_selector/conversation_row.ui b/main/data/conversation_selector/conversation_row.ui index 3e178c4f..86ca1ba6 100644 --- a/main/data/conversation_selector/conversation_row.ui +++ b/main/data/conversation_selector/conversation_row.ui @@ -80,6 +80,7 @@ + True 1 end True diff --git a/main/src/ui/conversation_selector/chat_row.vala b/main/src/ui/conversation_selector/chat_row.vala deleted file mode 100644 index fb427413..00000000 --- a/main/src/ui/conversation_selector/chat_row.vala +++ /dev/null @@ -1,54 +0,0 @@ -using Gdk; -using Gee; -using Gtk; - -using Dino.Entities; -using Xmpp; - -namespace Dino.Ui.ConversationSelector { - -public class ChatRow : ConversationRow { - - public ChatRow(StreamInteractor stream_interactor, Conversation conversation) { - base(stream_interactor, conversation); - has_tooltip = true; - query_tooltip.connect ((x, y, keyboard_tooltip, tooltip) => { - tooltip.set_custom(generate_tooltip()); - return true; - }); - stream_interactor.get_module(RosterManager.IDENTITY).updated_roster_item.connect((account, jid, roster_item) => { - if (conversation.account.equals(account) && conversation.counterpart.equals(jid)) { - update_name_label(); - } - }); - } - - protected override void update_message_label() { - base.update_message_label(); - if (last_message != null && last_message.direction == Message.DIRECTION_SENT) { - nick_label.visible = true; - nick_label.label = _("Me") + ": "; - } else { - nick_label.label = ""; - } - } - - private Widget generate_tooltip() { - Builder builder = new Builder.from_resource("/im/dino/Dino/conversation_selector/chat_row_tooltip.ui"); - Box main_box = builder.get_object("main_box") as Box; - Box inner_box = builder.get_object("inner_box") as Box; - Label jid_label = builder.get_object("jid_label") as Label; - - jid_label.label = conversation.counterpart.to_string(); - - Gee.List? full_jids = stream_interactor.get_module(PresenceManager.IDENTITY).get_full_jids(conversation.counterpart, conversation.account); - if (full_jids != null) { - for (int i = 0; i < full_jids.size; i++) { - inner_box.add(get_fulljid_box(full_jids[i])); - } - } - return main_box; - } -} - -} diff --git a/main/src/ui/conversation_selector/conversation_row.vala b/main/src/ui/conversation_selector/conversation_row.vala index ea0aeeb4..8157fde8 100644 --- a/main/src/ui/conversation_selector/conversation_row.vala +++ b/main/src/ui/conversation_selector/conversation_row.vala @@ -3,13 +3,14 @@ using Gdk; using Gtk; using Pango; +using Dino; using Dino.Entities; using Xmpp; namespace Dino.Ui.ConversationSelector { [GtkTemplate (ui = "/im/dino/Dino/conversation_selector/conversation_row.ui")] -public abstract class ConversationRow : ListBoxRow { +public class ConversationRow : ListBoxRow { public signal void closed(); @@ -27,7 +28,7 @@ public abstract class ConversationRow : ListBoxRow { protected const int AVATAR_SIZE = 40; - protected Message? last_message; + protected ContentItem? last_content_item; protected bool read = true; @@ -41,21 +42,66 @@ public abstract class ConversationRow : ListBoxRow { this.conversation = conversation; this.stream_interactor = stream_interactor; + switch (conversation.type_) { + case Conversation.Type.CHAT: + stream_interactor.get_module(RosterManager.IDENTITY).updated_roster_item.connect((account, jid, roster_item) => { + if (conversation.account.equals(account) && conversation.counterpart.equals(jid)) { + update_name_label(); + } + }); + break; + case Conversation.Type.GROUPCHAT: + closed.connect(() => { + stream_interactor.get_module(MucManager.IDENTITY).part(conversation.account, conversation.counterpart); + }); + stream_interactor.get_module(MucManager.IDENTITY).room_name_set.connect((account, jid, room_name) => { + if (conversation != null && conversation.counterpart.equals_bare(jid) && conversation.account.equals(account)) { + update_name_label(); + } + }); + break; + case Conversation.Type.GROUPCHAT_PM: + break; + } + + // Set tooltip + switch (conversation.type_) { + case Conversation.Type.CHAT: + has_tooltip = true; + query_tooltip.connect ((x, y, keyboard_tooltip, tooltip) => { + tooltip.set_custom(generate_tooltip()); + return true; + }); + break; + case Conversation.Type.GROUPCHAT: + has_tooltip = true; + set_tooltip_text(conversation.counterpart.bare_jid.to_string()); + break; + case Conversation.Type.GROUPCHAT_PM: + break; + } + + stream_interactor.get_module(ContentItemStore.IDENTITY).new_item.connect((item, c) => { + if (conversation.equals(c)) { + content_item_received(item); + } + }); + last_content_item = stream_interactor.get_module(ContentItemStore.IDENTITY).get_latest(conversation); + x_button.clicked.connect(close_conversation); image.set_jid(stream_interactor, conversation.counterpart, conversation.account); conversation.notify["read-up-to"].connect(update_read); update_name_label(); - message_received(); - + content_item_received(); } public void update() { update_time_label(); } - public void message_received(Entities.Message? m = null) { - last_message = stream_interactor.get_module(MessageStorage.IDENTITY).get_last_message(conversation) ?? m; + public void content_item_received(ContentItem? ci = null) { + last_content_item = stream_interactor.get_module(ContentItemStore.IDENTITY).get_latest(conversation) ?? ci; update_message_label(); update_time_label(); update_read(); @@ -66,20 +112,52 @@ public abstract class ConversationRow : ListBoxRow { } protected void update_time_label(DateTime? new_time = null) { - if (last_message != null) { + if (last_content_item != null) { time_label.visible = true; - time_label.label = get_relative_time(last_message.time.to_local()); + time_label.label = get_relative_time(last_content_item.display_time.to_local()); } } - protected virtual void update_message_label() { - if (last_message != null) { + protected void update_message_label() { + if (last_content_item != null) { + switch (last_content_item.type_) { + case MessageItem.TYPE: + MessageItem message_item = last_content_item as MessageItem; + Message last_message = message_item.message; + + if (conversation.type_ == Conversation.Type.GROUPCHAT) { + nick_label.label = Util.get_message_display_name(stream_interactor, last_message, conversation.account) + ": "; + } else { + nick_label.label = last_message.direction == Message.DIRECTION_SENT ? _("Me") + ": " : ""; + } + + message_label.label = Markup.escape_text((new Regex("\\s+")).replace_literal(last_message.body, -1, 0, " ")); + break; + case FileItem.TYPE: + FileItem file_item = last_content_item as FileItem; + FileTransfer transfer = file_item.file_transfer; + + if (conversation.type_ != Conversation.Type.GROUPCHAT) { + nick_label.label = transfer.direction == Message.DIRECTION_SENT ? _("Me") + ": " : ""; + } + + if (transfer.direction == Message.DIRECTION_SENT) { + message_label.label = "" + (transfer.mime_type.has_prefix("image") ? _("Image sent") : _("File sent") ) + ""; + } else { + message_label.label = "" +(transfer.mime_type.has_prefix("image") ? _("Image received") : _("File received") ) + ""; + } + break; + } + nick_label.visible = true; message_label.visible = true; - message_label.label = (new Regex("\\s+")).replace_literal(last_message.body, -1, 0, " "); } } protected void update_read() { + MessageItem? message_item = last_content_item as MessageItem; + if (message_item == null) return; + Message last_message = message_item.message; + bool read_was = read; read = last_message == null || (conversation.read_up_to != null && last_message.equals(conversation.read_up_to)); if (read == read_was) return; @@ -143,6 +221,23 @@ public abstract class ConversationRow : ListBoxRow { } } + private Widget generate_tooltip() { + Builder builder = new Builder.from_resource("/im/dino/Dino/conversation_selector/chat_row_tooltip.ui"); + Box main_box = builder.get_object("main_box") as Box; + Box inner_box = builder.get_object("inner_box") as Box; + Label jid_label = builder.get_object("jid_label") as Label; + + jid_label.label = conversation.counterpart.to_string(); + + Gee.List? full_jids = stream_interactor.get_module(PresenceManager.IDENTITY).get_full_jids(conversation.counterpart, conversation.account); + if (full_jids != null) { + for (int i = 0; i < full_jids.size; i++) { + inner_box.add(get_fulljid_box(full_jids[i])); + } + } + return main_box; + } + private static string get_relative_time(DateTime datetime) { DateTime now = new DateTime.now_utc(); TimeSpan timespan = now.difference(datetime); diff --git a/main/src/ui/conversation_selector/groupchat_pm_row.vala b/main/src/ui/conversation_selector/groupchat_pm_row.vala deleted file mode 100644 index 795bdcb6..00000000 --- a/main/src/ui/conversation_selector/groupchat_pm_row.vala +++ /dev/null @@ -1,43 +0,0 @@ -using Gdk; -using Gee; -using Gtk; - -using Dino.Entities; - -namespace Dino.Ui.ConversationSelector { - -public class GroupchatPmRow : ConversationRow { - - public GroupchatPmRow(StreamInteractor stream_interactor, Conversation conversation) { - base(stream_interactor, conversation); - has_tooltip = true; - query_tooltip.connect ((x, y, keyboard_tooltip, tooltip) => { - tooltip.set_custom(generate_tooltip()); - return true; - }); - } - - protected override void update_message_label() { - base.update_message_label(); - if (last_message != null && last_message.direction == Message.DIRECTION_SENT) { - nick_label.visible = true; - nick_label.label = _("Me") + ": "; - } else { - nick_label.label = ""; - } - } - - private Widget generate_tooltip() { - Builder builder = new Builder.from_resource("/im/dino/Dino/conversation_selector/chat_row_tooltip.ui"); - Box main_box = builder.get_object("main_box") as Box; - Box inner_box = builder.get_object("inner_box") as Box; - Label jid_label = builder.get_object("jid_label") as Label; - jid_label.label = conversation.counterpart.to_string(); - if (stream_interactor.get_module(MucManager.IDENTITY).is_joined(conversation.counterpart, conversation.account)) { - inner_box.add(get_fulljid_box(conversation.counterpart)); - } - return main_box; - } -} - -} diff --git a/main/src/ui/conversation_selector/groupchat_row.vala b/main/src/ui/conversation_selector/groupchat_row.vala deleted file mode 100644 index 70b24dfd..00000000 --- a/main/src/ui/conversation_selector/groupchat_row.vala +++ /dev/null @@ -1,32 +0,0 @@ -using Dino.Entities; - -namespace Dino.Ui.ConversationSelector { - -public class GroupchatRow : ConversationRow { - - public GroupchatRow(StreamInteractor stream_interactor, Conversation conversation) { - base(stream_interactor, conversation); - has_tooltip = true; - set_tooltip_text(conversation.counterpart.bare_jid.to_string()); - - closed.connect(() => { - stream_interactor.get_module(MucManager.IDENTITY).part(conversation.account, conversation.counterpart); - }); - - stream_interactor.get_module(MucManager.IDENTITY).room_name_set.connect((account, jid, room_name) => { - if (conversation != null && conversation.counterpart.equals_bare(jid) && conversation.account.equals(account)) { - update_name_label(); - } - }); - } - - protected override void update_message_label() { - base.update_message_label(); - if (last_message != null) { - nick_label.visible = true; - nick_label.label = Util.get_message_display_name(stream_interactor, last_message, conversation.account) + ": "; - } - } -} - -} diff --git a/main/src/ui/conversation_selector/list.vala b/main/src/ui/conversation_selector/list.vala index e250c4cd..8d71419b 100644 --- a/main/src/ui/conversation_selector/list.vala +++ b/main/src/ui/conversation_selector/list.vala @@ -67,7 +67,6 @@ public class List : ListBox { private void on_message_received(Entities.Message message, Conversation conversation) { if (rows.has_key(conversation)) { - rows[conversation].message_received(message); invalidate_sort(); } } @@ -75,19 +74,13 @@ public class List : ListBox { private void add_conversation(Conversation conversation) { ConversationRow row; if (!rows.has_key(conversation)) { - if (conversation.type_ == Conversation.Type.GROUPCHAT) { - row = new GroupchatRow(stream_interactor, conversation); - } else if (conversation.type_ == Conversation.Type.GROUPCHAT_PM){ - row = new GroupchatPmRow(stream_interactor, conversation); - } else { - row = new ChatRow(stream_interactor, conversation); - } + row = new ConversationRow(stream_interactor, conversation); rows[conversation] = row; add(row); row.closed.connect(() => { select_next_conversation(conversation); }); row.main_revealer.set_reveal_child(true); } - //invalidate_sort(); + invalidate_sort(); } private void select_next_conversation(Conversation conversation) { diff --git a/main/src/ui/conversation_summary/content_populator.vala b/main/src/ui/conversation_summary/content_populator.vala index c19d0d26..754446d3 100644 --- a/main/src/ui/conversation_summary/content_populator.vala +++ b/main/src/ui/conversation_summary/content_populator.vala @@ -35,7 +35,7 @@ public class ContentProvider : ContentItemCollection, Object { public Gee.List populate_latest(Conversation conversation, int n) { - Gee.List items = stream_interactor.get_module(ContentItemStore.IDENTITY).get_latest(conversation, n); + Gee.List items = stream_interactor.get_module(ContentItemStore.IDENTITY).get_n_latest(conversation, n); Gee.List ret = new ArrayList(); foreach (ContentItem item in items) { ret.add(new ContentMetaItem(item, widget_factory));