gtk: implement get_attachment_fd and texture/attachment cache, viewport loading
This commit is contained in:
@@ -62,44 +62,65 @@ public class MessageListModel : Object, ListModel
|
||||
}
|
||||
}
|
||||
|
||||
public void load_messages() {
|
||||
public void load_messages(bool force_full_reload = false) {
|
||||
var previous_messages = new HashSet<Message>();
|
||||
previous_messages.add_all(_messages);
|
||||
|
||||
try {
|
||||
bool first_load = _messages.size == 0;
|
||||
string last_message_id = (first_load || force_full_reload) ? "" : _messages.get(_messages.size - 1).guid;
|
||||
|
||||
Message[] messages = Repository.get_instance().get_messages(conversation.guid);
|
||||
|
||||
// Clear existing set
|
||||
uint old_count = _messages.size;
|
||||
_messages.clear();
|
||||
participants.clear();
|
||||
|
||||
// Notify of removal
|
||||
if (old_count > 0) {
|
||||
items_changed(0, old_count, 0);
|
||||
Message[] messages = Repository.get_instance().get_messages(conversation.guid, last_message_id);
|
||||
|
||||
bool fallback_full_reload = first_load || force_full_reload;
|
||||
if (!first_load && messages.length > 0 && previous_messages.contains(messages[0])) {
|
||||
fallback_full_reload = true;
|
||||
}
|
||||
|
||||
// Process each conversation
|
||||
uint position = 0;
|
||||
|
||||
for (int i = 0; i < messages.length; i++) {
|
||||
var message = messages[i];
|
||||
participants.add(message.sender);
|
||||
|
||||
if (!first_load && !previous_messages.contains(message)) {
|
||||
// This is a new message according to the UI, schedule an animation for it.
|
||||
message.should_animate = true;
|
||||
if (fallback_full_reload) {
|
||||
uint old_count = _messages.size;
|
||||
_messages.clear();
|
||||
participants.clear();
|
||||
|
||||
if (old_count > 0) {
|
||||
items_changed(0, old_count, 0);
|
||||
}
|
||||
|
||||
_messages.add(message);
|
||||
position++;
|
||||
}
|
||||
|
||||
// Notify of additions
|
||||
if (position > 0) {
|
||||
items_changed(0, 0, position);
|
||||
uint position = 0;
|
||||
for (int i = 0; i < messages.length; i++) {
|
||||
var message = messages[i];
|
||||
participants.add(message.sender);
|
||||
|
||||
if (!first_load && !previous_messages.contains(message)) {
|
||||
message.should_animate = true;
|
||||
}
|
||||
|
||||
_messages.add(message);
|
||||
position++;
|
||||
}
|
||||
|
||||
if (position > 0) {
|
||||
items_changed(0, 0, position);
|
||||
}
|
||||
} else {
|
||||
uint old_count = _messages.size;
|
||||
uint appended = 0;
|
||||
|
||||
for (int i = 0; i < messages.length; i++) {
|
||||
var message = messages[i];
|
||||
if (previous_messages.contains(message)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
participants.add(message.sender);
|
||||
message.should_animate = true;
|
||||
_messages.add(message);
|
||||
appended++;
|
||||
}
|
||||
|
||||
if (appended > 0) {
|
||||
items_changed(old_count, 0, appended);
|
||||
}
|
||||
}
|
||||
} catch (Error e) {
|
||||
warning("Failed to load messages: %s", e.message);
|
||||
@@ -134,4 +155,4 @@ public class MessageListModel : Object, ListModel
|
||||
public Object? get_item(uint position) {
|
||||
return _messages.get((int)position);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user