From b713512e9bf073bce5376a085b99d357dc3482a5 Mon Sep 17 00:00:00 2001 From: Aleksey Lim Date: Mon, 01 Feb 2010 05:22:12 +0000 Subject: Drag objects using title --- 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 -- cgit v0.9.1