gui_for_me.py 3.36 KB
Newer Older
1 2
from gi.repository import Gtk
from gi.repository import GdkPixbuf
3

4 5 6
from gajim.common import app
from gajim.plugins import GajimPlugin
from gajim.plugins.helpers import log_calls
7
from gajim.plugins.plugins_i18n import _
8 9 10 11 12

class GuiForMe(GajimPlugin):

    @log_calls('GuiForMePlugin')
    def init(self):
13
        self.description = _('Adds a button for the \'/me\' command.')
14 15
        self.config_dialog = None  # GuiForMePluginConfigDialog(self)
        self.gui_extension_points = {
16 17 18 19
            'chat_control_base': (self.connect_with_chat_control,
                                  self.disconnect_from_chat_control),
            'chat_control_base_update_toolbar': (self.update_button_state,
                                                None)}
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
        self.controls = []

    @log_calls('GuiForMePlugin')
    def connect_with_chat_control(self, chat_control):
        if chat_control.widget_name != 'groupchat_control':
            return

        self.chat_control = chat_control
        control = Base(self, self.chat_control)
        self.controls.append(control)


    @log_calls('GuiForMePlugin')
    def disconnect_from_chat_control(self, chat_control):
        for control in self.controls:
            control.disconnect_from_chat_control()
        self.controls = []

38 39 40 41 42
    @log_calls('GuiForMePlugin')
    def update_button_state(self, chat_control):
        for base in self.controls:
            if base.chat_control != chat_control:
                continue
43
            base.button.set_sensitive(chat_control.contact.show != 'offline' \
44
            and app.connections[chat_control.account].connected > 0)
45

46 47 48 49 50 51 52 53 54 55 56

class Base(object):
    def __init__(self, plugin, chat_control):
        self.chat_control = chat_control
        self.plugin = plugin
        self.textview = self.chat_control.conv_textview
        self.change_cursor = False

        self.create_buttons()

    def create_buttons(self):
57
        # create /me button
58 59 60 61 62
        actions_hbox = self.chat_control.xml.get_object('hbox')
        self.button = Gtk.Button(label=None, stock=None, use_underline=False)
        self.button.get_style_context().add_class(
            'chatcontrol-actionbar-button')
        self.button.set_relief(Gtk.ReliefStyle.NONE)
63
        self.button.set_property('can-focus', False)
64
        img = Gtk.Image()
65
        img_path = self.plugin.local_file_path('gui_for_me.png')
66
        pixbuf = GdkPixbuf.Pixbuf.new_from_file(img_path)
67
        img.set_from_pixbuf(pixbuf)
68 69 70
        self.button.set_image(img)
        self.button.set_tooltip_text(_('Insert /me to conversation input box,'
            ' at cursor position'))
71 72 73
        actions_hbox.pack_start(self.button, False, False , 0)
        actions_hbox.reorder_child(self.button,
            len(actions_hbox.get_children()) - 3)
74 75 76 77 78 79 80 81 82
        id_ = self.button.connect('clicked', self.on_me_button_clicked)
        self.chat_control.handlers[id_] = self.button
        self.button.show()

    def on_me_button_clicked(self, widget):
        """
        Insert /me to conversation input box, at cursor position
        """
        message_buffer = self.chat_control.msg_textview.get_buffer()
83
        self.chat_control.msg_textview.remove_placeholder()
84 85 86 87
        message_buffer.insert_at_cursor('/me ')
        self.chat_control.msg_textview.grab_focus()

    def disconnect_from_chat_control(self):
88
        actions_hbox = self.chat_control.xml.get_object('hbox')
89
        actions_hbox.remove(self.button)