Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManuel QuiƱones <manuq@laptop.org>2013-04-03 01:56:05 (GMT)
committer Ajay Garg <ajay@activitycentral.com>2013-04-13 04:03:30 (GMT)
commit53dbc344b80f08035aa8e22843c9ba5e2c889358 (patch)
treefdb8f4faada0edafb098c62504843437e415b5eb
parent68c4b7b65e26894390e7f4498b16f52cabeb2cbe (diff)
Bring back dragging of elements from the activities to the frame clipboard - SL #3819
TestCase: - open an activity like Browse, Read, Log (not Write, is a special case) - bring up the frame - drag things to the left side panel of the frame (images, links, or selected text) The elements should be added to the clipboard which is inside the panel. They should have the proper icon and they should popup a palette to act on them. Note: if the dragged object is a link from Browse, Sugar tries to copy the html to the disk. But the current implementation looks wrong. I have opened #4477 to track it: http://bugs.sugarlabs.org/ticket/4477 Note: this doesn't solve the inverse operation: drag from the clipboard to the activity. This will be done in another patch. API fixes: - gtk.SelectionData.type -> Gtk.SelectionData.get_data_type().name() [1] - gtk.SelectionData.data -> Gtk.SelectionData.get_data() [2] - gtk.SelectionData.target -> Gtk.SelectionData.get_target() [3] - context.targets -> context.list_targets() [4] - context.drop_finish(...) -> Gdk.drop_finish(context, ...) [5] - context.drag_status(...) -> Gdk.drag_status(context, ...) [6] - context.get_source_widget() -> Gdk.drag_get_source_widget(context) [7] [1] https://developer.gnome.org/gtk3/3.5/gtk3-Selections.html#gtk-selection-data-get-data-type [2] https://developer.gnome.org/gtk3/3.5/gtk3-Selections.html#gtk-selection-data-get-data [3] https://developer.gnome.org/gtk3/3.5/gtk3-Selections.html#gtk-selection-data-get-target [4] https://developer.gnome.org/gdk/stable/gdk-Drag-and-Drop.html#gdk-drag-context-list-targets [5] https://developer.gnome.org/gdk/stable/gdk-Drag-and-Drop.html#gdk-drop-finish [6] https://developer.gnome.org/gdk/stable/gdk-Drag-and-Drop.html#gdk-drag-status [7] https://developer.gnome.org/gtk3/stable/gtk3-Drag-and-Drop.html#gtk-drag-get-source-widget The type of Gtk.SelectionData now comes as a Gdk.Atom instead of string. We use the name of the type to keep our code working. The data for the type 'text/uri-list' comes with a character '\x00' at the end now. But using SelectionData.get_uris() returns a proper list (thanks to Flavio Danesse for the recommendation). So we can use that list instead of doing selection.get_data().split('\n') or sugar3.mime.split_uri_list (which could be obsolete now). In fact, this change was made a while ago in clipboardpanelwindow.py, but not in clipboardtray.py. See commit f0d194f3 . Signed-off-by: Manuel QuiƱones <manuq@laptop.org> Signed-off-by: Ajay Garg <ajay@activitycentral.com>
-rw-r--r--src/jarabe/frame/clipboardmenu.py4
-rw-r--r--src/jarabe/frame/clipboardobject.py4
-rw-r--r--src/jarabe/frame/clipboardpanelwindow.py2
-rw-r--r--src/jarabe/frame/clipboardtray.py38
4 files changed, 27 insertions, 21 deletions
diff --git a/src/jarabe/frame/clipboardmenu.py b/src/jarabe/frame/clipboardmenu.py
index e6766fb..eef3861 100644
--- a/src/jarabe/frame/clipboardmenu.py
+++ b/src/jarabe/frame/clipboardmenu.py
@@ -195,7 +195,7 @@ class ClipboardMenu(Palette):
transfer_ownership = False
if most_significant_mime_type == 'text/uri-list':
- uris = mime.split_uri_list(format_.get_data())
+ uris = format_.get_uris()
if len(uris) == 1 and uris[0].startswith('file://'):
parsed_url = urlparse.urlparse(uris[0])
file_path = parsed_url.path # pylint: disable=E1101
@@ -207,7 +207,7 @@ class ClipboardMenu(Palette):
mime_type = 'text/uri-list'
else:
if format_.is_on_disk():
- parsed_url = urlparse.urlparse(format_.get_data())
+ parsed_url = urlparse.urlparse(format_.get_uris()[0])
file_path = parsed_url.path # pylint: disable=E1101
transfer_ownership = False
mime_type = mime.get_for_file(file_path)
diff --git a/src/jarabe/frame/clipboardobject.py b/src/jarabe/frame/clipboardobject.py
index e79fa46..5a3c9fe 100644
--- a/src/jarabe/frame/clipboardobject.py
+++ b/src/jarabe/frame/clipboardobject.py
@@ -103,8 +103,8 @@ class ClipboardObject(object):
format_ = mime.choose_most_significant(self._formats.keys())
if format_ == 'text/uri-list':
- data = self._formats['text/uri-list'].get_data()
- uri = urlparse.urlparse(mime.split_uri_list(data)[0], 'file')
+ uris = self._formats[format_].get_uris()
+ uri = urlparse.urlparse(uris[0], 'file')
scheme = uri.scheme # pylint: disable=E1101
if scheme == 'file':
path = uri.path # pylint: disable=E1101
diff --git a/src/jarabe/frame/clipboardpanelwindow.py b/src/jarabe/frame/clipboardpanelwindow.py
index cfbc5f7..d67f27f 100644
--- a/src/jarabe/frame/clipboardpanelwindow.py
+++ b/src/jarabe/frame/clipboardpanelwindow.py
@@ -79,7 +79,7 @@ class ClipboardPanelWindow(FrameWindow):
cb_selections.append(selection)
if target_is_uri:
- uri = selection.get_data()
+ uri = selection.get_uris()[0]
filename = uri[len('file://'):].strip()
md5 = self._md5_for_file(filename)
data_hash = hash(md5)
diff --git a/src/jarabe/frame/clipboardtray.py b/src/jarabe/frame/clipboardtray.py
index abc885e..c2735c5 100644
--- a/src/jarabe/frame/clipboardtray.py
+++ b/src/jarabe/frame/clipboardtray.py
@@ -76,26 +76,31 @@ class ClipboardTray(tray.VTray):
return False
def _add_selection(self, object_id, selection):
- if not selection.data:
+ if not selection.get_data():
return
- logging.debug('ClipboardTray: adding type %r', selection.type)
+ selection_data = selection.get_data()
+
+ selection_type_atom = selection.get_data_type()
+ selection_type = selection_type_atom.name()
+
+ logging.debug('ClipboardTray: adding type %r', selection_type)
cb_service = clipboard.get_instance()
- if selection.type == 'text/uri-list':
- uris = selection.data.split('\n')
+ if selection_type == 'text/uri-list':
+ uris = selection.get_uris()
if len(uris) > 1:
raise NotImplementedError('Multiple uris in text/uri-list' \
' still not supported.')
cb_service.add_object_format(object_id,
- selection.type,
+ selection_type,
uris[0],
on_disk=True)
else:
cb_service.add_object_format(object_id,
- selection.type,
- selection.data,
+ selection_type,
+ selection_data,
on_disk=False)
def _object_added_cb(self, cb_service, cb_object):
@@ -132,9 +137,9 @@ class ClipboardTray(tray.VTray):
logging.debug('ClipboardTray._drag_motion_cb')
if self._internal_drag(context):
- context.drag_status(Gdk.DragAction.MOVE, time)
+ Gdk.drag_status(context, Gdk.DragAction.MOVE, time)
else:
- context.drag_status(Gdk.DragAction.COPY, time)
+ Gdk.drag_status(context, Gdk.DragAction.COPY, time)
self.props.drag_active = True
return True
@@ -148,15 +153,16 @@ class ClipboardTray(tray.VTray):
if self._internal_drag(context):
# TODO: We should move the object within the clipboard here
if not self._context_map.has_context(context):
- context.drop_finish(False, Gtk.get_current_event_time())
+ Gdk.drop_finish(context, False, Gtk.get_current_event_time())
return False
cb_service = clipboard.get_instance()
object_id = cb_service.add_object(name="")
- self._context_map.add_context(context, object_id, len(context.targets))
+ context_targets = context.list_targets()
+ self._context_map.add_context(context, object_id, len(context_targets))
- for target in context.targets:
+ for target in context_targets:
if str(target) not in ('TIMESTAMP', 'TARGETS', 'MULTIPLE'):
widget.drag_get_data(context, target, time)
@@ -167,13 +173,13 @@ class ClipboardTray(tray.VTray):
def drag_data_received_cb(self, widget, context, x, y, selection,
targetType, time):
logging.debug('ClipboardTray: got data for target %r',
- selection.target)
+ selection.get_target())
object_id = self._context_map.get_object_id(context)
try:
if selection is None:
logging.warn('ClipboardTray: empty selection for target %s',
- selection.target)
+ selection.get_target())
else:
self._add_selection(object_id, selection)
@@ -181,10 +187,10 @@ class ClipboardTray(tray.VTray):
# If it's the last target to be processed, finish
# the dnd transaction
if not self._context_map.has_context(context):
- context.drop_finish(True, Gtk.get_current_event_time())
+ Gdk.drop_finish(context, True, Gtk.get_current_event_time())
def _internal_drag(self, context):
- source_widget = context.get_source_widget()
+ source_widget = Gtk.drag_get_source_widget(context)
if source_widget is None:
return False
view_ancestor = source_widget.get_ancestor(Gtk.Viewport)