diff options
author | wurstsalat <mailtrash@posteo.de> | 2022-09-29 18:46:16 +0300 |
---|---|---|
committer | Philipp Hörist <philipp@hoerist.com> | 2022-10-01 21:54:47 +0300 |
commit | cb7c00f1e3fb37fe22de03e031140f7efa4ffca2 (patch) | |
tree | d11c52cdaa839a5257faccf11fbb808bd66dca5d | |
parent | d4736d9204c7694ba824f111e6731b87ac6795ff (diff) |
imprv: MUC: Add participant menu to avatar
-rw-r--r-- | gajim/gtk/conversation/rows/message.py | 38 | ||||
-rw-r--r-- | gajim/gtk/groupchat_roster.py | 8 | ||||
-rw-r--r-- | gajim/gtk/menus.py | 16 |
3 files changed, 52 insertions, 10 deletions
diff --git a/gajim/gtk/conversation/rows/message.py b/gajim/gtk/conversation/rows/message.py index 49ba3b325..512b6ef80 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 @@ -265,10 +266,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() diff --git a/gajim/gtk/groupchat_roster.py b/gajim/gtk/groupchat_roster.py index 6a067d62c..07b29d500 100644 --- a/gajim/gtk/groupchat_roster.py +++ b/gajim/gtk/groupchat_roster.py @@ -38,7 +38,7 @@ from gajim.common.events import ApplicationEvent from gajim.common.events import MUCNicknameChanged from gajim.common.modules.contacts import GroupchatContact -from .menus import get_groupchat_roster_menu +from .menus import get_groupchat_participant_menu from .tooltips import GCTooltip from .builder import get_builder from .util import EventHelper @@ -427,9 +427,9 @@ class GroupchatRoster(Gtk.Revealer, EventHelper): self_contact = self._contact.get_self() assert self_contact is not None contact = self._contact.get_resource(nick) - menu = get_groupchat_roster_menu(self._contact.account, - self_contact, - contact) + menu = get_groupchat_participant_menu(self._contact.account, + self_contact, + contact) def destroy(popover: Gtk.Popover) -> None: app.check_finalize(popover) diff --git a/gajim/gtk/menus.py b/gajim/gtk/menus.py index 15a7a7e48..8b22d43b8 100644 --- a/gajim/gtk/menus.py +++ b/gajim/gtk/menus.py @@ -465,6 +465,10 @@ def get_groupchat_admin_menu(self_contact: types.GroupchatParticipant, menu = GajimMenu() + if contact.real_jid is None: + menu.add_item(_('Not Available'), 'dummy', None) + return menu + action = 'win.muc-change-affiliation' if is_affiliation_change_allowed(self_contact, contact, 'owner'): @@ -499,6 +503,10 @@ def get_groupchat_mod_menu(self_contact: types.GroupchatParticipant, menu = GajimMenu() + if not contact.is_available: + menu.add_item(_('Not Available'), 'dummy', None) + return menu + if is_role_change_allowed(self_contact, contact): value = f'"{contact.name}"' menu.add_item(_('Kick…'), 'win.muc-kick', value) @@ -519,10 +527,10 @@ def get_groupchat_mod_menu(self_contact: types.GroupchatParticipant, return menu -def get_groupchat_roster_menu(account: str, - self_contact: types.GroupchatParticipant, - contact: types.GroupchatParticipant - ) -> GajimMenu: +def get_groupchat_participant_menu(account: str, + self_contact: types.GroupchatParticipant, + contact: types.GroupchatParticipant + ) -> GajimMenu: value = f'"{contact.name}"' |