home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / share / doc / python-gtk2 / examples / demos / dnd.py < prev    next >
Encoding:
Python Source  |  2006-08-09  |  7.1 KB  |  206 lines

  1. #!/usr/bin/env python
  2. '''Drag and Drop
  3.  
  4. This is a test of the drag and drop capabilities of gtk.  It is a
  5. fairly straight forward port of the example distributed with gtk.
  6. '''
  7.  
  8. import gtk
  9. import gobject
  10.  
  11. from dndpixmap import drag_icon_xpm, trashcan_open_xpm, trashcan_closed_xpm
  12.  
  13. TARGET_STRING = 0
  14. TARGET_ROOTWIN = 1
  15.  
  16. target = [
  17.     ('STRING', 0, TARGET_STRING),
  18.     ('text/plain', 0, TARGET_STRING),
  19.     ('application/x-rootwin-drop', 0, TARGET_ROOTWIN)
  20. ]
  21.  
  22. def create_pixmap(widget, xpm_data):
  23.     return \
  24.         gtk.gdk.pixmap_colormap_create_from_xpm_d(
  25.             None, widget.get_colormap(), None, xpm_data)
  26.  
  27. class DragAndDropDemo(gtk.Window):
  28.     trashcan_open = None
  29.     trashcan_open_mask = None
  30.     trashcan_closed = None
  31.     trashcan_closed_mask = None
  32.     drag_icon = None
  33.     drag_mask = None
  34.     have_drag = False
  35.     popped_up = False
  36.     in_popup = False
  37.     popup_timer = 0
  38.     popdown_timer = 0
  39.     popup_win = None
  40.  
  41.     def __init__(self, parent=None):
  42.         gtk.Window.__init__(self)
  43.         try:
  44.             self.set_screen(parent.get_screen())
  45.         except AttributeError:
  46.             self.connect('destroy', lambda *w: gtk.main_quit())
  47.         self.set_title(self.__class__.__name__)
  48.  
  49.         table = gtk.Table(2,2)
  50.         self.add(table)
  51.  
  52.         self.drag_icon, self.drag_mask = \
  53.             create_pixmap(self, drag_icon_xpm)
  54.         self.trashcan_open, self.trashcan_open_mask = \
  55.             create_pixmap(self, trashcan_open_xpm)
  56.         self.trashcan_closed, self.trashcan_closed_mask = \
  57.             create_pixmap(self, trashcan_closed_xpm)
  58.  
  59.         label = gtk.Label('Drop to Trashcan!\n')
  60.         label.drag_dest_set(gtk.DEST_DEFAULT_ALL, target[:-1],
  61.                 gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE)
  62.         label.connect('drag_data_received', self.label_drag_data_received)
  63.         table.attach(label, 0, 1, 0, 1)
  64.  
  65.         label = gtk.Label('Popup\n')
  66.         label.drag_dest_set(gtk.DEST_DEFAULT_ALL, target[:-1],
  67.                 gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE)
  68.         table.attach(label, 1, 2, 1, 2)
  69.         label.connect('drag_motion', self.popsite_motion)
  70.         label.connect('drag_leave', self.popsite_leave)
  71.  
  72.         image = gtk.Image()
  73.         image.set_from_pixmap(self.trashcan_closed, self.trashcan_closed_mask)
  74.         image.drag_dest_set(0, [], 0)
  75.         table.attach(image, 1, 2, 0, 1)
  76.         image.connect('drag_leave', self.target_drag_leave)
  77.         image.connect('drag_motion', self.target_drag_motion)
  78.         image.connect('drag_drop', self.target_drag_drop)
  79.         image.connect('drag_data_received', self.target_drag_data_received)
  80.  
  81.         b = gtk.Button('Drag from Here\n')
  82.         b.drag_source_set(gtk.gdk.BUTTON1_MASK | gtk.gdk.BUTTON3_MASK,
  83.                   target, gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE)
  84.         b.drag_source_set_icon(self.get_colormap(), self.drag_icon, self.drag_mask)
  85.         table.attach(b, 0, 1, 1, 2)
  86.         b.connect('drag_data_get', self.source_drag_data_get)
  87.         b.connect('drag_data_delete', self.source_drag_data_delete)
  88.         self.show_all()
  89.  
  90.     def label_drag_data_received(self, w, context, x, y, data, info, time):
  91.         if data and data.format == 8:
  92.             print 'Received "%s" in label' % data.data
  93.             context.finish(True, False, time)
  94.         else:
  95.             context.finish(False, False, time)
  96.  
  97.     def popsite_motion(self, w, context, x, y, time):
  98.         if not self.popup_timer:
  99.             self.popup_timer = gobject.timeout_add(500, self.popup_cb)
  100.         return True
  101.  
  102.     def popsite_leave(self, w, context, time):
  103.         if self.popup_timer:
  104.             gobject.source_remove(self.popup_timer)
  105.             self.popup_timer = 0
  106.  
  107.     def popup_motion(self, w, context, x, y, time):
  108.         print 'popup_motion'
  109.         if not self.in_popup:
  110.             self.in_popup = True
  111.             if self.popdown_timer:
  112.                 print 'removed popdown'
  113.                 gobject.source_remove(self.popdown_timer)
  114.                 self.popdown_timer = 0
  115.         return True
  116.  
  117.     def popup_leave(self, w, context, time):
  118.         print 'popup_leave'
  119.         if self.in_popup:
  120.             self.in_popup = False
  121.             if not self.popdown_timer:
  122.                 print 'added popdown'
  123.                 self.popdown_timer = gobject.timeout_add(500, self.popdown_cb)
  124.  
  125.     def popup_cb(self):
  126.         if not self.popped_up:
  127.             if self.popup_win is None:
  128.                 self.popup_win = gtk.Window(gtk.WINDOW_POPUP)
  129.                 self.popup_win.set_position(gtk.WIN_POS_MOUSE)
  130.                 table = gtk.Table(3, 3)
  131.                 for k in range(9):
  132.                     i, j = divmod(k, 3)
  133.                     b = gtk.Button("%d,%d" % (i,j))
  134.                     b.drag_dest_set(gtk.DEST_DEFAULT_ALL, target[:-1],
  135.                         gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE)
  136.                     b.connect('drag_motion', self.popup_motion)
  137.                     b.connect('drag_leave', self.popup_leave)
  138.                     table.attach(b, i, i+1, j, j+1)
  139.                 table.show_all()
  140.                 self.popup_win.add(table)
  141.             self.popup_win.present()
  142.             self.popped_up = True
  143.         self.popdown_timer = gobject.timeout_add(500, self.popdown_cb)
  144.         print 'added popdown'
  145.         self.popup_timer = 0
  146.         return False
  147.  
  148.     def popdown_cb(self):
  149.         print 'popdown'
  150.         #if self.in_popup:
  151.         #    return True
  152.         self.popdown_timer = 0
  153.         self.popup_win.hide()
  154.         self.popped_up = False
  155.         return False
  156.  
  157.     def target_drag_leave(self, img, context, time):
  158.         print 'leave'
  159.         self.have_drag = False
  160.         img.set_from_pixmap(self.trashcan_closed, self.trashcan_closed_mask)
  161.  
  162.     def target_drag_motion(self, img, context, x, y, time):
  163.         if self.have_drag is False:
  164.             self.have_drag = True
  165.             img.set_from_pixmap(self.trashcan_open, self.trashcan_open_mask)
  166.         source_widget = context.get_source_widget()
  167.         print 'motion, source ',
  168.         if source_widget:
  169.             print source_widget.__class__.__name__
  170.         else:
  171.             print 'unknown'
  172.         context.drag_status(context.suggested_action, time)
  173.         return True
  174.  
  175.     def target_drag_drop(self, img, context, x, y, time):
  176.         print 'drop'
  177.         self.have_drag = False
  178.         img.set_from_pixmap(self.trashcan_closed, self.trashcan_closed_mask)
  179.         if context.targets:
  180.             img.drag_get_data(context, context.targets[0], time)
  181.             return True
  182.         return False
  183.  
  184.     def target_drag_data_received(self, img, context, x, y, data, info, time):
  185.         if data.format == 8:
  186.             print 'Received "%s" in trashcan' % data.data
  187.             context.finish(True, False, time)
  188.         else:
  189.             context.finish(False, False, time)
  190.  
  191.     def source_drag_data_get(self, btn, context, selection_data, info, time):
  192.         if info == TARGET_ROOTWIN:
  193.             print 'I was dropped on the rootwin'
  194.         else:
  195.             selection_data.set(selection_data.target, 8, "I'm Data!")
  196.  
  197.     def source_drag_data_delete(self, btn, context, data):
  198.         print 'Delete the data!'
  199.  
  200. def main():
  201.     DragAndDropDemo()
  202.     gtk.main()
  203.  
  204. if __name__ == '__main__':
  205.     main()
  206.