using GLib; using Gee; public class MessageListModel : Object, ListModel { public signal void messages_changed(); public SortedSet messages { owned get { return _messages.read_only_view; } } private string _conversation_guid; private SortedSet _messages; public MessageListModel(string conversation_guid) { _messages = new TreeSet((a, b) => { // Sort by date in descending order (newest first) return (int)(b.date - a.date); }); Repository.get_instance().messages_updated.connect(got_messages_updated); _conversation_guid = conversation_guid; } public void load_messages() { try { Message[] messages = Repository.get_instance().get_messages(_conversation_guid); // Clear existing set uint old_count = _messages.size; _messages.clear(); // Notify of removal if (old_count > 0) { items_changed(0, old_count, 0); } // Process each conversation uint position = 0; for (int i = 0; i < messages.length; i++) { var message = messages[i]; _messages.add(message); position++; } // Notify of additions if (position > 0) { items_changed(0, 0, position); } } catch (Error e) { warning("Failed to load messages: %s", e.message); } messages_changed(); } private void got_messages_updated(string conversation_guid) { if (conversation_guid == _conversation_guid) { load_messages(); } } // ListModel implementation public Type get_item_type() { return typeof(Message); } public uint get_n_items() { return _messages.size; } public Object? get_item(uint position) { return _messages.to_array()[position]; } }