Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomeu 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)
commite1333de208a82c99da076bf26642a59f2868bd70 (patch)
tree18ad3f3b346442c9312f2b41f3b9a696a2951687
parentea0d3dc189c65ab181d8180b5df972c6d1dcfb7a (diff)
Add OwnerBuddyModel class so it is dealt with locally
-rw-r--r--src/jarabe/desktop/friendview.py37
-rw-r--r--src/jarabe/desktop/groupbox.py6
-rw-r--r--src/jarabe/desktop/meshbox.py10
-rw-r--r--src/jarabe/frame/friendstray.py37
-rw-r--r--src/jarabe/model/buddy.py148
-rw-r--r--src/jarabe/model/invites.py9
-rw-r--r--src/jarabe/model/neighborhood.py3
-rw-r--r--src/jarabe/model/shell.py9
-rw-r--r--src/jarabe/view/buddyicon.py10
-rw-r--r--src/jarabe/view/buddymenu.py13
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)