[Michele Campeotto] we now have an emoticon selector!

This commit is contained in:
Nikos Kouremenos 2005-11-15 11:52:40 +00:00
parent 518391c2aa
commit 03684ad385
4 changed files with 167 additions and 20 deletions

View file

@ -22,6 +22,7 @@ import gtk.glade
import pango
import gobject
import time
import math
import dialogs
import history_window
@ -89,10 +90,22 @@ class Chat:
self.notebook.set_show_tabs(gajim.config.get('tabs_always_visible'))
self.notebook.set_show_border(gajim.config.get('tabs_border'))
if gajim.config.get('useemoticons'):
self.emoticons_menu = self.emoticons_menu()
# muc attention states (when we are mentioned in a muc)
# if the room jid is in the list, the room has mentioned us
self.muc_attentions = []
def update_emoticons_button(self):
for jid in self.xmls:
if gajim.config.get('useemoticons'):
self.xmls[jid].get_widget('emoticons_button').show()
self.xmls[jid].get_widget('emoticons_button').set_no_show_all(False)
else:
self.xmls[jid].get_widget('emoticons_button').hide()
self.xmls[jid].get_widget('emoticons_button').set_no_show_all(True)
def update_font(self):
font = pango.FontDescription(gajim.config.get('conversation_font'))
for jid in self.xmls:
@ -353,6 +366,10 @@ class Chat:
menu.popup(None, None, self.position_actions_menu, 1, 0)
menu.show_all()
def on_emoticons_button_clicked(self, widget):
'''popup emoticons menu'''
self.emoticons_menu.popup(None, None, None, 1, 0)
def position_actions_menu(self, menu):
# here I get the coordinates of the button relative to
# window (self.window)
@ -425,6 +442,35 @@ class Chat:
return menu
def emoticons_menu(self):
menu = gtk.Menu()
def append_emoticon(w, d):
jid = self.get_active_jid()
message_textview = self.message_textviews[jid]
message_textview.get_buffer().insert_at_cursor(" %s " % d)
message_textview.grab_focus()
counter = 0
# Calculate the side lenght of the popup to make it a square
size = int(round(math.sqrt(len(gajim.interface.emoticons_images))))
for image in gajim.interface.emoticons_images:
item = gtk.MenuItem()
img = gtk.Image()
if type(image[1]) == gtk.gdk.PixbufAnimation:
img.set_from_animation(image[1])
else:
img.set_from_pixbuf(image[1])
item.add(img)
item.connect('activate', append_emoticon, image[0])
#FIXME: add tooltip with ascii
menu.attach(item,
counter % size, counter % size + 1,
counter / size, counter / size + 1)
counter += 1
menu.show_all()
return menu
def popup_menu(self, event):
menu = self.prepare_context_menu()
# common menuitems (tab switches)
@ -645,6 +691,13 @@ class Chat:
dialogs.ErrorDialog(unicode(msg), _('If that is not your language for which you want to highlight misspelled words, then please set your $LANG as appropriate. Eg. for French do export LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to make it global in /etc/profile.\n\nHighlighting misspelled words feature will not be used')).get_response()
gajim.config.set('use_speller', False)
if gajim.config.get('useemoticons'):
self.xmls[jid].get_widget('emoticons_button').show()
self.xmls[jid].get_widget('emoticons_button').set_no_show_all(False)
else:
self.xmls[jid].get_widget('emoticons_button').hide()
self.xmls[jid].get_widget('emoticons_button').set_no_show_all(True)
conv_textview.modify_font(font)
conv_buffer = conv_textview.get_buffer()
end_iter = conv_buffer.get_end_iter()
@ -744,6 +797,16 @@ class Chat:
elif event.keyval == gtk.keysyms.c and \
(event.state & gtk.gdk.MOD1_MASK): # alt + C toggles compact view
self.set_compact_view(not self.compact_view_current_state)
elif event.keyval == gtk.keysyms.e and \
(event.state & gtk.gdk.MOD1_MASK): # alt + E opens emoticons menu
if gajim.config.get('useemoticons'):
parent = self.message_textviews[jid]
def set_emoticons_menu_position(w, parent=parent):
window = parent.get_window(gtk.TEXT_WINDOW_WIDGET)
origin = window.get_origin()
size = window.get_size()
return (origin[0], origin[1] + size[1], 0)
self.emoticons_menu.popup(None, None, set_emoticons_menu_position, 1, 0)
elif event.keyval == gtk.keysyms.Page_Down:
if event.state & gtk.gdk.SHIFT_MASK: # SHIFT + PAGE DOWN
conv_textview = self.conversation_textviews[jid]

View file

@ -501,7 +501,19 @@ class PreferencesWindow:
def on_use_emoticons_checkbutton_toggled(self, widget):
self.on_checkbutton_toggled(widget, 'useemoticons',
[self.xml.get_widget('add_remove_emoticons_button')])
self.update_emoticons_button()
def update_emoticons_button(self):
'''Update emoticons button in Opened Chat Windows'''
for a in gajim.connections:
for kind in ('chats', 'gc'):
windows = gajim.interface.instances[a][kind]
if windows.has_key('tabbed'):
windows['tabbed'].update_emoticons_button()
else:
for jid in windows.keys():
windows[jid].update_emoticons_button()
def on_add_remove_emoticons_button_clicked(self, widget):
if gajim.interface.instances.has_key('manage_emots'):
gajim.interface.instances['manage_emots'].window.present()
@ -1947,7 +1959,7 @@ class ManageEmoticonsWindow:
self.xml.signal_autoconnect(self)
def on_manage_emoticons_window_destroy(self, widget):
gajim.interface.init_regexp() # update regexp [emoticons included]
gajim.interface.init_emoticons() # update emoticons
# remove us from open windows
del gajim.interface.instances['manage_emots']

View file

@ -1064,16 +1064,17 @@ class Interface:
basic_pattern = links + mail + formatting
self.basic_pattern_re = sre.compile(basic_pattern, sre.IGNORECASE)
# When an emoticon is bordered by an alpha-numeric character it is NOT
# expanded. e.g., foo:) NO, foo :) YES, (brb) NO, (:)) YES, etc.
emoticons_pattern = '(?<!\w)(?:'
# sort keys by length so :qwe emot is checked before :q
keys = self.emoticons.keys()
keys.sort(self.on_emoticon_sort)
for emoticon in keys: # travel thru emoticons list
emoticon_escaped = sre.escape(emoticon) # espace regexp metachars
emoticons_pattern += emoticon_escaped + '|' # | means or in regexp
emoticons_pattern = emoticons_pattern[:-1] + ')(?!\w)'
if gajim.config.get('useemoticons'):
# When an emoticon is bordered by an alpha-numeric character it is NOT
# expanded. e.g., foo:) NO, foo :) YES, (brb) NO, (:)) YES, etc.
emoticons_pattern = '(?<!\w)(?:'
# sort keys by length so :qwe emot is checked before :q
keys = self.emoticons.keys()
keys.sort(self.on_emoticon_sort)
for emoticon in keys: # travel thru emoticons list
emoticon_escaped = sre.escape(emoticon) # espace regexp metachars
emoticons_pattern += emoticon_escaped + '|'# | means or in regexp
emoticons_pattern = emoticons_pattern[:-1] + ')(?!\w)'
# because emoticons match later (in the string) they need to be after
# basic matches that may occur earlier
@ -1095,19 +1096,26 @@ class Interface:
def on_launch_browser_mailer(self, widget, url, kind):
helpers.launch_browser_mailer(kind, url)
def init_regexp(self):
#initialize emoticons dictionary
def init_emoticons(self):
if not gajim.config.get('useemoticons'):
return
#initialize emoticons dictionary and unique images list
self.emoticons_images = list()
self.emoticons = dict()
emots = gajim.config.get_per('emoticons')
for emot in emots:
emot_file = gajim.config.get_per('emoticons', emot, 'path')
if not self.image_is_ok(emot_file):
continue
if not emot_file in self.emoticons.values():
pix = gtk.gdk.pixbuf_new_from_file(emot_file)
if emot_file.endswith('.gif'):
pix = gtk.gdk.PixbufAnimation(emot_file)
self.emoticons_images.append((emot, pix))
self.emoticons[emot.upper()] = emot_file
# update regular expressions
self.make_regexps()
def register_handlers(self):
self.handlers = {
'ROSTER': self.handle_event_roster,
@ -1247,7 +1255,7 @@ class Interface:
'grouptextcolor', 'groupbgcolor', 'groupfont', 'groupfontattrs',
'contacttextcolor', 'contactbgcolor', 'contactfont', 'contactfontattrs',
'bannertextcolor', 'bannerbgcolor']
default = gajim.config.themes_default
for theme_name in default:
gajim.config.add_per('themes', theme_name)
@ -1340,7 +1348,8 @@ class Interface:
if gajim.config.get('check_for_new_version'):
check_for_new_version.Check_for_new_version_dialog()
self.init_regexp()
self.init_emoticons()
self.make_regexps()
# get instances for windows/dialogs that will show_all()/hide()
self.instances['file_transfers'] = dialogs.FileTransfersWindow()

View file

@ -9790,6 +9790,38 @@ topic</property>
<property name="homogeneous">False</property>
<property name="spacing">6</property>
<child>
<widget class="GtkButton" id="emoticons_button">
<property name="visible">True</property>
<property name="tooltip" translatable="yes">Click to insert an emoticon</property>
<property name="can_focus">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<accessibility>
<atkproperty name="AtkObject::accessible_name" translatable="yes">Emoticons</atkproperty>
</accessibility>
<signal name="clicked" handler="on_emoticons_button_clicked" last_modification_time="Wed, 14 Sep 2005 15:16:41 GMT"/>
<child>
<widget class="GtkImage" id="image1239">
<property name="visible">True</property>
<property name="stock">gtk-about</property>
<property name="icon_size">4</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="actions_button">
<property name="visible">True</property>
@ -11318,6 +11350,37 @@ Status message</property>
<property name="homogeneous">False</property>
<property name="spacing">6</property>
<child>
<widget class="GtkButton" id="emoticons_button">
<property name="visible">True</property>
<property name="tooltip" translatable="yes">Click to insert an emoticon</property>
<property name="can_focus">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<accessibility>
<atkproperty name="AtkObject::accessible_name" translatable="yes">Emoticons</atkproperty>
</accessibility>
<signal name="clicked" handler="on_emoticons_button_clicked" last_modification_time="Wed, 14 Sep 2005 15:16:41 GMT"/>
<child>
<widget class="GtkImage" id="image1239">
<property name="visible">True</property>
<property name="stock">gtk-about</property>
<property name="icon_size">4</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="actions_button">
<property name="visible">True</property>