72 lines
2.0 KiB
Vala
72 lines
2.0 KiB
Vala
|
|
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];
|
||
|
|
}
|
||
|
|
}
|