diff options
author | Tomeu Vizoso <tomeu@sugarlabs.org> | 2010-03-10 14:14:55 (GMT) |
---|---|---|
committer | Tomeu Vizoso <tomeu.vizoso@collabora.co.uk> | 2010-08-20 13:02:25 (GMT) |
commit | e1333de208a82c99da076bf26642a59f2868bd70 (patch) | |
tree | 18ad3f3b346442c9312f2b41f3b9a696a2951687 | |
parent | ea0d3dc189c65ab181d8180b5df972c6d1dcfb7a (diff) |
Add OwnerBuddyModel class so it is dealt with locally
-rw-r--r-- | src/jarabe/desktop/friendview.py | 37 | ||||
-rw-r--r-- | src/jarabe/desktop/groupbox.py | 6 | ||||
-rw-r--r-- | src/jarabe/desktop/meshbox.py | 10 | ||||
-rw-r--r-- | src/jarabe/frame/friendstray.py | 37 | ||||
-rw-r--r-- | src/jarabe/model/buddy.py | 148 | ||||
-rw-r--r-- | src/jarabe/model/invites.py | 9 | ||||
-rw-r--r-- | src/jarabe/model/neighborhood.py | 3 | ||||
-rw-r--r-- | src/jarabe/model/shell.py | 9 | ||||
-rw-r--r-- | src/jarabe/view/buddyicon.py | 10 | ||||
-rw-r--r-- | src/jarabe/view/buddymenu.py | 13 |
10 files changed, 157 insertions, 125 deletions
diff --git a/src/jarabe/desktop/friendview.py b/src/jarabe/desktop/friendview.py index 4c5f1c8..f917dac 100644 --- a/src/jarabe/desktop/friendview.py +++ b/src/jarabe/desktop/friendview.py @@ -37,14 +37,12 @@ class FriendView(hippo.CanvasBox): self._activity_icon = CanvasIcon(size=style.LARGE_ICON_SIZE) self._activity_icon_visible = False - if self._buddy.is_present(): - self._buddy_appeared_cb(buddy) + self._update_activity() - self._buddy.connect('current-activity-changed', - self._buddy_activity_changed_cb) - self._buddy.connect('appeared', self._buddy_appeared_cb) - self._buddy.connect('disappeared', self._buddy_disappeared_cb) - self._buddy.connect('color-changed', self._buddy_color_changed_cb) + self._buddy.connect('notify::current-activity', + self.__buddy_notify_current_activity_cb) + self._buddy.connect('notify::present', self.__buddy_notify_present_cb) + self._buddy.connect('notify::color', self.__buddy_notify_color_cb) def _get_new_icon_name(self, ps_activity): registry = bundleregistry.get_registry() @@ -58,30 +56,31 @@ class FriendView(hippo.CanvasBox): self.remove(self._activity_icon) self._activity_icon_visible = False - def _buddy_activity_changed_cb(self, buddy, ps_activity=None): - if not ps_activity: + def __buddy_notify_current_activity_cb(self, buddy, pspec): + self._update_activity() + + def _update_activity(self): + if not self._buddy.props.present or \ + not self._buddy.props.current_activity: self._remove_activity_icon() return # FIXME: use some sort of "unknown activity" icon rather # than hiding the icon? - name = self._get_new_icon_name(ps_activity) + name = self._get_new_icon_name(self._buddy.props.current_activity) if name: self._activity_icon.props.file_name = name - self._activity_icon.props.xo_color = buddy.get_color() + self._activity_icon.props.xo_color = self._buddy.props.color if not self._activity_icon_visible: self.append(self._activity_icon, hippo.PACK_EXPAND) self._activity_icon_visible = True else: self._remove_activity_icon() - def _buddy_appeared_cb(self, buddy): - home_activity = self._buddy.get_current_activity() - self._buddy_activity_changed_cb(buddy, home_activity) - - def _buddy_disappeared_cb(self, buddy): - self._buddy_activity_changed_cb(buddy, None) + def __buddy_notify_present_cb(self, buddy, pspec): + self._update_activity() - def _buddy_color_changed_cb(self, buddy, color): + def __buddy_notify_color_cb(self, buddy, pspec): # TODO: shouldn't this change self._buddy_icon instead? - self._activity_icon.props.xo_color = buddy.get_color() + self._activity_icon.props.xo_color = buddy.props.color + diff --git a/src/jarabe/desktop/groupbox.py b/src/jarabe/desktop/groupbox.py index 76c2981..6da85a2 100644 --- a/src/jarabe/desktop/groupbox.py +++ b/src/jarabe/desktop/groupbox.py @@ -26,7 +26,7 @@ from sugar.graphics.xocolor import XoColor from sugar.presence import presenceservice from jarabe.view.buddymenu import BuddyMenu -from jarabe.model.buddy import BuddyModel +from jarabe.model.buddy import OwnerBuddyModel from jarabe.model import friends from jarabe.desktop.friendview import FriendView from jarabe.desktop.spreadlayout import SpreadLayout @@ -54,9 +54,7 @@ class GroupBox(hippo.Canvas): xo_color=color) self._owner_icon.props.size = style.LARGE_ICON_SIZE - presence_service = presenceservice.get_instance() - owner = BuddyModel(buddy=presence_service.get_owner()) - self._owner_icon.set_palette(BuddyMenu(owner)) + self._owner_icon.set_palette(BuddyMenu(OwnerBuddyModel())) self._layout.add(self._owner_icon) friends_model = friends.get_model() diff --git a/src/jarabe/desktop/meshbox.py b/src/jarabe/desktop/meshbox.py index 8abf106..82fb555 100644 --- a/src/jarabe/desktop/meshbox.py +++ b/src/jarabe/desktop/meshbox.py @@ -1176,19 +1176,19 @@ class MeshBox(gtk.VBox): if hasattr(icon, 'set_filter'): icon.set_filter(self._query) - self._buddies[buddy_model.get_buddy().object_path()] = icon + self._buddies[buddy_model.props.key] = icon def _remove_alone_buddy(self, buddy_model): - icon = self._buddies[buddy_model.get_buddy().object_path()] + icon = self._buddies[buddy_model.props.key] self._layout.remove(icon) - del self._buddies[buddy_model.get_buddy().object_path()] + del self._buddies[buddy_model.props.key] icon.destroy() def _remove_buddy(self, buddy_model): - object_path = buddy_model.get_buddy().object_path() - if self._buddies.has_key(object_path): + if self._buddies.has_key(buddy_model.props.key): self._remove_alone_buddy(buddy_model) else: + object_path = buddy_model.get_buddy().object_path() for activity in self._activities.values(): if activity.has_buddy_icon(object_path): activity.remove_buddy_icon(object_path) diff --git a/src/jarabe/frame/friendstray.py b/src/jarabe/frame/friendstray.py index b5437e5..bd70622 100644 --- a/src/jarabe/frame/friendstray.py +++ b/src/jarabe/frame/friendstray.py @@ -14,13 +14,15 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +import logging + from sugar.presence import presenceservice from sugar.graphics.tray import VTray, TrayIcon from jarabe.view.buddymenu import BuddyMenu from jarabe.frame.frameinvoker import FrameWidgetInvoker from jarabe.model import shell -from jarabe.model.buddy import BuddyModel +from jarabe.model.buddy import BuddyModel, OwnerBuddyModel class FriendIcon(TrayIcon): def __init__(self, buddy): @@ -41,15 +43,15 @@ class FriendsTray(VTray): self._left_hid = -1 self._buddies = {} - self._pservice = presenceservice.get_instance() - self._pservice.connect('activity-appeared', - self.__activity_appeared_cb) - - self._owner = self._pservice.get_owner() + 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) + #self._pservice.get_activities_async( \ + # reply_handler=self._get_activities_cb) shell.get_model().connect('active-activity-changed', self._active_activity_changed_cb) @@ -62,9 +64,7 @@ class FriendsTray(VTray): if self._buddies.has_key(buddy.props.key): return - model = BuddyModel(buddy=buddy) - - icon = FriendIcon(model) + icon = FriendIcon(buddy) self.add_item(icon) icon.show() @@ -104,11 +104,11 @@ class FriendsTray(VTray): self.clear() # always display ourselves - self.add_buddy(self._owner) + self.add_buddy(OwnerBuddyModel()) if shared_activity is True: for buddy in activity_ps.get_joined_buddies(): - self.add_buddy(buddy) + self.add_buddy(BuddyModel(buddy=buddy)) self._joined_hid = activity_ps.connect( 'buddy-joined', self.__buddy_joined_cb) @@ -125,17 +125,18 @@ class FriendsTray(VTray): # check if activity is shared activity = None - for act in self._pservice.get_activities(): - if activity_id == act.props.id: - activity = act - break + 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(buddy) + self.add_buddy(BuddyModel(buddy=buddy)) def __buddy_left_cb(self, activity, buddy): self.remove_buddy(buddy) diff --git a/src/jarabe/model/buddy.py b/src/jarabe/model/buddy.py index 5978bae..8741343 100644 --- a/src/jarabe/model/buddy.py +++ b/src/jarabe/model/buddy.py @@ -20,47 +20,98 @@ import gobject _NOT_PRESENT_COLOR = "#d5d5d5,#FFFFFF" -class BuddyModel(gobject.GObject): - __gsignals__ = { - 'appeared': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, ([])), - 'disappeared': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, ([])), - 'nick-changed': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, - ([gobject.TYPE_PYOBJECT])), - 'color-changed': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, - ([gobject.TYPE_PYOBJECT])), - 'icon-changed': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, - ([])), - 'tags-changed': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, - ([gobject.TYPE_PYOBJECT])), - 'current-activity-changed': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, - ([gobject.TYPE_PYOBJECT])) - } +class BaseBuddyModel(gobject.GObject): + __gtype_name__ = 'SugarBaseBuddyModel' + def __init__(self, **kwargs): + self._key = None + self._nick = None + self._color = None + self._tags = None + self._present = False + + gobject.GObject.__init__(self, **kwargs) + + def _set_color_from_string(self, color_string): + self._color = XoColor(color_string) + + def is_present(self): + return self._present + + def set_present(self, present): + self._present = present + + present = gobject.property(type=bool, default=False, getter=is_present, + setter=set_present) + + def get_nick(self): + return self._nick + + def set_nick(self, nick): + self._nick = nick + + nick = gobject.property(type=object, getter=get_nick, setter=set_nick) + + def get_key(self): + return self._key + + key = gobject.property(type=object, getter=get_key) + + def get_color(self): + return self._color + + color = gobject.property(type=object, getter=get_color) + + def get_tags(self): + return self._tags + + tags = gobject.property(type=object, getter=get_tags) + + def get_current_activity(self): + raise NotImplementedError + + current_activity = gobject.property(type=object, + getter=get_current_activity) + + def is_owner(self): + raise NotImplementedError + + def get_buddy(self): + raise NotImplementedError + + +class OwnerBuddyModel(BaseBuddyModel): + __gtype_name__ = 'SugarOwnerBuddyModel' + def __init__(self): + BaseBuddyModel.__init__(self) + self.props.present = True + self.props.nick = 'XXXXXXXXXXXXXX' + self.props.color = '' + + def is_owner(self): + return True + + def get_buddy(self): + return None + + +class BuddyModel(BaseBuddyModel): + __gtype_name__ = 'SugarBuddyModel' def __init__(self, key=None, buddy=None, nick=None): if (key and buddy) or (not key and not buddy): raise RuntimeError("Must specify only _one_ of key or buddy.") - gobject.GObject.__init__(self) + BaseBuddyModel.__init__(self, nick=nick, key=key) + + self._pservice = presenceservice.get_instance() - self._color = None - self._tags = None + self._buddy = None self._ba_handler = None self._pc_handler = None self._dis_handler = None self._bic_handler = None self._cac_handler = None - self._pservice = presenceservice.get_instance() - - self._buddy = None - if not buddy: self._key = key # connect to the PS's buddy-appeared signal and @@ -91,32 +142,7 @@ class BuddyModel(gobject.GObject): self._update_buddy(buddy) - def _set_color_from_string(self, color_string): - self._color = XoColor(color_string) - - def get_key(self): - return self._key - - def get_nick(self): - return self._nick - - def get_color(self): - return self._color - - def get_tags(self): - return self._tags - - def get_buddy(self): - return self._buddy - def is_owner(self): - if not self._buddy: - return False - return self._buddy.props.owner - - def is_present(self): - if self._buddy: - return True return False def get_current_activity(self): @@ -124,6 +150,14 @@ class BuddyModel(gobject.GObject): return self._buddy.props.current_activity return None + def is_present(self): + if self._buddy: + return True + return False + + def get_buddy(self): + return self._buddy + def _update_buddy(self, buddy): if not buddy: raise ValueError("Buddy cannot be None.") @@ -133,11 +167,10 @@ class BuddyModel(gobject.GObject): self._nick = self._buddy.props.nick self._tags = self._buddy.props.tags self._set_color_from_string(self._buddy.props.color) + self.props.present = True self._pc_handler = self._buddy.connect('property-changed', self._buddy_property_changed_cb) - self._bic_handler = self._buddy.connect('icon-changed', - self._buddy_icon_changed_cb) def _buddy_appeared_cb(self, pservice, buddy): if self._buddy or buddy.props.key != self._key: @@ -177,6 +210,5 @@ class BuddyModel(gobject.GObject): self._set_color_from_string(_NOT_PRESENT_COLOR) self.emit('disappeared') self._buddy = None + self.props.present = False - def _buddy_icon_changed_cb(self, buddy): - self.emit('icon-changed') diff --git a/src/jarabe/model/invites.py b/src/jarabe/model/invites.py index c918308..f4c7d71 100644 --- a/src/jarabe/model/invites.py +++ b/src/jarabe/model/invites.py @@ -14,6 +14,8 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +import logging + import gobject from sugar.presence import presenceservice @@ -74,9 +76,10 @@ class Invites(gobject.GObject): self._dict = {} - ps = presenceservice.get_instance() - owner = ps.get_owner() - owner.connect('joined-activity', self._owner_joined_cb) + logging.info('KILL_PS listen for when the owner joins an activity') + #ps = presenceservice.get_instance() + #owner = ps.get_owner() + #owner.connect('joined-activity', self._owner_joined_cb) def add_invite(self, bundle_id, activity_id): if activity_id in self._dict: diff --git a/src/jarabe/model/neighborhood.py b/src/jarabe/model/neighborhood.py index 53e5581..b917219 100644 --- a/src/jarabe/model/neighborhood.py +++ b/src/jarabe/model/neighborhood.py @@ -22,7 +22,7 @@ from sugar.graphics.xocolor import XoColor from sugar.presence import presenceservice from sugar import activity -from jarabe.model.buddy import BuddyModel +from jarabe.model.buddy import BuddyModel, OwnerBuddyModel from jarabe.model import bundleregistry from jarabe.util.telepathy import connection_watcher @@ -77,6 +77,7 @@ class Neighborhood(gobject.GObject): self._activities = {} self._buddies = {} + self._buddies[None] = OwnerBuddyModel() self._pservice = presenceservice.get_instance() self._pservice.connect("activity-appeared", diff --git a/src/jarabe/model/shell.py b/src/jarabe/model/shell.py index 636a5b9..6d6cbde 100644 --- a/src/jarabe/model/shell.py +++ b/src/jarabe/model/shell.py @@ -147,13 +147,14 @@ class Activity(gobject.GObject): """ pservice = presenceservice.get_instance() + logging.info('KILL_PS check in local list of activities') # HACK to suppress warning in logs when activity isn't found # (if it's locally launched and not shared yet) activity = None - for act in pservice.get_activities(): - if self._activity_id == act.props.id: - activity = act - break + #for act in pservice.get_activities(): + # if self._activity_id == act.props.id: + # activity = act + # break if activity != None: return XoColor(activity.props.color) diff --git a/src/jarabe/view/buddyicon.py b/src/jarabe/view/buddyicon.py index 13edb2c..6e08d9e 100644 --- a/src/jarabe/view/buddyicon.py +++ b/src/jarabe/view/buddyicon.py @@ -25,19 +25,21 @@ class BuddyIcon(CanvasIcon): self._greyed_out = False self._buddy = buddy - self._buddy.connect('appeared', self._buddy_presence_change_cb) - self._buddy.connect('disappeared', self._buddy_presence_change_cb) - self._buddy.connect('color-changed', self._buddy_presence_change_cb) + self._buddy.connect('notify::present', self.__buddy_notify_present_cb) + self._buddy.connect('notify::color', self.__buddy_notify_color_cb) palette = BuddyMenu(buddy) self.set_palette(palette) self._update_color() - def _buddy_presence_change_cb(self, buddy, color=None): + def __buddy_notify_present_cb(self, buddy, pspec): # Update the icon's color when the buddy comes and goes self._update_color() + def __buddy_notify_color_cb(self, buddy, pspec): + self._update_color() + def _update_color(self): # keep the icon in the palette in sync with the view diff --git a/src/jarabe/view/buddymenu.py b/src/jarabe/view/buddymenu.py index 4637751..16d3934 100644 --- a/src/jarabe/view/buddymenu.py +++ b/src/jarabe/view/buddymenu.py @@ -42,8 +42,7 @@ class BuddyMenu(Palette): self._active_activity_changed_hid = None self.connect('destroy', self.__destroy_cb) - self._buddy.connect('icon-changed', self._buddy_icon_changed_cb) - self._buddy.connect('nick-changed', self._buddy_nick_changed_cb) + self._buddy.connect('notify::nick', self.__buddy_notify_nick_cb) if buddy.is_owner(): self._add_my_items() @@ -54,8 +53,7 @@ class BuddyMenu(Palette): if self._active_activity_changed_hid is not None: home_model = shell.get_model() home_model.disconnect(self._active_activity_changed_hid) - self._buddy.disconnect_by_func(self._buddy_icon_changed_cb) - self._buddy.disconnect_by_func(self._buddy_nick_changed_cb) + self._buddy.disconnect_by_func(self.__buddy_notify_nick_cb) def _add_buddy_items(self): if friends.get_model().has_buddy(self._buddy): @@ -139,11 +137,8 @@ class BuddyMenu(Palette): def _cur_activity_changed_cb(self, home_model, activity_model): self._update_invite_menu(activity_model) - def _buddy_icon_changed_cb(self, buddy): - pass - - def _buddy_nick_changed_cb(self, buddy, nick): - self.set_primary_text(nick) + def __buddy_notify_nick_cb(self, buddy, pspec): + self.set_primary_text(buddy.props.nick) def _make_friend_cb(self, menuitem): friends.get_model().make_friend(self._buddy) |