From be2234835a96601ac7dfffa93bd27a70a02b299e Mon Sep 17 00:00:00 2001 From: fiaxh Date: Sat, 18 Mar 2017 23:44:05 +0100 Subject: [PATCH] Preselect next conversation when closed and crossfade --- main/data/conversation_summary/view.ui | 45 +++++++++----- main/src/ui/chat_input.vala | 2 +- .../conversation_row.vala | 5 ++ main/src/ui/conversation_selector/list.vala | 58 ++++++++++++------- .../conversation_item.vala | 2 - main/src/ui/conversation_summary/view.vala | 3 + 6 files changed, 77 insertions(+), 38 deletions(-) diff --git a/main/data/conversation_summary/view.ui b/main/data/conversation_summary/view.ui index 88905268..d455c888 100644 --- a/main/data/conversation_summary/view.ui +++ b/main/data/conversation_summary/view.ui @@ -6,27 +6,44 @@ False 0 - + + crossfade True - - 15 - vertical + + True - - False + + 15 vertical - 15 - True - - - - - True - True + + + False + vertical + 15 + True + + + + + True + True + + + + main + + + + + True + + + void + diff --git a/main/src/ui/chat_input.vala b/main/src/ui/chat_input.vala index 2079d747..92d0ccc6 100644 --- a/main/src/ui/chat_input.vala +++ b/main/src/ui/chat_input.vala @@ -85,7 +85,7 @@ public class ChatInput : Box { check_convert_smiley(); } if (event.keyval == Key.Return) { - if (event.state == ModifierType.SHIFT_MASK) { + if ((event.state & ModifierType.SHIFT_MASK) > 0) { text_input.buffer.insert_at_cursor("\n", 1); } else if (text_input.buffer.text != ""){ send_text(); diff --git a/main/src/ui/conversation_selector/conversation_row.vala b/main/src/ui/conversation_selector/conversation_row.vala index 0a6b7e70..ef3984c1 100644 --- a/main/src/ui/conversation_selector/conversation_row.vala +++ b/main/src/ui/conversation_selector/conversation_row.vala @@ -11,6 +11,9 @@ namespace Dino.Ui.ConversationSelector { [GtkTemplate (ui = "/org/dino-im/conversation_selector/conversation_row.ui")] public abstract class ConversationRow : ListBoxRow { + public signal void closed(); + public signal void disappeared(); + [GtkChild] protected Image image; [GtkChild] private Label name_label; [GtkChild] private Label time_label; @@ -120,8 +123,10 @@ public abstract class ConversationRow : ListBoxRow { private void on_x_button_clicked() { main_revealer.set_transition_type(RevealerTransitionType.SLIDE_UP); main_revealer.set_reveal_child(false); + closed(); main_revealer.notify["child-revealed"].connect(() => { conversation.active = false; + disappeared(); }); } diff --git a/main/src/ui/conversation_selector/list.vala b/main/src/ui/conversation_selector/list.vala index 804cfad3..071ac504 100644 --- a/main/src/ui/conversation_selector/list.vala +++ b/main/src/ui/conversation_selector/list.vala @@ -32,10 +32,10 @@ public class List : ListBox { Idle.add(() => {add_conversation(conversation); return false;}); }); MessageManager.get_instance(stream_interactor).message_received.connect((message, conversation) => { - Idle.add(() => {message_received(message, conversation); return false;}); + Idle.add(() => {on_message_received(message, conversation); return false;}); }); MessageManager.get_instance(stream_interactor).message_sent.connect((message, conversation) => { - Idle.add(() => {message_received(message, conversation); return false;}); + Idle.add(() => {on_message_received(message, conversation); return false;}); }); PresenceManager.get_instance(stream_interactor).show_received.connect((show, jid, account) => { Idle.add(() => { @@ -93,7 +93,21 @@ public class List : ListBox { invalidate_filter(); } - public void add_conversation(Conversation conversation) { + public void on_conversation_selected(Conversation conversation) { + if (!rows.has_key(conversation)) { + add_conversation(conversation); + } + this.select_row(rows[conversation]); + } + + private void on_message_received(Entities.Message message, Conversation conversation) { + if (rows.has_key(conversation)) { + rows[conversation].message_received(message); + invalidate_sort(); + } + } + + private void add_conversation(Conversation conversation) { ConversationRow row; if (!rows.has_key(conversation)) { if (conversation.type_ == Conversation.Type.GROUPCHAT) { @@ -103,33 +117,35 @@ public class List : ListBox { } rows[conversation] = row; add(row); + row.closed.connect(() => { on_conversation_closed(conversation); }); + row.disappeared.connect(() => { on_conversation_disappeared(conversation); }); row.main_revealer.set_reveal_child(true); - conversation.notify["active"].connect((s, p) => { - if (rows.has_key(conversation) && !conversation.active) { - remove_conversation(conversation); - } - }); } invalidate_sort(); queue_draw(); } - public void remove_conversation(Conversation conversation) { - remove(rows[conversation]); - rows.unset(conversation); - } - - public void on_conversation_selected(Conversation conversation) { - if (!rows.has_key(conversation)) { - add_conversation(conversation); + private void on_conversation_closed(Conversation conversation) { + if (get_selected_row() == rows[conversation]) { + int index = rows[conversation].get_index(); + ListBoxRow? index_p1 = get_row_at_index(index + 1); + if (index_p1 != null) { + select_row(index_p1); + row_activated(index_p1); + } else if (index > 0) { + ListBoxRow? index_m1 = get_row_at_index(index - 1); + if (index_m1 != null) { + select_row(index_m1); + row_activated(index_p1); + } + } } - this.select_row(rows[conversation]); } - private void message_received(Entities.Message message, Conversation conversation) { - if (rows.has_key(conversation)) { - rows[conversation].message_received(message); - invalidate_sort(); + private void on_conversation_disappeared(Conversation conversation) { + if (rows.has_key(conversation) && !conversation.active) { + remove(rows[conversation]); + rows.unset(conversation); } } diff --git a/main/src/ui/conversation_summary/conversation_item.vala b/main/src/ui/conversation_summary/conversation_item.vala index 480ccd48..fa91f78e 100644 --- a/main/src/ui/conversation_summary/conversation_item.vala +++ b/main/src/ui/conversation_summary/conversation_item.vala @@ -22,10 +22,8 @@ public interface ConversationItem : Gtk.Widget { switch (get_message_kind(message)) { case MessageKind.TEXT: return new MergedMessageItem(stream_interactor, conversation, message); - break; case MessageKind.ME_COMMAND: return new SlashMeItem(stream_interactor, conversation, message); - break; } return null; } diff --git a/main/src/ui/conversation_summary/view.vala b/main/src/ui/conversation_summary/view.vala index d884a04a..33b3a836 100644 --- a/main/src/ui/conversation_summary/view.vala +++ b/main/src/ui/conversation_summary/view.vala @@ -15,6 +15,7 @@ public class View : Box { [GtkChild] private ScrolledWindow scrolled; [GtkChild] private Box main; + [GtkChild] private Stack stack; private StreamInteractor stream_interactor; private ConversationItem? last_conversation_item; @@ -56,6 +57,7 @@ public class View : Box { public void initialize_for_conversation(Conversation? conversation) { this.conversation = conversation; + stack.set_visible_child_name("void"); clear(); conversation_items.clear(); was_upper = null; @@ -95,6 +97,7 @@ public class View : Box { } } update_chat_state(); + stack.set_visible_child_name("main"); } private void on_received_state(Account account, Jid jid, string state) {