diff options
author | Philipp Hörist <philipp@hoerist.com> | 2022-10-01 23:25:21 +0300 |
---|---|---|
committer | Philipp Hörist <philipp@hoerist.com> | 2022-10-01 23:25:21 +0300 |
commit | 65c22279bae34bb7161aed8b9172fc7e3d835da4 (patch) | |
tree | 7eab61f78b97f40d30d5b55517e77314367be80a | |
parent | cb7c00f1e3fb37fe22de03e031140f7efa4ffca2 (diff) |
refactor: Add GajimPopover
-rw-r--r-- | gajim/gtk/chat_list.py | 16 | ||||
-rw-r--r-- | gajim/gtk/component_search.py | 11 | ||||
-rw-r--r-- | gajim/gtk/conversation/rows/message.py | 16 | ||||
-rw-r--r-- | gajim/gtk/groupchat_roster.py | 16 | ||||
-rw-r--r-- | gajim/gtk/roster.py | 16 | ||||
-rw-r--r-- | gajim/gtk/start_chat.py | 12 | ||||
-rw-r--r-- | gajim/gtk/util.py | 44 | ||||
-rw-r--r-- | gajim/gtk/workspace_side_bar.py | 12 |
8 files changed, 69 insertions, 74 deletions
diff --git a/gajim/gtk/chat_list.py b/gajim/gtk/chat_list.py index 649fe9d46..deb99b4f9 100644 --- a/gajim/gtk/chat_list.py +++ b/gajim/gtk/chat_list.py @@ -58,6 +58,8 @@ from gajim.common.modules.contacts import GroupchatParticipant from .menus import get_chat_list_row_menu from .builder import get_builder from .util import EventHelper +from .util import GajimPopover + log = logging.getLogger('gajim.gui.chatlist') @@ -867,24 +869,18 @@ class ChatRow(Gtk.ListBoxRow): menu = get_chat_list_row_menu( self.workspace_id, self.account, self.jid, self._pinned) - rectangle = Gdk.Rectangle() - rectangle.x = int(event.x) - rectangle.y = int(event.y) - rectangle.width = rectangle.height = 1 - event_widget = Gtk.get_event_widget(event) + x = event.x if isinstance(event_widget, Gtk.Button): # When the event is triggered by pressing the close button we get # a x coordinate relative to the window of the close button, which # would be a very low x integer as the close button is small, this # leads to opening the menu far away from the mouse. We overwrite # the x coordinate with an approx. position of the close button. - rectangle.x = int(self.get_allocated_width() - 10) + x = self.get_allocated_width() - 10 - popover = Gtk.Popover.new_from_model(self, menu) - popover.set_relative_to(self) - popover.set_position(Gtk.PositionType.RIGHT) - popover.set_pointing_to(rectangle) + popover = GajimPopover(menu, relative_to=self) + popover.set_pointing_to_coord(x=x, y=event.y) popover.popup() def _on_drag_begin(self, diff --git a/gajim/gtk/component_search.py b/gajim/gtk/component_search.py index 6efe06e8e..b86b2b394 100644 --- a/gajim/gtk/component_search.py +++ b/gajim/gtk/component_search.py @@ -41,6 +41,7 @@ from .assistant import Page from .assistant import ProgressPage from .dataform import DataFormWidget from .menus import get_component_search_menu +from .util import GajimPopover from .util import ensure_not_destroyed from .util import EventHelper @@ -311,15 +312,7 @@ class Result(Page): jid = column_values[self._jid_col] menu = get_component_search_menu(jid, text) - rectangle = Gdk.Rectangle() - rectangle.x = int(event.x) - rectangle.y = int(event.y) - rectangle.width = rectangle.height = 1 - - popover = Gtk.Popover.new_from_model(self, menu) - popover.set_relative_to(self) - popover.set_position(Gtk.PositionType.RIGHT) - popover.set_pointing_to(rectangle) + popover = GajimPopover(menu, relative_to=self, event=event) popover.popup() return True diff --git a/gajim/gtk/conversation/rows/message.py b/gajim/gtk/conversation/rows/message.py index 512b6ef80..b7c12f8be 100644 --- a/gajim/gtk/conversation/rows/message.py +++ b/gajim/gtk/conversation/rows/message.py @@ -55,6 +55,7 @@ from ...dialogs import InputDialog from ...dialogs import DialogButton from ...menus import get_groupchat_participant_menu from ...preview import PreviewWidget +from ...util import GajimPopover from ...util import format_fingerprint from ...util import get_cursor @@ -270,14 +271,11 @@ class MessageRow(BaseRow): 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) + self._show_participant_menu(name, event) return Gdk.EVENT_STOP - def _show_participant_menu(self, nick: str, rect: Gdk.Rectangle) -> None: + def _show_participant_menu(self, nick: str, event: Gdk.EventButton) -> None: assert isinstance(self._contact, GroupchatContact) if not self._contact.is_joined: return @@ -294,13 +292,7 @@ class MessageRow(BaseRow): 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 = GajimPopover(menu, relative_to=self, event=event) popover.popup() @staticmethod diff --git a/gajim/gtk/groupchat_roster.py b/gajim/gtk/groupchat_roster.py index 07b29d500..1fb32d8ba 100644 --- a/gajim/gtk/groupchat_roster.py +++ b/gajim/gtk/groupchat_roster.py @@ -42,6 +42,7 @@ from .menus import get_groupchat_participant_menu from .tooltips import GCTooltip from .builder import get_builder from .util import EventHelper +from .util import GajimPopover log = logging.getLogger('gajim.gui.groupchat_roster') @@ -414,15 +415,12 @@ class GroupchatRoster(Gtk.Revealer, EventHelper): return if event.button == 3: # right click - rec = Gdk.Rectangle() - rec.x, rec.y = int(event.x), int(event.y) - rec.height, rec.width = 1, 1 - self._show_contact_menu(nick, rec) + self._show_contact_menu(nick, event) # if event.button == 2: # middle click # self.roster.emit('row-activated', nick) - def _show_contact_menu(self, nick: str, rect: Gdk.Rectangle) -> None: + def _show_contact_menu(self, nick: str, event: Gdk.EventButton) -> None: assert self._contact is not None self_contact = self._contact.get_self() assert self_contact is not None @@ -431,13 +429,7 @@ class GroupchatRoster(Gtk.Revealer, EventHelper): 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 = GajimPopover(menu, relative_to=self, event=event) popover.popup() def _on_muc_state_changed(self, diff --git a/gajim/gtk/roster.py b/gajim/gtk/roster.py index ab3839c86..a62e865aa 100644 --- a/gajim/gtk/roster.py +++ b/gajim/gtk/roster.py @@ -50,6 +50,7 @@ from .dialogs import ConfirmationDialog from .dialogs import DialogButton from .tooltips import RosterTooltip from .util import EventHelper +from .util import GajimPopover from .builder import get_builder from .util import open_window @@ -384,18 +385,9 @@ class Roster(Gtk.ScrolledWindow, EventHelper): contact = self._contacts.get_bare_contact(jid) gateway_register = contact.is_gateway and contact.supports( Namespace.REGISTER) - menu = get_roster_menu( - self._account, jid, gateway=gateway_register) - - rectangle = Gdk.Rectangle() - rectangle.x = int(event.x) - rectangle.y = int(event.y) - rectangle.width = rectangle.height = 1 - - popover = Gtk.Popover.new_from_model(self, menu) - popover.set_relative_to(treeview) - popover.set_position(Gtk.PositionType.RIGHT) - popover.set_pointing_to(rectangle) + + menu = get_roster_menu(self._account, jid, gateway=gateway_register) + popover = GajimPopover(menu, relative_to=treeview, event=event) popover.popup() def set_search_string(self, text: str) -> None: diff --git a/gajim/gtk/start_chat.py b/gajim/gtk/start_chat.py index b8f11ea82..2576e459d 100644 --- a/gajim/gtk/start_chat.py +++ b/gajim/gtk/start_chat.py @@ -56,7 +56,7 @@ from .chat_filter import ChatFilter from .groupchat_info import GroupChatInfoScrolled from .groupchat_nick import NickChooser from .builder import get_builder -from .util import get_icon_name +from .util import GajimPopover, get_icon_name from .util import AccountBadge ContactT = Union[BareContact, GroupchatContact] @@ -829,15 +829,7 @@ class ContactRow(Gtk.ListBoxRow): menu = get_start_chat_row_menu(self.account, self.jid) - rectangle = Gdk.Rectangle() - rectangle.x = int(event.x) - rectangle.y = int(event.y) - rectangle.width = rectangle.height = 1 - - popover = Gtk.Popover.new_from_model(self, menu) - popover.set_relative_to(self) - popover.set_position(Gtk.PositionType.RIGHT) - popover.set_pointing_to(rectangle) + popover = GajimPopover(menu, relative_to=self, event=event) popover.popup() def _get_avatar_image(self, contact: ContactT) -> Gtk.Image: diff --git a/gajim/gtk/util.py b/gajim/gtk/util.py index d4d5c0998..9b2bb78ff 100644 --- a/gajim/gtk/util.py +++ b/gajim/gtk/util.py @@ -866,3 +866,47 @@ class GajimMenu(Gio.Menu): menu = GajimMenu() self.append_submenu(label, menu) return menu + + +class GdkRectangle(Gdk.Rectangle): + def __init__(self, + x: int, + y: int, + height: int = 1, + width: int = 1 + ) -> None: + + Gdk.Rectangle.__init__(self) + self.x = x + self.y = y + self.height = height + self.width = width + + +class GajimPopover(Gtk.Popover): + def __init__(self, + menu: Gio.MenuModel, + relative_to: Optional[Gtk.Widget] = None, + position: Gtk.PositionType = Gtk.PositionType.RIGHT, + event: Optional[Gdk.EventButton] = None) -> None: + + Gtk.Popover.__init__(self) + + self.bind_model(menu) + self.set_relative_to(relative_to) + self.set_position(position) + if event is not None: + self.set_pointing_from_event(event) + + self.connect('closed', self._destroy) + + def set_pointing_from_event(self, event: Gdk.EventButton) -> None: + self.set_pointing_to_coord(event.x, event.y) + + def set_pointing_to_coord(self, x: float, y: float) -> None: + rectangle = GdkRectangle(x=int(x), y=int(y)) + self.set_pointing_to(rectangle) + + def _destroy(self, popover: Gtk.Popover) -> None: + app.check_finalize(popover) + GLib.idle_add(popover.set_relative_to, None) diff --git a/gajim/gtk/workspace_side_bar.py b/gajim/gtk/workspace_side_bar.py index 8c73eebb3..2d9cd6e0a 100644 --- a/gajim/gtk/workspace_side_bar.py +++ b/gajim/gtk/workspace_side_bar.py @@ -33,8 +33,10 @@ from .chat_list_stack import ChatListStack from .chat_page import ChatPage from .menus import get_workspace_menu from .structs import ChatListEntryParam +from .util import GajimPopover from .util import open_window + log = logging.getLogger('gajim.gui.workspace_sidebar') @@ -332,15 +334,7 @@ class Workspace(CommonWorkspace): menu = get_workspace_menu(self.workspace_id) - rectangle = Gdk.Rectangle() - rectangle.x = int(event.x) - rectangle.y = int(event.y) - rectangle.width = rectangle.height = 1 - - popover = Gtk.Popover.new_from_model(self, menu) - popover.set_relative_to(self) - popover.set_position(Gtk.PositionType.RIGHT) - popover.set_pointing_to(rectangle) + popover = GajimPopover(menu, relative_to=self, event=event) popover.popup() def update_avatar(self) -> None: |