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:
authorPhilipp Hörist <philipp@hoerist.com>2022-10-01 23:25:21 +0300
committerPhilipp Hörist <philipp@hoerist.com>2022-10-01 23:25:21 +0300
commit65c22279bae34bb7161aed8b9172fc7e3d835da4 (patch)
tree7eab61f78b97f40d30d5b55517e77314367be80a
parentcb7c00f1e3fb37fe22de03e031140f7efa4ffca2 (diff)
refactor: Add GajimPopover
-rw-r--r--gajim/gtk/chat_list.py16
-rw-r--r--gajim/gtk/component_search.py11
-rw-r--r--gajim/gtk/conversation/rows/message.py16
-rw-r--r--gajim/gtk/groupchat_roster.py16
-rw-r--r--gajim/gtk/roster.py16
-rw-r--r--gajim/gtk/start_chat.py12
-rw-r--r--gajim/gtk/util.py44
-rw-r--r--gajim/gtk/workspace_side_bar.py12
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: