plugin.py 8.82 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
# -*- coding: utf-8 -*-

## This file is part of Gajim.
##
## Gajim is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published
## by the Free Software Foundation; version 3 only.
##
## Gajim is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with Gajim.  If not, see <http://www.gnu.org/licenses/>.
##

'''
Adjustable chat window banner.

Includes tweaks to make it compact.

Based on patch by pb in ticket  #4133:
http://trac.gajim.org/attachment/ticket/4133/gajim-chatbanneroptions-svn10008.patch

:author: Mateusz Biliński <mateusz@bilinski.it>
:since: 30 July 2008
:copyright: Copyright (2008) Mateusz Biliński <mateusz@bilinski.it>
:license: GPL
'''

import sys

Yann Leboulanger's avatar
Yann Leboulanger committed
34 35
from gi.repository import Gtk
from gi.repository import GObject
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
import message_control
from common import gajim
from common import helpers

from plugins import GajimPlugin
from plugins.helpers import log, log_calls
from plugins.gui import GajimPluginConfigDialog

class BannerTweaksPlugin(GajimPlugin):

    @log_calls('BannerTweaksPlugin')
    def init(self):
        self.description = _('Allows user to tweak chat window banner '
            'appearance (eg. make it compact).\n'
            'Based on patch by pb in ticket #4133:\n'
            'http://trac.gajim.org/attachment/ticket/4133.')
        self.config_dialog = BannerTweaksPluginConfigDialog(self)

        self.gui_extension_points = {
Yann Leboulanger's avatar
Yann Leboulanger committed
55 56 57
            'chat_control_base_draw_banner': (
                self.chat_control_base_draw_banner_called,
                self.chat_control_base_draw_banner_deactivation)
58 59 60 61 62 63 64 65 66 67 68 69
        }

        self.config_default_values = {
            'show_banner_image': (True, 'If True, Gajim will display a status icon in the banner of chat windows.'),
            'show_banner_online_msg': (True, 'If True, Gajim will display the status message of the contact in the banner of chat windows.'),
            'show_banner_resource': (False, 'If True, Gajim will display the resource name of the contact in the banner of chat windows.'),
            'banner_small_fonts': (False, 'If True, Gajim will use small fonts for contact name and resource name in the banner of chat windows.'),
            'old_chat_avatar_height': (52, 'chat_avatar_height value before plugin was activated'),
        }

    @log_calls('BannerTweaksPlugin')
    def activate(self):
Yann Leboulanger's avatar
Yann Leboulanger committed
70 71
        self.config['old_chat_avatar_height'] = gajim.config.get(
            'chat_avatar_height')
72 73 74 75
        #gajim.config.set('chat_avatar_height', 28)

    @log_calls('BannerTweaksPlugin')
    def deactivate(self):
Yann Leboulanger's avatar
Yann Leboulanger committed
76 77
        gajim.config.set('chat_avatar_height', self.config[
            'old_chat_avatar_height'])
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95

    @log_calls('BannerTweaksPlugin')
    def chat_control_base_draw_banner_called(self, chat_control):
        if not self.config['show_banner_online_msg']:
            chat_control.banner_status_label.hide()
            chat_control.banner_status_label.set_no_show_all(True)
            status_text = ''
            chat_control.banner_status_label.set_markup(status_text)

        if not self.config['show_banner_image']:
            if chat_control.TYPE_ID == message_control.TYPE_GC:
                banner_status_img = chat_control.xml.get_object(
                    'gc_banner_status_image')
            else:
                banner_status_img = chat_control.xml.get_object(
                    'banner_status_image')
            banner_status_img.clear()

Yann Leboulanger's avatar
Yann Leboulanger committed
96 97
        # TODO: part below repeats a lot of code from 
        # ChatControl.draw_banner_text()
98 99 100
        # This could be rewritten using re module: getting markup text from
        # banner_name_label and replacing some elements based on plugin config.
        # Would it be faster?
Yann Leboulanger's avatar
Yann Leboulanger committed
101 102
        if self.config['show_banner_resource'] or self.config[
        'banner_small_fonts']:
103 104 105 106 107 108 109 110 111 112 113 114 115
            banner_name_label = chat_control.xml.get_object('banner_name_label')
            label_text = banner_name_label.get_label()

            contact = chat_control.contact
            jid = contact.jid

            name = contact.get_shown_name()
            if chat_control.resource:
                name += '/' + chat_control.resource
            elif contact.resource and self.config['show_banner_resource']:
                name += '/' + contact.resource

            if chat_control.TYPE_ID == message_control.TYPE_PM:
Yann Leboulanger's avatar
Yann Leboulanger committed
116 117 118 119 120 121 122 123
                name = _('%(nickname)s from group chat %(room_name)s') % \
                    {'nickname': name, 'room_name': chat_control.room_name}
            name = GObject.markup_escape_text(name)

            # We know our contacts nick, but if another contact has the same
            # nick in another account we need to also display the account.
            # except if we are talking to two different resources of the same
            # contact
124 125 126 127 128 129 130 131
            acct_info = ''
            for account in gajim.contacts.get_accounts():
                if account == chat_control.account:
                    continue
                if acct_info: # We already found a contact with same nick
                    break
                for jid in gajim.contacts.get_jid_list(account):
                    other_contact_ = \
Yann Leboulanger's avatar
Yann Leboulanger committed
132 133 134
                        gajim.contacts.get_first_contact_from_jid(account, jid)
                    if other_contact_.get_shown_name() == \
                    chat_control.contact.get_shown_name():
135
                        acct_info = ' (%s)' % \
Yann Leboulanger's avatar
Yann Leboulanger committed
136
                            GObject.markup_escape_text(chat_control.account)
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
                        break

            font_attrs, font_attrs_small = chat_control.get_font_attrs()
            if self.config['banner_small_fonts']:
                font_attrs = font_attrs_small

            st = gajim.config.get('displayed_chat_state_notifications')
            cs = contact.chatstate
            if cs and st in ('composing_only', 'all'):
                if contact.show == 'offline':
                    chatstate = ''
                elif st == 'all' or cs == 'composing':
                    chatstate = helpers.get_uf_chatstate(cs)
                else:
                    chatstate = ''

                label_text = '<span %s>%s</span><span %s>%s %s</span>' % \
                    (font_attrs, name, font_attrs_small, acct_info, chatstate)
            else:
                # weight="heavy" size="x-large"
                label_text = '<span %s>%s</span><span %s>%s</span>' % \
                    (font_attrs, name, font_attrs_small, acct_info)

            banner_name_label.set_markup(label_text)

    @log_calls('BannerTweaksPlugin')
    def chat_control_base_draw_banner_deactivation(self, chat_control):
        pass
        #chat_control.draw_banner()

class BannerTweaksPluginConfigDialog(GajimPluginConfigDialog):
    def init(self):
        self.GTK_BUILDER_FILE_PATH = self.plugin.local_file_path(
                'config_dialog.ui')
Yann Leboulanger's avatar
Yann Leboulanger committed
171
        self.xml = Gtk.Builder()
172 173
        self.xml.set_translation_domain('gajim_plugins')
        self.xml.add_objects_from_file(self.GTK_BUILDER_FILE_PATH,
Yann Leboulanger's avatar
Yann Leboulanger committed
174
            ['banner_tweaks_config_vbox'])
175
        self.config_vbox = self.xml.get_object('banner_tweaks_config_vbox')
Yann Leboulanger's avatar
Yann Leboulanger committed
176
        self.get_child().pack_start(self.config_vbox, True, True, 0)
177

Yann Leboulanger's avatar
Yann Leboulanger committed
178 179 180 181 182 183 184 185
        self.show_banner_image_checkbutton = self.xml.get_object(
            'show_banner_image_checkbutton')
        self.show_banner_online_msg_checkbutton = self.xml.get_object(
            'show_banner_online_msg_checkbutton')
        self.show_banner_resource_checkbutton = self.xml.get_object(
            'show_banner_resource_checkbutton')
        self.banner_small_fonts_checkbutton = self.xml.get_object(
            'banner_small_fonts_checkbutton')
186 187 188 189

        self.xml.connect_signals(self)

    def on_run(self):
Yann Leboulanger's avatar
Yann Leboulanger committed
190 191 192 193 194 195 196 197
        self.show_banner_image_checkbutton.set_active(self.plugin.config[
            'show_banner_image'])
        self.show_banner_online_msg_checkbutton.set_active(self.plugin.config[
            'show_banner_online_msg'])
        self.show_banner_resource_checkbutton.set_active(self.plugin.config[
            'show_banner_resource'])
        self.banner_small_fonts_checkbutton.set_active(self.plugin.config[
            'banner_small_fonts'])
198 199 200 201 202 203 204 205 206 207 208 209

    def on_show_banner_image_checkbutton_toggled(self, button):
        self.plugin.config['show_banner_image'] = button.get_active()

    def on_show_banner_online_msg_checkbutton_toggled(self, button):
        self.plugin.config['show_banner_online_msg'] = button.get_active()

    def on_show_banner_resource_checkbutton_toggled(self, button):
        self.plugin.config['show_banner_resource'] = button.get_active()

    def on_banner_small_fonts_checkbutton_toggled(self, button):
        self.plugin.config['banner_small_fonts'] = button.get_active()