diff options
Diffstat (limited to 'gajim/gtk/conversation/rows/message.py')
-rw-r--r-- | gajim/gtk/conversation/rows/message.py | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/gajim/gtk/conversation/rows/message.py b/gajim/gtk/conversation/rows/message.py index 60fea0a8e..3c56837af 100644 --- a/gajim/gtk/conversation/rows/message.py +++ b/gajim/gtk/conversation/rows/message.py @@ -53,6 +53,7 @@ from .widgets import MoreMenuButton from ..message_widget import MessageWidget from ...dialogs import InputDialog from ...dialogs import DialogButton +from ...menus import get_groupchat_participant_menu from ...preview import PreviewWidget from ...util import format_fingerprint from ...util import get_cursor @@ -254,10 +255,43 @@ class MessageRow(BaseRow): event: Gdk.EventButton, name: str ) -> int: - if event.type == Gdk.EventType.BUTTON_PRESS and event.button == 1: - app.window.activate_action('mention', GLib.Variant('s', name)) + if event.type == Gdk.EventType.BUTTON_PRESS: + if event.button == 1: + app.window.activate_action('mention', GLib.Variant('s', name)) + elif event.button == 3: + rect = Gdk.Rectangle() + rect.x, rect.y = int(event.x), int(event.y) + rect.height, rect.width = 1, 1 + self._show_participant_menu(name, rect) + return Gdk.EVENT_STOP + def _show_participant_menu(self, nick: str, rect: Gdk.Rectangle) -> None: + assert isinstance(self._contact, GroupchatContact) + if not self._contact.is_joined: + return + + self_contact = self._contact.get_self() + assert self_contact is not None + + if nick == self_contact.name: + # Don’t show menu for us + return + + contact = self._contact.get_resource(nick) + menu = get_groupchat_participant_menu(self._contact.account, + self_contact, + contact) + + def destroy(popover: Gtk.Popover) -> None: + app.check_finalize(popover) + GLib.idle_add(popover.set_relative_to, None) + + popover = Gtk.Popover.new_from_model(self, menu) + popover.set_pointing_to(rect) + popover.connect('closed', destroy) + popover.popup() + @staticmethod def _on_realize(event_box: Gtk.EventBox) -> None: window = event_box.get_window() |