[fractal] fractal-gtk: room_history: Allow replacing messages



commit 20bf9ee48be6e65bd310e8d31a4213b35d44488e
Author: Juraj Fiala <jurf riseup net>
Date:   Mon Jun 29 20:13:14 2020 +0200

    fractal-gtk: room_history: Allow replacing messages

 fractal-gtk/src/widgets/room_history.rs | 47 +++++++++++++++++++++++++++++++--
 1 file changed, 45 insertions(+), 2 deletions(-)
---
diff --git a/fractal-gtk/src/widgets/room_history.rs b/fractal-gtk/src/widgets/room_history.rs
index c469095b..5c10d253 100644
--- a/fractal-gtk/src/widgets/room_history.rs
+++ b/fractal-gtk/src/widgets/room_history.rs
@@ -31,8 +31,8 @@ use gtk::prelude::*;
 
 struct List {
     /* With the exception of temporary widgets, only modify the fields list and listbox
-    through the methods add_top(), add_bottom(), and remove_item() to maintain the
-    1-1 correspondence between them. */
+    through the methods add_top(), add_bottom(), remove_item() and replace_item() to
+    maintain the 1-1 correspondence between them. */
     list: VecDeque<Element>,
     new_divider_index: Option<usize>,
     playing_videos: Vec<(Rc<VideoPlayerWidget>, SignalHandlerId)>,
@@ -76,6 +76,14 @@ impl List {
         self.listbox.remove(row);
     }
 
+    fn replace_item(&mut self, index: usize, row: &gtk::ListBoxRow, element: Element) {
+        /* Spinner is at position 0, so increment index by 1 */
+        self.listbox
+            .insert(element.get_listbox_row(), (self.list.len() - index) as i32);
+        self.listbox.remove(row);
+        self.list[index] = element;
+    }
+
     fn create_new_message_divider(rows: Rc<RefCell<Self>>) -> widgets::NewMessageDivider {
         let rows_weak = Rc::downgrade(&rows);
         let remove_divider = move || {
@@ -569,6 +577,41 @@ impl RoomHistory {
         None
     }
 
+    pub fn replace_message(
+        &mut self,
+        thread_pool: ThreadPool,
+        user_info_cache: Arc<Mutex<CacheMap<UserId, (String, String)>>>,
+        mut item: MessageContent,
+    ) -> Option<()> {
+        let mut rows = self.rows.borrow_mut();
+
+        let (i, ref mut msg) = rows
+            .list
+            .iter_mut()
+            .enumerate()
+            .find_map(|(i, e)| match e {
+                Element::Message(ref mut itermessage)
+                    if itermessage.id == item.msg.replace
+                        || itermessage.msg.replace == item.msg.replace =>
+                {
+                    Some((i, itermessage))
+                }
+                _ => None,
+            })?;
+        let msg_widget = msg.widget.clone()?;
+
+        item.widget = Some(create_row(
+            thread_pool,
+            user_info_cache,
+            item.clone(),
+            msg_widget.header,
+            self.server_url.clone(),
+            &self.rows,
+        ));
+        rows.replace_item(i, msg_widget.get_listbox_row(), Element::Message(item));
+        None
+    }
+
     pub fn remove_message(
         &mut self,
         thread_pool: ThreadPool,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]