aboutsummaryrefslogtreecommitdiff
path: root/main/src/ui/conversation_view_controller.vala
diff options
context:
space:
mode:
authorfiaxh <git@lightrise.org>2020-02-21 02:42:19 +0100
committerfiaxh <git@lightrise.org>2020-02-22 02:58:36 +0100
commit01698959feaa9005c8a5f3439478431ab5837792 (patch)
treed45810014dd30893343e352f354a175aec4a13bf /main/src/ui/conversation_view_controller.vala
parent28c44380ba89e51c5aeac01ca9549633fbeb7e11 (diff)
downloaddino-01698959feaa9005c8a5f3439478431ab5837792.tar.gz
dino-01698959feaa9005c8a5f3439478431ab5837792.zip
Move ConversationTitlebar into ConversationViewController responsibility
Diffstat (limited to 'main/src/ui/conversation_view_controller.vala')
-rw-r--r--main/src/ui/conversation_view_controller.vala109
1 files changed, 89 insertions, 20 deletions
diff --git a/main/src/ui/conversation_view_controller.vala b/main/src/ui/conversation_view_controller.vala
index 1a0b2b07..149a1f76 100644
--- a/main/src/ui/conversation_view_controller.vala
+++ b/main/src/ui/conversation_view_controller.vala
@@ -15,39 +15,74 @@ const TargetEntry[] target_list = {
{ "text/uri-list", 0, Target.URI_LIST }
};
-public class ConversationViewController {
+public class ConversationViewController : Object {
- private ConversationView widget;
+ public new string? conversation_display_name { get; set; }
+ public string? conversation_topic { get; set; }
+
+ private Application app;
+ private ConversationView view;
+ private ConversationTitlebar titlebar;
+ public SearchMenuEntry search_menu_entry = new SearchMenuEntry();
private ChatInputController chat_input_controller;
private StreamInteractor stream_interactor;
private Conversation? conversation;
- public ConversationViewController(ConversationView widget, StreamInteractor stream_interactor) {
- this.widget = widget;
+ public ConversationViewController(ConversationView view, ConversationTitlebar titlebar, StreamInteractor stream_interactor) {
+ this.view = view;
+ this.titlebar = titlebar;
this.stream_interactor = stream_interactor;
+ this.app = GLib.Application.get_default() as Application;
- this.chat_input_controller = new ChatInputController(widget.chat_input, stream_interactor);
+ this.chat_input_controller = new ChatInputController(view.chat_input, stream_interactor);
- widget.conversation_frame.init(stream_interactor);
+ view.conversation_frame.init(stream_interactor);
// drag 'n drop file upload
- Gtk.drag_dest_unset(widget.chat_input.text_input);
- Gtk.drag_dest_set(widget, DestDefaults.ALL, target_list, Gdk.DragAction.COPY);
- widget.drag_data_received.connect(this.on_drag_data_received);
+ Gtk.drag_dest_unset(view.chat_input.text_input);
+ Gtk.drag_dest_set(view, DestDefaults.ALL, target_list, Gdk.DragAction.COPY);
+ view.drag_data_received.connect(this.on_drag_data_received);
// forward key presses
- widget.chat_input.key_press_event.connect(forward_key_press_to_chat_input);
- widget.conversation_frame.key_press_event.connect(forward_key_press_to_chat_input);
+ view.chat_input.key_press_event.connect(forward_key_press_to_chat_input);
+ view.conversation_frame.key_press_event.connect(forward_key_press_to_chat_input);
+ titlebar.key_press_event.connect(forward_key_press_to_chat_input);
// goto-end floating button
- var vadjustment = widget.conversation_frame.scrolled.vadjustment;
+ var vadjustment = view.conversation_frame.scrolled.vadjustment;
vadjustment.notify["value"].connect(() => {
- widget.goto_end_revealer.reveal_child = vadjustment.value < vadjustment.upper - vadjustment.page_size;
+ view.goto_end_revealer.reveal_child = vadjustment.value < vadjustment.upper - vadjustment.page_size;
+ });
+ view.goto_end_button.clicked.connect(() => {
+ view.conversation_frame.initialize_for_conversation(conversation);
+ });
+
+ // Update conversation display name & topic
+ this.bind_property("conversation-display-name", titlebar, "title");
+ this.bind_property("conversation-topic", titlebar, "subtitle");
+ 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_conversation_display_name();
+ }
+ });
+ stream_interactor.get_module(MucManager.IDENTITY).private_room_occupant_updated.connect((account, room, occupant) => {
+ if (conversation != null && conversation.counterpart.equals_bare(room.bare_jid) && conversation.account.equals(account)) {
+ update_conversation_display_name();
+ }
});
- widget.goto_end_button.clicked.connect(() => {
- widget.conversation_frame.initialize_for_conversation(conversation);
+ stream_interactor.get_module(MucManager.IDENTITY).subject_set.connect((account, jid, subject) => {
+ if (conversation != null && conversation.counterpart.equals_bare(jid) && conversation.account.equals(account)) {
+ update_conversation_topic(subject);
+ }
});
+
+ // Register headerbar plugins
+ app.plugin_registry.register_contact_titlebar_entry(new MenuEntry(stream_interactor));
+ app.plugin_registry.register_contact_titlebar_entry(search_menu_entry);
+ app.plugin_registry.register_contact_titlebar_entry(new OccupantsEntry(stream_interactor));
+
+
}
public void select_conversation(Conversation? conversation, bool default_initialize_conversation) {
@@ -55,12 +90,46 @@ public class ConversationViewController {
chat_input_controller.set_conversation(conversation);
+ update_conversation_display_name();
+ update_conversation_topic();
+
+ foreach(var e in this.app.plugin_registry.conversation_titlebar_entries) {
+ Plugins.ConversationTitlebarWidget view = e.get_widget(Plugins.WidgetType.GTK);
+ if (view != null) {
+ view.set_conversation(conversation);
+ }
+ }
+
if (default_initialize_conversation) {
- widget.conversation_frame.initialize_for_conversation(conversation);
+ view.conversation_frame.initialize_for_conversation(conversation);
+ }
+ }
+
+ public void unset_conversation() {
+ conversation_display_name = null;
+ conversation_topic = null;
+ }
+
+ private void update_conversation_display_name() {
+ conversation_display_name = Util.get_conversation_display_name(stream_interactor, conversation);
+ }
+
+ private void update_conversation_topic(string? subtitle = null) {
+ if (subtitle != null) {
+ conversation_topic = Util.summarize_whitespaces_to_space(subtitle);
+ } else if (conversation.type_ == Conversation.Type.GROUPCHAT) {
+ string? subject = stream_interactor.get_module(MucManager.IDENTITY).get_groupchat_subject(conversation.counterpart, conversation.account);
+ if (subject != null) {
+ conversation_topic = Util.summarize_whitespaces_to_space(subject);
+ } else {
+ conversation_topic = null;
+ }
+ } else {
+ conversation_topic = null;
}
}
- public void on_drag_data_received(Widget widget, Gdk.DragContext context, int x, int y, SelectionData selection_data, uint target_type, uint time) {
+ private void on_drag_data_received(Widget widget, Gdk.DragContext context, int x, int y, SelectionData selection_data, uint target_type, uint time) {
if ((selection_data != null) && (selection_data.get_length() >= 0)) {
switch (target_type) {
case Target.URI_LIST:
@@ -78,7 +147,7 @@ public class ConversationViewController {
}
}
- public bool forward_key_press_to_chat_input(EventKey event) {
+ private bool forward_key_press_to_chat_input(EventKey event) {
// Don't forward / change focus on Control / Alt
if (event.keyval == Gdk.Key.Control_L || event.keyval == Gdk.Key.Control_R ||
event.keyval == Gdk.Key.Alt_L || event.keyval == Gdk.Key.Alt_R) {
@@ -88,8 +157,8 @@ public class ConversationViewController {
if ((event.state & ModifierType.CONTROL_MASK) > 0) {
return false;
}
- widget.chat_input.text_input.key_press_event(event);
- widget.chat_input.text_input.grab_focus();
+ view.chat_input.text_input.key_press_event(event);
+ view.chat_input.text_input.grab_focus();
return true;
}
}