|
|
|
|
@ -1,5 +1,10 @@
|
|
|
|
|
use gtk::{gio, glib, prelude::*, subclass::prelude::*}; |
|
|
|
|
use matrix_sdk::{events::AnyRoomEvent, identifiers::EventId}; |
|
|
|
|
use matrix_sdk::{ |
|
|
|
|
events::{exports::serde::de::DeserializeOwned, AnyRoomEvent}, |
|
|
|
|
identifiers::EventId, |
|
|
|
|
Raw, |
|
|
|
|
}; |
|
|
|
|
use serde_json::{to_string_pretty as to_json_string_pretty, to_value as to_json_value}; |
|
|
|
|
|
|
|
|
|
use crate::fn_event; |
|
|
|
|
use crate::session::room::{Event, Item, Room}; |
|
|
|
|
@ -251,7 +256,7 @@ impl Timeline {
|
|
|
|
|
|
|
|
|
|
/// Append the new events
|
|
|
|
|
// TODO: This should be lazy, for isperation see: https://blogs.gnome.org/ebassi/documentation/lazy-loading/
|
|
|
|
|
pub fn append(&self, batch: Vec<AnyRoomEvent>) { |
|
|
|
|
pub fn append<T: DeserializeOwned>(&self, batch: Vec<(AnyRoomEvent, Raw<T>)>) { |
|
|
|
|
let priv_ = imp::Timeline::from_instance(self); |
|
|
|
|
|
|
|
|
|
if batch.is_empty() { |
|
|
|
|
@ -269,18 +274,22 @@ impl Timeline {
|
|
|
|
|
|
|
|
|
|
let mut pending_events = priv_.pending_events.borrow_mut(); |
|
|
|
|
|
|
|
|
|
for event in batch.into_iter() { |
|
|
|
|
for (event, raw) in batch.into_iter() { |
|
|
|
|
let event_id = fn_event!(event, event_id).clone(); |
|
|
|
|
let user = self.room().member_by_id(fn_event!(event, sender)); |
|
|
|
|
let source = to_json_value(raw.into_json()) |
|
|
|
|
.and_then(|v| to_json_string_pretty(&v)) |
|
|
|
|
.unwrap(); |
|
|
|
|
|
|
|
|
|
if let Some(pending_id) = pending_events.remove(&event_id) { |
|
|
|
|
if let Some(event_obj) = priv_.event_map.borrow_mut().remove(&pending_id) { |
|
|
|
|
event_obj.set_matrix_event(event); |
|
|
|
|
event_obj.set_source(Some(source)); |
|
|
|
|
priv_.event_map.borrow_mut().insert(event_id, event_obj); |
|
|
|
|
} |
|
|
|
|
added -= 1; |
|
|
|
|
} else { |
|
|
|
|
let event = Event::new(&event, &user); |
|
|
|
|
let event = Event::new(&event, &source, &user); |
|
|
|
|
|
|
|
|
|
priv_.event_map.borrow_mut().insert(event_id, event.clone()); |
|
|
|
|
if event.is_hidden_event() { |
|
|
|
|
@ -307,7 +316,8 @@ impl Timeline {
|
|
|
|
|
let index = list.len(); |
|
|
|
|
|
|
|
|
|
let user = self.room().member_by_id(fn_event!(event, sender)); |
|
|
|
|
let event = Event::new(&event, &user); |
|
|
|
|
let source = to_json_string_pretty(&event).unwrap(); |
|
|
|
|
let event = Event::new(&event, &source, &user); |
|
|
|
|
|
|
|
|
|
if event.is_hidden_event() { |
|
|
|
|
self.add_hidden_event(event); |
|
|
|
|
@ -341,7 +351,7 @@ impl Timeline {
|
|
|
|
|
|
|
|
|
|
/// Prepends a batch of events
|
|
|
|
|
// TODO: This should be lazy, see: https://blogs.gnome.org/ebassi/documentation/lazy-loading/
|
|
|
|
|
pub fn prepend(&self, batch: Vec<AnyRoomEvent>) { |
|
|
|
|
pub fn prepend<T: DeserializeOwned>(&self, batch: Vec<(AnyRoomEvent, Raw<T>)>) { |
|
|
|
|
let priv_ = imp::Timeline::from_instance(self); |
|
|
|
|
let mut added = batch.len(); |
|
|
|
|
|
|
|
|
|
@ -349,10 +359,13 @@ impl Timeline {
|
|
|
|
|
// Extened the size of the list so that rust doesn't need to realocate memory multiple times
|
|
|
|
|
priv_.list.borrow_mut().reserve(added); |
|
|
|
|
|
|
|
|
|
for event in batch { |
|
|
|
|
for (event, raw) in batch { |
|
|
|
|
let user = self.room().member_by_id(fn_event!(event, sender)); |
|
|
|
|
let event_id = fn_event!(event, event_id).clone(); |
|
|
|
|
let event = Event::new(&event, &user); |
|
|
|
|
let source = to_json_value(raw.into_json()) |
|
|
|
|
.and_then(|v| to_json_string_pretty(&v)) |
|
|
|
|
.unwrap(); |
|
|
|
|
let event = Event::new(&event, &source, &user); |
|
|
|
|
|
|
|
|
|
priv_.event_map.borrow_mut().insert(event_id, event.clone()); |
|
|
|
|
|
|
|
|
|
|