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(); } 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; 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); } private void reload_messages() { transcript_drawing_area.show_sender = _model.is_group_chat; transcript_drawing_area.set_messages(_model.messages); } }