Private
Public Access
1
0

initial scaffolding for inverted, custom message list

This commit is contained in:
2025-04-30 15:58:47 -07:00
parent 3e1fa63fdf
commit e976b3db4c
10 changed files with 233 additions and 0 deletions

View File

@@ -0,0 +1,72 @@
using GLib;
using Gee;
public class MessageListModel : Object, ListModel
{
public SortedSet<Message> messages {
owned get { return _messages.read_only_view; }
}
private string _conversation_guid;
private SortedSet<Message> _messages;
public MessageListModel(string conversation_guid) {
_messages = new TreeSet<Message>((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);
}
}
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];
}
}