Получилось. :) На основе примеров
этого и
этого написал простейший пример.
#!/usr/bin/python
from gi.repository import Gtk, Gdk
class MyWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="Drag and Drop Demo")
self.set_size_request(200, 200)
store = Gtk.ListStore(str)
self.treeview = Gtk.TreeView(store)
renderer = Gtk.CellRendererText()
column = Gtk.TreeViewColumn("Title", renderer, text=0)
self.treeview.append_column(column)
self.add(self.treeview)
store.append(['Item 1'])
store.append(['Item 2'])
store.append(['Item 3'])
store.append(['Item 4'])
store.append(['Item 5'])
self.treeview.enable_model_drag_source(
Gdk.ModifierType.BUTTON1_MASK,
[('text', Gtk.TargetFlags.SAME_WIDGET, 0)],
Gdk.DragAction.MOVE)
self.treeview.enable_model_drag_dest([('text', Gtk.TargetFlags.SAME_WIDGET, 0)],
Gdk.DragAction.MOVE)
self.treeview.drag_source_add_text_targets()
self.treeview.drag_dest_add_text_targets()
self.treeview.connect("drag_data_get", self.drag_data_get_data)
self.treeview.connect("drag_data_received",
self.drag_data_received_data)
def drag_data_get_data(self, treeview, context, selection, target_id,
etime):
treeselection = treeview.get_selection()
model, iter = treeselection.get_selected()
data = model.get_value(iter, 0)
selection.set(selection.get_selection(), 8, data)
def drag_data_received_data(self, treeview, context, x, y, selection,
info, etime):
model = treeview.get_model()
data = selection.get_data()
drop_info = treeview.get_dest_row_at_pos(x, y)
if drop_info:
path, position = drop_info
iter = model.get_iter(path)
if (position == Gtk.TreeViewDropPosition.BEFORE
or position == Gtk.TreeViewDropPosition.INTO_OR_BEFORE):
model.insert_before(iter, [data])
else:
model.insert_after(iter, [data])
else:
model.append([data])
if context.get_actions() == Gdk.DragAction.MOVE:
context.finish(True, True, etime)
return
win = MyWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
Замечания, предложения?