[fractal] room-history: Fix reaction chooser in context menu



commit 84ac10882273be45b07d955040116a3acd1a394c
Author: Kévin Commaille <zecakeh tedomum fr>
Date:   Sat Apr 23 11:12:29 2022 +0200

    room-history: Fix reaction chooser in context menu

 src/components/reaction_chooser.rs           | 24 +++++++++++++--
 src/session/content/room_history/item_row.rs | 44 +++++++++++++++-------------
 src/session/content/room_history/mod.rs      |  7 ++++-
 3 files changed, 52 insertions(+), 23 deletions(-)
---
diff --git a/src/components/reaction_chooser.rs b/src/components/reaction_chooser.rs
index 4a2791764..0f439debd 100644
--- a/src/components/reaction_chooser.rs
+++ b/src/components/reaction_chooser.rs
@@ -133,8 +133,20 @@ impl ReactionChooser {
             if let Some(signal_handler) = priv_.reactions_handler.take() {
                 reactions.disconnect(signal_handler);
             }
-            for (_, binding) in priv_.reaction_bindings.borrow_mut().drain() {
-                binding.unbind();
+
+            let mut reaction_bindings = priv_.reaction_bindings.borrow_mut();
+            for reaction_item in QUICK_REACTIONS {
+                if let Some(binding) = reaction_bindings.remove(reaction_item.key) {
+                    if let Some(button) = priv_
+                        .reaction_grid
+                        .child_at(reaction_item.column, reaction_item.row)
+                        .and_then(|widget| widget.downcast::<gtk::ToggleButton>().ok())
+                    {
+                        button.set_active(false);
+                    }
+
+                    binding.unbind();
+                }
             }
         }
 
@@ -171,6 +183,14 @@ impl ReactionChooser {
                     reaction_bindings.insert(reaction_item.key.to_string(), binding);
                 }
             } else if let Some(binding) = reaction_bindings.remove(reaction_item.key) {
+                if let Some(button) = priv_
+                    .reaction_grid
+                    .child_at(reaction_item.column, reaction_item.row)
+                    .and_then(|widget| widget.downcast::<gtk::ToggleButton>().ok())
+                {
+                    button.set_active(false);
+                }
+
                 binding.unbind();
             }
         }
diff --git a/src/session/content/room_history/item_row.rs b/src/session/content/room_history/item_row.rs
index 6e4b3862f..a1e1c5ecf 100644
--- a/src/session/content/room_history/item_row.rs
+++ b/src/session/content/room_history/item_row.rs
@@ -110,33 +110,37 @@ mod imp {
     impl ContextMenuBinImpl for ItemRow {
         fn menu_opened(&self, obj: &Self::Type) {
             if let Some(event) = obj.item().and_then(|item| item.downcast::<Event>().ok()) {
-                let popover = obj.room_history().item_context_menu().clone();
+                let room_history = obj.room_history();
+                let popover = room_history.item_context_menu().to_owned();
 
                 if event.message_content().is_some() {
                     let menu_model = Self::Type::event_message_menu_model();
-
+                    let reaction_chooser = room_history.item_reaction_chooser();
                     if popover.menu_model().as_ref() != Some(menu_model) {
-                        let action_group = obj.action_group().unwrap();
                         popover.set_menu_model(Some(menu_model));
-
-                        let reaction_chooser = ReactionChooser::new();
-                        reaction_chooser.set_reactions(Some(event.reactions().to_owned()));
-                        popover.add_child(&reaction_chooser, "reaction-chooser");
-
-                        // Open emoji chooser
-                        let more_reactions = gio::SimpleAction::new("more-reactions", None);
-                        more_reactions.connect_activate(
-                            clone!(@weak obj, @weak popover => move |_, _| {
-                                obj.show_emoji_chooser(&popover);
-                            }),
-                        );
-                        action_group.add_action(&more_reactions);
+                        popover.add_child(reaction_chooser, "reaction-chooser");
                     }
+
+                    reaction_chooser.set_reactions(Some(event.reactions().to_owned()));
+
+                    // Open emoji chooser
+                    let more_reactions = gio::SimpleAction::new("more-reactions", None);
+                    more_reactions.connect_activate(
+                        clone!(@weak obj, @weak popover => move |_, _| {
+                            obj.show_emoji_chooser(&popover);
+                        }),
+                    );
+                    obj.action_group().unwrap().add_action(&more_reactions);
                 } else {
-                    popover.set_menu_model(Some(Self::Type::event_state_menu_model()));
+                    let menu_model = Self::Type::event_state_menu_model();
+                    if popover.menu_model().as_ref() != Some(menu_model) {
+                        popover.set_menu_model(Some(menu_model));
+                    }
                 }
 
                 obj.set_popover(Some(popover));
+            } else {
+                obj.set_popover(None);
             }
         }
     }
@@ -292,11 +296,11 @@ impl ItemRow {
 
     fn show_emoji_chooser(&self, popover: &gtk::PopoverMenu) {
         let emoji_chooser = gtk::EmojiChooser::builder().has_arrow(false).build();
-        emoji_chooser.connect_emoji_picked(|emoji_chooser, emoji| {
-            emoji_chooser
+        emoji_chooser.connect_emoji_picked(clone!(@weak self as obj => move |_, emoji| {
+            obj
                 .activate_action("event.toggle-reaction", Some(&emoji.to_variant()))
                 .unwrap();
-        });
+        }));
         emoji_chooser.set_parent(self);
         emoji_chooser.connect_closed(|emoji_chooser| {
             emoji_chooser.unparent();
diff --git a/src/session/content/room_history/mod.rs b/src/session/content/room_history/mod.rs
index b5ea0bdc3..c838267ec 100644
--- a/src/session/content/room_history/mod.rs
+++ b/src/session/content/room_history/mod.rs
@@ -33,7 +33,7 @@ use self::{
     state_row::StateRow, verification_info_bar::VerificationInfoBar,
 };
 use crate::{
-    components::{CustomEntry, DragOverlay, Pill, RoomTitle},
+    components::{CustomEntry, DragOverlay, Pill, ReactionChooser, RoomTitle},
     i18n::gettext_f,
     session::{
         content::{MarkdownPopover, RoomDetails},
@@ -72,6 +72,7 @@ mod imp {
         pub is_auto_scrolling: Cell<bool>,
         pub sticky: Cell<bool>,
         pub item_context_menu: OnceCell<gtk::PopoverMenu>,
+        pub item_reaction_chooser: ReactionChooser,
         #[template_child]
         pub headerbar: TemplateChild<adw::HeaderBar>,
         #[template_child]
@@ -950,6 +951,10 @@ impl RoomHistory {
             .item_context_menu
             .get_or_init(|| gtk::PopoverMenu::from_model(gio::MenuModel::NONE))
     }
+
+    pub fn item_reaction_chooser(&self) -> &ReactionChooser {
+        &self.imp().item_reaction_chooser
+    }
 }
 
 impl Default for RoomHistory {


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