aboutsummaryrefslogtreecommitdiff
path: root/main/src
diff options
context:
space:
mode:
authorfiaxh <git@mx.ax.lt>2017-03-18 23:44:05 +0100
committerfiaxh <git@mx.ax.lt>2017-03-18 23:44:05 +0100
commitbe2234835a96601ac7dfffa93bd27a70a02b299e (patch)
treee452bda72de538a209a913f900a059cbdc954b82 /main/src
parent582cc78edd35d7d3a9ab6ddc579919306a2325f5 (diff)
downloaddino-be2234835a96601ac7dfffa93bd27a70a02b299e.tar.gz
dino-be2234835a96601ac7dfffa93bd27a70a02b299e.zip
Preselect next conversation when closed and crossfade
Diffstat (limited to 'main/src')
-rw-r--r--main/src/ui/chat_input.vala2
-rw-r--r--main/src/ui/conversation_selector/conversation_row.vala5
-rw-r--r--main/src/ui/conversation_selector/list.vala58
-rw-r--r--main/src/ui/conversation_summary/conversation_item.vala2
-rw-r--r--main/src/ui/conversation_summary/view.vala3
5 files changed, 46 insertions, 24 deletions
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) {