Using Gtk.TreeDragSource.drag_data_get()

Posted by knutsondc on Stack Overflow See other posts from Stack Overflow or by knutsondc
Published on 2012-10-12T03:35:06Z Indexed on 2012/10/12 3:36 UTC
Read the original article Hit count: 128

Filed under:
|
|

I have a simple Gtk.TreeView with a Gtk.ListStore with four columns as the model. I want to be able to drag and drop rows within the TreeView and track row insertions, changes and deletions as they happen so I can implement undo/redo to drag and drop operations. I'm using PyGObject 3 and Python 3.2.

I thought that using methods under the Gtk.TreeDragSource and Gtk.TreeDragDest interfaces would suit my needs perfectly, with Gtk.TreeDragSource.drag_data_get() in my drag_data_get handler and Gtk.TreeDragDest.drag_data_received() or Gtk.tree_get_row_drag_data() in my drag_data_received handler. Basically, what I've tried looks something like this:

def drag_data_received(self, treeview, context, x, y, selection,  info, time):
    treeselection = tv.get_selection()
    model, my_iter = treeselection.get_selected()
    path = model.get_path(my_iter)
    result = Gtk.TreeDragSource.drag_data_get(path, selection)

def drag_data_received(self, tv, context, x, y, selection,  info, time):
    result, model, row = Gtk.tree_get_row_drag_data(selection)
    my_iter = model.get_iter(row)
    data = [model.get_value(my_iter, i) for i in range(model.get_n_columns())]
    drop_info = tv.get_dest_row_at_pos(x, y)
    if drop_info:
        path, position = drop_info
        my_iter = model.get_iter(path)
        if (position == Gtk.TreeViewDropPosition.BEFORE
            or position == Gtk.TreeViewDropPosition.INTO_OR_BEFORE):
            model.insert_before(my_iter, [data])
        else:
            model.insert_after(my_iter, [data])
    else:
        model.append([data])    
    if context.get_actions() == Gdk.DragAction.MOVE|Gdk.DragAction.DEFAULT:
        context.finish(True, True, time)
    return

This fails spectacularly - when Python hits the call to Gtk.TreeDragSource.drag_data_get(), Python crashes and my program window swiftly disappears. I don't even get to the drag_data_received handler. Can anyone point me to some example code showing how these methods using the TreeDragSource and TreeDragDest interfaces work? Any help much appreciated!

© Stack Overflow or respective owner

Related posts about python

Related posts about gtk