From ef45d2946f45ebfd3c50154b74c2b53b936724a9 Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso Date: Mon, 02 Aug 2010 13:13:31 +0000 Subject: Implement tracking of buddies inside an activity for FriendsTray --- diff --git a/src/jarabe/desktop/meshbox.py b/src/jarabe/desktop/meshbox.py index cacc404..92ce47a 100644 --- a/src/jarabe/desktop/meshbox.py +++ b/src/jarabe/desktop/meshbox.py @@ -66,8 +66,8 @@ class ActivityView(hippo.CanvasBox): hippo.CanvasBox.__init__(self) self._model = model - self._model.connect('buddy-added', self.__buddy_added_cb) - self._model.connect('buddy-removed', self.__buddy_removed_cb) + self._model.connect('current-buddy-added', self.__buddy_added_cb) + self._model.connect('current-buddy-removed', self.__buddy_removed_cb) self._icons = {} self._palette = None @@ -81,7 +81,7 @@ class ActivityView(hippo.CanvasBox): self._palette = self._create_palette() self._icon.set_palette(self._palette) - for buddy in self._model.props.buddies: + for buddy in self._model.props.current_buddies: self._add_buddy(buddy) def _create_icon(self): diff --git a/src/jarabe/frame/friendstray.py b/src/jarabe/frame/friendstray.py index 62c0e9f..545443a 100644 --- a/src/jarabe/frame/friendstray.py +++ b/src/jarabe/frame/friendstray.py @@ -23,6 +23,7 @@ from jarabe.view.buddymenu import BuddyMenu from jarabe.frame.frameinvoker import FrameWidgetInvoker from jarabe.model import shell from jarabe.model.buddy import BuddyModel, get_owner_instance +from jarabe.model import neighborhood class FriendIcon(TrayIcon): def __init__(self, buddy): @@ -38,27 +39,14 @@ class FriendsTray(VTray): def __init__(self): VTray.__init__(self) - self._activity_ps = None - self._joined_hid = -1 - self._left_hid = -1 + self._shared_activity = None self._buddies = {} - logging.info('KILL_PS listen for when new activities appear') - #self._pservice = presenceservice.get_instance() - #self._pservice.connect('activity-appeared', - # self.__activity_appeared_cb) - - logging.info('KILL_PS Add initial activities the PS knows about') - # Add initial activities the PS knows about - #self._pservice.get_activities_async( \ - # reply_handler=self._get_activities_cb) - shell.get_model().connect('active-activity-changed', - self._active_activity_changed_cb) + self.__active_activity_changed_cb) - def _get_activities_cb(self, activities_list): - for act in activities_list: - self.__activity_appeared_cb(self._pservice, act) + neighborhood.get_model().connect('activity-added', + self.__neighborhood_activity_added_cb) def add_buddy(self, buddy): if self._buddies.has_key(buddy.props.key): @@ -83,39 +71,22 @@ class FriendsTray(VTray): item.destroy() self._buddies = {} - def __activity_appeared_cb(self, pservice, activity_ps): - activity = shell.get_model().get_active_activity() - if activity and activity_ps.props.id == activity.get_activity_id(): - self._set_activity_ps(activity_ps, True) - - def _set_activity_ps(self, activity_ps, shared_activity): - if self._activity_ps == activity_ps: - return + def __neighborhood_activity_added_cb(self, neighborhood, shared_activity): + logging.debug('FriendsTray.__neighborhood_activity_added_cb') + self.clear() - if self._joined_hid > 0: - self._activity_ps.disconnect(self._joined_hid) - self._joined_hid = -1 - if self._left_hid > 0: - self._activity_ps.disconnect(self._left_hid) - self._left_hid = -1 + # always display ourselves + self.add_buddy(get_owner_instance()) - self._activity_ps = activity_ps + self._set_current_activity(shared_activity.activity_id) + def __active_activity_changed_cb(self, home_model, home_activity): + logging.debug('FriendsTray.__active_activity_changed_cb') self.clear() # always display ourselves self.add_buddy(get_owner_instance()) - if shared_activity is True: - for buddy in activity_ps.get_joined_buddies(): - self.add_buddy(BuddyModel(buddy=buddy)) - - self._joined_hid = activity_ps.connect( - 'buddy-joined', self.__buddy_joined_cb) - self._left_hid = activity_ps.connect( - 'buddy-left', self.__buddy_left_cb) - - def _active_activity_changed_cb(self, home_model, home_activity): if home_activity is None: return @@ -123,20 +94,25 @@ class FriendsTray(VTray): if activity_id is None: return - # check if activity is shared - activity = None - logging.info('KILL_PS check in local list of activities') - #for act in self._pservice.get_activities(): - # if activity_id == act.props.id: - # activity = act - # break - if activity: - self._set_activity_ps(activity, True) - else: - self._set_activity_ps(home_activity, False) - - def __buddy_joined_cb(self, activity, buddy): - self.add_buddy(BuddyModel(buddy=buddy)) - - def __buddy_left_cb(self, activity, buddy): + self._set_current_activity(activity_id) + + def _set_current_activity(self, activity_id): + logging.debug('FriendsTray._set_current_activity') + neighborhood_model = neighborhood.get_model() + self._shared_activity = neighborhood_model.get_activity(activity_id) + if self._shared_activity is None: + return + + for buddy in self._shared_activity.get_buddies(): + self.add_buddy(buddy) + + self._shared_activity.connect('buddy-added', self.__buddy_added_cb) + self._shared_activity.connect('buddy-removed', self.__buddy_removed_cb) + + def __buddy_added_cb(self, activity, buddy): + logging.debug('FriendsTray.__buddy_added_cb') + self.add_buddy(buddy) + + def __buddy_removed_cb(self, activity, buddy): + logging.debug('FriendsTray.__buddy_removed_cb') self.remove_buddy(buddy) diff --git a/src/jarabe/model/neighborhood.py b/src/jarabe/model/neighborhood.py index ab6330b..81e6b42 100644 --- a/src/jarabe/model/neighborhood.py +++ b/src/jarabe/model/neighborhood.py @@ -60,10 +60,14 @@ CONNECTION_INTERFACE_ACTIVITY_PROPERTIES = 'org.laptop.Telepathy.ActivityPropert class ActivityModel(gobject.GObject): __gsignals__ = { - 'buddy-added': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, ([object])), - 'buddy-removed': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, ([object])), + 'current-buddy-added': (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ([object])), + 'current-buddy-removed': (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ([object])), + 'buddy-added': (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ([object])), + 'buddy-removed': (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ([object])), } def __init__(self, activity_id, room_handle): gobject.GObject.__init__(self) @@ -72,6 +76,7 @@ class ActivityModel(gobject.GObject): self.room_handle = room_handle self._bundle = None self._color = None + self._current_buddies = [] self._buddies = [] def get_color(self): @@ -113,6 +118,21 @@ class ActivityModel(gobject.GObject): buddies = gobject.property(type=object, getter=get_buddies) + def get_current_buddies(self): + return self._current_buddies + + def add_current_buddy(self, buddy): + self._current_buddies.append(buddy) + self.notify('current-buddies') + self.emit('current-buddy-added', buddy) + + def remove_current_buddy(self, buddy): + self._current_buddies.remove(buddy) + self.notify('current-buddies') + self.emit('current-buddy-removed', buddy) + + current_buddies = gobject.property(type=object, getter=get_current_buddies) + class _Account(gobject.GObject): __gsignals__ = { 'activity-added': (gobject.SIGNAL_RUN_FIRST, @@ -127,6 +147,10 @@ class _Account(gobject.GObject): gobject.TYPE_NONE, ([object, object])), 'buddy-removed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([object])), + 'buddy-joined-activity': (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ([object, object])), + 'buddy-left-activity': (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ([object, object])), 'current-activity-updated': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([object, object])), } @@ -290,7 +314,12 @@ class _Account(gobject.GObject): if not activity_id in self._buddies_per_activity: self._buddies_per_activity[activity_id] = set() self._buddies_per_activity[activity_id].add(buddy_handle) - self._activities_per_buddy[buddy_handle].add(activity_id) + if activity_id not in self._activities_per_buddy[buddy_handle]: + self._activities_per_buddy[buddy_handle].add(activity_id) + if self._buddy_handles[buddy_handle] is not None: + self.emit('buddy-joined-activity', + self._buddy_handles[buddy_handle], + activity_id) current_activity_ids = [activity_id for activity_id, room_handle in activities] for activity_id in self._activities_per_buddy[buddy_handle].copy(): @@ -308,6 +337,11 @@ class _Account(gobject.GObject): if activity_id in self._activities_per_buddy[buddy_handle]: self._activities_per_buddy[buddy_handle].remove(activity_id) + if self._buddy_handles[buddy_handle] is not None: + self.emit('buddy-left-activity', + self._buddy_handles[buddy_handle], + activity_id) + if not self._buddies_per_activity[activity_id]: del self._buddies_per_activity[activity_id] @@ -451,6 +485,8 @@ class Neighborhood(gobject.GObject): account = _Account(account_path) account.connect('buddy-added', self.__buddy_added_cb) account.connect('buddy-updated', self.__buddy_updated_cb) + account.connect('buddy-joined-activity', self.__buddy_joined_activity_cb) + account.connect('buddy-left-activity', self.__buddy_left_activity_cb) account.connect('activity-added', self.__activity_added_cb) account.connect('activity-updated', self.__activity_updated_cb) account.connect('activity-removed', self.__activity_removed_cb) @@ -600,29 +636,45 @@ class Neighborhood(gobject.GObject): if buddy.props.current_activity is not None: if buddy.props.current_activity.activity_id == activity_id: return - buddy.props.current_activity.remove_buddy(buddy) + buddy.props.current_activity.remove_current_buddy(buddy) if activity_id: activity = self._activities[activity_id] buddy.props.current_activity = activity - activity.add_buddy(buddy) + activity.add_current_buddy(buddy) else: buddy.props.current_activity = None - def get_activities(self): - return [] + def __buddy_joined_activity_cb(self, account, contact_id, activity_id): + if contact_id not in self._buddies: + logging.debug('__buddy_joined_activity_cb Unknown buddy with contact_id %r', contact_id) + return + + if activity_id not in self._activities: + logging.debug('__buddy_joined_activity_cb Unknown activity with activity_id %r', activity_id) + return + + self._activities[activity_id].add_buddy(self._buddies[contact_id]) + + def __buddy_left_activity_cb(self, account, contact_id, activity_id): + if contact_id not in self._buddies: + logging.debug('__buddy_left_activity_cb Unknown buddy with contact_id %r', contact_id) + return + + if activity_id not in self._activities: + logging.debug('__buddy_left_activity_cb Unknown activity with activity_id %r', activity_id) + return + + self._activities[activity_id].remove_buddy(self._buddies[contact_id]) def get_buddies(self): return self._buddies.values() - def has_activity(self, activity_id): - return False - def get_activity(self, activity_id): - return None + return self._activities.get(activity_id, None) - def add_activity(self, bundle, act): - pass + def get_activities(self): + return self._activities.values() _model = None -- cgit v0.9.1