# -*- coding: utf-8 -*- ## import gtk import pango import gobject import io import ConfigParser import os import zipfile import tempfile from shutil import rmtree import sys import imp from common import gajim from plugins import GajimPlugin from plugins.helpers import log_calls from htmltextview import HtmlTextView from conversation_textview import ConversationTextview from dialogs import WarningDialog, HigDialog ( C_PIXBUF, C_NAME, C_DESCRIPTION, C_AUTHORS, C_CONVERTER, C_HOMEPAGE, C_UPGRADE) = range(7) class EmoticonsPackPlugin(GajimPlugin): @log_calls('EmoticonsPackPlugin') def init(self): self.config_dialog = None # EmoticonsPackPluginConfigDialog(self) self.window = None self.model = None self.connected_ids = {} self.tmp_dir = '' @log_calls('EmoticonsPackPlugin') def activate(self): self.pl_menuitem = gajim.interface.roster.xml.get_object( 'plugins_menuitem') self.id_ = self.pl_menuitem.connect_after('activate', self.on_activate) if 'plugins' in gajim.interface.instances: self.on_activate(None) @log_calls('EmoticonsPackPlugin') def deactivate(self): self.pl_menuitem.disconnect(self.id_) if hasattr(self, 'page_num'): self.notebook.remove_page(self.notebook.page_num(self.hpaned)) self.notebook.set_current_page(0) for id_, widget in list(self.connected_ids.items()): widget.disconnect(id_) del self.page_num def on_activate(self, widget): if 'plugins' not in gajim.interface.instances: return if hasattr(self, 'page_num'): # 'Available' tab exists return self.installed_plugins_model = gajim.interface.instances[ 'plugins'].installed_plugins_model self.notebook = gajim.interface.instances['plugins'].plugins_notebook id_ = self.notebook.connect( 'switch-page', self.on_notebook_switch_page) self.connected_ids[id_] = self.notebook self.window = gajim.interface.instances['plugins'].window id_ = self.window.connect('destroy', self.on_win_destroy) self.connected_ids[id_] = self.window self.Gtk_BUILDER_FILE_PATH = self.local_file_path('config_dialog.ui') self.xml = gtk.Builder() self.xml.set_translation_domain('gajim_plugins') self.xml.add_objects_from_file(self.Gtk_BUILDER_FILE_PATH, ['hpaned2', 'image1', 'image2']) self.hpaned = self.xml.get_object('hpaned2') self.page_num = self.notebook.append_page(self.hpaned, gtk.Label(_( 'Emoticons'))) widgets_to_extract = ( 'set_name', 'available_treeview', 'homepage_linkbutton', 'inslall_upgrade_button', 'authors_label', 'converter_label',) for widget_name in widgets_to_extract: setattr(self, widget_name, self.xml.get_object(widget_name)) self.model = gtk.ListStore( gtk.gdk.Pixbuf, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_BOOLEAN) self.available_treeview.set_model(self.model) self.available_treeview.set_rules_hint(True) self.model.set_sort_column_id(1, gtk.SORT_ASCENDING) #self.progressbar.set_property('no-show-all', True) renderer = gtk.CellRendererText() col = gtk.TreeViewColumn(_('Name')) cell = gtk.CellRendererPixbuf() col.pack_start(cell, False) col.add_attribute(cell, 'pixbuf', C_PIXBUF) col.pack_start(renderer, True) col.add_attribute(renderer, 'text', C_NAME) col.set_property('expand', True) col.set_sizing(gtk.TREE_VIEW_COLUMN_GROW_ONLY) self.available_treeview.append_column(col) renderer = gtk.CellRendererToggle() renderer.set_property('activatable', True) renderer.connect('toggled', self.available_emoticons_toggled_cb) col = gtk.TreeViewColumn( _('Install /\nUpgrade'), renderer, active=C_UPGRADE) col.set_property('expand', False) col.set_resizable(False) self.available_treeview.append_column(col) selection = self.available_treeview.get_selection() selection.connect( 'changed', self.available_emoticons_treeview_selection_changed) selection.set_mode(gtk.SELECTION_SINGLE) self.emoticons_description_textview = ConversationTextview(None) sw = self.xml.get_object('scrolledwindow1') sw.add(self.emoticons_description_textview.tv) self.xml.connect_signals(self) self.window.show_all() def on_legend_button_clicked(self, widget): self.xml.get_object('scrolledwindow1').get_children()[0].destroy() treeview_selection = self.available_treeview.get_selection() model, iter = treeview_selection.get_selected() name = model.get_value(iter, C_NAME) button = self.xml.get_object('legend_button') if button.get_label() == _('Legend'): button.set_label(_('Description')) sys.path.append(os.path.join(self.tmp_dir, name)) import emoticons imp.reload(emoticons) self.emoticons_description_textview = gtk.TextView() sw = self.xml.get_object('scrolledwindow1') sw.add(self.emoticons_description_textview) sw.show_all() buff = self.emoticons_description_textview.get_buffer() for icon in emoticons.emoticons: icon_file = os.path.join(self.tmp_dir, name, icon) with open(icon_file, 'rb') as _file: data = _file.read() pbl = gtk.gdk.PixbufLoader() pbl.write(data) pbl.close() if icon.endswith('.gif'): img = gtk.Image() img.set_from_animation(pbl.get_animation()) img.show() anchor = buff.create_child_anchor(buff.get_end_iter()) self.emoticons_description_textview.add_child_at_anchor( img, anchor) else: buff.insert_pixbuf(buff.get_end_iter(), pbl.get_pixbuf()) text = ' , '.join(emoticons.emoticons[icon]) buff.insert(buff.get_end_iter(), text + '\n', -1) self.emoticons_description_textview.set_property('sensitive', True) sys.path.remove(os.path.join(self.tmp_dir, name)) else: self.emoticons_description_textview = ConversationTextview(None) sw = self.xml.get_object('scrolledwindow1') sw.add(self.emoticons_description_textview.tv) sw.show_all() button.set_label(_('Legend')) desc = _(model.get_value(iter, C_DESCRIPTION)) if not desc.startswith('
' + \ desc + ' ' desc = desc.replace('preview.image', ('file:' + os.path.join( self.tmp_dir, name, 'preview.png'))).replace('\n', '