clients_icons. show icons in MUC

This commit is contained in:
Denis Fomin
2010-10-13 16:53:02 +04:00
parent ad4f5f4d7c
commit 3fa0877427
3 changed files with 106 additions and 13 deletions

View File

@@ -13,6 +13,7 @@ import cell_renderer_image
clients = { clients = {
'http://gajim.org': 'gajim.png', 'http://gajim.org': 'gajim.png',
'http://gajim.org/caps': 'gajim.png',
'http://bombus-im.org/java': 'bombus.png', 'http://bombus-im.org/java': 'bombus.png',
'http://bombusmod.net.ru/caps': 'bombusmod.png', 'http://bombusmod.net.ru/caps': 'bombusmod.png',
'http://psi-dev.googlecode.com/caps': 'psiplus.png', 'http://psi-dev.googlecode.com/caps': 'psiplus.png',
@@ -26,7 +27,6 @@ clients = {
'http://voffk.org.ru/bombus': 'bombusplus.png', 'http://voffk.org.ru/bombus': 'bombusplus.png',
'http://bombusng-qd.googlecode.com': 'bombusqd.png', 'http://bombusng-qd.googlecode.com': 'bombusqd.png',
'http://tkabber.jabber.ru/': 'tkabber.png', 'http://tkabber.jabber.ru/': 'tkabber.png',
'http://qip.ru/caps': 'qipinfium.png',
'http://pidgin.im/': 'pidgin.png', 'http://pidgin.im/': 'pidgin.png',
'http://qutim.org': 'qutim.png', 'http://qutim.org': 'qutim.png',
'http://exodus.jabberstudio.org/caps': 'exodus.png', 'http://exodus.jabberstudio.org/caps': 'exodus.png',
@@ -61,13 +61,14 @@ clients = {
'http://fatal-bot.spb.ru/caps': 'bot.png', 'http://fatal-bot.spb.ru/caps': 'bot.png',
'http://svn.posix.ru/fatal-bot/trunk': 'bot.png', 'http://svn.posix.ru/fatal-bot/trunk': 'bot.png',
'http://storm-bot.googlecode.com/svn/trunk': 'bot.png', 'http://storm-bot.googlecode.com/svn/trunk': 'bot.png',
'http://jabbrik.ru/caps': 'bot.png',#Utah Jabber Bot 'http://jabbrik.ru/caps': 'bot.png',
'http://jabrvista.net.ru': 'bot.png',#Utah Jabber Bot 'http://jabrvista.net.ru': 'bot.png',
'http://xu-6.jabbrik.ru/caps': 'bot.png',#XU-6 Bot 'http://xu-6.jabbrik.ru/caps': 'bot.png',
'http://jabber.pdg.pl/caps': 'bombus-klub.png', 'http://jabber.pdg.pl/caps': 'bombus-klub.png',
'http://klub54.wen.ru': 'bombus-klub.png',#BombusKlub 'http://klub54.wen.ru': 'bombus-klub.png',
'http://aqq.eu/': 'aqq.png', 'http://aqq.eu/': 'aqq.png',
'http://2010.qip.ru/caps': 'qipinfium.png',#QIP 2010 'http://2010.qip.ru/caps': 'qipinfium.png',
'http://qip.ru/caps': 'qipinfium.png',
'http://glu.net/': 'glu.png', 'http://glu.net/': 'glu.png',
'-Z-r': 'siejc.png', '-Z-r': 'siejc.png',
'telepathy.': 'telepathy.freedesktop.org.png', 'telepathy.': 'telepathy.freedesktop.org.png',
@@ -83,9 +84,51 @@ class ClientsIconsPlugin(GajimPlugin):
def init(self): def init(self):
self.config_dialog = None#ClientsIconsPluginConfigDialog(self) self.config_dialog = None#ClientsIconsPluginConfigDialog(self)
self.events_handlers = {'CAPS_RECEIVED': self.events_handlers = {'CAPS_RECEIVED':
(ged.POSTCORE, self.caps_received), (ged.POSTGUI, self.caps_received),
'presence-received': 'presence-received':
(ged.POSTCORE, self.presence_received),} (ged.POSTGUI, self.presence_received),
'gc-presence-received':
(ged.POSTGUI, self.gc_presence_received),}
self.gui_extension_points = {
'groupchat_control' : (self.connect_with_groupchat_control,
self.disconnect_from_groupchat_control)}
self.groupchats_tree_is_transformed = False
theme = gtk.icon_theme_get_default()
self.default_pixbuf = theme.load_icon('gtk-dialog-question', 16,
gtk.ICON_LOOKUP_USE_BUILTIN)
@log_calls('ClientsIconsPlugin')
def connect_with_groupchat_control(self, chat_control):
chat_control.nb_ext_renderers += 1
chat_control.columns += [gtk.gdk.Pixbuf]
self.groupchats_tree_is_transformed = True
self.chat_control = chat_control
col = gtk.TreeViewColumn()
self.muc_renderer_num = 4 + chat_control.nb_ext_renderers
client_icon_rend = ('client_icon', gtk.CellRendererPixbuf(), False,
'pixbuf', self.muc_renderer_num,
self.tree_cell_data_func, chat_control)
# remove old column
chat_control.list_treeview.remove_column(
chat_control.list_treeview.get_column(0))
# add new renderer in renderers list after location pixbuf renderer
for renderer in chat_control.renderers_list:
if renderer[0] == 'name':
break
num = chat_control.renderers_list.index(renderer)
chat_control.renderers_list.insert(num, client_icon_rend)
# fill and append column
chat_control.fill_column(col)
chat_control.list_treeview.insert_column(col, 0)
# redraw roster
store = gtk.TreeStore(*chat_control.columns)
store.set_sort_func(1, chat_control.tree_compare_iters)
store.set_sort_column_id(1, gtk.SORT_ASCENDING)
chat_control.list_treeview.set_model(store)
@log_calls('ClientsIconsPlugin')
def disconnect_from_groupchat_control(self, chat_control):
pass
@log_calls('ClientsIconsPlugin') @log_calls('ClientsIconsPlugin')
def activate(self): def activate(self):
@@ -93,17 +136,18 @@ class ClientsIconsPlugin(GajimPlugin):
col = gtk.TreeViewColumn() col = gtk.TreeViewColumn()
roster.nb_ext_renderers += 1 roster.nb_ext_renderers += 1
self.renderer_num = 10 + roster.nb_ext_renderers self.renderer_num = 10 + roster.nb_ext_renderers
client_icon_rend = ('client_icon', gtk.CellRendererPixbuf(), False, self.renderer = gtk.CellRendererPixbuf()
client_icon_rend = ('client_icon', self.renderer, False,
'pixbuf', self.renderer_num, 'pixbuf', self.renderer_num,
roster._fill_pep_pixbuf_renderer, self.renderer_num) roster._fill_pep_pixbuf_renderer, self.renderer_num)
# remove old column # remove old column
roster.tree.remove_column(roster.tree.get_column(0)) roster.tree.remove_column(roster.tree.get_column(0))
# add new renderer in renderers list after location pixbuf renderer # add new renderer in renderers list after location pixbuf renderer
for renderer in roster.renderers_list: for renderer in roster.renderers_list:
if renderer[0] == 'location': if renderer[0] == 'name':
break break
num = roster.renderers_list.index(renderer) num = roster.renderers_list.index(renderer)
roster.renderers_list.insert(num+1, client_icon_rend) roster.renderers_list.insert(num, client_icon_rend)
# fill and append column # fill and append column
roster.fill_column(col) roster.fill_column(col)
roster.tree.insert_column(col, 0) roster.tree.insert_column(col, 0)
@@ -136,17 +180,66 @@ class ClientsIconsPlugin(GajimPlugin):
if not contact: if not contact:
continue continue
caps = contact.client_caps._node caps = contact.client_caps._node
iter_ = roster._get_contact_iter(jid, account, contact,
roster.model)[0]
if not caps: if not caps:
if roster.model[iter_][self.renderer_num] is not None:
continue
roster.model[iter_][self.renderer_num] = self.default_pixbuf
continue continue
client_icon = clients.get(caps.split('#')[0], None) client_icon = clients.get(caps.split('#')[0], None)
if not client_icon: if not client_icon:
roster.model[iter_][self.renderer_num] = self.default_pixbuf
continue continue
icon_path = os.path.join(self.local_file_path('icons'), client_icon) icon_path = os.path.join(self.local_file_path('icons'), client_icon)
pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(icon_path, 16, 16) pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(icon_path, 16, 16)
iter_ = roster._get_contact_iter(jid, account, contact,
roster.model)[0]
roster.model[iter_][self.renderer_num] = pixbuf roster.model[iter_][self.renderer_num] = pixbuf
def presence_received(self, iq_obj): def presence_received(self, iq_obj):
if iq_obj.new_show == 0: if iq_obj.new_show == 0:
self.caps_received(iq_obj.conn.name, [iq_obj.fjid]) self.caps_received(iq_obj.conn.name, [iq_obj.fjid])
return
def gc_presence_received(self, iq_obj):
contact = gajim.contacts.get_gc_contact(iq_obj.conn.name,
iq_obj.presence_obj.jid, iq_obj.nick.decode('utf-8'))
if not contact:
return
caps = None
tag = iq_obj.iq_obj.getTags('c')
if tag:
caps = tag[0].getAttr('node')
iter_ = iq_obj.gc_control.get_contact_iter(iq_obj.nick.decode('utf-8'))
model = iq_obj.gc_control.list_treeview.get_model()
if model[iter_][self.muc_renderer_num] is not None:
return
if not caps:
model[iter_][self.muc_renderer_num] = self.default_pixbuf
return
client_icon = clients.get(caps.split('#')[0], None)
if not client_icon:
model[iter_][self.muc_renderer_num] = self.default_pixbuf
else:
icon_path = os.path.join(self.local_file_path('icons'),
client_icon)
pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(icon_path, 16, 16)
model[iter_][self.muc_renderer_num] = pixbuf
def tree_cell_data_func(self, column, renderer, model, iter_, control):
if not model.iter_parent(iter_):
renderer.set_property('visible', False)
return
renderer.set_property('visible', True)
contact = gajim.contacts.get_gc_contact(control.account,
control.room_jid, model[iter_][1].decode('utf-8'))
if not contact:
return
bgcolor = gajim.config.get_per('themes', gajim.config.get(
'roster_theme'), 'contactbgcolor')
if bgcolor:
renderer.set_property('cell-background', bgcolor)
else:
renderer.set_property('cell-background', None)
renderer.set_property('width', 16)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB