Show activity in roster.

This commit is contained in:
js 2008-07-29 02:32:57 +00:00
parent d3b86d2105
commit c078f11fe0
5 changed files with 154 additions and 21 deletions

View file

@ -89,6 +89,23 @@
<property name="position">2</property>
</packing>
</child>
<child>
<widget class="GtkCheckButton" id="show_activity_in_roster_checkbutton">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="tooltip" translatable="yes">If checked, Gajim will display the activity of contacts in the roster window</property>
<property name="label" translatable="yes">Display _activity of contacts in roster</property>
<property name="use_underline">True</property>
<property name="response_id">0</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_show_activity_in_roster_checkbutton_toggled"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">3</property>
</packing>
</child>
<child>
<widget class="GtkCheckButton" id="show_tunes_in_roster_checkbutton">
<property name="visible">True</property>
@ -103,7 +120,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">3</property>
<property name="position">4</property>
</packing>
</child>
<child>
@ -120,7 +137,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">4</property>
<property name="position">5</property>
</packing>
</child>
</widget>

View file

@ -216,6 +216,7 @@ class Config:
'show_status_msgs_in_roster': [opt_bool, True, _('If True, Gajim will display the status message, if not empty, for every contact under the contact name in roster window.'), True],
'show_avatars_in_roster': [opt_bool, True, '', True],
'show_mood_in_roster': [opt_bool, True, '', True],
'show_activity_in_roster': [opt_bool, True, '', True],
'show_tunes_in_roster': [opt_bool, True, '', True],
'avatar_position_in_roster': [opt_str, 'right', _('Define the position of the avatar in roster. Can be left or right'), True],
'ask_avatars_on_startup': [opt_bool, True, _('If True, Gajim will ask for avatar each contact that did not have an avatar last time or has one cached that is too old.')],

View file

@ -323,10 +323,10 @@ def user_activity(items, name, jid):
if contact.activity.has_key('text'):
del contact.activity['text']
#if jid == gajim.get_jid_from_account(name):
# gajim.interface.roster.draw_account(name)
#else:
# gajim.interface.roster.draw_activity(user, name)
if jid == gajim.get_jid_from_account(name):
gajim.interface.roster.draw_account(name)
else:
gajim.interface.roster.draw_activity(user, name)
ctrl = gajim.interface.msg_win_mgr.get_control(user, name)
if ctrl:
ctrl.update_activity()

View file

@ -105,6 +105,11 @@ class PreferencesWindow:
self.xml.get_widget('show_mood_in_roster_checkbutton'). \
set_active(st)
# Display activity in roster
st = gajim.config.get('show_activity_in_roster')
self.xml.get_widget('show_activity_in_roster_checkbutton'). \
set_active(st)
# Display tunes in roster
st = gajim.config.get('show_tunes_in_roster')
self.xml.get_widget('show_tunes_in_roster_checkbutton'). \
@ -542,6 +547,10 @@ class PreferencesWindow:
self.on_checkbutton_toggled(widget, 'show_mood_in_roster')
gajim.interface.roster.setup_and_draw_roster()
def on_show_activity_in_roster_checkbutton_toggled(self, widget):
self.on_checkbutton_toggled(widget, 'show_activity_in_roster')
gajim.interface.roster.setup_and_draw_roster()
def on_show_tunes_in_roster_checkbutton_toggled(self, widget):
self.on_checkbutton_toggled(widget, 'show_tunes_in_roster')
gajim.interface.roster.setup_and_draw_roster()

View file

@ -62,7 +62,7 @@ if dbus_support.supported:
from lastfm_track_listener import LastFMTrackListener
from common.xmpp.protocol import NS_COMMANDS, NS_FILE, NS_MUC
from common.pep import MOODS
from common.pep import MOODS, ACTIVITIES
try:
from osx import syncmenu
@ -77,10 +77,11 @@ C_TYPE, # account, group or contact?
C_JID, # the jid of the row
C_ACCOUNT, # cellrenderer text that holds account name
C_MOOD_PIXBUF,
C_ACTIVITY_PIXBUF,
C_TUNE_PIXBUF,
C_AVATAR_PIXBUF, # avatar_pixbuf
C_PADLOCK_PIXBUF, # use for account row only
) = range(9)
) = range(10)
class RosterWindow:
'''Class for main window of the GTK+ interface'''
@ -290,7 +291,7 @@ class RosterWindow:
self.model.append(None, [
gajim.interface.jabber_state_images['16'][show],
_('Merged accounts'), 'account', '', 'all',
None, None, None, None])
None, None, None, None, None])
else:
show = gajim.SHOW_LIST[gajim.connections[account]. \
connected]
@ -306,7 +307,8 @@ class RosterWindow:
self.model.append(None, [
gajim.interface.jabber_state_images['16'][show],
gobject.markup_escape_text(account), 'account',
our_jid, account, None, None, None, tls_pixbuf])
our_jid, account, None, None, None, None,
tls_pixbuf])
self.draw_account(account)
@ -370,7 +372,7 @@ class RosterWindow:
it = self.model.append(child_iter, (None,
contact.get_shown_name(), 'contact',
contact.jid, account, None, None, None,
None))
None, None))
added_iters.append(it)
else:
# We are a normal contact. Add us to our groups.
@ -389,7 +391,7 @@ class RosterWindow:
['closed'], gobject. \
markup_escape_text(group),
'group', group, account, None,
None, None, None])
None, None, None, None])
self.draw_group(group, account)
if contact.is_transport():
@ -404,7 +406,7 @@ class RosterWindow:
i_ = self.model.append(child_iterG, (None,
contact.get_shown_name(), typestr,
contact.jid, account, None, None, None,
None))
None, None))
added_iters.append(i_)
# Restore the group expand state
@ -612,6 +614,7 @@ class RosterWindow:
for c, acc in brothers:
self.draw_contact(c.jid, acc)
self.draw_mood(c.jid, acc)
self.draw_activity(c.jid, acc)
self.draw_tune(c.jid, acc)
self.draw_avatar(c.jid, acc)
@ -654,10 +657,12 @@ class RosterWindow:
child_iterA = self._get_account_iter(account, self.model)
self.model.append(child_iterA, (None, gajim.nicks[account],
'self_contact', jid, account, None, None, None, None))
'self_contact', jid, account, None, None, None, None,
None))
self.draw_contact(jid, account)
self.draw_mood(jid, account)
self.draw_activity(jid, account)
self.draw_tune(jid, account)
self.draw_avatar(jid, account)
self.draw_account(account)
@ -717,6 +722,7 @@ class RosterWindow:
for c, acc in contacts:
self.draw_contact(c.jid, acc)
self.draw_mood(c.jid, acc)
self.draw_activity(c.jid, acc)
self.draw_tune(c.jid, acc)
self.draw_avatar(c.jid, acc)
for group in contact.get_shown_groups():
@ -775,6 +781,7 @@ class RosterWindow:
for c, acc in brothers:
self.draw_contact(c.jid, acc)
self.draw_mood(c.jid, acc)
self.draw_activity(c.jid, acc)
self.draw_tune(c.jid, acc)
self.draw_avatar(c.jid, acc)
@ -983,11 +990,11 @@ class RosterWindow:
if gajim.config.get('show_mood_in_roster') \
and gajim.connections[account].mood.has_key('mood') \
and gajim.connections[account].mood['mood'] in MOODS:
and gajim.connections[account].mood['mood'].strip() in MOODS:
self.model[child_iter][C_MOOD_PIXBUF] = \
gtkgui_helpers.load_mood_icon(
gajim.connections[account].mood['mood']). \
get_pixbuf()
gajim.connections[account].mood['mood']. \
strip()).get_pixbuf()
elif gajim.config.get('show_mood_in_roster') \
and gajim.connections[account].mood.has_key('mood'):
self.model[child_iter][C_MOOD_PIXBUF] = \
@ -996,6 +1003,22 @@ class RosterWindow:
else:
self.model[child_iter][C_MOOD_PIXBUF] = None
if gajim.config.get('show_activity_in_roster') \
and gajim.connections[account].activity.has_key('activity') \
and gajim.connections[account].activity['activity'].strip() \
in ACTIVITIES:
self.model[child_iter][C_ACTIVITY_PIXBUF] = \
gtkgui_helpers.load_activity_icon(
gajim.connections[account]. \
activity['activity'].strip()).get_pixbuf()
elif gajim.config.get('show_activity_in_roster') \
and gajim.connections[account].activity.has_key('activity'):
self.model[child_iter][C_ACTIVITY_PIXBUF] = \
gtkgui_helpers.load_activity_icon('unknown'). \
get_pixbuf()
else:
self.model[child_iter][C_ACTIVITY_PIXBUF] = None
if gajim.config.get('show_tunes_in_roster') \
and (gajim.connections[account].tune.has_key('artist') \
or gajim.connections[account].tune.has_key('title')):
@ -1236,9 +1259,9 @@ class RosterWindow:
jid = jid.decode('utf-8')
contact = gajim.contacts.get_contact(account, jid)
if contact.mood.has_key('mood') \
and contact.mood['mood'] in MOODS:
and contact.mood['mood'].strip() in MOODS:
pixbuf = gtkgui_helpers.load_mood_icon(
contact.mood['mood']).get_pixbuf()
contact.mood['mood'].strip()).get_pixbuf()
elif contact.mood.has_key('mood'):
pixbuf = gtkgui_helpers.load_mood_icon(
'unknown').get_pixbuf()
@ -1249,6 +1272,28 @@ class RosterWindow:
return False
def draw_activity(self, jid, account):
iters = self._get_contact_iter(jid, account, model = self.model)
if not iters or not gajim.config.get('show_activity_in_roster'):
return
jid = self.model[iters[0]][C_JID]
jid = jid.decode('utf-8')
contact = gajim.contacts.get_contact(account, jid)
if contact.activity.has_key('activity') \
and contact.activity['activity'].strip() in ACTIVITIES:
pixbuf = gtkgui_helpers.load_activity_icon(
contact.activity['activity'].strip()). \
get_pixbuf()
elif contact.activity.has_key('activity'):
pixbuf = gtkgui_helpers.load_activity_icon(
'unknown').get_pixbuf()
else:
pixbuf = None
for child_iter in iters:
self.model[child_iter][C_ACTIVITY_PIXBUF] = pixbuf
return False
def draw_tune(self, jid, account):
iters = self._get_contact_iter(jid, account, model = self.model)
if not iters or not gajim.config.get('show_tunes_in_roster'):
@ -1314,6 +1359,7 @@ class RosterWindow:
for jid in jids:
self.draw_contact(jid, account)
self.draw_mood(jid, account)
self.draw_activity(jid, account)
self.draw_tune(jid, account)
self.draw_avatar(jid, account)
yield True
@ -1326,10 +1372,10 @@ class RosterWindow:
'''create new empty model and draw roster'''
self.modelfilter = None
# (icon, name, type, jid, account, editable, mood_pixbuf,
# avatar_pixbuf, padlock_pixbuf)
# activity_pixbuf, tune_pixbuf avatar_pixbuf, padlock_pixbuf)
self.model = gtk.TreeStore(gtk.Image, str, str, str, str,
gtk.gdk.Pixbuf, gtk.gdk.Pixbuf, gtk.gdk.Pixbuf,
gtk.gdk.Pixbuf)
gtk.gdk.Pixbuf, gtk.gdk.Pixbuf)
self.model.set_sort_func(1, self._compareIters)
self.model.set_sort_column_id(1, gtk.SORT_ASCENDING)
@ -3734,6 +3780,7 @@ class RosterWindow:
for c, acc in brothers:
self.draw_contact(c.jid, acc)
self.draw_mood(c.jid, acc)
self.draw_activity(c.jid, acc)
self.draw_tune(c.jid, acc)
self.draw_avatar(c.jid, acc)
@ -4295,6 +4342,59 @@ class RosterWindow:
renderer.set_property('xalign', 1)
def _fill_activity_pixbuf_rederer(self, column, renderer, model, titer,
data = None):
'''When a row is added, set properties for avatar renderer'''
theme = gajim.config.get('roster_theme')
type_ = model[titer][C_TYPE]
if type_ == 'group':
renderer.set_property('visible', False)
return
# allocate space for the icon only if needed
if model[titer][C_ACTIVITY_PIXBUF]:
renderer.set_property('visible', True)
else:
renderer.set_property('visible', False)
if type_ == 'account':
color = gajim.config.get_per('themes', theme,
'accountbgcolor')
if color:
renderer.set_property('cell-background', color)
else:
self.set_renderer_color(renderer,
gtk.STATE_ACTIVE)
# align pixbuf to the right)
renderer.set_property('xalign', 1)
# prevent type_ = None, see http://trac.gajim.org/ticket/2534
elif type_:
if not model[titer][C_JID] \
or not model[titer][C_ACCOUNT]:
# This can append at the moment we add the row
return
jid = model[titer][C_JID].decode('utf-8')
account = model[titer][C_ACCOUNT].decode('utf-8')
if jid in gajim.newly_added[account]:
renderer.set_property('cell-background',
gajim.config.get(
'just_connected_bg_color'))
elif jid in gajim.to_be_removed[account]:
renderer.set_property('cell-background',
gajim.config.get(
'just_disconnected_bg_color'))
else:
color = gajim.config.get_per('themes',
theme, 'contactbgcolor')
if color:
renderer.set_property(
'cell-background', color)
else:
renderer.set_property(
'cell-background', None)
# align pixbuf to the right
renderer.set_property('xalign', 1)
def _fill_tune_pixbuf_rederer(self, column, renderer, model, titer,
data = None):
'''When a row is added, set properties for avatar renderer'''
@ -6158,6 +6258,12 @@ class RosterWindow:
col.set_cell_data_func(render_pixbuf,
self._fill_mood_pixbuf_rederer, None)
render_pixbuf = gtk.CellRendererPixbuf()
col.pack_start(render_pixbuf, expand = False)
col.add_attribute(render_pixbuf, 'pixbuf', C_ACTIVITY_PIXBUF)
col.set_cell_data_func(render_pixbuf,
self._fill_activity_pixbuf_rederer, None)
render_pixbuf = gtk.CellRendererPixbuf()
col.pack_start(render_pixbuf, expand = False)
col.add_attribute(render_pixbuf, 'pixbuf', C_TUNE_PIXBUF)