Merge branch 'master' of git+ssh://dev.laptop.org/git/sugar

This commit is contained in:
Marco Pesenti Gritti 2007-07-11 11:45:43 +02:00
commit d2059c1baa
5 changed files with 79 additions and 37 deletions

1
NEWS
View File

@ -1,3 +1,4 @@
* #1888 Fix opening items from the clipboard. (tomeu)
* #1984 Fix removing items from the clipboard. (tomeu) * #1984 Fix removing items from the clipboard. (tomeu)
Snapshot b83a9ec27d Snapshot b83a9ec27d

View File

@ -27,8 +27,6 @@ from sugar.graphics.palette import Palette
from sugar.graphics.canvasicon import CanvasIcon from sugar.graphics.canvasicon import CanvasIcon
from sugar.graphics import color from sugar.graphics import color
from sugar.graphics import style from sugar.graphics import style
from sugar.activity import activityfactory
from sugar.activity.bundle import Bundle
from sugar.clipboard import clipboardservice from sugar.clipboard import clipboardservice
from sugar.datastore import datastore from sugar.datastore import datastore
from sugar.objects import mime from sugar.objects import mime
@ -118,44 +116,43 @@ class ClipboardMenu(Palette):
if self._percent < 100: if self._percent < 100:
return return
# Get the file path jobject = self._copy_to_journal()
cb_service = clipboardservice.get_instance() # TODO: we cannot simply call resume() right now because we would lock
obj = cb_service.get_object(self._object_id) # the shell as we are sharing the same loop as the shell service.
formats = obj['FORMATS'] #jobject.resume()
if len(formats) == 0:
logging.warning('ClipboardMenu._open_item_activate_cb: Object without data.')
return
if not self._activity and \ # TODO: take this out when we fix the mess that is the shell/shellservice.
not formats[0] == 'application/vnd.olpc-x-sugar': from shell.model import bundleregistry
logging.warning('ClipboardMenu._open_item_activate_cb: Object without activity.') from sugar.activity.bundle import Bundle
return from sugar.activity import activityfactory
if jobject.is_bundle():
bundle = Bundle(jobject.file_path)
if not bundle.is_installed():
bundle.install()
uri = cb_service.get_object_data(self._object_id, formats[0])['DATA'] activityfactory.create(bundle.get_service_name())
if not uri.startswith('file://'):
return
(scheme, netloc, path, params, query, fragment) = urlparse.urlparse(uri)
# FIXME: would be better to check for format.onDisk
try:
path_exists = os.path.exists(path)
except TypeError:
path_exists = False
if path_exists:
if self._activity:
activityfactory.create_with_uri(self._activity, uri)
else: else:
self._install_xo(path) service_name = None
else: if jobject.metadata.has_key('activity') and jobject.metadata['activity']:
logging.debug("Clipboard item file path %s didn't exist" % path) service_name = self.metadata['activity']
elif jobject.metadata.has_key('mime_type') and jobject.metadata['mime_type']:
mime_type = jobject.metadata['mime_type']
for bundle in bundleregistry.get_registry():
if bundle.get_mime_types() and mime_type in bundle.get_mime_types():
service_name = bundle.get_service_name()
break
if service_name:
activityfactory.create_with_object_id(service_name,
jobject.object_id)
def _remove_item_activate_cb(self, menu_item): def _remove_item_activate_cb(self, menu_item):
cb_service = clipboardservice.get_instance() cb_service = clipboardservice.get_instance()
cb_service.delete_object(self._object_id) cb_service.delete_object(self._object_id)
def _journal_item_activate_cb(self, menu_item): def _journal_item_activate_cb(self, menu_item):
self._copy_to_journal()
def _copy_to_journal(self):
cb_service = clipboardservice.get_instance() cb_service = clipboardservice.get_instance()
obj = cb_service.get_object(self._object_id) obj = cb_service.get_object(self._object_id)
@ -186,8 +183,5 @@ class ClipboardMenu(Palette):
jobject.file_path = file_path jobject.file_path = file_path
datastore.write(jobject) datastore.write(jobject)
def _install_xo(self, path): return jobject
bundle = Bundle(path)
if not bundle.is_installed():
bundle.install()

View File

@ -312,6 +312,8 @@ class Activity(Window, gtk.Container):
def _get_preview(self): def _get_preview(self):
preview_pixbuf = self.get_canvas_screenshot() preview_pixbuf = self.get_canvas_screenshot()
if preview_pixbuf is None:
return None
preview_pixbuf = preview_pixbuf.scale_simple(units.grid_to_pixels(4), preview_pixbuf = preview_pixbuf.scale_simple(units.grid_to_pixels(4),
units.grid_to_pixels(3), units.grid_to_pixels(3),
gtk.gdk.INTERP_BILINEAR) gtk.gdk.INTERP_BILINEAR)

View File

@ -20,6 +20,9 @@ import logging
import gobject import gobject
from sugar.datastore import dbus_helpers from sugar.datastore import dbus_helpers
from sugar import activity
from sugar.activity.bundle import Bundle
from sugar.activity import activityfactory
class DSMetadata(gobject.GObject): class DSMetadata(gobject.GObject):
__gsignals__ = { __gsignals__ = {
@ -85,6 +88,37 @@ class DSObject:
file_path = property(get_file_path, set_file_path) file_path = property(get_file_path, set_file_path)
def get_activities(self):
activities = []
if self.metadata['activity']:
activity_info = activity.get_registry().get_activity(self.metadata['activity'])
activities.append(activity_info)
mime_type = self.metadata['mime_type']
if mime_type:
activities_info = activity.get_registry().get_activities_for_type(mime_type)
for activity_info in activities_info:
if activity_info.service_name != self.metadata['activity']:
activities.append(activity_info)
return activities
def is_bundle(self):
return self.metadata['mime_type'] == 'application/vnd.olpc-x-sugar'
def resume(self):
if self.is_bundle():
bundle = Bundle(self.file_path)
if not bundle.is_installed():
bundle.install()
activityfactory.create(bundle.get_service_name())
else:
activity_info = self.get_activities()[0]
activityfactory.create_with_object_id(activity_info.service_name,
self.object_id)
def get(object_id): def get(object_id):
logging.debug('datastore.get') logging.debug('datastore.get')
metadata = dbus_helpers.get_properties(object_id) metadata = dbus_helpers.get_properties(object_id)

View File

@ -166,6 +166,17 @@ class Activity(gobject.GObject):
(bus_name, connection, channels) = self._activity.GetChannels() (bus_name, connection, channels) = self._activity.GetChannels()
return bus_name, connection, channels return bus_name, connection, channels
def _leave_cb(self):
# XXX Is this the right thing to do?
self.emit("joined", False, "left activity")
def _leave_error_cb(self, err):
# XXX We are closing down anyway
pass
def leave(self): def leave(self):
"""Leave this shared activity"""
# FIXME # FIXME
self._joined = False self._joined = False
self._activity.Leave(reply_handler=self._leave_cb,
error_handler=self._leave_error_cb)