[fractal] fractal-gtk: room_history: Allow replacing messages
- From: Daniel Garcia Moreno <danigm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [fractal] fractal-gtk: room_history: Allow replacing messages
- Date: Fri, 3 Jul 2020 06:53:41 +0000 (UTC)
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: >k::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]