diff --git a/gajim/gtk/menus.py b/gajim/gtk/menus.py index b761f837b6a9e4e3431cf697fc0bfe0d54199277..138f74c924b9e9cc0a695790952557634cb9c938 100644 --- a/gajim/gtk/menus.py +++ b/gajim/gtk/menus.py @@ -549,18 +549,23 @@ def get_groupchat_roster_menu(account: str, return menu -class SearchMenu(Gtk.Menu): - def __init__(self, treeview: Gtk.TreeView) -> None: - Gtk.Menu.__init__(self) - self._copy_item = Gtk.MenuItem(label=_('Copy')) - self._copy_item.set_action_name('app.copy-text') - self.set_copy_text('') - self._copy_item.show() - self.append(self._copy_item) - self.attach_to_widget(treeview, None) - - def set_copy_text(self, text: str) -> None: - self._copy_item.set_action_target_value(GLib.Variant('s', text)) +def get_directory_search_menu(jid: str, copy_text: str) -> Gio.Menu: + menu_items: list[tuple[str, str]] = [ + ('app.copy-text', _('Copy')), + ('app.start-chat', _('Start Chat…')) + ] + menu = Gio.Menu() + for item in menu_items: + action, label = item + menuitem = Gio.MenuItem.new(label, action) + if action == 'app.copy-text': + data = copy_text + else: + data = jid + variant = GLib.Variant('s', data) + menuitem.set_action_and_target_value(action, variant) + menu.append_item(menuitem) + return menu def escape_mnemonic(label: Optional[str]) -> Optional[str]: diff --git a/gajim/gtk/search.py b/gajim/gtk/search.py index 28f26467cd409d1d8c603f68fae350a470b35b5e..6709756b7de8284f26d3c3bd8bc716f739e7cfbc 100644 --- a/gajim/gtk/search.py +++ b/gajim/gtk/search.py @@ -40,7 +40,7 @@ from .assistant import Page from .assistant import ProgressPage from .dataform import DataFormWidget -from .menus import SearchMenu +from .menus import get_directory_search_menu from .util import ensure_not_destroyed from .util import EventHelper @@ -222,7 +222,6 @@ def __init__(self) -> None: self.add(self._scrolled) self._treeview: Optional[Gtk.TreeView] = None - self._menu: Optional[SearchMenu] = None self.show_all() @@ -231,7 +230,6 @@ def process_result(self, form: Optional[Node]) -> None: self._scrolled.remove(self._treeview) self._treeview.destroy() self._treeview = None - self._menu = None self._label.hide() self._scrolled.hide() @@ -268,7 +266,6 @@ def process_result(self, form: Optional[Node]) -> None: self._treeview.set_vexpand(True) self._treeview.get_style_context().add_class('search-treeview') self._treeview.connect('button-press-event', self._on_button_press) - self._menu = SearchMenu(self._treeview) for field, counter in zip(form.reported.iter_fields(), itertools.count()): @@ -298,11 +295,21 @@ def _on_button_press(self, assert store is not None assert path is not None iter_ = store.get_iter(path) - column_values = str(store[iter_]) + column_values = store[iter_] text = ' '.join(column_values) - assert self._menu is not None - self._menu.set_copy_text(text) - self._menu.popup_at_pointer() + + menu = get_directory_search_menu(column_values[0], 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.popup() return True def get_visible_buttons(self) -> list[str]: