diff --git a/plugin.py b/plugin.py index ef516ac..cf274de 100644 --- a/plugin.py +++ b/plugin.py @@ -23,7 +23,8 @@ import logging from gajim.plugins import GajimPlugin from gajim.common import app from gajim.common.modules.contacts import BareContact -from gi.repository import Gtk +from gajim.gtk.util import make_menu_item +from gi.repository import Gtk, Gio log = logging.getLogger('gajim.p.otr') @@ -55,23 +56,25 @@ class OTRPlugin(GajimPlugin): self.gui_extension_points = { 'encrypt' + self.encryption_name: (self._encrypt_message, None), 'message_actions_box': (self._message_actions_box_activate, self._message_actions_box_deactivate), - 'switch_contact': (self._switch_contact, None), } - self.switch = None - self.switch_box = None + self._menuitem = None @staticmethod - def _get_box(): - return app.window.get_chat_stack().get_message_action_box()._ui.box + def _get_grid(): + return app.window.get_chat_stack().get_message_action_box() + + @staticmethod + def _get_model(grid): + return grid._ui.encryption_menu_button.get_menu_model() def activate(self): if app.window is not None: - box = self._get_box() - self._actions_hack_activate(box) + grid = self._get_grid() + self._actions_hack_activate(grid) def deactivate(self): - box = self._get_box() - self._actions_hack_deactivate(box) + grid = self._get_grid() + self._actions_hack_deactivate(grid) @staticmethod def get_otr(account): @@ -87,9 +90,6 @@ class OTRPlugin(GajimPlugin): def encrypt_file(file, account, callback): callback(file) - def toggle_otr(self): - print('toggle') - # encrypt message # def _encrypt_message(self,con,event,callback): if not event.message or event.type_ != 'chat': return # drop empty and non-chat messages @@ -97,37 +97,23 @@ class OTRPlugin(GajimPlugin): otr.otr.encrypt(event,callback) def _message_actions_box_activate(self, grid, box): - if self.switch_box is None: - self._actions_hack_activate(box) + if self._menuitem is None: + self._actions_hack_activate(grid) def _message_actions_box_deactivate(self, grid, box): - if self.switch_box is not None: - self._actions_hack_deactivate(box) - - def _actions_hack_activate(self, box): - self.switch_box = Gtk.VBox() - label = Gtk.Label(label='OTR') - self.switch = Gtk.Switch() - self.switch_box.pack_start(label, False, True, 0) - self.switch_box.pack_start(self.switch, False, True, 0) - self.switch_box.set_center_widget(self.switch) - box.pack_start(self.switch_box, False, True, 0) - self.switch.connect('activate', self.toggle_otr) - if app.window is not None and hasattr(app.window, '_chat_page'): - self._update_switch_visibility(app.window.get_chat_stack()._get_current_contact()) - - def _actions_hack_deactivate(self, box): - box.remove(self.switch_box) - self.switch_box = None - self.switch = None - - def _update_switch_visibility(self, contact): - if isinstance(contact, BareContact): - otr = self.get_otr(contact._account) - self.switch.set_active(contact.jid.new_as_bare() in otr.otr.ctxs) - self.switch_box.show_all() - else: - self.switch_box.hide() - - def _switch_contact(self, contact): - self._update_switch_visibility(contact) + if self._menuitem is not None: + self._actions_hack_deactivate(grid) + + def _actions_hack_activate(self, grid): + model = grid._ui.encryption_menu_button.get_menu_model() + menuitem = make_menu_item('OTR', 'win.set-encryption', '"OTR"') + self._menuitem = menuitem.get_attribute_value(Gio.MENU_ATTRIBUTE_LABEL) + model.append_item(menuitem) + + def _actions_hack_deactivate(self, grid): + model = self._get_model(grid) + for i in range(model.get_n_items()): + if model.get_item_attribute_value(i, Gio.MENU_ATTRIBUTE_LABEL, None) == self._menuitem: + model.remove(i) + self._menuitem = None + break