diff options
Diffstat (limited to 'main/src/ui/conversation_view_controller.vala')
-rw-r--r-- | main/src/ui/conversation_view_controller.vala | 109 |
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; } } |