diff options
Diffstat (limited to 'src/jarabe/frame')
-rw-r--r-- | src/jarabe/frame/__init__.py | 2 | ||||
-rw-r--r-- | src/jarabe/frame/activitiestray.py | 282 | ||||
-rw-r--r-- | src/jarabe/frame/clipboard.py | 20 | ||||
-rw-r--r-- | src/jarabe/frame/clipboardicon.py | 8 | ||||
-rw-r--r-- | src/jarabe/frame/clipboardmenu.py | 7 | ||||
-rw-r--r-- | src/jarabe/frame/clipboardobject.py | 17 | ||||
-rw-r--r-- | src/jarabe/frame/clipboardpanelwindow.py | 14 | ||||
-rw-r--r-- | src/jarabe/frame/clipboardtray.py | 18 | ||||
-rw-r--r-- | src/jarabe/frame/devicestray.py | 11 | ||||
-rw-r--r-- | src/jarabe/frame/eventarea.py | 14 | ||||
-rw-r--r-- | src/jarabe/frame/frame.py | 21 | ||||
-rw-r--r-- | src/jarabe/frame/frameinvoker.py | 2 | ||||
-rw-r--r-- | src/jarabe/frame/framewindow.py | 1 | ||||
-rw-r--r-- | src/jarabe/frame/friendstray.py | 105 | ||||
-rw-r--r-- | src/jarabe/frame/notification.py | 12 | ||||
-rw-r--r-- | src/jarabe/frame/zoomtoolbar.py | 2 |
16 files changed, 212 insertions, 324 deletions
diff --git a/src/jarabe/frame/__init__.py b/src/jarabe/frame/__init__.py index d7aec3d..b3e4b80 100644 --- a/src/jarabe/frame/__init__.py +++ b/src/jarabe/frame/__init__.py @@ -16,8 +16,10 @@ from jarabe.frame.frame import Frame + _view = None + def get_view(): global _view if not _view: diff --git a/src/jarabe/frame/activitiestray.py b/src/jarabe/frame/activitiestray.py index 3a80ac0..6e08fc0 100644 --- a/src/jarabe/frame/activitiestray.py +++ b/src/jarabe/frame/activitiestray.py @@ -1,5 +1,6 @@ # Copyright (C) 2006-2007 Red Hat, Inc. # Copyright (C) 2008 One Laptop Per Child +# Copyright (C) 2010 Collabora Ltd. <http://www.collabora.co.uk/> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -33,20 +34,16 @@ from sugar.graphics.toolbutton import ToolButton from sugar.graphics.icon import Icon, get_icon_file_name from sugar.graphics.palette import Palette, WidgetInvoker from sugar.graphics.menuitem import MenuItem -from sugar.activity.activityhandle import ActivityHandle -from sugar.activity import activityfactory from sugar.datastore import datastore from sugar import mime from sugar import env from jarabe.model import shell -from jarabe.model import neighborhood -from jarabe.model import owner +from jarabe.model import invites from jarabe.model import bundleregistry from jarabe.model import filetransfer from jarabe.view.palettes import JournalPalette, CurrentActivityPalette from jarabe.view.pulsingicon import PulsingIcon -from jarabe.view import launcher from jarabe.frame.frameinvoker import FrameWidgetInvoker from jarabe.frame.notification import NotificationIcon import jarabe.frame @@ -101,21 +98,51 @@ class ActivityButton(RadioToolButton): self._icon.props.pulsing = False -class BaseInviteButton(ToolButton): +class InviteButton(ToolButton): + """Invite to shared activity""" def __init__(self, invite): ToolButton.__init__(self) + self._invite = invite + self.connect('clicked', self.__clicked_cb) + self.connect('destroy', self.__destroy_cb) + + bundle_registry = bundleregistry.get_registry() + bundle = bundle_registry.get_bundle(invite.get_bundle_id()) + self._icon = Icon() + self._icon.props.xo_color = invite.get_color() + if bundle is not None: + self._icon.props.file = bundle.get_icon() + else: + self._icon.props.icon_name = 'image-missing' self.set_icon_widget(self._icon) self._icon.show() - self.connect('clicked', self.__clicked_cb) - self.connect('destroy', self.__destroy_cb) + palette = InvitePalette(invite) + palette.props.invoker = FrameWidgetInvoker(self) + palette.set_group_id('frame') + self.set_palette(palette) + self._notif_icon = NotificationIcon() self._notif_icon.connect('button-release-event', self.__button_release_event_cb) + self._notif_icon.props.xo_color = invite.get_color() + if bundle is not None: + self._notif_icon.props.icon_filename = bundle.get_icon() + else: + self._notif_icon.props.icon_name = 'image-missing' + + palette = InvitePalette(invite) + palette.props.invoker = WidgetInvoker(self._notif_icon) + palette.set_group_id('frame') + self._notif_icon.palette = palette + + frame = jarabe.frame.get_view() + frame.add_notification(self._notif_icon, gtk.CORNER_TOP_LEFT) + def __button_release_event_cb(self, icon, event): self.emit('clicked') @@ -126,118 +153,23 @@ class BaseInviteButton(ToolButton): self._notif_icon = None self._launch() - def _launch(self): - """Launch the target of the invite""" - raise NotImplementedError - def __destroy_cb(self, button): frame = jarabe.frame.get_view() frame.remove_notification(self._notif_icon) -class ActivityInviteButton(BaseInviteButton): - """Invite to shared activity""" - def __init__(self, invite): - BaseInviteButton.__init__(self, invite) - mesh = neighborhood.get_model() - activity_model = mesh.get_activity(invite.get_activity_id()) - self._activity_model = activity_model - self._bundle_id = activity_model.get_bundle_id() - - 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' - - palette = ActivityInvitePalette(invite) - palette.props.invoker = FrameWidgetInvoker(self) - palette.set_group_id('frame') - self.set_palette(palette) - - 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' - - palette = ActivityInvitePalette(invite) - palette.props.invoker = WidgetInvoker(self._notif_icon) - palette.set_group_id('frame') - self._notif_icon.palette = palette - - frame = jarabe.frame.get_view() - frame.add_notification(self._notif_icon, - gtk.CORNER_TOP_LEFT) - def _launch(self): """Join the activity in the invite.""" + self._invite.join() - shell_model = shell.get_model() - activity = shell_model.get_activity_by_id(self._activity_model.get_id()) - if activity: - activity.get_window().activate(gtk.get_current_event_time()) - return - - registry = bundleregistry.get_registry() - bundle = registry.get_bundle(self._bundle_id) - - launcher.add_launcher(self._activity_model.get_id(), - bundle.get_icon(), - self._activity_model.get_color()) - handle = ActivityHandle(self._activity_model.get_id()) - activityfactory.create(bundle, handle) +class InvitePalette(Palette): + """Palette for frame or notification icon for invites.""" -class PrivateInviteButton(BaseInviteButton): - """Invite to a private one to one channel""" def __init__(self, invite): - BaseInviteButton.__init__(self, invite) - self._private_channel = invite.get_private_channel() - self._bundle_id = invite.get_bundle_id() - - client = gconf.client_get_default() - color = XoColor(client.get_string('/desktop/sugar/user/color')) - - self._icon.props.xo_color = color - registry = bundleregistry.get_registry() - self._bundle = registry.get_bundle(self._bundle_id) - - if self._bundle: - self._icon.props.file = self._bundle.get_icon() - else: - self._icon.props.icon_name = 'image-missing' - - palette = PrivateInvitePalette(invite) - palette.props.invoker = FrameWidgetInvoker(self) - palette.set_group_id('frame') - self.set_palette(palette) - - self._notif_icon.props.xo_color = color - - if self._bundle: - self._notif_icon.props.icon_filename = self._bundle.get_icon() - else: - self._notif_icon.props.icon_name = 'image-missing' - - palette = PrivateInvitePalette(invite) - palette.props.invoker = WidgetInvoker(self._notif_icon) - palette.set_group_id('frame') - self._notif_icon.palette = palette - - frame = jarabe.frame.get_view() - frame.add_notification(self._notif_icon, - gtk.CORNER_TOP_LEFT) - - def _launch(self): - """Start the activity with private channel.""" - activityfactory.create_with_uri(self._bundle, self._private_channel) - -class BaseInvitePalette(Palette): - """Palette for frame or notification icon for invites.""" - def __init__(self): Palette.__init__(self, '') + self._invite = invite + menu_item = MenuItem(_('Join'), icon_name='dialog-ok') menu_item.connect('activate', self.__join_activate_cb) self.menu.append(menu_item) @@ -248,72 +180,22 @@ class BaseInvitePalette(Palette): self.menu.append(menu_item) menu_item.show() - def __join_activate_cb(self, menu_item): - self._join() - - def __decline_activate_cb(self, menu_item): - self._decline() - - def _join(self): - raise NotImplementedError - - def _decline(self): - raise NotImplementedError - - -class ActivityInvitePalette(BaseInvitePalette): - """Palette for shared activity invites.""" - - def __init__(self, invite): - BaseInvitePalette.__init__(self) - - mesh = neighborhood.get_model() - activity_model = mesh.get_activity(invite.get_activity_id()) - self._activity_model = activity_model - self._bundle_id = activity_model.get_bundle_id() + bundle_id = invite.get_bundle_id() registry = bundleregistry.get_registry() - self._bundle = registry.get_bundle(self._bundle_id) + self._bundle = registry.get_bundle(bundle_id) if self._bundle: self.set_primary_text(self._bundle.get_name()) else: - self.set_primary_text(self._bundle_id) + self.set_primary_text(bundle_id) - def _join(self): - handle = ActivityHandle(self._activity_model.get_id()) - activityfactory.create(self._bundle, handle) + def __join_activate_cb(self, menu_item): + self._invite.join() - def _decline(self): - invites = owner.get_model().get_invites() + def __decline_activate_cb(self, menu_item): + invites_model = invites.get_instance() activity_id = self._activity_model.get_id() - invites.remove_activity(activity_id) - - -class PrivateInvitePalette(BaseInvitePalette): - """Palette for private channel invites.""" - - def __init__(self, invite): - BaseInvitePalette.__init__(self) - - self._private_channel = invite.get_private_channel() - self._bundle_id = invite.get_bundle_id() - - registry = bundleregistry.get_registry() - self._bundle = registry.get_bundle(self._bundle_id) - if self._bundle: - self.set_primary_text(self._bundle.get_name()) - else: - self.set_primary_text(self._bundle_id) - - def _join(self): - activityfactory.create_with_uri(self._bundle, self._private_channel) - - invites = owner.get_model().get_invites() - invites.remove_private_channel(self._private_channel) - - def _decline(self): - invites = owner.get_model().get_invites() - invites.remove_private_channel(self._private_channel) + invites_model.remove_activity(activity_id) class ActivitiesTray(HTray): @@ -326,13 +208,14 @@ class ActivitiesTray(HTray): self._home_model = shell.get_model() self._home_model.connect('activity-added', self.__activity_added_cb) - self._home_model.connect('activity-removed', self.__activity_removed_cb) + self._home_model.connect('activity-removed', + self.__activity_removed_cb) self._home_model.connect('active-activity-changed', self.__activity_changed_cb) self._home_model.connect('tabbing-activity-changed', self.__tabbing_activity_changed_cb) - self._invites = owner.get_model().get_invites() + self._invites = invites.get_instance() for invite in self._invites: self._add_invite(invite) self._invites.connect('invite-added', self.__invite_added_cb) @@ -396,32 +279,22 @@ class ActivitiesTray(HTray): window.activate(gtk.get_current_event_time()) def __invite_clicked_cb(self, icon, invite): - if hasattr(invite, 'get_activity_id'): - self._invites.remove_invite(invite) - else: - self._invites.remove_private_invite(invite) + self._invites.remove_invite(invite) - def __invite_added_cb(self, invites, invite): + def __invite_added_cb(self, invites_model, invite): self._add_invite(invite) - def __invite_removed_cb(self, invites, invite): + def __invite_removed_cb(self, invites_model, invite): self._remove_invite(invite) def _add_invite(self, invite): - """Add an invite (SugarInvite or PrivateInvite)""" - item = None - if hasattr(invite, 'get_activity_id'): - mesh = neighborhood.get_model() - activity_model = mesh.get_activity(invite.get_activity_id()) - if activity_model is not None: - item = ActivityInviteButton(invite) - else: - item = PrivateInviteButton(invite) - if item is not None: - item.connect('clicked', self.__invite_clicked_cb, invite) - self.add_item(item) - item.show() - self._invite_to_item[invite] = item + """Add an invite""" + 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]) @@ -440,6 +313,7 @@ class ActivitiesTray(HTray): self.add_item(button) button.show() + class BaseTransferButton(ToolButton): """Button with a notification attached """ @@ -476,6 +350,7 @@ class BaseTransferButton(ToolButton): filetransfer.FT_REASON_LOCAL_STOPPED: self.remove() + class IncomingTransferButton(BaseTransferButton): """UI element representing an ongoing incoming file transfer """ @@ -498,7 +373,7 @@ class IncomingTransferButton(BaseTransferButton): self.notif_icon.props.icon_name = icon_name break - icon_color = XoColor(file_transfer.buddy.props.color) + icon_color = file_transfer.buddy.props.color self.props.icon_widget.props.xo_color = icon_color self.notif_icon.props.xo_color = icon_color @@ -523,18 +398,18 @@ class IncomingTransferButton(BaseTransferButton): self._ds_object.metadata['buddies'] = '' self._ds_object.metadata['preview'] = '' self._ds_object.metadata['icon-color'] = \ - file_transfer.buddy.props.color + file_transfer.buddy.props.color.to_string() self._ds_object.metadata['mime_type'] = file_transfer.mime_type elif file_transfer.props.state == filetransfer.FT_STATE_COMPLETED: logging.debug('__notify_state_cb COMPLETED') self._ds_object.metadata['progress'] = '100' self._ds_object.file_path = file_transfer.destination_path - datastore.write(self._ds_jobject, transfer_ownership=True, + datastore.write(self._ds_object, transfer_ownership=True, reply_handler=self.__reply_handler_cb, error_handler=self.__error_handler_cb) elif file_transfer.props.state == filetransfer.FT_STATE_CANCELLED: logging.debug('__notify_state_cb CANCELLED') - object_id = self._jobject.object_id + object_id = self._ds_object.object_id if object_id is not None: self._ds_object.destroy() datastore.delete(object_id) @@ -544,17 +419,19 @@ class IncomingTransferButton(BaseTransferButton): progress = file_transfer.props.transferred_bytes / \ file_transfer.file_size self._ds_object.metadata['progress'] = str(progress * 100) - datastore.write(self._ds_object.object_id, update_mtime=False) + datastore.write(self._ds_object, update_mtime=False) def __reply_handler_cb(self): - logging.debug('__reply_handler_cb %r', self._object_id) + logging.debug('__reply_handler_cb %r', self._ds_object.object_id) def __error_handler_cb(self, error): - logging.debug('__error_handler_cb %r %s', self._object_id, error) + logging.debug('__error_handler_cb %r %s', self._ds_object.object_id, + error) def __dismiss_clicked_cb(self, palette): self.remove() + class OutgoingTransferButton(BaseTransferButton): """UI element representing an ongoing outgoing file transfer """ @@ -572,7 +449,7 @@ class OutgoingTransferButton(BaseTransferButton): break client = gconf.client_get_default() - icon_color = XoColor(client.get_string("/desktop/sugar/user/color")) + icon_color = XoColor(client.get_string('/desktop/sugar/user/color')) self.props.icon_widget.props.xo_color = icon_color self.notif_icon.props.xo_color = icon_color @@ -590,14 +467,14 @@ class OutgoingTransferButton(BaseTransferButton): def __dismiss_clicked_cb(self, palette): self.remove() + class BaseTransferPalette(Palette): """Base palette class for frame or notification icon for file transfers """ - __gtype_name__ = "SugarBaseTransferPalette" + __gtype_name__ = 'SugarBaseTransferPalette' __gsignals__ = { - 'dismiss-clicked': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, ([])), + 'dismiss-clicked': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])), } def __init__(self, file_transfer): @@ -652,10 +529,12 @@ class BaseTransferPalette(Palette): total = self._format_size(self.file_transfer.file_size) self.progress_label.props.label = _('%s of %s') % (transferred, total) + class IncomingTransferPalette(BaseTransferPalette): """Palette for frame or notification icon for incoming file transfers """ - __gtype_name__ = "SugarIncomingTransferPalette" + __gtype_name__ = 'SugarIncomingTransferPalette' + def __init__(self, file_transfer): BaseTransferPalette.__init__(self, file_transfer) @@ -778,10 +657,11 @@ class IncomingTransferPalette(BaseTransferPalette): def __dismiss_activate_cb(self, menu_item): self.emit('dismiss-clicked') + class OutgoingTransferPalette(BaseTransferPalette): """Palette for frame or notification icon for outgoing file transfers """ - __gtype_name__ = "SugarOutgoingTransferPalette" + __gtype_name__ = 'SugarOutgoingTransferPalette' def __init__(self, file_transfer): BaseTransferPalette.__init__(self, file_transfer) diff --git a/src/jarabe/frame/clipboard.py b/src/jarabe/frame/clipboard.py index 3b9f745..be2b902 100644 --- a/src/jarabe/frame/clipboard.py +++ b/src/jarabe/frame/clipboard.py @@ -26,6 +26,10 @@ from sugar import mime from jarabe.frame.clipboardobject import ClipboardObject, Format + +_instance = None + + class Clipboard(gobject.GObject): __gsignals__ = { @@ -34,7 +38,7 @@ class Clipboard(gobject.GObject): 'object-deleted': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([int])), 'object-state-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, - ([object])) + ([object])), } def __init__(self): @@ -69,7 +73,7 @@ class Clipboard(gobject.GObject): + ' with path at ' + new_uri) else: cb_object.add_format(Format(format_type, data, on_disk)) - logging.debug('Added in-memory format of type ' + format_type + '.') + logging.debug('Added in-memory format of type %s.', format_type) self.emit('object-state-changed', cb_object) @@ -82,9 +86,9 @@ class Clipboard(gobject.GObject): def set_object_percent(self, object_id, percent): cb_object = self._objects[object_id] if percent < 0 or percent > 100: - raise ValueError("invalid percentage") + raise ValueError('invalid percentage') if cb_object.get_percent() > percent: - raise ValueError("invalid percentage; less than current percent") + raise ValueError('invalid percentage; less than current percent') if cb_object.get_percent() == percent: # ignore setting same percentage return @@ -126,21 +130,21 @@ class Clipboard(gobject.GObject): def _copy_file(self, original_uri): uri = urlparse.urlparse(original_uri) - path_, file_name = os.path.split(uri.path) + path = uri.path # pylint: disable=E1101 + directory_, file_name = os.path.split(path) root, ext = os.path.splitext(file_name) if not ext or ext == '.': - mime_type = mime.get_for_file(uri.path) + mime_type = mime.get_for_file(path) ext = '.' + mime.get_primary_extension(mime_type) f_, new_file_path = tempfile.mkstemp(ext, root) del f_ - shutil.copyfile(uri.path, new_file_path) + shutil.copyfile(path, new_file_path) os.chmod(new_file_path, 0644) return 'file://' + new_file_path -_instance = None def get_instance(): global _instance diff --git a/src/jarabe/frame/clipboardicon.py b/src/jarabe/frame/clipboardicon.py index 279db08..aa72d8a 100644 --- a/src/jarabe/frame/clipboardicon.py +++ b/src/jarabe/frame/clipboardicon.py @@ -31,6 +31,7 @@ from jarabe.frame.frameinvoker import FrameWidgetInvoker from jarabe.frame.notification import NotificationIcon import jarabe.frame + class ClipboardIcon(RadioToolButton): __gtype_name__ = 'SugarClipboardIcon' @@ -71,7 +72,8 @@ class ClipboardIcon(RadioToolButton): def _drag_data_get_cb(self, widget, context, selection, target_type, event_time): - logging.debug('_drag_data_get_cb: requested target ' + selection.target) + logging.debug('_drag_data_get_cb: requested target %s', + selection.target) data = self._cb_object.get_formats()[selection.target].get_data() selection.set(selection.target, 8, data) @@ -79,8 +81,8 @@ class ClipboardIcon(RadioToolButton): logging.debug('ClipboardIcon._put_in_clipboard') if self._cb_object.get_percent() < 100: - raise ValueError('Object is not complete,' \ - ' cannot be put into the clipboard.') + raise ValueError('Object is not complete, cannot be put into the' + ' clipboard.') targets = self._get_targets() if targets: diff --git a/src/jarabe/frame/clipboardmenu.py b/src/jarabe/frame/clipboardmenu.py index b998110..d11538d 100644 --- a/src/jarabe/frame/clipboardmenu.py +++ b/src/jarabe/frame/clipboardmenu.py @@ -35,6 +35,7 @@ from jarabe.frame import clipboard from jarabe.journal import misc from jarabe.model import bundleregistry + class ClipboardMenu(Palette): def __init__(self, cb_object): @@ -212,7 +213,8 @@ class ClipboardMenu(Palette): if most_significant_mime_type == 'text/uri-list': uris = mime.split_uri_list(format_.get_data()) if len(uris) == 1 and uris[0].startswith('file://'): - file_path = urlparse.urlparse(uris[0]).path + parsed_url = urlparse.urlparse(uris[0]) + file_path = parsed_url.path # pylint: disable=E1101 transfer_ownership = False mime_type = mime.get_for_file(file_path) else: @@ -221,7 +223,8 @@ class ClipboardMenu(Palette): mime_type = 'text/uri-list' else: if format_.is_on_disk(): - file_path = urlparse.urlparse(format_.get_data()).path + parsed_url = urlparse.urlparse(format_.get_data()) + file_path = parsed_url.path # pylint: disable=E1101 transfer_ownership = False mime_type = mime.get_for_file(file_path) else: diff --git a/src/jarabe/frame/clipboardobject.py b/src/jarabe/frame/clipboardobject.py index e9403f9..407af2f 100644 --- a/src/jarabe/frame/clipboardobject.py +++ b/src/jarabe/frame/clipboardobject.py @@ -24,6 +24,7 @@ from gettext import gettext as _ from sugar import mime from sugar.bundle.activitybundle import ActivityBundle + class ClipboardObject(object): def __init__(self, object_path, name): @@ -105,15 +106,18 @@ class ClipboardObject(object): if format_ == 'text/uri-list': data = self._formats['text/uri-list'].get_data() uri = urlparse.urlparse(mime.split_uri_list(data)[0], 'file') - if uri.scheme == 'file': - if os.path.exists(uri.path): - format_ = mime.get_for_file(uri.path) + scheme = uri.scheme # pylint: disable=E1101 + if scheme == 'file': + path = uri.path # pylint: disable=E1101 + if os.path.exists(path): + format_ = mime.get_for_file(path) else: - format_ = mime.get_from_file_name(uri.path) + format_ = mime.get_from_file_name(path) logging.debug('Chose %r!', format_) return format_ + class Format(object): def __init__(self, mime_type, data, on_disk): @@ -126,8 +130,9 @@ class Format(object): def destroy(self): if self._on_disk: uri = urlparse.urlparse(self._data) - if os.path.isfile(uri.path): - os.remove(uri.path) + path = uri.path # pylint: disable=E1101 + if os.path.isfile(path): + os.remove(path) def get_type(self): return self._type diff --git a/src/jarabe/frame/clipboardpanelwindow.py b/src/jarabe/frame/clipboardpanelwindow.py index ac324f4..f5d537c 100644 --- a/src/jarabe/frame/clipboardpanelwindow.py +++ b/src/jarabe/frame/clipboardpanelwindow.py @@ -25,6 +25,7 @@ from jarabe.frame.clipboardtray import ClipboardTray from jarabe.frame import clipboard + class ClipboardPanelWindow(FrameWindow): def __init__(self, frame, orientation): FrameWindow.__init__(self, orientation) @@ -35,7 +36,7 @@ class ClipboardPanelWindow(FrameWindow): # NOTE: we need to keep a reference to gtk.Clipboard in order to keep # listening to it. self._clipboard = gtk.Clipboard() - self._clipboard.connect("owner-change", self._owner_change_cb) + self._clipboard.connect('owner-change', self._owner_change_cb) self._clipboard_tray = ClipboardTray() canvas_widget = hippo.CanvasWidget(widget=self._clipboard_tray) @@ -43,14 +44,14 @@ class ClipboardPanelWindow(FrameWindow): # Receiving dnd drops self.drag_dest_set(0, [], 0) - self.connect("drag_motion", self._clipboard_tray.drag_motion_cb) - self.connect("drag_leave", self._clipboard_tray.drag_leave_cb) - self.connect("drag_drop", self._clipboard_tray.drag_drop_cb) - self.connect("drag_data_received", + self.connect('drag_motion', self._clipboard_tray.drag_motion_cb) + self.connect('drag_leave', self._clipboard_tray.drag_leave_cb) + self.connect('drag_drop', self._clipboard_tray.drag_drop_cb) + self.connect('drag_data_received', self._clipboard_tray.drag_data_received_cb) def _owner_change_cb(self, x_clipboard, event): - logging.debug("owner_change_cb") + logging.debug('owner_change_cb') if self._clipboard_tray.owns_clipboard(): return @@ -100,4 +101,3 @@ class ClipboardPanelWindow(FrameWindow): selection.type, selection.data, on_disk=False) - diff --git a/src/jarabe/frame/clipboardtray.py b/src/jarabe/frame/clipboardtray.py index 8beb6a8..f49b799 100644 --- a/src/jarabe/frame/clipboardtray.py +++ b/src/jarabe/frame/clipboardtray.py @@ -27,6 +27,7 @@ from sugar.graphics import style from jarabe.frame import clipboard from jarabe.frame.clipboardicon import ClipboardIcon + class _ContextMap(object): """Maps a drag context to the clipboard object involved in the dragging.""" def __init__(self): @@ -40,8 +41,8 @@ class _ContextMap(object): def get_object_id(self, context): """Retrieves the object_id associated with context. - Will release the association when this function was called as many times - as the number of data_types that this clipboard object contains. + Will release the association when this function was called as many + times as the number of data_types that this clipboard object contains. """ [object_id, data_types_left] = self._context_map[context] @@ -56,6 +57,7 @@ class _ContextMap(object): def has_context(self, context): return context in self._context_map + class ClipboardTray(tray.VTray): MAX_ITEMS = gtk.gdk.screen_height() / style.GRID_CELL_SIZE - 2 @@ -154,7 +156,7 @@ class ClipboardTray(tray.VTray): if 'XdndDirectSave0' in context.targets: window = context.source_window prop_type, format_, filename = \ - window.property_get('XdndDirectSave0','text/plain') + window.property_get('XdndDirectSave0', 'text/plain') # FIXME query the clipboard service for a filename? base_dir = tempfile.gettempdir() @@ -192,12 +194,13 @@ class ClipboardTray(tray.VTray): if selection.data == 'S': window = context.source_window - prop_type, format_, dest = \ - window.property_get('XdndDirectSave0', 'text/plain') + prop_type, format_, dest = window.property_get( + 'XdndDirectSave0', 'text/plain') clipboardservice = clipboard.get_instance() - clipboardservice.add_object_format( \ - object_id, 'XdndDirectSave0', dest, on_disk=True) + clipboardservice.add_object_format(object_id, + 'XdndDirectSave0', + dest, on_disk=True) else: self._add_selection(object_id, selection) @@ -213,4 +216,3 @@ class ClipboardTray(tray.VTray): return True else: return False - diff --git a/src/jarabe/frame/devicestray.py b/src/jarabe/frame/devicestray.py index 72affe3..c5db639 100644 --- a/src/jarabe/frame/devicestray.py +++ b/src/jarabe/frame/devicestray.py @@ -15,14 +15,13 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import os -import sys -import traceback import logging from sugar.graphics import tray from jarabe import config + class DevicesTray(tray.HTray): def __init__(self): tray.HTray.__init__(self, align=tray.ALIGN_TO_END) @@ -35,14 +34,14 @@ class DevicesTray(tray.HTray): locals(), [module_name]) mod.setup(self) except Exception: - logging.error('Exception while loading extension:\n' + \ - ''.join(traceback.format_exception(*sys.exc_info()))) + logging.exception('Exception while loading extension:') def add_device(self, view): index = 0 - relative_index = getattr(view, "FRAME_POSITION_RELATIVE", -1) + relative_index = getattr(view, 'FRAME_POSITION_RELATIVE', -1) for item in self.get_children(): - current_relative_index = getattr(item, "FRAME_POSITION_RELATIVE", 0) + current_relative_index = getattr(item, 'FRAME_POSITION_RELATIVE', + 0) if current_relative_index >= relative_index: index += 1 else: diff --git a/src/jarabe/frame/eventarea.py b/src/jarabe/frame/eventarea.py index 166aaf5..1b5bf86 100644 --- a/src/jarabe/frame/eventarea.py +++ b/src/jarabe/frame/eventarea.py @@ -19,14 +19,14 @@ import gobject import wnck import gconf + _MAX_DELAY = 1000 + class EventArea(gobject.GObject): __gsignals__ = { - 'enter': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, ([])), - 'leave': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, ([])) + 'enter': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])), + 'leave': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])), } def __init__(self): @@ -37,10 +37,11 @@ class EventArea(gobject.GObject): self._sids = {} client = gconf.client_get_default() self._edge_delay = client.get_int('/desktop/sugar/frame/edge_delay') - self._corner_delay = client.get_int('/desktop/sugar/frame/corner_delay') + self._corner_delay = client.get_int('/desktop/sugar/frame' + '/corner_delay') right = gtk.gdk.screen_width() - 1 - bottom = gtk.gdk.screen_height() -1 + bottom = gtk.gdk.screen_height() - 1 width = gtk.gdk.screen_width() - 2 height = gtk.gdk.screen_height() - 2 @@ -94,6 +95,7 @@ class EventArea(gobject.GObject): invisible.connect('drag_leave', self._drag_leave_cb) invisible.realize() + # pylint: disable=E1101 invisible.window.set_events(gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.ENTER_NOTIFY_MASK | gtk.gdk.LEAVE_NOTIFY_MASK) diff --git a/src/jarabe/frame/frame.py b/src/jarabe/frame/frame.py index 55f866f..079eeeb 100644 --- a/src/jarabe/frame/frame.py +++ b/src/jarabe/frame/frame.py @@ -35,6 +35,7 @@ from jarabe.frame.clipboardpanelwindow import ClipboardPanelWindow from jarabe.frame.notification import NotificationIcon, NotificationWindow from jarabe.model import notifications + TOP_RIGHT = 0 TOP_LEFT = 1 BOTTOM_RIGHT = 2 @@ -43,6 +44,7 @@ BOTTOM_LEFT = 3 _FRAME_HIDING_DELAY = 500 _NOTIFICATION_DURATION = 5000 + class _Animation(animator.Animation): def __init__(self, frame, end): start = frame.current_position @@ -52,6 +54,7 @@ class _Animation(animator.Animation): def next_frame(self, current): self._frame.move(current) + class _MouseListener(object): def __init__(self, frame): self._frame = frame @@ -79,6 +82,7 @@ class _MouseListener(object): self._hide_sid = gobject.timeout_add( _FRAME_HIDING_DELAY, self._hide_frame_timeout_cb) + class _KeyListener(object): def __init__(self, frame): self._frame = frame @@ -90,13 +94,14 @@ class _KeyListener(object): else: self._frame.show(Frame.MODE_KEYBOARD) + class Frame(object): - MODE_MOUSE = 0 + MODE_MOUSE = 0 MODE_KEYBOARD = 1 MODE_NON_INTERACTIVE = 2 def __init__(self): - logging.debug("STARTUP: Loading the frame") + logging.debug('STARTUP: Loading the frame') self.mode = None self._palette_group = palettegroup.get_group('frame') @@ -173,12 +178,12 @@ class Frame(object): def _create_top_panel(self): panel = self._create_panel(gtk.POS_TOP) - # TODO: setting box_width and hippo.PACK_EXPAND looks like a hack to me. - # Why hippo isn't respecting the request size of these controls? + # TODO: setting box_width and hippo.PACK_EXPAND looks like a hack to + # me. Why hippo isn't respecting the request size of these controls? zoom_toolbar = ZoomToolbar() panel.append(hippo.CanvasWidget(widget=zoom_toolbar, - box_width=4*style.GRID_CELL_SIZE)) + box_width=4 * style.GRID_CELL_SIZE)) zoom_toolbar.show() activities_tray = ActivitiesTray() @@ -193,7 +198,8 @@ class Frame(object): # TODO: same issue as in _create_top_panel() devices_tray = DevicesTray() - panel.append(hippo.CanvasWidget(widget=devices_tray), hippo.PACK_EXPAND) + panel.append(hippo.CanvasWidget(widget=devices_tray), + hippo.PACK_EXPAND) devices_tray.show() return panel @@ -322,7 +328,7 @@ class Frame(object): del self._notif_by_icon[icon] def __notification_received_cb(self, **kwargs): - logging.debug('__notification_received_cb %r', kwargs) + logging.debug('__notification_received_cb') icon = NotificationIcon() hints = kwargs['hints'] @@ -348,4 +354,3 @@ class Frame(object): # Do nothing for now. Our notification UI is so simple, there's no # point yet. pass - diff --git a/src/jarabe/frame/frameinvoker.py b/src/jarabe/frame/frameinvoker.py index e4a13e1..a4abfa8 100644 --- a/src/jarabe/frame/frameinvoker.py +++ b/src/jarabe/frame/frameinvoker.py @@ -19,6 +19,7 @@ import gtk from sugar.graphics import style from sugar.graphics.palette import WidgetInvoker + def _get_screen_area(): frame_thickness = style.GRID_CELL_SIZE @@ -28,6 +29,7 @@ def _get_screen_area(): return gtk.gdk.Rectangle(x, y, width, height) + class FrameWidgetInvoker(WidgetInvoker): def __init__(self, widget): WidgetInvoker.__init__(self, widget, widget.child) diff --git a/src/jarabe/frame/framewindow.py b/src/jarabe/frame/framewindow.py index a7d8fe7..c77e76c 100644 --- a/src/jarabe/frame/framewindow.py +++ b/src/jarabe/frame/framewindow.py @@ -19,6 +19,7 @@ import hippo from sugar.graphics import style + class FrameWindow(gtk.Window): __gtype_name__ = 'SugarFrameWindow' diff --git a/src/jarabe/frame/friendstray.py b/src/jarabe/frame/friendstray.py index b5437e5..31a9809 100644 --- a/src/jarabe/frame/friendstray.py +++ b/src/jarabe/frame/friendstray.py @@ -14,13 +14,16 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -from sugar.presence import presenceservice +import logging + 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 get_owner_instance +from jarabe.model import neighborhood + class FriendIcon(TrayIcon): def __init__(self, buddy): @@ -32,46 +35,32 @@ class FriendIcon(TrayIcon): self.palette.props.icon_visible = False self.palette.set_group_id('frame') + 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 = {} - self._pservice = presenceservice.get_instance() - self._pservice.connect('activity-appeared', - self.__activity_appeared_cb) - - self._owner = self._pservice.get_owner() - - # 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): + if buddy.props.key in self._buddies: return - model = BuddyModel(buddy=buddy) - - icon = FriendIcon(model) + icon = FriendIcon(buddy) self.add_item(icon) icon.show() self._buddies[buddy.props.key] = icon def remove_buddy(self, buddy): - if not self._buddies.has_key(buddy.props.key): + if buddy.props.key not in self._buddies: return self.remove_item(self._buddies[buddy.props.key]) @@ -83,39 +72,23 @@ 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_model, + 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(self._owner) - - if shared_activity is True: - for buddy in activity_ps.get_joined_buddies(): - self.add_buddy(buddy) + self.add_buddy(get_owner_instance()) - 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,19 +96,25 @@ class FriendsTray(VTray): if activity_id is None: return - # check if activity is shared - activity = None - 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._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_left_cb(self, activity, buddy): + def __buddy_removed_cb(self, activity, buddy): + logging.debug('FriendsTray.__buddy_removed_cb') self.remove_buddy(buddy) diff --git a/src/jarabe/frame/notification.py b/src/jarabe/frame/notification.py index 83dc27e..3471e2c 100644 --- a/src/jarabe/frame/notification.py +++ b/src/jarabe/frame/notification.py @@ -22,13 +22,14 @@ from sugar.graphics.xocolor import XoColor from jarabe.view.pulsingicon import PulsingIcon + class NotificationIcon(gtk.EventBox): __gtype_name__ = 'SugarNotificationIcon' __gproperties__ = { - 'xo-color' : (object, None, None, gobject.PARAM_READWRITE), - 'icon-name' : (str, None, None, None, gobject.PARAM_READWRITE), - 'icon-filename' : (str, None, None, None, gobject.PARAM_READWRITE) + 'xo-color': (object, None, None, gobject.PARAM_READWRITE), + 'icon-name': (str, None, None, None, gobject.PARAM_READWRITE), + 'icon-filename': (str, None, None, None, gobject.PARAM_READWRITE), } _PULSE_TIMEOUT = 3 @@ -45,7 +46,8 @@ class NotificationIcon(gtk.EventBox): self.add(self._icon) self._icon.show() - gobject.timeout_add_seconds(self._PULSE_TIMEOUT, self.__stop_pulsing_cb) + gobject.timeout_add_seconds(self._PULSE_TIMEOUT, + self.__stop_pulsing_cb) self.set_size_request(style.GRID_CELL_SIZE, style.GRID_CELL_SIZE) @@ -80,6 +82,7 @@ class NotificationIcon(gtk.EventBox): palette = property(_get_palette, _set_palette) + class NotificationWindow(gtk.Window): __gtype_name__ = 'SugarNotificationWindow' @@ -97,4 +100,3 @@ class NotificationWindow(gtk.Window): color = gtk.gdk.color_parse(style.COLOR_TOOLBAR_GREY.get_html()) self.modify_bg(gtk.STATE_NORMAL, color) - diff --git a/src/jarabe/frame/zoomtoolbar.py b/src/jarabe/frame/zoomtoolbar.py index 2ed3c54..6c10c61 100644 --- a/src/jarabe/frame/zoomtoolbar.py +++ b/src/jarabe/frame/zoomtoolbar.py @@ -26,6 +26,7 @@ from sugar.graphics.radiotoolbutton import RadioToolButton from jarabe.frame.frameinvoker import FrameWidgetInvoker from jarabe.model import shell + class ZoomToolbar(gtk.Toolbar): def __init__(self): gtk.Toolbar.__init__(self) @@ -86,4 +87,3 @@ class ZoomToolbar(gtk.Toolbar): self._activity_button.props.active = True else: raise ValueError('Invalid zoom level: %r' % (new_level)) - |