we can now add an avatar in our vcard

This commit is contained in:
Yann Leboulanger 2005-06-06 22:58:06 +00:00
parent 47e3fd3ddc
commit 9e58a5b68c
3 changed files with 134 additions and 8 deletions

View File

@ -887,6 +887,7 @@ class Connection:
def send_vcard(self, vcard): def send_vcard(self, vcard):
if not self.connection: if not self.connection:
return return
print vcard
iq = common.xmpp.Iq(typ = 'set') iq = common.xmpp.Iq(typ = 'set')
iq2 = iq.setTag(common.xmpp.NS_VCARD + ' vCard') iq2 = iq.setTag(common.xmpp.NS_VCARD + ' vCard')
for i in vcard.keys(): for i in vcard.keys():

View File

@ -8058,23 +8058,76 @@ Custom</property>
<widget class="GtkExpander" id="expander6"> <widget class="GtkExpander" id="expander6">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="expanded">True</property> <property name="expanded">False</property>
<property name="spacing">0</property> <property name="spacing">0</property>
<child> <child>
<widget class="GtkImage" id="PHOTO_image"> <widget class="GtkHBox" id="hbox2963">
<property name="visible">True</property> <property name="visible">True</property>
<property name="xalign">0.5</property> <property name="homogeneous">False</property>
<property name="yalign">0.5</property> <property name="spacing">0</property>
<property name="xpad">0</property>
<property name="ypad">0</property> <child>
<widget class="GtkImage" id="PHOTO_image">
<property name="visible">True</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkVButtonBox" id="photo_vbuttonbox">
<property name="border_width">6</property>
<property name="visible">True</property>
<property name="layout_style">GTK_BUTTONBOX_SPREAD</property>
<property name="spacing">0</property>
<child>
<widget class="GtkButton" id="set_avatar_button">
<property name="visible">True</property>
<property name="can_default">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">Set Avatar</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<signal name="clicked" handler="on_set_avatar_button_clicked" last_modification_time="Mon, 06 Jun 2005 20:29:04 GMT"/>
</widget>
</child>
<child>
<widget class="GtkButton" id="clear_button">
<property name="visible">True</property>
<property name="can_default">True</property>
<property name="can_focus">True</property>
<property name="label">gtk-clear</property>
<property name="use_stock">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<signal name="clicked" handler="on_clear_button_clicked" last_modification_time="Mon, 06 Jun 2005 20:28:59 GMT"/>
</widget>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
</widget> </widget>
</child> </child>
<child> <child>
<widget class="GtkLabel" id="label310"> <widget class="GtkLabel" id="label310">
<property name="visible">True</property> <property name="visible">True</property>
<property name="label" translatable="yes">Photo</property> <property name="label" translatable="yes">Avatar</property>
<property name="use_underline">False</property> <property name="use_underline">False</property>
<property name="use_markup">False</property> <property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property> <property name="justify">GTK_JUSTIFY_LEFT</property>

View File

@ -21,6 +21,8 @@ import gtk
import gtk.glade import gtk.glade
import urllib import urllib
import base64 import base64
import mimetypes
import os
from common import gajim from common import gajim
from common import i18n from common import i18n
_ = i18n._ _ = i18n._
@ -69,6 +71,62 @@ class Vcard_window:
' '.join(no_log_for)) ' '.join(no_log_for))
self.window.destroy() self.window.destroy()
def on_clear_button_clicked(self, widget):
# empty the image
self.xml.get_widget('PHOTO_image').set_from_pixbuf(None)
def image_is_ok(self, image):
if not os.path.exists(image):
return False
return True
def on_set_avatar_button_clicked(self, widget):
dialog = gtk.FileChooserDialog('Choose avatar', None,
gtk.FILE_CHOOSER_ACTION_OPEN,
(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
gtk.STOCK_OPEN, gtk.RESPONSE_OK))
dialog.set_default_response(gtk.RESPONSE_OK)
filter = gtk.FileFilter()
filter.set_name('All files')
filter.add_pattern('*')
dialog.add_filter(filter)
filter = gtk.FileFilter()
filter.set_name('Images')
filter.add_mime_type('image/png')
filter.add_mime_type('image/jpeg')
filter.add_mime_type('image/gif')
filter.add_pattern('*.png')
filter.add_pattern('*.jpg')
filter.add_pattern('*.gif')
filter.add_pattern('*.tif')
filter.add_pattern('*.xpm')
dialog.add_filter(filter)
dialog.set_filter(filter)
ok = False
while not ok:
response = dialog.run()
if response == gtk.RESPONSE_OK:
file = dialog.get_filename()
if self.image_is_ok(file):
ok = True
else:
ok = True
dialog.destroy()
if file:
fd = open(file)
data = fd.read()
pixbufloader = gtk.gdk.PixbufLoader()
pixbufloader.write(data)
pixbufloader.close()
pixbuf = pixbufloader.get_pixbuf()
image = self.xml.get_widget('PHOTO_image')
image.set_from_pixbuf(pixbuf)
self.avatar_encoded = base64.encodestring(data)
self.avatar_mime_type = mimetypes.guess_type(file)[0]
def set_value(self, entry_name, value): def set_value(self, entry_name, value):
try: try:
self.xml.get_widget(entry_name).set_text(value) self.xml.get_widget(entry_name).set_text(value)
@ -81,8 +139,10 @@ class Vcard_window:
if i == 'PHOTO': if i == 'PHOTO':
img_decoded = None img_decoded = None
if vcard[i].has_key('BINVAL'): if vcard[i].has_key('BINVAL'):
img_encoded = vcard[i]['BINVAL']
self.avatar_encoded = img_encoded
self.avatar_mime_type = vcard[i]['TYPE']
try: try:
img_encoded = vcard[i]['BINVAL']
img_decoded = base64.decodestring(img_encoded) img_decoded = base64.decodestring(img_encoded)
except: except:
pass pass
@ -204,12 +264,19 @@ class Vcard_window:
txt = self.xml.get_widget(e + '_entry').get_text() txt = self.xml.get_widget(e + '_entry').get_text()
if txt != '': if txt != '':
vcard = self.add_to_vcard(vcard, e, txt) vcard = self.add_to_vcard(vcard, e, txt)
# DESC textview
buffer = self.xml.get_widget('DESC_textview').get_buffer() buffer = self.xml.get_widget('DESC_textview').get_buffer()
start_iter = buffer.get_start_iter() start_iter = buffer.get_start_iter()
end_iter = buffer.get_end_iter() end_iter = buffer.get_end_iter()
txt = buffer.get_text(start_iter, end_iter, 0) txt = buffer.get_text(start_iter, end_iter, 0)
if txt != '': if txt != '':
vcard['DESC'] = txt vcard['DESC'] = txt
# Avatar
if self.avatar_encoded:
vcard['PHOTO'] = {'TYPE': self.avatar_mime_type,
'BINVAL': self.avatar_encoded}
return vcard return vcard
def on_publish_button_clicked(self, widget): def on_publish_button_clicked(self, widget):
@ -263,6 +330,8 @@ class Vcard_window:
#close button at the end #close button at the end
button = self.xml.get_widget('close_button') button = self.xml.get_widget('close_button')
information_hbuttonbox.reorder_child(button, 2) information_hbuttonbox.reorder_child(button, 2)
#photo_vbuttonbox visible
self.xml.get_widget('photo_vbuttonbox').show()
#make all entries editable #make all entries editable
entries = ['FN', 'NICKNAME', 'BDAY', 'EMAIL_HOME_USERID', 'URL', entries = ['FN', 'NICKNAME', 'BDAY', 'EMAIL_HOME_USERID', 'URL',
@ -283,10 +352,13 @@ class Vcard_window:
def __init__(self, user, plugin, account, vcard = False): def __init__(self, user, plugin, account, vcard = False):
self.xml = gtk.glade.XML(GTKGUI_GLADE, 'vcard_information_window', APP) self.xml = gtk.glade.XML(GTKGUI_GLADE, 'vcard_information_window', APP)
self.window = self.xml.get_widget('vcard_information_window') self.window = self.xml.get_widget('vcard_information_window')
self.xml.get_widget('photo_vbuttonbox').set_no_show_all(True)
self.plugin = plugin self.plugin = plugin
self.user = user #don't use it if vcard is true self.user = user #don't use it if vcard is true
self.account = account self.account = account
self.vcard = vcard self.vcard = vcard
self.avatar_mime_type = None
self.avatar_encoded = None
if vcard: if vcard:
self.jid = user self.jid = user