Welcome to mirror list, hosted at ThFree Co, Russian Federation.

dev.gajim.org/gajim/gajim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwurstsalat <mailtrash@posteo.de>2022-09-29 18:46:16 +0300
committerwurstsalat <mailtrash@posteo.de>2022-09-30 19:06:17 +0300
commitc25b2f6797524fd062ec7bb70f366cd038747392 (patch)
tree412e1f03c6f9cb9e123cc9897b56b9aac00179e3
parentdd218cc3e5eed3db8d56d74e7e087d616efee5a4 (diff)
imprv: MUC: Add participant menu to avatarmuc-participant-menu
-rw-r--r--gajim/gtk/conversation/rows/message.py38
-rw-r--r--gajim/gtk/groupchat_roster.py8
-rw-r--r--gajim/gtk/menus.py16
3 files changed, 52 insertions, 10 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()
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}"'