[fractal] room-history: Don't loop when new messages are added
- From: Julian Sparber <jsparber src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [fractal] room-history: Don't loop when new messages are added
- Date: Tue, 11 Oct 2022 12:38:06 +0000 (UTC)
commit b0274eaaf29a791f71e90dbc6132239474a781b1
Author: Kévin Commaille <zecakeh tedomum fr>
Date: Mon Oct 10 14:58:41 2022 +0200
room-history: Don't loop when new messages are added
The scrollbar has not been updated when the `load()` method returns,
so wait until we get notified of the change if new messages are added.
src/session/content/room_history/mod.rs | 17 +----------------
src/session/room/timeline/mod.rs | 16 +++++++++-------
2 files changed, 10 insertions(+), 23 deletions(-)
---
diff --git a/src/session/content/room_history/mod.rs b/src/session/content/room_history/mod.rs
index 665861bed..f75bf518f 100644
--- a/src/session/content/room_history/mod.rs
+++ b/src/session/content/room_history/mod.rs
@@ -842,22 +842,7 @@ impl RoomHistory {
let obj_weak = self.downgrade();
spawn!(async move {
loop {
- // We don't want to hold a strong ref to `obj` on `await`
- let need = if let Some(obj) = obj_weak.upgrade() {
- if obj.room().as_ref() == Some(&room) {
- obj.need_messages() || room.timeline().is_empty()
- } else {
- return;
- }
- } else {
- return;
- };
-
- if need {
- if !room.timeline().load().await {
- break;
- }
- } else {
+ if !room.timeline().load().await {
break;
}
}
diff --git a/src/session/room/timeline/mod.rs b/src/session/room/timeline/mod.rs
index 1bdd5f79f..5c0fff5c4 100644
--- a/src/session/room/timeline/mod.rs
+++ b/src/session/room/timeline/mod.rs
@@ -507,9 +507,9 @@ impl Timeline {
}
}
- /// Load the timeline
- /// This function should also be called to load more events
- /// Returns `true` when messages where successfully added
+ /// Load events at the start of the timeline.
+ ///
+ /// Returns `true` when no messages were added, but more can be loaded.
pub async fn load(&self) -> bool {
let priv_ = self.imp();
@@ -584,8 +584,7 @@ impl Timeline {
}
self.set_state(TimelineState::Ready);
- self.prepend(events);
- true
+ !self.prepend(events)
}
Ok(None) => {
self.remove_loading_spinner();
@@ -784,8 +783,10 @@ impl Timeline {
}
}
- /// Prepends a batch of events
- pub fn prepend(&self, batch: Vec<Event>) {
+ /// Prepends a batch of events.
+ ///
+ /// Returns `true` if new shown events where added to the timeline.
+ pub fn prepend(&self, batch: Vec<Event>) -> bool {
let priv_ = self.imp();
let mut added = batch.len();
@@ -831,6 +832,7 @@ impl Timeline {
}
self.items_changed(0, 0, added as u32);
+ added > 0
}
fn set_room(&self, room: Option<Room>) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]