[fractal] room-history: Fix reaction chooser in context menu
- From: Julian Sparber <jsparber src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [fractal] room-history: Fix reaction chooser in context menu
- Date: Tue, 26 Apr 2022 09:41:18 +0000 (UTC)
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: >k::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]