using Adw; using Gtk; using Gee; public class TranscriptView : Adw.Bin { public MessageListModel? model { get { return _model; } set { if (_model != null) { _model.disconnect(messages_changed_handler_id); _model.unwatch_updates(); } _model = value; if (value != null) { // Reset scroll position scrolled_window.vadjustment = new Gtk.Adjustment(0, 0, 0, 0, 0, 0); weak TranscriptView self = this; messages_changed_handler_id = value.messages_changed.connect(() => { self.reload_messages(); }); value.load_messages(); value.watch_updates(); } else { transcript_drawing_area.set_messages(new ArrayList()); } } } public string title { get { return title_label.label; } set { title_label.label = value; } } private MessageListModel? _model = null; private Adw.ToolbarView container; private Label title_label = new Label("Messages"); private TranscriptDrawingArea transcript_drawing_area = new TranscriptDrawingArea(); private ScrolledWindow scrolled_window = new ScrolledWindow(); private ulong messages_changed_handler_id = 0; private bool needs_reload = false; public TranscriptView() { container = new Adw.ToolbarView(); set_child(container); scrolled_window.set_child(transcript_drawing_area); scrolled_window.add_css_class("message-list-scroller"); container.set_content(scrolled_window); var header_bar = new Adw.HeaderBar(); header_bar.set_title_widget(title_label); container.add_top_bar(header_bar); Repository.get_instance().attachment_downloaded.connect((attachment_guid) => { debug("Attachment downloaded: %s", attachment_guid); // See if this attachment is part of this transcript. bool contains_attachment = false; foreach (var message in _model.messages) { foreach (var attachment in message.attachments) { if (attachment.guid == attachment_guid) { contains_attachment = true; break; } } } if (contains_attachment && !needs_reload) { debug("Queueing reload of messages for attachment download"); needs_reload = true; GLib.Idle.add(() => { if (needs_reload) { debug("Reloading messages for attachment download"); model.load_messages(); needs_reload = false; } return false; }, GLib.Priority.HIGH); } }); } private void reload_messages() { transcript_drawing_area.show_sender = _model.is_group_chat; transcript_drawing_area.set_messages(_model.messages); } }