[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