Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksey Lim <alsroot@member.fsf.org>2010-02-01 05:22:12 (GMT)
committer Aleksey Lim <alsroot@member.fsf.org>2010-02-01 05:22:12 (GMT)
commitb713512e9bf073bce5376a085b99d357dc3482a5 (patch)
treeafa4b26035e755fd48bb8befc16c8e4bf259ceb2
parente5f3fef5ca761bbce368510cd60672d6f8b48562 (diff)
Drag objects using title
-rw-r--r--src/jarabe/journal/entry.py31
-rw-r--r--src/jarabe/journal/fields.py112
2 files changed, 86 insertions, 57 deletions
diff --git a/src/jarabe/journal/entry.py b/src/jarabe/journal/entry.py
index 5cd8351..65126d7 100644
--- a/src/jarabe/journal/entry.py
+++ b/src/jarabe/journal/entry.py
@@ -39,7 +39,6 @@ class Entry(gtk.TextView):
def __init__(self, **kwargs):
self._max_line_count = 1
self._text = None
- self._button_pressed = False
gobject.GObject.__init__(self, **kwargs)
@@ -52,10 +51,12 @@ class Entry(gtk.TextView):
self.connect('key-press-event', self.__key_press_event_cb)
self.connect('focus-in-event', self.__focus_in_event_cb)
self.connect('focus-out-event', self.__focus_out_event_cb)
- self.connect('button-press-event', self.__button_press_event_cb)
self.connect('button-release-event', self.__button_release_event_cb)
+ self.connect('drag-motion', self.__drag_motion_cb)
self.props.buffer.connect('changed', self.__buffer_changed_cb)
+ self.props.can_focus = False
+
def set_accepts_tab(self, value):
# accepts_tab cannot be set by users
assert(False)
@@ -168,30 +169,29 @@ class Entry(gtk.TextView):
self._set_height_request(self._line_count())
return False
- def __button_press_event_cb(self, widget, event):
- self._button_pressed = self.props.has_focus or -1
- return False
-
def __button_release_event_cb(self, widget, event):
- if self._button_pressed == -1:
- self._select()
- self._button_pressed = False
+ x, y = self.get_pointer()
+ if not self.dragging and \
+ x in xrange(self.allocation.width) and \
+ y in xrange(self.allocation.height):
+ self.props.can_focus = True
+ self.grab_focus()
return False
def __focus_in_event_cb(self, widget, event):
+ self.can_source_drag = False
self.props.buffer.props.text = self._text
self._set_edit_mode()
self.parent.check_resize()
-
- if not self._button_pressed:
- self._select()
-
+ self._select()
return False
def __focus_out_event_cb(self, widget, event):
self._text = self.props.buffer.props.text
self._set_accent_mode()
self.parent.check_resize()
+ self.props.can_focus = False
+ self.can_source_drag = True
return False
def __key_press_event_cb(self, widget, event):
@@ -216,3 +216,8 @@ class Entry(gtk.TextView):
self.props.buffer.props.text = self._text
return False
+
+ def __drag_motion_cb(self, widget, context, x, y, time):
+ # disable text dragging
+ context.drag_status(0, time)
+ return True
diff --git a/src/jarabe/journal/fields.py b/src/jarabe/journal/fields.py
index ab08e26..bd102dc 100644
--- a/src/jarabe/journal/fields.py
+++ b/src/jarabe/journal/fields.py
@@ -155,10 +155,69 @@ class KeepIcon(_Button):
self.do_colors()
-class _JournalObject(gtk.EventBox):
+class _DragObject(object):
+
+ def __init__(self):
+ self._can_source_drag = False
+ self._dragging = False
+ self._temp_drag_file_path = None
+
+ self.connect('drag-begin', self.__drag_begin_cb)
+ self.connect('drag-data-get', self.__drag_data_get_cb)
+ self.connect('drag-end', self.__drag_end_cb)
+
+ self.can_source_drag = True
+
+ @property
+ def can_source_drag(self):
+ return self._can_source_drag
+
+ @can_source_drag.setter
+ def can_source_drag(self, value):
+ if value:
+ self.drag_source_set(gtk.gdk.BUTTON1_MASK,
+ [('text/uri-list', 0, 0), ('journal-object-id', 0, 0)],
+ gtk.gdk.ACTION_COPY)
+ else:
+ self.drag_source_set(0, [], 0)
+ self._can_source_drag = value
+
+ @property
+ def dragging(self):
+ return self._dragging
+
+ def __drag_begin_cb(self, widget, context):
+ self._dragging = True
+
+ surface = get_surface(
+ file_name=misc.get_icon_name(self.metadata),
+ xo_color=misc.get_icon_color(self.metadata))
+ pixmap, bitmask = _surface_to_pixels(self.window, surface)
+
+ context.set_icon_pixmap(self.get_colormap(), pixmap, bitmask,
+ surface.get_width() / 2, surface.get_height() / 2)
+
+ def __drag_data_get_cb(self, widget, context, selection, target_type,
+ event_time):
+ if selection.target == 'text/uri-list':
+ # Get hold of a reference so the temp file doesn't get deleted
+ self._temp_drag_file_path = model.get_file(self.metadata)
+ logging.debug('putting %r in selection', self._temp_drag_file_path)
+ selection.set(selection.target, 8, self._temp_drag_file_path)
+
+ elif selection.target == 'journal-object-id':
+ selection.set(selection.target, 8, self.metadata['uid'])
+
+ def __drag_end_cb(self, widget, context):
+ self._dragging = False
+ self._temp_drag_file_path = None
+
+
+class _JournalObject(_DragObject, gtk.EventBox):
def __init__(self, detail, paint_border, paint_fill):
gtk.EventBox.__init__(self)
+ _DragObject.__init__(self)
self.metadata = None
self._detail = detail
@@ -166,14 +225,9 @@ class _JournalObject(gtk.EventBox):
self._invoker = WidgetInvoker(self)
self._invoker._position_hint = Invoker.AT_CURSOR
- self.modify_fg(gtk.STATE_NORMAL,
- style.COLOR_PANEL_GREY.get_gdk_color())
-
- self.connect_after('button-release-event',
- self.__button_release_event_cb)
- self.connect('destroy', self.__destroy_cb)
-
if paint_border:
+ self.modify_fg(gtk.STATE_NORMAL,
+ style.COLOR_PANEL_GREY.get_gdk_color())
self.connect_after('expose-event', self.__expose_event_cb)
paint_fill = True
@@ -183,16 +237,10 @@ class _JournalObject(gtk.EventBox):
else:
self.props.visible_window = False
- # DND stuff
-
- self._drag = False
- self._temp_drag_file_path = None
- self.drag_source_set(gtk.gdk.BUTTON1_MASK,
- [('text/uri-list', 0, 0), ('journal-object-id', 0, 0)],
- gtk.gdk.ACTION_COPY)
+ self.connect_after('button-release-event',
+ self.__button_release_event_cb)
+ self.connect('destroy', self.__destroy_cb)
self.connect('drag-begin', self.__drag_begin_cb)
- self.connect('drag-data-get', self.__drag_data_get_cb)
- self.connect('drag-end', self.__drag_end_cb)
def fill_in(self, metadata):
self.metadata = metadata
@@ -212,36 +260,11 @@ class _JournalObject(gtk.EventBox):
self.window.draw_rectangle(fg, False, 0, 0, width - 1, height - 1)
def __drag_begin_cb(self, widget, context):
- self._drag = True
-
if self._invoker.palette is not None:
self._invoker.palette.popdown(immediate=True)
- surface = get_surface(
- file_name=misc.get_icon_name(self.metadata),
- xo_color=misc.get_icon_color(self.metadata))
- pixmap, bitmask = _surface_to_pixels(self.window, surface)
-
- context.set_icon_pixmap(self.get_colormap(), pixmap, bitmask,
- surface.get_width() / 2, surface.get_height() / 2)
-
- def __drag_data_get_cb(self, widget, context, selection, target_type,
- event_time):
- if selection.target == 'text/uri-list':
- # Get hold of a reference so the temp file doesn't get deleted
- self._temp_drag_file_path = model.get_file(self.metadata)
- logging.debug('putting %r in selection', self._temp_drag_file_path)
- selection.set(selection.target, 8, self._temp_drag_file_path)
-
- elif selection.target == 'journal-object-id':
- selection.set(selection.target, 8, self.metadata['uid'])
-
- def __drag_end_cb(self, widget, context):
- self._drag = False
- self._temp_drag_file_path = None
-
def __button_release_event_cb(self, button, event):
- if not self._drag and self.metadata is not None:
+ if not self.dragging and self.metadata is not None:
misc.resume(self.metadata)
return True
@@ -274,10 +297,11 @@ class Thumb(_JournalObject):
self._image.set_from_pixbuf(pixbuf)
-class Title(Entry):
+class Title(_DragObject, Entry):
def __init__(self, **kwargs):
Entry.__init__(self, **kwargs)
+ _DragObject.__init__(self)
self.metadata = None