From 3fa087742799766cdc8f7f715d438363f03ac795 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Wed, 13 Oct 2010 16:53:02 +0400 Subject: [PATCH] clients_icons. show icons in MUC --- clients_icons/clients_icons.py | 119 ++++++++++++++++++++++++++---- clients_icons/icons/qipinfium.png | Bin 2165 -> 1374 bytes clients_icons/icons/tkabber.png | Bin 1117 -> 1096 bytes 3 files changed, 106 insertions(+), 13 deletions(-) diff --git a/clients_icons/clients_icons.py b/clients_icons/clients_icons.py index f20c8ef..edb4c7b 100644 --- a/clients_icons/clients_icons.py +++ b/clients_icons/clients_icons.py @@ -13,6 +13,7 @@ import cell_renderer_image clients = { 'http://gajim.org': 'gajim.png', + 'http://gajim.org/caps': 'gajim.png', 'http://bombus-im.org/java': 'bombus.png', 'http://bombusmod.net.ru/caps': 'bombusmod.png', 'http://psi-dev.googlecode.com/caps': 'psiplus.png', @@ -26,7 +27,6 @@ clients = { 'http://voffk.org.ru/bombus': 'bombusplus.png', 'http://bombusng-qd.googlecode.com': 'bombusqd.png', 'http://tkabber.jabber.ru/': 'tkabber.png', - 'http://qip.ru/caps': 'qipinfium.png', 'http://pidgin.im/': 'pidgin.png', 'http://qutim.org': 'qutim.png', 'http://exodus.jabberstudio.org/caps': 'exodus.png', @@ -61,13 +61,14 @@ clients = { 'http://fatal-bot.spb.ru/caps': 'bot.png', 'http://svn.posix.ru/fatal-bot/trunk': 'bot.png', 'http://storm-bot.googlecode.com/svn/trunk': 'bot.png', - 'http://jabbrik.ru/caps': 'bot.png',#Utah Jabber Bot - 'http://jabrvista.net.ru': 'bot.png',#Utah Jabber Bot - 'http://xu-6.jabbrik.ru/caps': 'bot.png',#XU-6 Bot + 'http://jabbrik.ru/caps': 'bot.png', + 'http://jabrvista.net.ru': 'bot.png', + 'http://xu-6.jabbrik.ru/caps': 'bot.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://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', '-Z-r': 'siejc.png', 'telepathy.': 'telepathy.freedesktop.org.png', @@ -83,9 +84,51 @@ class ClientsIconsPlugin(GajimPlugin): def init(self): self.config_dialog = None#ClientsIconsPluginConfigDialog(self) self.events_handlers = {'CAPS_RECEIVED': - (ged.POSTCORE, self.caps_received), + (ged.POSTGUI, self.caps_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') def activate(self): @@ -93,17 +136,18 @@ class ClientsIconsPlugin(GajimPlugin): col = gtk.TreeViewColumn() roster.nb_ext_renderers += 1 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, roster._fill_pep_pixbuf_renderer, self.renderer_num) # remove old column roster.tree.remove_column(roster.tree.get_column(0)) # add new renderer in renderers list after location pixbuf renderer for renderer in roster.renderers_list: - if renderer[0] == 'location': + if renderer[0] == 'name': break 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 roster.fill_column(col) roster.tree.insert_column(col, 0) @@ -136,17 +180,66 @@ class ClientsIconsPlugin(GajimPlugin): if not contact: continue caps = contact.client_caps._node + iter_ = roster._get_contact_iter(jid, account, contact, + roster.model)[0] if not caps: + if roster.model[iter_][self.renderer_num] is not None: + continue + roster.model[iter_][self.renderer_num] = self.default_pixbuf continue client_icon = clients.get(caps.split('#')[0], None) if not client_icon: + roster.model[iter_][self.renderer_num] = self.default_pixbuf continue 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) - iter_ = roster._get_contact_iter(jid, account, contact, - roster.model)[0] roster.model[iter_][self.renderer_num] = pixbuf def presence_received(self, iq_obj): if iq_obj.new_show == 0: 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) diff --git a/clients_icons/icons/qipinfium.png b/clients_icons/icons/qipinfium.png index ea1374a2ac4d13c5b13371cdd19c85a86fad4c6f..cd68c21b0e8764c7da97b480523cea51f499a6ff 100644 GIT binary patch delta 1356 zcmV-S1+)6~5Z(%qBYyw^b5ch_0Itp)=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2igh@5gQIHeH|(Q00iDiL_t(I%axT`Ow?Bthrc^B zFyqW16^2b65f~5AYu+^lies)J%Ce68Jr3d;b;g8^0rXe2~4JIb=FdjXKdv!9-vjtd_Gi6f|@=d)@cF80Pl3jlfdJEs?}%#s2*tI zefvQQjelmw1_Mw7!Dkf!0)YU)n3U2dgb+^!PgYe3;U|1<$mJne2`3dVv`i?X<0Byi zZubbl=v3_^un@uo7=g&}njeT()rqKbVwbQZWf`YCZqpwRuP=e@)GRzcAA#|4fEXc! z1<+4<@u&c{=B#{sQ>ry#Ra3`+zrE?9EPQQ2^nZpI^UZ5kEh8g6^|3suAqB73N1xM0 zS;ciOl;8GV`m@)aZZV3il!O_M-ho@SSB{kkbosS+YJbdFyeP{wDQ>lQa#BgCSN35XZrys&mMcQhRoIswsaYUZ|<-EkOR)!`zd#tmgqrcs5zuVAwR~{)o?EntxfJ0}` z{c4Uf%}6m6teVx;)iWz5#)IGQlc@KF$r#0`5}>Uas0Uq~0kbg*)F6(Y`)D-i?|-#* z#+%LN_?A|?th!Ns4Jg)0DQkrgC8cNf8;DqwNARlc=aXk6Gc!^Ink1A^5T9ohnt>5e z6a|SSZD}Iz5jWK}cldDY76pyXL8z@BxByg5Hb^OOk>FM9`put|#>ZJQ6-9xRB!otw z_=8XbB*R0`Fj}I>v|12AQepz6t$({udsz|C0rW~K-MVnsgn)4&L|0`)=lkT@0)N0qN4LXw<$7I*!{r&gSJPI3+E@-u{zW9p6Twq1 zNY2cEV_VX!nOj0&_4xegbXwwKqKVLHx<@>t#TDm&Iu{12;i>4I1pf_3Cc=P%KSkvL O0000Z! delta 2135 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 Ze*tbFl|{1gli>gW002ovPDHLkV1iHz{}liL delta 1079 zcmV-71jzfy2;B&fB#}cDe*_OnL_t(I5sj5wOk7nIK-Zl+b7zKmQVNXaO`%}5MT?65 z)TRbaY|xk#>IaFEG$rbX(f;^hVl^h!82mA&?N_Z$s-!V#jeTMjwFQxil?M9YQC>3) zP+(pR^B&Jl#Q?()cXD&jIs5Fj_t|&vbERZ5$$Ijkgu)T*K0A3@e;x8>GtL9QOY?k? z46SD;tp`3k_j$q1Xxke-mk-yuM;^-$#Lz@EGj0~Muhf-s^fRZ_FC4_ya*!5$@cRD8 z1G4A%w#+?M3D=7_ow>L?FsHr2eWi<`zxIvRWZK_8Hzu9uSTedAu35dH&fov3Gw~mtQ1t9;MO~rxBaMa0Y9vWo&C#x2pjpygE{MLB zm%Zarj0$oFIBXGS12P(6?kMbHQD?%QF@me`%tKfDpE=0SUp5I&U^y!#;^U1;dn~Tq zn{Ux$)JcTIAv=flxV$p9{C09Hzd;sOij;}T-htP6zV_9&e>b-*hpOY0h&zU;R5TQ* z$JPiyLh_SS+D(?_Zx*Cc<`!c_;!)IMlBEO*gVQ!JN4a42EQhCn6A3aCA|SI~Y*UR* z6O2#fF&)e#Y3oFjbCEzINEknho(f{#Cy}hk%c1Hx1uWM53n5}6B4tBfH&XTm=BMNM z?-t^o)S=h=e{l`&BJ3$85ecL5)*#zhr2n+S*80ejgA{O0IkzwMF*)UCXx1zVS3y zuhlU+6JdNB!n$sV1j!23Qjrh2W*ZixboGaqz8Vxse_zqUDPUf|7uvanW4Fff{dU{L zFTcLRA03U{_j~aAljLf*QMJiRX*Pr+#7c8GN=egyDOgHHDp+VvPL}i=w4CUlf@x8m zW5dre<*WeT4z?QiQsI#C3e=33Ge6dzY!lIn@4Zsew)7|8Q+DVa?co@CsAZz~*j@k) z)mFlBfB3cw_x2)QIJKYNmB%Hs9l%1tJbn2CCL)^j4co%I1$1%lEfs%2Ka)M%V)_+O1Uj5#5?}HO1kZa=T=o9xTeIf8f)Pf-e{M63j0^maQ0#GFstar`bdP zMxC0Kw2~eyOsw|Y9;d4>lw*w=6up90Cpu3t5RVgAjKzIvsX~!H$3ofM+g(&Ttp`q9Zp)11-Me@1^Z9&-9S%p_WHNo++S+