[pygtk] Treeview, nautilus and drag and drop to reorder.

Rob Brown-Bayliss r.brown.bayliss at gmail.com
Sat Mar 14 17:58:35 WST 2009


On Sat, 2009-03-14 at 03:20 -0500, alex goretoy wrote:

> I would track certain evens and recreate the tree view with the list
> after drop or after press, code is good
> -Alex Goretoy
> http://www.goretoy.com


Any way, here is the full code involved:



	def setup_maps_treeview(self):
		self.maps_treeview = self.wtree.get_widget("maps_treeview")
		self.maps_list = gtk.ListStore(gobject.TYPE_STRING,
gobject.TYPE_STRING)
		cell_0 = gtk.CellRendererText()
		cell_0.set_property("markup", True)
		col_0 = gtk.TreeViewColumn("Order")
		col_0.pack_start(cell_0, True)
		#col_0.add_attribute( cell_0,  "active", 0)
		self.maps_treeview.append_column(col_0)
		cell_1 = gtk.CellRendererText()
		cell_1.set_property("markup", True)
		col_1 = gtk.TreeViewColumn("Map Image", cell_1, markup=1)
		col_1.pack_start(cell_1, True)
		self.maps_treeview.append_column(col_1)	
		self.maps_treeview.set_model(self.maps_list)
		self.maps_treeview.drag_source_set(gtk.DEST_DEFAULT_ALL,
target[:-1],gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE)
		self.maps_treeview.drag_dest_set(gtk.DEST_DEFAULT_ALL,
target[:-1],gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE)
		NO_SUCH_WIDGET = None
		NO_SUCH_WIDGET.enable_model_drag_source(gtk.gdk.BUTTON1_MASK,
[("Reorder", gtk.TARGET_SAME_WIDGET, 0)], gtk.gdk.ACTION_COPY)
		self.maps_treeview.enable_model_drag_dest([("Reorder",
gtk.TARGET_SAME_WIDGET, 0)], gtk.gdk.ACTION_COPY)

	def add_map(self, path):
		#incase it's needed elsewhere and not just for drag and drop
		iter = self.maps_list.append()
		self.maps_list.set(iter, 0, "A", 1, path)
	
	#
	# Drag and Drop
	#
	
	def on_maps_treeview_drag_drop(self, widget, drag_context, data1,
data2, timestamp):
		"Pretty much does nothing - dnd in treeviews is strange"
		if drag_context.get_source_widget() == self.maps_treeview:  
			# drag and drop within widget to re-order 
			self.internal_drag_data_received(widget, drag_context, data1,
data2,None,1,timestamp)
		# if signal is not stopped here weirdnes will happen, double dropping
from external apps etc.
		gobject.GObject.emit_stop_by_name(widget, "drag_drop")
		
	def  on_maps_treeview_drag_data_received(self, widget, drag_context,
data1,  data2, selection, data3, timestamp):
		"get info on dropped object and check to see if it is an image"
		dropped = selection.get_text()[:-2]  # seems to have \r\n appended to
text
		if dropped[:7] == "file://":
			try:
				mime_type = gnomevfs.get_mime_type(dropped)
				if mime_type[:6] == "image/":
					self.add_map(dropped[7:])
			except:
				pass
		
	def internal_drag_data_received(self, treeview, drag_context, x, y,
selection, info, eventtime):
		"Handle the drag and drop reordering of map images."
		model, iter_to_move = treeview.get_selection().get_selected()
		temp = treeview.get_dest_row_at_pos(x, y)
		if temp != None:
			path, pos = temp
		else:
			path, pos = (len(model)-1,), gtk.TREE_VIEW_DROP_AFTER
		destination_iter = model.get_iter(path)
		if self.check_row_path(model, iter_to_move, destination_iter):
			self.move_row(model, iter_to_move, destination_iter, pos)
			drag_context.finish(True, True, eventtime)
		else:
			drag_context.finish(False, False, eventtime)
		self.output_tree()
		
	def check_row_path(self, model, iter_to_move, destination):
		path_to_move = model.get_path(iter_to_move)
		path_of_destination = model.get_path(destination)
		if path_of_destination[0:len(path_to_move)] == path_to_move:
			return False
		else:
			return True

	def move_row(self, model, iter_to_move, destination_iter, pos):
		order = model.get_value(iter_to_move, 0)
		path = model.get_value(iter_to_move, 1)
		row = (order, path)
		try:
			if (pos == gtk.TREE_VIEW_DROP_INTO_OR_BEFORE) or (pos ==
gtk.TREE_VIEW_DROP_INTO_OR_AFTER):
				iter = model.prepend(row)
			elif pos == gtk.TREE_VIEW_DROP_BEFORE:
				iter = model.insert_before(destination_iter, row)
			elif pos == gtk.TREE_VIEW_DROP_AFTER:
				iter = model.insert_after(destination_iter, row)
		except:
			pass
		model.remove(iter_to_move)		
		
	def output_tree(self):
		n_rows = len(self.maps_list)
		#print n_rows
		for row in self.maps_list:
			print row.path[0]
			print row[1]	

-- 
Rob Brown-Bayliss <r.brown.bayliss at gmail.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.daa.com.au/pipermail/pygtk/attachments/20090314/f0c2eca4/attachment.htm 


More information about the pygtk mailing list