diff options
author | Morgan Collett <morgan.collett@gmail.com> | 2008-05-28 20:16:23 (GMT) |
---|---|---|
committer | Morgan Collett <morgan.collett@gmail.com> | 2008-06-13 14:59:34 (GMT) |
commit | 9d89b4c0c07d5e337ff98a8aeedd6adcea8e96c8 (patch) | |
tree | 1c1ef1e2d7030c70dbd318130867e318e24cac5e /src/view | |
parent | 7a62df6758254ee9b6bb764c1ccccb9b40627131 (diff) |
6298: Refactor invites to handle 1-1 XMPP connections
Diffstat (limited to 'src/view')
-rw-r--r-- | src/view/Shell.py | 8 | ||||
-rw-r--r-- | src/view/frame/activitiestray.py | 142 |
2 files changed, 114 insertions, 36 deletions
diff --git a/src/view/Shell.py b/src/view/Shell.py index 1095878..b77465d 100644 --- a/src/view/Shell.py +++ b/src/view/Shell.py @@ -164,6 +164,14 @@ class Shell(gobject.GObject): self._activities_starting.add(activity_type) activityfactory.create(activity_type) + def start_activity_with_uri(self, activity_type, uri): + if activity_type in self._activities_starting: + logging.debug("This activity is still launching.") + return + + self._activities_starting.add(activity_type) + activityfactory.create_with_uri(activity_type, uri) + def take_activity_screenshot(self): if self._model.get_zoom_level() != shellmodel.ShellModel.ZOOM_ACTIVITY: return diff --git a/src/view/frame/activitiestray.py b/src/view/frame/activitiestray.py index 90be6e9..da087d6 100644 --- a/src/view/frame/activitiestray.py +++ b/src/view/frame/activitiestray.py @@ -28,6 +28,7 @@ from sugar.graphics.icon import Icon from sugar.graphics.palette import Palette, WidgetInvoker from sugar.graphics.menuitem import MenuItem from sugar import activity +from sugar import profile from model import shellmodel from view.palettes import JournalPalette, CurrentActivityPalette @@ -90,21 +91,45 @@ class ActivityButton(RadioToolButton): home_activity.disconnect(self._notify_launching_hid) class InviteButton(ToolButton): - def __init__(self, activity_model): + """Invite to shared activity""" + def __init__(self, invite): ToolButton.__init__(self) - self._activity_model = activity_model + self._invite = invite + self._activity_model = activity_model = None + self._private_channel = None + if invite.get_activity_id(): + # shared activity + mesh = shellmodel.get_instance().get_mesh() + activity_model = mesh.get_activity(invite.get_activity_id()) + self._activity_model = activity_model + self._bundle_id = activity_model.get_bundle_id() + else: + # private invite to 1-1 connection + self._private_channel = invite.get_private_channel() + self._bundle_id = invite.get_bundle_id() self._icon = Icon() - self._icon.props.xo_color = activity_model.get_color() - if activity_model.get_icon_name(): - self._icon.props.file = activity_model.get_icon_name() + if activity_model: + # shared activity + self._icon.props.xo_color = activity_model.get_color() + if activity_model.get_icon_name(): + self._icon.props.file = activity_model.get_icon_name() + else: + self._icon.props.icon_name = 'image-missing' else: - self._icon.props.icon_name = 'image-missing' + # private invite: displays with owner's colors + self._icon.props.xo_color = profile.get_color() + registry = activity.get_registry() + activity_info = registry.get_activity(self._bundle_id) + if activity_info: + self._icon.props.file = activity_info.icon + else: + self._icon.props.icon_name = 'image-missing' self.set_icon_widget(self._icon) self._icon.show() - palette = InvitePalette(activity_model) + palette = InvitePalette(invite) palette.props.invoker = FrameWidgetInvoker(self) palette.set_group_id('frame') self.set_palette(palette) @@ -113,21 +138,34 @@ class InviteButton(ToolButton): self.connect('destroy', self.__destroy_cb) self._notif_icon = NotificationIcon() - self._notif_icon.props.xo_color = activity_model.get_color() - if activity_model.get_icon_name(): - icon_name = activity_model.get_icon_name() - self._notif_icon.props.icon_filename = icon_name + if activity_model: + # shared activity + self._notif_icon.props.xo_color = activity_model.get_color() + if activity_model.get_icon_name(): + icon_name = activity_model.get_icon_name() + self._notif_icon.props.icon_filename = icon_name + else: + self._notif_icon.props.icon_name = 'image-missing' else: - self._notif_icon.props.icon_name = 'image-missing' + # private invite: displays with owner's colors + self._notif_icon.props.xo_color = profile.get_color() + registry = activity.get_registry() + activity_info = registry.get_activity(self._bundle_id) + if activity_info: + self._notif_icon.props.icon_filename = activity_info.icon + else: + self._notif_icon.props.icon_name = 'image-missing' self._notif_icon.connect('button-release-event', self.__button_release_event_cb) - palette = InvitePalette(activity_model) + palette = InvitePalette(invite) palette.props.invoker = WidgetInvoker(self._notif_icon) palette.set_group_id('frame') self._notif_icon.palette = palette - view.frame.frame.get_instance().add_notification(self._notif_icon) + frame = view.frame.frame.get_instance() + frame.add_notification(self._notif_icon, + view.frame.frame.TOP_LEFT) def __button_release_event_cb(self, icon, event): self.emit('clicked') @@ -139,25 +177,44 @@ class InviteButton(ToolButton): self._notif_icon = None shell = view.Shell.get_instance() - shell.join_activity(self._activity_model.get_bundle_id(), - self._activity_model.get_id()) + if self._activity_model: + # shared activity + shell.join_activity(self._activity_model.get_bundle_id(), + self._activity_model.get_id()) + else: + # private invite to 1-1 connection + shell.start_activity_with_uri(self._bundle_id, + self._private_channel) def __destroy_cb(self, button): frame = view.frame.frame.get_instance() frame.remove_notification(self._notif_icon) class InvitePalette(Palette): - def __init__(self, activity_model): - self._activity_model = activity_model + def __init__(self, invite): + + self._invite = invite + self._activity_model = activity_model = None + self._private_channel = None + if invite.get_activity_id(): + # shared activity + mesh = shellmodel.get_instance().get_mesh() + activity_model = mesh.get_activity(invite.get_activity_id()) + self._activity_model = activity_model + self._bundle_id = activity_model.get_bundle_id() + else: + # private invite to 1-1 connection + self._private_channel = invite.get_private_channel() + self._bundle_id = invite.get_bundle_id() Palette.__init__(self, '') registry = activity.get_registry() - activity_info = registry.get_activity(activity_model.get_bundle_id()) + activity_info = registry.get_activity(self._bundle_id) if activity_info: self.set_primary_text(activity_info.name) else: - self.set_primary_text(activity_model.get_bundle_id()) + self.set_primary_text(self._bundle_id) menu_item = MenuItem(_('Join'), icon_name='dialog-ok') menu_item.connect('activate', self.__join_activate_cb) @@ -171,15 +228,23 @@ class InvitePalette(Palette): def __join_activate_cb(self, menu_item): shell = view.Shell.get_instance() - shell.join_activity(self._activity_model.get_bundle_id(), - self._activity_model.get_id()) + if self._activity_model: + # shared activity + shell.join_activity(self._activity_model.get_bundle_id(), + self._activity_model.get_id()) + else: + # private invite to 1-1 connection + shell.start_activity_with_uri(self._bundle_id, + self._private_channel) def __decline_activate_cb(self, menu_item): invites = shellmodel.get_instance().get_invites() - for invite in invites: - if invite.get_activity_id() == self._activity_model.get_id(): - invites.remove_invite(invite) - return + if self._activity_model: + activity_id = self._activity_model.get_id() + invites.remove_activity(activity_id) + else: + invites.remove_private_channel(self._private_channel) + class ActivitiesTray(HTray): def __init__(self): @@ -232,7 +297,10 @@ class ActivitiesTray(HTray): window.activate(gtk.get_current_event_time()) def __invite_clicked_cb(self, icon, invite): - self._invites.remove_invite(invite) + if invite.get_activity_id(): + self._invites.remove_invite(invite) + else: + self._invites.remove_private_invite(invite) def __invite_added_cb(self, invites, invite): self._add_invite(invite) @@ -241,15 +309,17 @@ class ActivitiesTray(HTray): self._remove_invite(invite) def _add_invite(self, invite): - mesh = shellmodel.get_instance().get_mesh() - activity_model = mesh.get_activity(invite.get_activity_id()) - if activity_model: - item = InviteButton(activity_model) - item.connect('clicked', self.__invite_clicked_cb, invite) - self.add_item(item) - item.show() - - self._invite_to_item[invite] = item + """Add an invite (SugarInvite or PrivateInvite)""" + if invite.get_activity_id(): + mesh = shellmodel.get_instance().get_mesh() + activity_model = mesh.get_activity(invite.get_activity_id()) + if not activity_model: + return + item = InviteButton(invite) + item.connect('clicked', self.__invite_clicked_cb, invite) + self.add_item(item) + item.show() + self._invite_to_item[invite] = item def _remove_invite(self, invite): self.remove_item(self._invite_to_item[invite]) |