Up
index

source: Drag&Drop


import pygtk
pygtk.require("2.0")
import gtk

import pickle

NAME="Drag&Drop"

list1_data = ["list1_a", "list1_b", ]
list2_data = ["list2_a", "list2_b", ]

def create_glist(list):
	glist = gtk.ListStore(str)
	for data in list:
		iter = glist.append( (data,) )
		glist.set(iter)
	return glist

def create_treeview(glist):
	treeview = gtk.TreeView()
	model = treeview.get_selection()
	model.set_mode(gtk.SELECTION_SINGLE)
	r = gtk.CellRendererText()
	treeview.insert_column_with_attributes(-1, "Name", r, text=0)
	treeview.set_model(glist)
	treeview.show()
	return treeview

def serialize(data):
	return pickle.dumps(data)

def unserialize(data):
	return pickle.loads(data)

def l(list):
	iter = list.get_iter_root()
	while iter is not None:
		n = list.get_n_columns()
		tmp = []
		for i in range(0, n):
			tmp.append( list.get_value(iter, i) )
		print tmp
		iter = list.iter_next(iter)
			    
class t_drag_drop(gtk.Window):
	TARGETS = [
		("INT", 0, 1),
		("TEXT", 0, 2),
		]
	def __init__(self):
		gtk.Window.__init__(self)

		self.set_title("Drag Drop")
		self.set_geometry_hints(min_width=200)
		self.connect("destroy", gtk.main_quit)

		self.list1 = create_glist(list1_data)
		self.tree1 = create_treeview(self.list1)

		self.tree1.enable_model_drag_source(
			gtk.gdk.BUTTON1_MASK,
			self.TARGETS,
			gtk.gdk.ACTION_COPY
			)
		self.tree1.connect("drag_data_get", self.drag_data_get_data)
		
		self.list2 = create_glist(list2_data)
		self.tree2 = create_treeview(self.list2)
		self.tree2.enable_model_drag_dest(
			self.TARGETS,
			gtk.gdk.ACTION_DEFAULT)
		self.tree2.connect("drag_data_received", self.drag_data_received_data)
		self.h = gtk.HBox(2)
		self.h.pack_start(self.tree1)
		self.h.pack_end(self.tree2)
		self.h.show()
		self.add(self.h)

	def drag_data_get_data(self, treeview, context, selection, target_id,
						   etime):
		treeselection = treeview.get_selection()
		model, iter = treeselection.get_selected()
		path = model.get_path(iter)
		print len(serialize(path))
		selection.set(selection.target, 8, serialize(path))

	def drag_data_received_data(self, treeview, context, x, y, selection,
								info, etime):
		model = treeview.get_model()

		path_src = unserialize(selection.data)
		print "data:", path_src, len(selection.data)
		
		drop_info = treeview.get_dest_row_at_pos(x, y)
		if drop_info:
			path, position = drop_info
			print "drop_info:", drop_info
			iter = model.get_iter(path)
			print "position:", position
			tmp = []
			model_src = self.tree1.get_model()
			iter_src = model_src.get_iter(path_src)
			for i in range(0, model_src.get_n_columns()):
				tmp.append(model_src.get_value(iter_src, i))
			model.append( tmp )
			
			model_src.remove(iter_src)
		l(self.list2)
		
t = t_drag_drop()
t.show()
gtk.main()

$Id: page.wml,v 1.5 2007-01-04 15:52:08 dakol Exp $

Valid XHTML 1.0! Valid CSS!